GUI refactoring...

This commit is contained in:
Shamus Hammons 2009-01-30 18:20:05 +00:00
parent 2a82c98a26
commit 3cff304619
7 changed files with 79 additions and 8 deletions

View File

@ -24,7 +24,7 @@ autoSaveState = 1
#floppyImage1 = ./disks/bt1_boot.dsk
# Yes
#floppyImage1 = ./disks/bt2_boot.dsk
# Yes (but segfaults in the timer routine in the title screen)
# Yes (but segfaults in the timer routine in the title screen--NB: Not anymore...)
floppyImage1 = ./disks/bt3_boot_fixed.dsk
floppyImage2 = ./disks/bt3_character_fixed.dsk
# Yes

View File

@ -851,11 +851,13 @@ memcpy(ram + 0xD000, ram + 0xC000, 0x1000);
// gui = new GUI(surface); // Set up the GUI system object...
gui = new GUI(mainSurface); // Set up the GUI system object...
#if 0
gui->AddMenuTitle("Apple2");
gui->AddMenuItem("Test!", TestWindow/*, hotkey*/);
gui->AddMenuItem("");
gui->AddMenuItem("Quit", QuitEmulator, SDLK_q);
gui->CommitItemsToMenu();
#endif
SetupBlurTable(); // Set up the color TV emulation blur table
running = true; // Set running status...

View File

@ -26,6 +26,12 @@
#define MASK_A 0xFF000000
#endif
// Debugging...
//#define DEBUG_GUI_BUTTON
#ifdef DEBUG_GUI_BUTTON
#include "log.h"
#endif
//
// Button class implementation
//
@ -86,7 +92,7 @@ Button::Button(uint32 x, uint32 y, uint32 w, uint32 h, std::string s, Element *
}
Button::Button(uint32 x, uint32 y, std::string s, Element * parent/*= NULL*/):
Element(x, y, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0xFF, parent),
Element(x, y, 0, 0, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xCF, 0x00, 0xFF, parent),
activated(false), clicked(false), inside(false),
buttonUp(NULL), buttonDown(NULL), buttonHover(NULL), surfacesAreLocal(true),
activatedSave(false), clickedSave(false), insideSave(false)
@ -103,14 +109,31 @@ Button::Button(uint32 x, uint32 y, std::string s, Element * parent/*= NULL*/):
buttonHover = SDL_CreateRGBSurface(SDL_SWSURFACE, extents.w, extents.h, 32,
MASK_R, MASK_G, MASK_B, MASK_A);
//bleh
uint8 r1, g1, b1, a1;
SDL_GetRGBA(fgColor, screen->format, &r1, &g1, &b1, &a1);
fgColor = SDL_MapRGBA(buttonUp->format, r1, g1, b1, a1);
SDL_GetRGBA(bgColor, screen->format, &r1, &g1, &b1, &a1);
bgColor = SDL_MapRGBA(buttonUp->format, r1, g1, b1, a1);
fgColorHL = SDL_MapRGBA(buttonUp->format, 0xFF, 0xFF, 0xFF, 0xFF);
bgColorHL = SDL_MapRGBA(buttonUp->format, 0x4F, 0xFF, 0x4F, 0xFF);
//helb
// Need to create backgrounds before we do this stuff...
SDL_FillRect(buttonUp, NULL, bgColor);
SDL_FillRect(buttonDown, NULL, fgColor);
SDL_FillRect(buttonHover, NULL, bgColor);
SDL_FillRect(buttonHover, NULL, bgColorHL);
DrawStringTrans(buttonUp, GetFontWidth(), 0, fgColor, s.c_str());
DrawStringTrans(buttonDown, GetFontWidth(), 0, fgColor, s.c_str());
DrawStringTrans(buttonHover, GetFontWidth(), 0, fgColor, s.c_str());
DrawStringTrans(buttonHover, GetFontWidth(), 0, fgColorHL, s.c_str());
#ifdef DEBUG_GUI_BUTTON
WriteLog("Button::Button()...\n");
WriteLog("\tbuttonUp w/h = %u/%u\n", buttonUp->w, buttonUp->h);
WriteLog("\tbuttonDown w/h = %u/%u\n", buttonDown->w, buttonDown->h);
WriteLog("\tbuttonHover w/h = %u/%u\n", buttonHover->w, buttonHover->h);
#endif
}
Button::~Button()
@ -165,6 +188,9 @@ void Button::HandleMouseButton(uint32 x, uint32 y, bool mouseDown)
void Button::Draw(void)
{
#ifdef DEBUG_GUI_BUTTON
WriteLog("Button::Draw()...\n");
#endif
if (buttonUp == NULL)
return; // Bail out if no surface was created...
@ -179,12 +205,23 @@ void Button::Draw(void)
picToShow = buttonDown;
SDL_Rect rect = GetScreenCoords();
#ifdef DEBUG_GUI_BUTTON
WriteLog(" coords: x=%u, y=%u\n", rect.x, rect.y);
WriteLog(" picToShow=%08X\n", picToShow);
#endif
//Need to do coverage list blitting here, to avoid unnecessary drawing when doing mouseovers
//Also, need to add suport in Gui()...
SDL_BlitSurface(picToShow, NULL, screen, &rect); // This handles alpha blending too! :-D
#ifdef DEBUG_GUI_BUTTON
WriteLog(" width: w=%u, h=%u\n", rect.w, rect.h);
#endif
needToRefreshScreen = true;
#ifdef DEBUG_GUI_BUTTON
// SDL_FillRect(screen, &extents, fgColor);
#endif
}
void Button::Notify(Element *)

View File

@ -35,6 +35,8 @@ class Button: public Element
protected:
bool activated, clicked, inside;
SDL_Surface * buttonUp, * buttonDown, * buttonHover;
uint32 fgColorHL;
uint32 bgColorHL;
private:
bool surfacesAreLocal;

View File

@ -21,6 +21,7 @@
#include "gui.h"
#include "menu.h" // Element class methods are pulled in here...
#include "window.h"
#include "button.h"
#include "video.h"
// Debug support
@ -43,7 +44,9 @@ GUI::GUI(SDL_Surface * surface): menuItem(new MenuItems())
// windowList.push_back(new Menu());
// Create drive windows, and config windows here...
windowList.push_back(new Window(30, 30, 200, 100));
windowList.push_back(new Window(30, 140, 200, 100));
windowList.push_back(new Button(30, 250, "Click!"));
}
GUI::~GUI()
@ -96,6 +99,7 @@ void GUI::Run(void)
SDL_EnableKeyRepeat(150, 75);
// Initial update... [Now handled correctly in the constructor]
// Uh, still needed here, though... Only makes sense that it should
for(i=windowList.begin(); i!=windowList.end(); i++)
(*i)->Draw();

View File

@ -22,7 +22,8 @@
//#define DESTRUCTOR_TESTING
// Rendering experiment...
#define USE_COVERAGE_LISTS
//BAH
//#define USE_COVERAGE_LISTS
#if SDL_BYTEORDER == SDL_BIG_ENDIAN
#define MASK_R 0xFF000000
@ -54,8 +55,8 @@ Window::Window(uint32 x/*= 0*/, uint32 y/*= 0*/, uint32 w/*= 0*/, uint32 h/*= 0*
MASK_R, MASK_G, MASK_B, MASK_A))
{
//Could probably move this into the initializer list as well...
closeButton = new Button(w - (cbWidth + 1), 1, cbUp, cbHover, cbDown, this);
list.push_back(closeButton);
// closeButton = new Button(w - (cbWidth + 1), 1, cbUp, cbHover, cbDown, this);
// list.push_back(closeButton);
CreateBackstore();
Draw(); // Can we do this in the constructor??? Mebbe.
@ -99,10 +100,22 @@ void Window::HandleMouseMove(uint32 x, uint32 y)
void Window::HandleMouseButton(uint32 x, uint32 y, bool mouseDown)
{
#if 1
// Handle the items this window contains...
for(uint32 i=0; i<list.size(); i++)
// Make coords relative to upper right corner of this window...
list[i]->HandleMouseButton(x - extents.x, y - extents.y, mouseDown);
#else //? This works in draggablewindow2...
// Handle the items this window contains...
for(uint32 i=0; i<list.size(); i++)
{
// Make coords relative to upper right corner of this window...
list[i]->HandleMouseButton(x - extents.x, y - extents.y, mouseDown);
if (list[i]->Inside(x - extents.x, y - extents.y))
clicked = false;
}
#endif
}
void Window::Draw(void)
@ -127,9 +140,11 @@ void Window::Draw(void)
#endif
//Prolly don't need this since the close button will do this for us...
//Close button isn't mandatory anymore...
needToRefreshScreen = true;
}
// This is only called if a close button has been added
void Window::Notify(Element * e)
{
if (e == closeButton)
@ -146,3 +161,13 @@ void Window::AddElement(Element * e)
{
list.push_back(e);
}
void Window::AddCloseButton(void)
{
// Only allow this to happen once!
if (closeButton == NULL)
{
closeButton = new Button(extents.w - (cbWidth + 1), 1, cbUp, cbHover, cbDown, this);
list.push_back(closeButton);
}
}

View File

@ -24,6 +24,7 @@ class Window: public Element
virtual void Draw(void);
virtual void Notify(Element *);
void AddElement(Element * e);
void AddCloseButton(void);
protected:
void (* handler)(Element *);