diff --git a/stella/src/cheat/CheatCodeDialog.cxx b/stella/src/cheat/CheatCodeDialog.cxx index 034322f3c..512f4be6f 100644 --- a/stella/src/cheat/CheatCodeDialog.cxx +++ b/stella/src/cheat/CheatCodeDialog.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: CheatCodeDialog.cxx,v 1.9 2006-03-23 16:16:32 stephena Exp $ +// $Id: CheatCodeDialog.cxx,v 1.10 2006-05-04 17:45:20 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -35,15 +35,6 @@ #include "bspf.hxx" -enum { - kAddCheatCmd = 'CHTa', - kEditCheatCmd = 'CHTe', - kAddOneShotCmd = 'CHTo', - kCheatAdded = 'CHad', - kCheatEdited = 'CHed', - kOneShotCheatAdded = 'CHoa', - kRemCheatCmd = 'CHTr' -}; // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - CheatCodeDialog::CheatCodeDialog(OSystem* osystem, DialogContainer* parent, @@ -51,6 +42,8 @@ CheatCodeDialog::CheatCodeDialog(OSystem* osystem, DialogContainer* parent, : Dialog(osystem, parent, x, y, w, h) { int xpos, ypos; + WidgetArray wid; + ButtonWidget* b; // List of cheats, with checkboxes to enable/disable xpos = 10; ypos = 10; @@ -58,14 +51,17 @@ CheatCodeDialog::CheatCodeDialog(OSystem* osystem, DialogContainer* parent, _w - 25 - kButtonWidth, _h - 50); myCheatList->setStyle(kXFill); myCheatList->setEditable(false); - myCheatList->setFlags(WIDGET_NODRAW_FOCUS); - addFocusWidget(myCheatList); + wid.push_back(myCheatList); xpos += myCheatList->getWidth() + 15; ypos = 15; - addButton(font, xpos, ypos, "Add", kAddCheatCmd, 0); - myEditButton = addButton(font, xpos, ypos+=20, "Edit", kEditCheatCmd, 0); - myRemoveButton = addButton(font, xpos, ypos+=20, "Remove", kRemCheatCmd, 0); - addButton(font, xpos, ypos+=30, "One shot", kAddOneShotCmd, 0); + b = addButton(font, xpos, ypos, "Add", kAddCheatCmd); + wid.push_back(b); + myEditButton = addButton(font, xpos, ypos+=20, "Edit", kEditCheatCmd); + wid.push_back(myEditButton); + myRemoveButton = addButton(font, xpos, ypos+=20, "Remove", kRemCheatCmd); + wid.push_back(myRemoveButton); + b = addButton(font, xpos, ypos+=30, "One shot", kAddOneShotCmd); + wid.push_back(b); // Inputbox which will pop up when adding/editing a cheat StringList labels; @@ -76,14 +72,20 @@ CheatCodeDialog::CheatCodeDialog(OSystem* osystem, DialogContainer* parent, // Add OK and Cancel buttons **** FIXME - coordinates #ifndef MAC_OSX - addButton(font, _w - 2 * (kButtonWidth + 7), _h - 24, "OK", kOKCmd, 0); + b = addButton(font, _w - 2 * (kButtonWidth + 7), _h - 24, "OK", kOKCmd); + wid.push_back(b); myCancelButton = addButton(font, _w - (kButtonWidth + 10), _h - 24, - "Cancel", kCloseCmd, 0); + "Cancel", kCloseCmd); + wid.push_back(myCancelButton); #else myCancelButton = addButton(font, _w - 2 * (kButtonWidth + 7), _h - 24, - "Cancel", kCloseCmd, 0); - addButton(font, _w - (kButtonWidth + 10), _h - 24, "OK", kOKCmd, 0); + "Cancel", kCloseCmd); + wid.push_back(myCancelButton); + b = addButton(font, _w - (kButtonWidth + 10), _h - 24, "OK", kOKCmd); + wid.push_back(b); #endif + + addToFocusList(wid); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -154,6 +156,7 @@ void CheatCodeDialog::editCheat() myCheatInput->setEditString(name, 0); myCheatInput->setEditString(code, 1); + myCheatInput->setTitle(""); myCheatInput->setFocus(1); myCheatInput->setEmitSignal(kCheatEdited); parent()->addDialog(myCheatInput); diff --git a/stella/src/cheat/CheatCodeDialog.hxx b/stella/src/cheat/CheatCodeDialog.hxx index 83449dc45..3a34aff4c 100644 --- a/stella/src/cheat/CheatCodeDialog.hxx +++ b/stella/src/cheat/CheatCodeDialog.hxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: CheatCodeDialog.hxx,v 1.5 2006-02-22 17:38:03 stephena Exp $ +// $Id: CheatCodeDialog.hxx,v 1.6 2006-05-04 17:45:21 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -63,6 +63,16 @@ class CheatCodeDialog : public Dialog ButtonWidget* myEditButton; ButtonWidget* myRemoveButton; ButtonWidget* myCancelButton; + + enum { + kAddCheatCmd = 'CHTa', + kEditCheatCmd = 'CHTe', + kAddOneShotCmd = 'CHTo', + kCheatAdded = 'CHad', + kCheatEdited = 'CHed', + kOneShotCheatAdded = 'CHoa', + kRemCheatCmd = 'CHTr' + }; }; #endif diff --git a/stella/src/debugger/gui/DataGridOpsWidget.cxx b/stella/src/debugger/gui/DataGridOpsWidget.cxx index 8f1dc21c5..29276759b 100644 --- a/stella/src/debugger/gui/DataGridOpsWidget.cxx +++ b/stella/src/debugger/gui/DataGridOpsWidget.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: DataGridOpsWidget.cxx,v 1.3 2006-02-22 17:38:04 stephena Exp $ +// $Id: DataGridOpsWidget.cxx,v 1.4 2006-05-04 17:45:23 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -42,32 +42,32 @@ DataGridOpsWidget::DataGridOpsWidget(GuiObject* boss, const GUI::Font& font, // Create operations buttons xpos = x; ypos = y; _zeroButton = new ButtonWidget(boss, font, xpos, ypos, bwidth, bheight, - "0", kDGZeroCmd, 0); + "0", kDGZeroCmd); ypos += bheight + space; _invButton = new ButtonWidget(boss, font, xpos, ypos, bwidth, bheight, - "Inv", kDGInvertCmd, 0); + "Inv", kDGInvertCmd); ypos += bheight + space; _incButton = new ButtonWidget(boss, font, xpos, ypos, bwidth, bheight, - "++", kDGIncCmd, 0); + "++", kDGIncCmd); ypos += bheight + space; _shiftLeftButton = new ButtonWidget(boss, font, xpos, ypos, bwidth, bheight, - "<<", kDGShiftLCmd, 0); + "<<", kDGShiftLCmd); // Move to next column, skip a row xpos = x + bwidth + space; ypos = y + bheight + space; _negButton = new ButtonWidget(boss, font, xpos, ypos, bwidth, bheight, - "Neg", kDGNegateCmd, 0); + "Neg", kDGNegateCmd); ypos += bheight + space; _decButton = new ButtonWidget(boss, font, xpos, ypos, bwidth, bheight, - "--", kDGDecCmd, 0); + "--", kDGDecCmd); ypos += bheight + space; _shiftRightButton = new ButtonWidget(boss, font, xpos, ypos, bwidth, bheight, - ">>", kDGShiftRCmd, 0); + ">>", kDGShiftRCmd); // Calculate real dimensions _w = xpos + bwidth; diff --git a/stella/src/debugger/gui/DataGridWidget.cxx b/stella/src/debugger/gui/DataGridWidget.cxx index 6c76c099e..a12e587d2 100644 --- a/stella/src/debugger/gui/DataGridWidget.cxx +++ b/stella/src/debugger/gui/DataGridWidget.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: DataGridWidget.cxx,v 1.7 2006-03-25 00:34:17 stephena Exp $ +// $Id: DataGridWidget.cxx,v 1.8 2006-05-04 17:45:23 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -45,7 +45,8 @@ DataGridWidget::DataGridWidget(GuiObject* boss, const GUI::Font& font, _selectedItem(0), _opsWidget(NULL) { - _flags = WIDGET_ENABLED | WIDGET_CLEARBG | WIDGET_RETAIN_FOCUS; + _flags = WIDGET_ENABLED | WIDGET_CLEARBG | WIDGET_RETAIN_FOCUS | + WIDGET_WANTS_RAWDATA; _type = kDataGridWidget; _editMode = false; diff --git a/stella/src/debugger/gui/DebuggerDialog.cxx b/stella/src/debugger/gui/DebuggerDialog.cxx index 8a0143e62..12c4aa4b9 100644 --- a/stella/src/debugger/gui/DebuggerDialog.cxx +++ b/stella/src/debugger/gui/DebuggerDialog.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: DebuggerDialog.cxx,v 1.13 2006-03-23 16:16:32 stephena Exp $ +// $Id: DebuggerDialog.cxx,v 1.14 2006-05-04 17:45:24 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -211,6 +211,7 @@ void DebuggerDialog::addStatusArea() xpos, ypos, myTiaZoom->getWidth(), font.getLineHeight(), ""); myMessageBox->setEditable(false); + myMessageBox->clearFlags(WIDGET_RETAIN_FOCUS); myMessageBox->setColor(kTextColorEm); } diff --git a/stella/src/debugger/gui/PromptWidget.cxx b/stella/src/debugger/gui/PromptWidget.cxx index 79b3f71e2..d58f3b6e5 100644 --- a/stella/src/debugger/gui/PromptWidget.cxx +++ b/stella/src/debugger/gui/PromptWidget.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: PromptWidget.cxx,v 1.8 2006-03-25 00:34:17 stephena Exp $ +// $Id: PromptWidget.cxx,v 1.9 2006-05-04 17:45:24 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -52,7 +52,7 @@ PromptWidget::PromptWidget(GuiObject* boss, const GUI::Font& font, _firstTime(true) { _flags = WIDGET_ENABLED | WIDGET_CLEARBG | WIDGET_RETAIN_FOCUS | - WIDGET_WANTS_TAB; + WIDGET_WANTS_TAB | WIDGET_WANTS_RAWDATA; _type = kPromptWidget; _kConsoleCharWidth = font.getMaxCharWidth(); diff --git a/stella/src/debugger/gui/RamWidget.cxx b/stella/src/debugger/gui/RamWidget.cxx index 35fc7fb5a..f794e7ba4 100644 --- a/stella/src/debugger/gui/RamWidget.cxx +++ b/stella/src/debugger/gui/RamWidget.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: RamWidget.cxx,v 1.5 2006-03-29 13:53:00 stephena Exp $ +// $Id: RamWidget.cxx,v 1.6 2006-05-04 17:45:24 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -66,27 +66,27 @@ RamWidget::RamWidget(GuiObject* boss, const GUI::Font& font, int x, int y) // Create actions buttons to the left of the RAM grid xpos += lwidth + myRamGrid->getWidth() + 4; myUndoButton = new ButtonWidget(boss, font, xpos, ypos, bwidth, bheight, - "Undo", kUndoCmd, 0); + "Undo", kUndoCmd); myUndoButton->setTarget(this); ypos += bheight + 4; myRevertButton = new ButtonWidget(boss, font, xpos, ypos, bwidth, bheight, - "Rev", kRevertCmd, 0); + "Rev", kRevertCmd); myRevertButton->setTarget(this); ypos += 2 * bheight + 2; mySearchButton = new ButtonWidget(boss, font, xpos, ypos, bwidth, bheight, - "Srch", kSearchCmd, 0); + "Srch", kSearchCmd); mySearchButton->setTarget(this); ypos += bheight + 4; myCompareButton = new ButtonWidget(boss, font, xpos, ypos, bwidth, bheight, - "Cmp", kCmpCmd, 0); + "Cmp", kCmpCmd); myCompareButton->setTarget(this); ypos += bheight + 4; myRestartButton = new ButtonWidget(boss, font, xpos, ypos, bwidth, bheight, - "Rset", kRestartCmd, 0); + "Rset", kRestartCmd); myRestartButton->setTarget(this); // Labels for RAM grid diff --git a/stella/src/debugger/gui/RomListWidget.cxx b/stella/src/debugger/gui/RomListWidget.cxx index db4bc5f02..39f0abf44 100644 --- a/stella/src/debugger/gui/RomListWidget.cxx +++ b/stella/src/debugger/gui/RomListWidget.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: RomListWidget.cxx,v 1.5 2006-02-22 17:38:04 stephena Exp $ +// $Id: RomListWidget.cxx,v 1.6 2006-05-04 17:45:24 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -71,6 +71,12 @@ void RomListWidget::handleMouseDown(int x, int y, int button, int clickCount) ListWidget::handleMouseDown(x, y, button, clickCount); } +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +bool RomListWidget::handleEvent(Event::Type e) +{ + return ListWidget::handleEvent(e); // override CheckListWidget::handleEvent() +} + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void RomListWidget::drawWidget(bool hilite) { diff --git a/stella/src/debugger/gui/RomListWidget.hxx b/stella/src/debugger/gui/RomListWidget.hxx index afd23bcb1..d2a5f3841 100644 --- a/stella/src/debugger/gui/RomListWidget.hxx +++ b/stella/src/debugger/gui/RomListWidget.hxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: RomListWidget.hxx,v 1.4 2005-09-07 18:34:52 stephena Exp $ +// $Id: RomListWidget.hxx,v 1.5 2006-05-04 17:45:24 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -43,6 +43,7 @@ class RomListWidget : public CheckListWidget protected: void handleMouseDown(int x, int y, int button, int clickCount); + bool handleEvent(Event::Type e); void drawWidget(bool hilite); GUI::Rect getLineRect() const; diff --git a/stella/src/debugger/gui/TiaZoomWidget.cxx b/stella/src/debugger/gui/TiaZoomWidget.cxx index 8f5980827..ff56e0ca0 100644 --- a/stella/src/debugger/gui/TiaZoomWidget.cxx +++ b/stella/src/debugger/gui/TiaZoomWidget.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: TiaZoomWidget.cxx,v 1.7 2006-03-25 00:34:17 stephena Exp $ +// $Id: TiaZoomWidget.cxx,v 1.8 2006-05-04 17:45:24 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -34,7 +34,8 @@ TiaZoomWidget::TiaZoomWidget(GuiObject* boss, const GUI::Font& font, CommandSender(boss), myMenu(NULL) { - _flags = WIDGET_ENABLED | WIDGET_CLEARBG | WIDGET_RETAIN_FOCUS; + _flags = WIDGET_ENABLED | WIDGET_CLEARBG | WIDGET_RETAIN_FOCUS | + WIDGET_WANTS_RAWDATA; _w = 210; _h = 120; diff --git a/stella/src/debugger/gui/ToggleWidget.cxx b/stella/src/debugger/gui/ToggleWidget.cxx index 254509f7b..b96bf1f4b 100644 --- a/stella/src/debugger/gui/ToggleWidget.cxx +++ b/stella/src/debugger/gui/ToggleWidget.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: ToggleWidget.cxx,v 1.3 2006-02-22 17:38:04 stephena Exp $ +// $Id: ToggleWidget.cxx,v 1.4 2006-05-04 17:45:24 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -34,7 +34,8 @@ ToggleWidget::ToggleWidget(GuiObject* boss, const GUI::Font& font, _currentCol(0), _selectedItem(0) { - _flags = WIDGET_ENABLED | WIDGET_CLEARBG | WIDGET_RETAIN_FOCUS; + _flags = WIDGET_ENABLED | WIDGET_CLEARBG | WIDGET_RETAIN_FOCUS | + WIDGET_WANTS_RAWDATA; _type = kToggleWidget; } diff --git a/stella/src/emucore/Event.hxx b/stella/src/emucore/Event.hxx index ed96a75d1..2682d77ab 100644 --- a/stella/src/emucore/Event.hxx +++ b/stella/src/emucore/Event.hxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: Event.hxx,v 1.19 2006-01-05 18:53:22 stephena Exp $ +// $Id: Event.hxx,v 1.20 2006-05-04 17:45:24 stephena Exp $ //============================================================================ #ifndef EVENT_HXX @@ -26,7 +26,7 @@ class EventStreamer; /** @author Bradford W. Mott - @version $Id: Event.hxx,v 1.19 2006-01-05 18:53:22 stephena Exp $ + @version $Id: Event.hxx,v 1.20 2006-05-04 17:45:24 stephena Exp $ */ class Event { @@ -34,7 +34,7 @@ class Event /** Enumeration of all possible events in Stella, including both console and controller event types as well as events that aren't - technically part of the core + technically part of the emulation core */ enum Type { @@ -80,6 +80,9 @@ class Event MenuMode, CmdMenuMode, DebuggerMode, LauncherMode, Fry, VolumeDecrease, VolumeIncrease, + UIUp, UIDown, UILeft, UIRight, UIHome, UIEnd, UIPgUp, UIPgDown, + UIPrevDir, UINavNext, UINavPrev, UITabNext, UITabPrev, UISelect, + LastType }; diff --git a/stella/src/emucore/EventHandler.cxx b/stella/src/emucore/EventHandler.cxx index c8d939e7e..7bc277244 100644 --- a/stella/src/emucore/EventHandler.cxx +++ b/stella/src/emucore/EventHandler.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: EventHandler.cxx,v 1.160 2006-04-05 12:28:37 stephena Exp $ +// $Id: EventHandler.cxx,v 1.161 2006-05-04 17:45:24 stephena Exp $ //============================================================================ #include @@ -187,11 +187,6 @@ void EventHandler::reset(State state) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void EventHandler::refreshDisplay(bool forceUpdate) { - // These are reset each time the display changes size - DialogContainer::ourJoyMouse.x_max = myOSystem->frameBuffer().imageWidth(); - DialogContainer::ourJoyMouse.y_max = myOSystem->frameBuffer().imageHeight(); - DialogContainer::ourJoyMouse.amt = myOSystem->frameBuffer().zoomLevel() * 3; - switch(myState) { case S_EMULATE: @@ -863,9 +858,6 @@ void EventHandler::handleMouseMotionEvent(SDL_Event& event) { // Take window zooming into account int x = event.motion.x, y = event.motion.y; - DialogContainer::ourJoyMouse.x = x; - DialogContainer::ourJoyMouse.y = y; - myOSystem->frameBuffer().translateCoords(&x, &y); // Determine which mode we're in, then send the event to the appropriate place @@ -1223,8 +1215,8 @@ bool EventHandler::eventStateChange(Event::Type type) { if(myState == S_EMULATE) enterMenuMode(S_MENU); - else if(myState == S_MENU) - leaveMenuMode(); +// else if(myState == S_MENU) // FIXME - maybe 'tab' should only enter, not exit +// leaveMenuMode(); else handled = false; } @@ -1856,6 +1848,79 @@ inline bool EventHandler::eventIsAnalog(Event::Type event) } } +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Event::Type EventHandler::eventForKey(int key, EventMode mode) +{ + // FIXME - eventually make this a one-line inliner in the header + + Event::Type e = Event::NoType; + + // FIXME - eventually this will return the mapped events for + // keys either for emulation mode or UI mode. For now, it always + // assumes UI mode, and generates the key statically. + if(key < 0 || key >= SDLK_LAST) + return e; + + switch(key) + { + case '\n': // enter/return + case '\r': + e = Event::UISelect; + break; + case 256+17: // cursor up + e = Event::UIUp; + break; + case 256+18: // cursor down + e = Event::UIDown; + break; + case 256+20: // cursor left + e = Event::UILeft; + break; + case 256+19: // cursor right + e = Event::UIRight; + break; + case 256+24: // Page Up: + e = Event::UIPgUp; + break; + case 256+25: // Page Down + e = Event::UIPgDown; + break; + case 256+22: // Home + e = Event::UIHome; + break; + case 256+23: // End + e = Event::UIEnd; + break; + default: + break; + } + return e; // ... myKeyTable[key]; +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Event::Type EventHandler::eventForJoyButton(int stick, int button, + EventMode mode) +{ + // FIXME - do a lookup + return Event::NoType; +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Event::Type EventHandler::eventForJoyAxis(int stick, int axis, int value, + EventMode mode) +{ + // FIXME - do a lookup + return Event::NoType; +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Event::Type EventHandler::eventForJoyHat(int stick, int hat, int value, + EventMode mode) +{ + // FIXME - do a lookup + return Event::NoType; +} + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - inline bool EventHandler::isJitter(int paddle, int value) { diff --git a/stella/src/emucore/EventHandler.hxx b/stella/src/emucore/EventHandler.hxx index 33ee7e69b..a3a8d25ca 100644 --- a/stella/src/emucore/EventHandler.hxx +++ b/stella/src/emucore/EventHandler.hxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: EventHandler.hxx,v 1.85 2006-04-05 12:28:37 stephena Exp $ +// $Id: EventHandler.hxx,v 1.86 2006-05-04 17:45:24 stephena Exp $ //============================================================================ #ifndef EVENTHANDLER_HXX @@ -64,6 +64,11 @@ enum { kActionListSize = 81 }; +enum EventMode { + kEmulation, + kMenuOverlay +}; + // Joystick related items enum { kNumJoysticks = 8, @@ -107,7 +112,7 @@ struct JoyMouse { mapping can take place. @author Stephen Anthony - @version $Id: EventHandler.hxx,v 1.85 2006-04-05 12:28:37 stephena Exp $ + @version $Id: EventHandler.hxx,v 1.86 2006-05-04 17:45:24 stephena Exp $ */ class EventHandler { @@ -328,6 +333,11 @@ class EventHandler inline SDL_Joystick* getJoystick(int i) { return ourJoysticks[i].stick; } + Event::Type eventForKey(int key, EventMode mode); + Event::Type eventForJoyButton(int stick, int button, EventMode mode); + Event::Type eventForJoyAxis(int stick, int axis, int value, EventMode mode); + Event::Type eventForJoyHat(int stick, int hat, int value, EventMode mode); + private: /** Bind a key to an event/action and regenerate the mapping array(s) diff --git a/stella/src/emucore/FrameBuffer.cxx b/stella/src/emucore/FrameBuffer.cxx index 9a5a5da6f..1c5526823 100644 --- a/stella/src/emucore/FrameBuffer.cxx +++ b/stella/src/emucore/FrameBuffer.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: FrameBuffer.cxx,v 1.85 2006-03-25 00:34:17 stephena Exp $ +// $Id: FrameBuffer.cxx,v 1.86 2006-05-04 17:45:24 stephena Exp $ //============================================================================ #include @@ -608,7 +608,7 @@ void FrameBuffer::frameRect(uInt32 x, uInt32 y, uInt32 w, uInt32 h, break; case kDashLine: - unsigned int i, skip, lwidth = 1; + unsigned int i, skip, lwidth = 0; for(i = x, skip = 1; i < x+w-1; i=i+lwidth+1, ++skip) { diff --git a/stella/src/gui/AboutDialog.cxx b/stella/src/gui/AboutDialog.cxx index 243aab994..64dbdc530 100644 --- a/stella/src/gui/AboutDialog.cxx +++ b/stella/src/gui/AboutDialog.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: AboutDialog.cxx,v 1.12 2006-04-05 16:06:59 stephena Exp $ +// $Id: AboutDialog.cxx,v 1.13 2006-05-04 17:45:25 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -36,12 +36,20 @@ AboutDialog::AboutDialog(OSystem* osystem, DialogContainer* parent, myPage(1), myNumPages(6) { + WidgetArray wid; + // Add Previous, Next and Close buttons - myPrevButton = addButton(font, 10, h - 24, "Previous", kPrevCmd, 'P'); - myNextButton = addButton(font, (kButtonWidth + 15), h - 24, - "Next", kNextCmd, 'N'); - addButton(font, w - (kButtonWidth + 10), h - 24, "Close", kCloseCmd, 'C'); + myPrevButton = addButton(font, 10, h - 24, "Previous", kPrevCmd); myPrevButton->clearFlags(WIDGET_ENABLED); + wid.push_back(myPrevButton); + + myNextButton = addButton(font, (kButtonWidth + 15), h - 24, + "Next", kNextCmd); + wid.push_back(myNextButton); + + ButtonWidget* b = addButton(font, w - (kButtonWidth + 10), h - 24, + "Close", kCloseCmd); + wid.push_back(b); myTitle = new StaticTextWidget(this, font, 5, 5, w - 10, font.getFontHeight(), "", kTextAlignCenter); @@ -52,6 +60,8 @@ AboutDialog::AboutDialog(OSystem* osystem, DialogContainer* parent, myDesc[i] = new StaticTextWidget(this, font, 10, 18 + (10 * i), w - 20, font.getFontHeight(), "", kTextAlignLeft); } + + addToFocusList(wid); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/stella/src/gui/AudioDialog.cxx b/stella/src/gui/AudioDialog.cxx index 46f0f65c6..ee5802b57 100644 --- a/stella/src/gui/AudioDialog.cxx +++ b/stella/src/gui/AudioDialog.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: AudioDialog.cxx,v 1.18 2006-02-22 17:38:04 stephena Exp $ +// $Id: AudioDialog.cxx,v 1.19 2006-05-04 17:45:25 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -44,6 +44,7 @@ AudioDialog::AudioDialog(OSystem* osystem, DialogContainer* parent, int xpos, ypos; int lwidth = font.getStringWidth("Fragment Size: "), pwidth = font.getStringWidth("4096"); + WidgetArray wid; // Volume xpos = (w - lwidth - pwidth - 40) / 2; ypos = 10; @@ -51,6 +52,7 @@ AudioDialog::AudioDialog(OSystem* osystem, DialogContainer* parent, myVolumeSlider = new SliderWidget(this, font, xpos, ypos, 30, lineHeight, "Volume: ", lwidth, kVolumeChanged); myVolumeSlider->setMinValue(1); myVolumeSlider->setMaxValue(100); + wid.push_back(myVolumeSlider); myVolumeLabel = new StaticTextWidget(this, font, xpos + myVolumeSlider->getWidth() + 4, ypos + 1, @@ -68,27 +70,38 @@ AudioDialog::AudioDialog(OSystem* osystem, DialogContainer* parent, myFragsizePopup->appendEntry("1024", 3); myFragsizePopup->appendEntry("2048", 4); myFragsizePopup->appendEntry("4096", 5); + wid.push_back(myFragsizePopup); ypos += lineHeight + 4; // Stereo sound mySoundTypeCheckbox = new CheckboxWidget(this, font, xpos+28, ypos, "Stereo mode", 0); + wid.push_back(mySoundTypeCheckbox); ypos += lineHeight + 4; // Enable sound mySoundEnableCheckbox = new CheckboxWidget(this, font, xpos+28, ypos, "Enable sound", kSoundEnableChanged); + wid.push_back(mySoundEnableCheckbox); ypos += lineHeight + 12; // Add Defaults, OK and Cancel buttons - addButton(font, 10, _h - 24, "Defaults", kDefaultsCmd, 0); + ButtonWidget* b; + b = addButton(font, 10, _h - 24, "Defaults", kDefaultsCmd); + wid.push_back(b); #ifndef MAC_OSX - addButton(font, _w - 2 * (kButtonWidth + 7), _h - 24, "OK", kOKCmd, 0); - addButton(font, _w - (kButtonWidth + 10), _h - 24, "Cancel", kCloseCmd, 0); + b = addButton(font, _w - 2 * (kButtonWidth + 7), _h - 24, "OK", kOKCmd); + wid.push_back(b); + b = addButton(font, _w - (kButtonWidth + 10), _h - 24, "Cancel", kCloseCmd); + wid.push_back(b); #else - addButton(font, _w - 2 * (kButtonWidth + 7), _h - 24, "Cancel", kCloseCmd, 0); - addButton(font, _w - (kButtonWidth + 10), _h - 24, "OK", kOKCmd, 0); + b = addButton(font, _w - 2 * (kButtonWidth + 7), _h - 24, "Cancel", kCloseCmd); + wid.push_back(b); + b = addButton(font, _w - (kButtonWidth + 10), _h - 24, "OK", kOKCmd); + wid.push_back(b); #endif + + addToFocusList(wid); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/stella/src/gui/BrowserDialog.cxx b/stella/src/gui/BrowserDialog.cxx index efc8ab164..f82375b42 100644 --- a/stella/src/gui/BrowserDialog.cxx +++ b/stella/src/gui/BrowserDialog.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: BrowserDialog.cxx,v 1.18 2006-03-20 13:23:13 stephena Exp $ +// $Id: BrowserDialog.cxx,v 1.19 2006-05-04 17:45:25 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -49,6 +49,7 @@ BrowserDialog::BrowserDialog(GuiObject* boss, const GUI::Font& font, bwidth = font.getStringWidth("Cancel") + 20, bheight = font.getLineHeight() + 4; int xpos, ypos; + ButtonWidget* b; xpos = 10; ypos = 4; _title = new StaticTextWidget(this, font, xpos, ypos, @@ -67,28 +68,33 @@ BrowserDialog::BrowserDialog(GuiObject* boss, const GUI::Font& font, _w - 2 * xpos, _h - bheight - ypos - 15); _fileList->setNumberingMode(kListNumberingOff); _fileList->setEditable(false); - _fileList->setFlags(WIDGET_NODRAW_FOCUS); - addFocusWidget(_fileList); // Buttons xpos = 10; ypos = _h - bheight - 8; - _goUpButton = new ButtonWidget(this, font, xpos, ypos, bwidth, bheight, - "Go up", kGoUpCmd, 0); + b = _goUpButton = new ButtonWidget(this, font, xpos, ypos, bwidth, bheight, + "Go up", kGoUpCmd); + addFocusWidget(b); #ifndef MAC_OSX xpos = _w - 2 *(bwidth + 10); - new ButtonWidget(this, font, xpos, ypos, bwidth, bheight, "Choose", - kChooseCmd, 0); + b = new ButtonWidget(this, font, xpos, ypos, bwidth, bheight, "Choose", + kChooseCmd); + addFocusWidget(b); xpos += bwidth + 10; - new ButtonWidget(this, font, xpos, ypos, bwidth, bheight, "Cancel", - kCloseCmd, 0); + b = new ButtonWidget(this, font, xpos, ypos, bwidth, bheight, "Cancel", + kCloseCmd); + addFocusWidget(b); #else xpos = _w - 2 *(bwidth + 10); ypos = _h - bheight - 8; - new ButtonWidget(this, font, xpos, ypos, bwidth, bheight, "Cancel", - kCloseCmd, 0); + b = new ButtonWidget(this, font, xpos, ypos, bwidth, bheight, "Cancel", + kCloseCmd); + addFocusWidget(b); xpos += bwidth + 10; - new ButtonWidget(this, font, xpos, ypos, bwidth, bheight, "Choose", - kChooseCmd, 0); + b = new ButtonWidget(this, font, xpos, ypos, bwidth, bheight, "Choose", + kChooseCmd); + addFocusWidget(b); #endif + + addFocusWidget(_fileList); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/stella/src/gui/CheckListWidget.cxx b/stella/src/gui/CheckListWidget.cxx index 74d6ecc7e..4a90476dc 100644 --- a/stella/src/gui/CheckListWidget.cxx +++ b/stella/src/gui/CheckListWidget.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: CheckListWidget.cxx,v 1.10 2006-02-22 17:38:04 stephena Exp $ +// $Id: CheckListWidget.cxx,v 1.11 2006-05-04 17:45:25 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -41,7 +41,6 @@ CheckListWidget::CheckListWidget(GuiObject* boss, const GUI::Font& font, t = new CheckboxWidget(boss, font, _x + 2, ypos, "", kCheckActionCmd); t->setTarget(this); t->setID(i); - t->holdFocus(false); ypos += _fontHeight; _checkList.push_back(t); @@ -190,6 +189,23 @@ bool CheckListWidget::getState(int line) return false; } +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +bool CheckListWidget::handleEvent(Event::Type e) +{ + switch(e) + { + case Event::UISelect: + // Simulate a mouse button click + _checkList[ListWidget::getSelected()]->handleMouseUp(0, 0, 1, 0); + return true; + break; + + default: + return ListWidget::handleEvent(e); + break; + } +} + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void CheckListWidget::handleCommand(CommandSender* sender, int cmd, int data, int id) @@ -209,5 +225,6 @@ void CheckListWidget::handleCommand(CommandSender* sender, int cmd, default: ListWidget::handleCommand(sender, cmd, data, id); + break; } } diff --git a/stella/src/gui/CheckListWidget.hxx b/stella/src/gui/CheckListWidget.hxx index 524978821..5e87f0b47 100644 --- a/stella/src/gui/CheckListWidget.hxx +++ b/stella/src/gui/CheckListWidget.hxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: CheckListWidget.hxx,v 1.8 2005-12-09 01:16:13 stephena Exp $ +// $Id: CheckListWidget.hxx,v 1.9 2006-05-04 17:45:25 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -54,6 +54,7 @@ class CheckListWidget : public ListWidget bool getState(int line); bool getSelectedState() { return getState(_selectedItem); } + bool handleEvent(Event::Type e); void handleCommand(CommandSender* sender, int cmd, int data, int id); protected: diff --git a/stella/src/gui/CommandDialog.cxx b/stella/src/gui/CommandDialog.cxx index cbbd0368c..66bd3c719 100644 --- a/stella/src/gui/CommandDialog.cxx +++ b/stella/src/gui/CommandDialog.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: CommandDialog.cxx,v 1.8 2006-02-22 17:38:04 stephena Exp $ +// $Id: CommandDialog.cxx,v 1.9 2006-05-04 17:45:25 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -49,89 +49,73 @@ CommandDialog::CommandDialog(OSystem* osystem, DialogContainer* parent) ButtonWidget* b; b = new ButtonWidget(this, font, xoffset, yoffset, buttonWidth, buttonHeight, - "Select", kSelectCmd, 0); - b->setEditable(true); + "Select", kSelectCmd); wid.push_back(b); xoffset += lwidth; b = new ButtonWidget(this, font, xoffset, yoffset, buttonWidth, buttonHeight, - "Reset", kResetCmd, 0); - b->setEditable(true); + "Reset", kResetCmd); wid.push_back(b); xoffset += lwidth; b = new ButtonWidget(this, font, xoffset, yoffset, buttonWidth, buttonHeight, - "Color TV", kColorCmd, 0); - b->setEditable(true); + "Color TV", kColorCmd); wid.push_back(b); xoffset += lwidth; b = new ButtonWidget(this, font, xoffset, yoffset, buttonWidth, buttonHeight, - "B/W TV", kBWCmd, 0); - b->setEditable(true); + "B/W TV", kBWCmd); wid.push_back(b); xoffset = 5; yoffset += buttonHeight + 5; b = new ButtonWidget(this, font, xoffset, yoffset, buttonWidth, buttonHeight, - "Left Diff A", kLeftDiffACmd, 0); - b->setEditable(true); + "Left Diff A", kLeftDiffACmd); wid.push_back(b); xoffset += lwidth; b = new ButtonWidget(this, font, xoffset, yoffset, buttonWidth, buttonHeight, - "Left Diff B", kLeftDiffBCmd, 0); - b->setEditable(true); + "Left Diff B", kLeftDiffBCmd); wid.push_back(b); xoffset += lwidth; b = new ButtonWidget(this, font, xoffset, yoffset, buttonWidth, buttonHeight, - "Right Diff A", kRightDiffACmd, 0); - b->setEditable(true); + "Right Diff A", kRightDiffACmd); wid.push_back(b); xoffset += lwidth; b = new ButtonWidget(this, font, xoffset, yoffset, buttonWidth, buttonHeight, - "Right Diff B", kRightDiffBCmd, 0); - b->setEditable(true); + "Right Diff B", kRightDiffBCmd); wid.push_back(b); xoffset = 5; yoffset += buttonHeight + 5; b = new ButtonWidget(this, font, xoffset, yoffset, buttonWidth, buttonHeight, - "Save State", kSaveStateCmd, 0); - b->setEditable(true); + "Save State", kSaveStateCmd); wid.push_back(b); xoffset += lwidth; b = new ButtonWidget(this, font, xoffset, yoffset, buttonWidth, buttonHeight, - "State Slot", kStateSlotCmd, 0); - b->setEditable(true); + "State Slot", kStateSlotCmd); wid.push_back(b); xoffset += lwidth; b = new ButtonWidget(this, font, xoffset, yoffset, buttonWidth, buttonHeight, - "Load State", kLoadStateCmd, 0); - b->setEditable(true); + "Load State", kLoadStateCmd); wid.push_back(b); xoffset += lwidth; b = new ButtonWidget(this, font, xoffset, yoffset, buttonWidth, buttonHeight, - "Snapshot", kSnapshotCmd, 0); - b->setEditable(true); + "Snapshot", kSnapshotCmd); wid.push_back(b); xoffset = 5; yoffset += buttonHeight + 5; b = new ButtonWidget(this, font, xoffset, yoffset, buttonWidth, buttonHeight, - "NTSC/PAL", kFormatCmd, 0); - b->setEditable(true); + "NTSC/PAL", kFormatCmd); wid.push_back(b); xoffset += lwidth; b = new ButtonWidget(this, font, xoffset, yoffset, buttonWidth, buttonHeight, - "Palette", kPaletteCmd, 0); - b->setEditable(true); + "Palette", kPaletteCmd); wid.push_back(b); xoffset += lwidth; b = new ButtonWidget(this, font, xoffset, yoffset, buttonWidth, buttonHeight, - "Reload ROM", kReloadRomCmd, 0); - b->setEditable(true); + "Reload ROM", kReloadRomCmd); wid.push_back(b); xoffset += lwidth; b = new ButtonWidget(this, font, xoffset, yoffset, buttonWidth, buttonHeight, - "Exit Game", kExitCmd, 0); - b->setEditable(true); + "Exit Game", kExitCmd); wid.push_back(b); addToFocusList(wid); @@ -142,100 +126,6 @@ CommandDialog::~CommandDialog() { } -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void CommandDialog::handleKeyDown(int ascii, int keycode, int modifiers) -{ - bool handled = true; - int row = mySelectedItem / kNumRows, - col = mySelectedItem - (row * kNumCols); - - // Only detect the cursor keys, otherwise pass to base class - switch(ascii) - { - case kCursorUp: - if (row > 0) - --row; - else if(col > 0) - { - row = kNumRows - 1; - --col; - } - break; - - case kCursorDown: - if (row < kNumRows - 1) - ++row; - else if(col < kNumCols - 1) - { - row = 0; - ++col; - } - break; - - case kCursorLeft: - if (col > 0) - --col; - else if(row > 0) - { - col = kNumCols - 1; - --row; - } - break; - - case kCursorRight: - if (col < kNumCols - 1) - ++col; - else if(row < kNumRows - 1) - { - col = 0; - ++row; - } - break; - - default: - handled = false; - break; - } - - if(handled) - { - mySelectedItem = row * kNumCols + col; - Dialog::setFocus(getFocusList()[mySelectedItem]); - } - else - Dialog::handleKeyDown(ascii, keycode, modifiers); -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void CommandDialog::handleJoyAxis(int stick, int axis, int value) -{ - if(!parent()->joymouse()) - return; - - // We make the (hopefully) valid assumption that all joysticks - // treat axis the same way. Eventually, we may need to remap - // these actions of this assumption is invalid. - // TODO - make this work better with analog axes ... - int key = -1; - if(axis % 2 == 0) // x-direction - { - if(value < 0) - key = kCursorLeft; - else if(value > 0) - key = kCursorRight; - } - else // y-direction - { - if(value < 0) - key = kCursorUp; - else if(value > 0) - key = kCursorDown; - } - - if(key != -1) - handleKeyDown(key, 0, 0); -} - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void CommandDialog::handleCommand(CommandSender* sender, int cmd, int data, int id) diff --git a/stella/src/gui/CommandDialog.hxx b/stella/src/gui/CommandDialog.hxx index b13bbb709..6b7a2c03d 100644 --- a/stella/src/gui/CommandDialog.hxx +++ b/stella/src/gui/CommandDialog.hxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: CommandDialog.hxx,v 1.4 2006-01-04 01:24:17 stephena Exp $ +// $Id: CommandDialog.hxx,v 1.5 2006-05-04 17:45:25 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -36,12 +36,8 @@ class CommandDialog : public Dialog ~CommandDialog(); protected: - virtual void handleKeyDown(int ascii, int keycode, int modifiers); - virtual void handleJoyAxis(int stick, int axis, int value); virtual void handleCommand(CommandSender* sender, int cmd, int data, int id); - virtual bool wantsEvents() { return true; } - private: int mySelectedItem; diff --git a/stella/src/gui/Dialog.cxx b/stella/src/gui/Dialog.cxx index e536bedd1..f89da3afa 100644 --- a/stella/src/gui/Dialog.cxx +++ b/stella/src/gui/Dialog.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: Dialog.cxx,v 1.43 2006-03-02 13:10:53 stephena Exp $ +// $Id: Dialog.cxx,v 1.44 2006-05-04 17:45:25 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -98,6 +98,10 @@ void Dialog::releaseFocus() // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void Dialog::addFocusWidget(Widget* w) { + // All focusable widgets should retain focus + if(w) + w->setFlags(WIDGET_RETAIN_FOCUS); + if(_ourFocusList.size() == 0) { Focus f; @@ -111,6 +115,10 @@ void Dialog::addFocusWidget(Widget* w) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void Dialog::addToFocusList(WidgetArray& list, int id) { + // All focusable widgets should retain focus + for(unsigned int i = 0; i < list.size(); ++i) + list[i]->setFlags(WIDGET_RETAIN_FOCUS); + id++; // Arrays start at 0, not -1. // Make sure the array is large enough @@ -125,7 +133,7 @@ void Dialog::addToFocusList(WidgetArray& list, int id) if(id == 0 && _ourFocusList.size() > 0) _focusList = _ourFocusList[0].focusList; - if(list.size() > 0 && !(list[0]->getFlags() & WIDGET_NODRAW_FOCUS)) + if(list.size() > 0) _ourFocusList[id].focusedWidget = list[0]; } @@ -186,12 +194,6 @@ void Dialog::redrawFocus() _focusedWidget = Widget::setFocusForChain(this, getFocusList(), _focusedWidget, 0); } -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool Dialog::wantsEvents() -{ - return _focusedWidget && _focusedWidget->wantsEvents(); -} - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void Dialog::draw() { @@ -290,41 +292,79 @@ void Dialog::handleKeyDown(int ascii, int keycode, int modifiers) // Shift-left/shift-right cursor selects next tab // Tab sets next widget in current tab // Shift-Tab sets previous widget in current tab - // - // Widgets are only cycled if currently focused key hasn't claimed - // the TAB key - // TODO - figure out workaround for this - if(_ourTab && instance()->eventHandler().kbdShift(modifiers)) - { - // these key-combos are never passed to the child widget - if(ascii == 256 + 20) // left arrow - { - _ourTab->cycleTab(-1); - return; - } - else if(ascii == 256 + 19) // right arrow - { - _ourTab->cycleTab(+1); - return; - } - } + Event::Type e = Event::NoType; - if(keycode == 9) // tab key + // Detect selection of previous and next tab headers and objects + // For some strange reason, 'tab' needs to be interpreted as keycode, + // not ascii?? + if(instance()->eventHandler().kbdShift(modifiers)) { - if(_focusedWidget && !(_focusedWidget->getFlags() & WIDGET_WANTS_TAB)) - { - if(instance()->eventHandler().kbdShift(modifiers)) + if(ascii == 256+20) // left arrow + e = Event::UITabPrev; + else if(ascii == 256+19) // right arrow + e = Event::UITabNext; + else if(keycode == 9) // tab + e = Event::UINavPrev; + } + else if(keycode == 9) // tab + e = Event::UINavNext; + + // Check the keytable now, since we might get one of the above events, + // which must always be processed before any widget sees it. + bool handled = false; + if(e == Event::NoType) + e = instance()->eventHandler().eventForKey(ascii, kMenuOverlay); + + switch(e) + { + case Event::UITabPrev: + if(_ourTab) + { + _ourTab->cycleTab(-1); + handled = true; + } + break; + + case Event::UITabNext: + if(_ourTab) + { + _ourTab->cycleTab(+1); + handled = true; + } + break; + + case Event::UINavPrev: + if(_focusedWidget && !_focusedWidget->wantsTab()) + { _focusedWidget = Widget::setFocusForChain(this, getFocusList(), _focusedWidget, -1); - else + handled = true; + } + break; + + case Event::UINavNext: + if(_focusedWidget && !_focusedWidget->wantsTab()) + { _focusedWidget = Widget::setFocusForChain(this, getFocusList(), _focusedWidget, +1); - return; // this key-combo is never passed to the child widget - } + handled = true; + } + break; + + default: + handled = false; + break; } - if (_focusedWidget) - _focusedWidget->handleKeyDown(ascii, keycode, modifiers); + // Unless a widget has claimed all responsibility for data, we assume + // that if an event exists for the given data, it should have priority. + if(!handled && _focusedWidget) + { + if(_focusedWidget->wantsRaw() || e == Event::NoType) + _focusedWidget->handleKeyDown(ascii, keycode, modifiers); + else + _focusedWidget->handleEvent(e); + } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -388,9 +428,18 @@ void Dialog::handleMouseMoved(int x, int y, int button) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void Dialog::handleJoyDown(int stick, int button) { - // Focused widget receives joystick events - if(_focusedWidget) - _focusedWidget->handleJoyDown(stick, button); + Event::Type e = Event::NoType; // FIXME - do a lookup + bool handled = false; // isNavigation(e); + + // Unless a widget has claimed all responsibility for data, we assume + // that if an event exists for the given data, it should have priority. + if(!handled && _focusedWidget) + { + if(_focusedWidget->wantsRaw() || e == Event::NoType) + _focusedWidget->handleJoyDown(stick, button); + else + _focusedWidget->handleEvent(e); + } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -404,16 +453,36 @@ void Dialog::handleJoyUp(int stick, int button) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void Dialog::handleJoyAxis(int stick, int axis, int value) { - // Focused widget receives joystick events - if(_focusedWidget) - _focusedWidget->handleJoyAxis(stick, axis, value); + Event::Type e = Event::NoType; // FIXME - do a lookup + bool handled = false; // isNavigation(e); + + // Unless a widget has claimed all responsibility for data, we assume + // that if an event exists for the given data, it should have priority. + if(!handled && _focusedWidget) + { + if(_focusedWidget->wantsRaw() || e == Event::NoType) + _focusedWidget->handleJoyAxis(stick, axis, value); + else + _focusedWidget->handleEvent(e); + } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bool Dialog::handleJoyHat(int stick, int hat, int value) { - // Focused widget receives joystick events - return (_focusedWidget && _focusedWidget->handleJoyHat(stick, hat, value)); + Event::Type e = Event::NoType; // FIXME - do a lookup + bool handled = false; // isNavigation(e); + + // Unless a widget has claimed all responsibility for data, we assume + // that if an event exists for the given data, it should have priority. + if(!handled && _focusedWidget) + { + if(_focusedWidget->wantsRaw() || e == Event::NoType) + return _focusedWidget->handleJoyHat(stick, hat, value); + else + return _focusedWidget->handleEvent(e); + } + return handled; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -444,14 +513,14 @@ Widget* Dialog::findWidget(int x, int y) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ButtonWidget* Dialog::addButton(const GUI::Font& font, int x, int y, - const string& label, int cmd, char hotkey) + const string& label, int cmd) { #if 0 const int w = 6 * font.getMaxCharWidth(), h = font.getFontHeight() + 6; - return new ButtonWidget(this, font, x, y, w, h, label, cmd, hotkey); + return new ButtonWidget(this, font, x, y, w, h, label, cmd); #else - return new ButtonWidget(this, font, x, y, kButtonWidth, 16, label, cmd, hotkey); + return new ButtonWidget(this, font, x, y, kButtonWidth, 16, label, cmd); #endif } diff --git a/stella/src/gui/Dialog.hxx b/stella/src/gui/Dialog.hxx index cb2be3017..83aed0be8 100644 --- a/stella/src/gui/Dialog.hxx +++ b/stella/src/gui/Dialog.hxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: Dialog.hxx,v 1.28 2006-03-02 13:10:53 stephena Exp $ +// $Id: Dialog.hxx,v 1.29 2006-05-04 17:45:25 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -36,7 +36,7 @@ class TabWidget; This is the base class for all dialog boxes. @author Stephen Anthony - @version $Id: Dialog.hxx,v 1.28 2006-03-02 13:10:53 stephena Exp $ + @version $Id: Dialog.hxx,v 1.29 2006-05-04 17:45:25 stephena Exp $ */ class Dialog : public GuiObject { @@ -86,13 +86,10 @@ class Dialog : public GuiObject virtual void handleCommand(CommandSender* sender, int cmd, int data, int id); virtual void handleScreenChanged() {} - /** The dialog wants all events */ - virtual bool wantsEvents(); - Widget* findWidget(int x, int y); // Find the widget at pos x,y if any ButtonWidget* addButton(const GUI::Font& font, int x, int y, - const string& label = "", int cmd = 0, char hotkey = 0); + const string& label = "", int cmd = 0); void setResult(int result) { _result = result; } int getResult() const { return _result; } diff --git a/stella/src/gui/DialogContainer.cxx b/stella/src/gui/DialogContainer.cxx index 2608939ef..317cb843c 100644 --- a/stella/src/gui/DialogContainer.cxx +++ b/stella/src/gui/DialogContainer.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: DialogContainer.cxx,v 1.31 2006-03-02 13:10:53 stephena Exp $ +// $Id: DialogContainer.cxx,v 1.32 2006-05-04 17:45:25 stephena Exp $ //============================================================================ #include "OSystem.hxx" @@ -32,10 +32,6 @@ DialogContainer::DialogContainer(OSystem* osystem) myTime(0), myRefreshFlag(false) { - memset(&ourJoyMouse, 0, sizeof(JoyMouse)); - ourJoyMouse.delay_time = 25; - - ourEnableJoyMouseFlag = myOSystem->settings().getBool("joymouse"); reset(); } @@ -73,6 +69,7 @@ void DialogContainer::updateTime(uInt32 time) myClickRepeatTime = myTime + kClickRepeatSustainDelay; } +/* FIXME - make this similar to the key-repeat code above if(ourEnableJoyMouseFlag && myCurrentAxisDown.stick != -1 && myAxisRepeatTime < myTime) { @@ -98,10 +95,7 @@ void DialogContainer::updateTime(uInt32 time) myAxisRepeatTime = myTime + kAxisRepeatSustainDelay / interval; } } - - // Update joy to mouse events - if(ourEnableJoyMouseFlag) - handleJoyMouse(time); +*/ } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -277,16 +271,10 @@ void DialogContainer::handleJoyEvent(int stick, int button, uInt8 state) // Send the event to the dialog box on the top of the stack Dialog* activeDialog = myDialogStack.top(); - if(activeDialog->wantsEvents()) - { - if(state == 1) - activeDialog->handleJoyDown(stick, button); - else - activeDialog->handleJoyUp(stick, button); - } - else if(ourEnableJoyMouseFlag) - myOSystem->eventHandler().createMouseButtonEvent( - ourJoyMouse.x, ourJoyMouse.y, state); + if(state == 1) + activeDialog->handleJoyDown(stick, button); + else + activeDialog->handleJoyUp(stick, button); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -305,57 +293,21 @@ void DialogContainer::handleJoyAxisEvent(int stick, int axis, int value) else value = 0; - if(activeDialog->wantsEvents()) + // Only stop firing events if it's the current stick + if(myCurrentAxisDown.stick == stick && value == 0) { - // Only stop firing events if it's the current key - if(myCurrentAxisDown.stick == stick && value == 0) - { - myCurrentAxisDown.stick = myCurrentAxisDown.axis = -1; - myCurrentAxisDown.count = 0; - } - else - { - // Now account for repeated axis events (press and hold) - myCurrentAxisDown.stick = stick; - myCurrentAxisDown.axis = axis; - myCurrentAxisDown.value = value; - myAxisRepeatTime = myTime + kAxisRepeatInitialDelay; - } - activeDialog->handleJoyAxis(stick, axis, value); - } - else - { - if(axis % 2 == 0) // x-direction - { - if(value != 0) - { - ourJoyMouse.x_vel = (value > 0) ? 1 : -1; - ourJoyMouse.x_down_count = 1; - } - else - { - ourJoyMouse.x_vel = 0; - ourJoyMouse.x_down_count = 0; - } - } - else // y-direction - { - value = -value; - - if(value != 0) - { - ourJoyMouse.y_vel = (-value > 0) ? 1 : -1; - ourJoyMouse.y_down_count = 1; - } - else - { - ourJoyMouse.y_vel = 0; - ourJoyMouse.y_down_count = 0; - } - } myCurrentAxisDown.stick = myCurrentAxisDown.axis = -1; myCurrentAxisDown.count = 0; } + else + { + // Now account for repeated axis events (press and hold) + myCurrentAxisDown.stick = stick; + myCurrentAxisDown.axis = axis; + myCurrentAxisDown.value = value; + myAxisRepeatTime = myTime + kAxisRepeatInitialDelay; + } + activeDialog->handleJoyAxis(stick, axis, value); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -367,126 +319,8 @@ void DialogContainer::handleJoyHatEvent(int stick, int hat, int value) // Send the event to the dialog box on the top of the stack Dialog* activeDialog = myDialogStack.top(); - if(!(activeDialog->wantsEvents() && - activeDialog->handleJoyHat(stick, hat, value))) - { - bool handled = true; - switch(value) - { - case kJHatCentered: - handleJoyAxisEvent(stick, 0, 0); - handleJoyAxisEvent(stick, 1, 0); // axis 0 & 1, 0 ==> OFF - break; - case kJHatUp: - handleJoyAxisEvent(stick, 1, -32767); // axis 1, -value ==> UP - break; - case kJHatLeft: - handleJoyAxisEvent(stick, 0, -32767); // axis 0, -value ==> LEFT - break; - case kJHatDown: - handleJoyAxisEvent(stick, 1, 32767); // axis 1, +value ==> DOWN - break; - case kJHatRight: - handleJoyAxisEvent(stick, 0, 32767); // axis 0, +value ==> RIGHT - break; - default: - handled = false; - } - if(handled) - return; - } -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void DialogContainer::handleJoyMouse(uInt32 time) -{ - bool mouseAccel = true;//false; // TODO - make this a commandline option - int oldX = ourJoyMouse.x, oldY = ourJoyMouse.y; - - if(time >= ourJoyMouse.last_time + ourJoyMouse.delay_time) - { - ourJoyMouse.last_time = time; - if(ourJoyMouse.x_down_count == 1) - { - ourJoyMouse.x_down_time = time; - ourJoyMouse.x_down_count = 2; - } - if(ourJoyMouse.y_down_count == 1) - { - ourJoyMouse.y_down_time = time; - ourJoyMouse.y_down_count = 2; - } - - if(ourJoyMouse.x_vel || ourJoyMouse.y_vel) - { - if(ourJoyMouse.x_down_count) - { - if(mouseAccel && time > ourJoyMouse.x_down_time + ourJoyMouse.delay_time * 12) - { - if(ourJoyMouse.x_vel > 0) - ourJoyMouse.x_vel++; - else - ourJoyMouse.x_vel--; - } - else if(time > ourJoyMouse.x_down_time + ourJoyMouse.delay_time * 8) - { - if(ourJoyMouse.x_vel > 0) - ourJoyMouse.x_vel = ourJoyMouse.amt; - else - ourJoyMouse.x_vel = -ourJoyMouse.amt; - } - } - if(ourJoyMouse.y_down_count) - { - if(mouseAccel && time > ourJoyMouse.y_down_time + ourJoyMouse.delay_time * 12) - { - if(ourJoyMouse.y_vel > 0) - ourJoyMouse.y_vel++; - else - ourJoyMouse.y_vel--; - } - else if(time > ourJoyMouse.y_down_time + ourJoyMouse.delay_time * 8) - { - if(ourJoyMouse.y_vel > 0) - ourJoyMouse.y_vel = ourJoyMouse.amt; - else - ourJoyMouse.y_vel = -ourJoyMouse.amt; - } - } - - ourJoyMouse.x += ourJoyMouse.x_vel; - ourJoyMouse.y += ourJoyMouse.y_vel; - - if(ourJoyMouse.x < 0) - { - ourJoyMouse.x = 0; - ourJoyMouse.x_vel = -1; - ourJoyMouse.x_down_count = 1; - } - else if(ourJoyMouse.x > ourJoyMouse.x_max) - { - ourJoyMouse.x = ourJoyMouse.x_max; - ourJoyMouse.x_vel = 1; - ourJoyMouse.x_down_count = 1; - } - - if(ourJoyMouse.y < 0) - { - ourJoyMouse.y = 0; - ourJoyMouse.y_vel = -1; - ourJoyMouse.y_down_count = 1; - } - else if(ourJoyMouse.y > ourJoyMouse.y_max) - { - ourJoyMouse.y = ourJoyMouse.y_max; - ourJoyMouse.y_vel = 1; - ourJoyMouse.y_down_count = 1; - } - - if(oldX != ourJoyMouse.x || oldY != ourJoyMouse.y) - myOSystem->eventHandler().createMouseMotionEvent(ourJoyMouse.x, ourJoyMouse.y); - } - } + // FIXME - add speedup processing, similar to axis events + activeDialog->handleJoyHat(stick, hat, value); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -500,19 +334,4 @@ void DialogContainer::reset() myCurrentAxisDown.stick = myCurrentAxisDown.axis = -1; myCurrentAxisDown.count = 0; - - int oldX = ourJoyMouse.x, oldY = ourJoyMouse.y; - if(ourJoyMouse.x > ourJoyMouse.x_max) - ourJoyMouse.x = ourJoyMouse.x_max; - if(ourJoyMouse.y > ourJoyMouse.y_max) - ourJoyMouse.y = ourJoyMouse.y_max; - - if(oldX != ourJoyMouse.x || oldY != ourJoyMouse.y) - myOSystem->eventHandler().createMouseMotionEvent(ourJoyMouse.x, ourJoyMouse.y); } - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool DialogContainer::ourEnableJoyMouseFlag; - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -JoyMouse DialogContainer::ourJoyMouse; diff --git a/stella/src/gui/DialogContainer.hxx b/stella/src/gui/DialogContainer.hxx index 3a1418cbe..b58b3a6b2 100644 --- a/stella/src/gui/DialogContainer.hxx +++ b/stella/src/gui/DialogContainer.hxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: DialogContainer.hxx,v 1.16 2006-01-09 16:50:01 stephena Exp $ +// $Id: DialogContainer.hxx,v 1.17 2006-05-04 17:45:25 stephena Exp $ //============================================================================ #ifndef DIALOG_CONTAINER_HXX @@ -37,7 +37,7 @@ typedef FixedStack DialogStack; a stack, and handles their events. @author Stephen Anthony - @version $Id: DialogContainer.hxx,v 1.16 2006-01-09 16:50:01 stephena Exp $ + @version $Id: DialogContainer.hxx,v 1.17 2006-05-04 17:45:25 stephena Exp $ */ class DialogContainer { @@ -150,13 +150,7 @@ class DialogContainer */ virtual void initialize() = 0; - /** - Whether joymouse emulation is enabled - */ - static bool joymouse() { return ourEnableJoyMouseFlag; } - private: - void handleJoyMouse(uInt32); void reset(); protected: @@ -211,12 +205,6 @@ class DialogContainer uInt32 time; // Time int count; // How often was it already pressed? } myLastClick; - - // Whether to enable joymouse emulation - static bool ourEnableJoyMouseFlag; - - // Emulation of mouse using joystick axis events - static JoyMouse ourJoyMouse; }; #endif diff --git a/stella/src/gui/EditTextWidget.cxx b/stella/src/gui/EditTextWidget.cxx index 62024580d..a398c4150 100644 --- a/stella/src/gui/EditTextWidget.cxx +++ b/stella/src/gui/EditTextWidget.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: EditTextWidget.cxx,v 1.14 2006-02-22 17:38:04 stephena Exp $ +// $Id: EditTextWidget.cxx,v 1.15 2006-05-04 17:45:25 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -34,6 +34,7 @@ EditTextWidget::EditTextWidget(GuiObject* boss, const GUI::Font& font, _type = kEditTextWidget; _editable = true; + startEditMode(); // We're always in edit mode } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -105,15 +106,18 @@ void EditTextWidget::lostFocusWidget() // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void EditTextWidget::startEditMode() { + EditableWidget::startEditMode(); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void EditTextWidget::endEditMode() { + EditableWidget::endEditMode(); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void EditTextWidget::abortEditMode() { setEditString(_backupString); + EditableWidget::abortEditMode(); } diff --git a/stella/src/gui/EditableWidget.cxx b/stella/src/gui/EditableWidget.cxx index 50fff391a..6e8d4c731 100644 --- a/stella/src/gui/EditableWidget.cxx +++ b/stella/src/gui/EditableWidget.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: EditableWidget.cxx,v 1.17 2006-03-25 00:34:17 stephena Exp $ +// $Id: EditableWidget.cxx,v 1.18 2006-05-04 17:45:25 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -58,6 +58,15 @@ void EditableWidget::setEditString(const string& str) // Make sure the new string is seen onscreen setDirty(); draw(); } +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void EditableWidget::setEditable(bool editable) +{ + _editable = editable; + if(_editable) + setFlags(WIDGET_WANTS_RAWDATA|WIDGET_RETAIN_FOCUS); + else + clearFlags(WIDGET_WANTS_RAWDATA|WIDGET_RETAIN_FOCUS); +} // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bool EditableWidget::tryInsertChar(char c, int pos) diff --git a/stella/src/gui/EditableWidget.hxx b/stella/src/gui/EditableWidget.hxx index e9d754e35..0394fe2d2 100644 --- a/stella/src/gui/EditableWidget.hxx +++ b/stella/src/gui/EditableWidget.hxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: EditableWidget.hxx,v 1.9 2006-02-22 17:38:04 stephena Exp $ +// $Id: EditableWidget.hxx,v 1.10 2006-05-04 17:45:25 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -45,8 +45,8 @@ class EditableWidget : public Widget, public CommandSender virtual void setEditString(const string& str); virtual const string& getEditString() const { return _editString; } - bool isEditable() const { return _editable; } - void setEditable(bool editable) { _editable = editable; } + bool isEditable() const { return _editable; } + void setEditable(bool editable); virtual bool handleKeyDown(int ascii, int keycode, int modifiers); @@ -54,9 +54,9 @@ class EditableWidget : public Widget, public CommandSender virtual bool wantsFocus() { return _editable; } protected: - virtual void startEditMode() = 0; - virtual void endEditMode() = 0; - virtual void abortEditMode() = 0; + virtual void startEditMode() { setFlags(WIDGET_WANTS_RAWDATA); } + virtual void endEditMode() { clearFlags(WIDGET_WANTS_RAWDATA); } + virtual void abortEditMode() { clearFlags(WIDGET_WANTS_RAWDATA); } virtual GUI::Rect getEditRect() const = 0; virtual int getCaretOffset() const; diff --git a/stella/src/gui/EventMappingWidget.cxx b/stella/src/gui/EventMappingWidget.cxx index f1495cc8e..838694c40 100644 --- a/stella/src/gui/EventMappingWidget.cxx +++ b/stella/src/gui/EventMappingWidget.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: EventMappingWidget.cxx,v 1.14 2006-03-05 01:18:42 stephena Exp $ +// $Id: EventMappingWidget.cxx,v 1.15 2006-05-04 17:45:25 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -50,7 +50,6 @@ EventMappingWidget::EventMappingWidget(GuiObject* boss, const GUI::Font& font, myActionsList->setTarget(this); myActionsList->setNumberingMode(kListNumberingOff); myActionsList->setEditable(false); - myActionsList->setFlags(WIDGET_NODRAW_FOCUS); addFocusWidget(myActionsList); // Add remap, erase, cancel and default buttons @@ -58,19 +57,23 @@ EventMappingWidget::EventMappingWidget(GuiObject* boss, const GUI::Font& font, myMapButton = new ButtonWidget(boss, font, xpos, ypos, 50, 16, "Map", kStartMapCmd); myMapButton->setTarget(this); + addFocusWidget(myMapButton); ypos += 20; myEraseButton = new ButtonWidget(boss, font, xpos, ypos, 50, 16, "Erase", kEraseCmd); myEraseButton->setTarget(this); + addFocusWidget(myEraseButton); ypos += 20; myCancelMapButton = new ButtonWidget(boss, font, xpos, ypos, 50, 16, "Cancel", kStopMapCmd); myCancelMapButton->setTarget(this); myCancelMapButton->clearFlags(WIDGET_ENABLED); + addFocusWidget(myCancelMapButton); ypos += 30; myDefaultsButton = new ButtonWidget(boss, font, xpos, ypos, 50, 16, "Defaults", kDefaultsCmd); myDefaultsButton->setTarget(this); + addFocusWidget(myDefaultsButton); // Show message for currently selected event xpos = 10; ypos = 5 + myActionsList->getHeight() + 3; @@ -136,9 +139,9 @@ void EventMappingWidget::startRemapping() myKeyMapping->setColor(kTextColorEm); myKeyMapping->setLabel(buf.str()); - // Make sure that this widget receives all events, - // and they aren't handled anywhere else - myActionsList->setFlags(WIDGET_WANTS_EVENTS); + // Make sure that this widget receives all raw data, before any + // pre-processing occurs + myActionsList->setFlags(WIDGET_WANTS_RAWDATA); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -175,7 +178,7 @@ void EventMappingWidget::stopRemapping() } // Widget is now free to process events normally - myActionsList->clearFlags(WIDGET_WANTS_EVENTS); + myActionsList->clearFlags(WIDGET_WANTS_RAWDATA); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/stella/src/gui/EventMappingWidget.hxx b/stella/src/gui/EventMappingWidget.hxx index 86e07ba5f..5d212bec8 100644 --- a/stella/src/gui/EventMappingWidget.hxx +++ b/stella/src/gui/EventMappingWidget.hxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: EventMappingWidget.hxx,v 1.8 2006-03-02 13:10:53 stephena Exp $ +// $Id: EventMappingWidget.hxx,v 1.9 2006-05-04 17:45:25 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -45,10 +45,10 @@ class EventMappingWidget : public Widget, public CommandSender int x, int y, int w, int h); ~EventMappingWidget(); - virtual bool handleKeyDown(int ascii, int keycode, int modifiers); - virtual void handleJoyDown(int stick, int button); - virtual void handleJoyAxis(int stick, int axis, int value); - virtual bool handleJoyHat(int stick, int hat, int value); + bool handleKeyDown(int ascii, int keycode, int modifiers); + void handleJoyDown(int stick, int button); + void handleJoyAxis(int stick, int axis, int value); + bool handleJoyHat(int stick, int hat, int value); bool remapMode() { return myRemapStatus; } diff --git a/stella/src/gui/GameInfoDialog.cxx b/stella/src/gui/GameInfoDialog.cxx index ad151b67b..5b8b40659 100644 --- a/stella/src/gui/GameInfoDialog.cxx +++ b/stella/src/gui/GameInfoDialog.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: GameInfoDialog.cxx,v 1.24 2006-03-05 01:18:42 stephena Exp $ +// $Id: GameInfoDialog.cxx,v 1.25 2006-05-04 17:45:25 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -47,6 +47,7 @@ GameInfoDialog::GameInfoDialog( // The tab widget xpos = 2; ypos = vBorder; myTab = new TabWidget(this, font, xpos, ypos, _w - 2*xpos, _h - 24 - 2*ypos); + addTabWidget(myTab); // 1) Cartridge properties wid.clear(); @@ -268,13 +269,20 @@ GameInfoDialog::GameInfoDialog( "(*) Requires a ROM reload", kTextAlignLeft); // Add Defaults, OK and Cancel buttons + ButtonWidget* b; + wid.clear(); #ifndef MAC_OSX - addButton(font, _w - 2 * (kButtonWidth + 7), _h - 24, "OK", kOKCmd, 0); - addButton(font, _w - (kButtonWidth + 10), _h - 24, "Cancel", kCloseCmd, 0); + b = addButton(font, _w - 2 * (kButtonWidth + 7), _h - 24, "OK", kOKCmd); + wid.push_back(b); + b = addButton(font, _w - (kButtonWidth + 10), _h - 24, "Cancel", kCloseCmd); + wid.push_back(b); #else - addButton(font, _w - 2 * (kButtonWidth + 7), _h - 24, "Cancel", kCloseCmd, 0); - addButton(font, _w - (kButtonWidth + 10), _h - 24, "OK", kOKCmd, 0); + b = addButton(font, _w - 2 * (kButtonWidth + 7), _h - 24, "Cancel", kCloseCmd); + wid.push_back(b); + b = addButton(font, _w - (kButtonWidth + 10), _h - 24, "OK", kOKCmd); + wid.push_back(b); #endif + addToFocusList(wid); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/stella/src/gui/GuiObject.hxx b/stella/src/gui/GuiObject.hxx index a215d1960..e817c3119 100644 --- a/stella/src/gui/GuiObject.hxx +++ b/stella/src/gui/GuiObject.hxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: GuiObject.hxx,v 1.19 2006-02-22 17:38:04 stephena Exp $ +// $Id: GuiObject.hxx,v 1.20 2006-05-04 17:45:25 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -31,22 +31,11 @@ class Widget; typedef Common::Array WidgetArray; -enum { - kCursorUp = 256+17, - kCursorDown = 256+18, - kCursorRight = 256+19, - kCursorLeft = 256+20, - kCursorHome = 256+22, - kCursorEnd = 256+23, - kCursorPgUp = 256+24, - kCursorPgDn = 256+25 -}; - /** This is the base class for all GUI objects/widgets. @author Stephen Anthony - @version $Id: GuiObject.hxx,v 1.19 2006-02-22 17:38:04 stephena Exp $ + @version $Id: GuiObject.hxx,v 1.20 2006-05-04 17:45:25 stephena Exp $ */ class GuiObject : public CommandReceiver { diff --git a/stella/src/gui/HelpDialog.cxx b/stella/src/gui/HelpDialog.cxx index bad2e9a62..7e5b410eb 100644 --- a/stella/src/gui/HelpDialog.cxx +++ b/stella/src/gui/HelpDialog.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: HelpDialog.cxx,v 1.15 2006-02-22 17:38:04 stephena Exp $ +// $Id: HelpDialog.cxx,v 1.16 2006-05-04 17:45:25 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -34,12 +34,20 @@ HelpDialog::HelpDialog(OSystem* osystem, DialogContainer* parent, myPage(1), myNumPages(4) { + WidgetArray wid; + // Add Previous, Next and Close buttons - myPrevButton = addButton(font, 10, h - 24, "Previous", kPrevCmd, 'P'); - myNextButton = addButton(font, (kButtonWidth + 15), h - 24, - "Next", kNextCmd, 'N'); - addButton(font, w - (kButtonWidth + 10), h - 24, "Close", kCloseCmd, 'C'); + myPrevButton = addButton(font, 10, h - 24, "Previous", kPrevCmd); myPrevButton->clearFlags(WIDGET_ENABLED); + wid.push_back(myPrevButton); + + myNextButton = addButton(font, (kButtonWidth + 15), h - 24, + "Next", kNextCmd); + wid.push_back(myNextButton); + + ButtonWidget* b = addButton(font, w - (kButtonWidth + 10), h - 24, + "Close", kCloseCmd); + wid.push_back(b); myTitle = new StaticTextWidget(this, font, 5, 5, w - 10, font.getFontHeight(), "", kTextAlignCenter); @@ -50,6 +58,8 @@ HelpDialog::HelpDialog(OSystem* osystem, DialogContainer* parent, myDesc[i] = new StaticTextWidget(this, font, 90, 18 + (10 * i), 160, font.getFontHeight(), "", kTextAlignLeft); } + + addToFocusList(wid); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/stella/src/gui/InputDialog.cxx b/stella/src/gui/InputDialog.cxx index ae1c10e45..a4e1f76f2 100644 --- a/stella/src/gui/InputDialog.cxx +++ b/stella/src/gui/InputDialog.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: InputDialog.cxx,v 1.13 2006-04-05 12:28:39 stephena Exp $ +// $Id: InputDialog.cxx,v 1.14 2006-05-04 17:45:25 stephena Exp $ //============================================================================ #include "OSystem.hxx" @@ -42,6 +42,7 @@ InputDialog::InputDialog(OSystem* osystem, DialogContainer* parent, { const int vBorder = 4; int xpos, ypos, tabID; + WidgetArray wid; // The tab widget xpos = 2; ypos = vBorder; @@ -64,13 +65,19 @@ InputDialog::InputDialog(OSystem* osystem, DialogContainer* parent, myTab->setActiveTab(0); // Add OK and Cancel buttons + ButtonWidget* b; #ifndef MAC_OSX - addButton(font, _w - 2 * (kButtonWidth + 7), _h - 24, "OK", kOKCmd, 0); - addButton(font, _w - (kButtonWidth + 10), _h - 24, "Cancel", kCloseCmd, 0); + b = addButton(font, _w - 2 * (kButtonWidth + 7), _h - 24, "OK", kOKCmd); + wid.push_back(b); + b = addButton(font, _w - (kButtonWidth + 10), _h - 24, "Cancel", kCloseCmd); + wid.push_back(b); #else - addButton(font, _w - 2 * (kButtonWidth + 7), _h - 24, "Cancel", kCloseCmd, 0); - addButton(font, _w - (kButtonWidth + 10), _h - 24, "OK", kOKCmd, 0); + b = addButton(font, _w - 2 * (kButtonWidth + 7), _h - 24, "Cancel", kCloseCmd); + wid.push_back(b); + b = addButton(font, _w - (kButtonWidth + 10), _h - 24, "OK", kOKCmd); + wid.push_back(b); #endif + addToFocusList(wid); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/stella/src/gui/InputTextDialog.cxx b/stella/src/gui/InputTextDialog.cxx index f273ab603..0f8d1b460 100644 --- a/stella/src/gui/InputTextDialog.cxx +++ b/stella/src/gui/InputTextDialog.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: InputTextDialog.cxx,v 1.12 2006-03-23 16:16:33 stephena Exp $ +// $Id: InputTextDialog.cxx,v 1.13 2006-05-04 17:45:25 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -29,10 +29,6 @@ #include "bspf.hxx" -enum { - kAcceptCmd = 'ACPT' -}; - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - InputTextDialog::InputTextDialog(GuiObject* boss, const GUI::Font& font, const StringList& labels, int x, int y) @@ -46,6 +42,7 @@ InputTextDialog::InputTextDialog(GuiObject* boss, const GUI::Font& font, bwidth = font.getStringWidth(" Cancel "), bheight = font.getLineHeight() + 2; unsigned int xpos, ypos, i, lwidth = 0, maxIdx = 0; + WidgetArray wid; // Calculate real dimensions _w = fontWidth * 25; @@ -63,7 +60,6 @@ InputTextDialog::InputTextDialog(GuiObject* boss, const GUI::Font& font, lwidth = font.getStringWidth(labels[maxIdx]); // Create editboxes for all labels - WidgetArray wid; ypos = lineHeight; for(i = 0; i < labels.size(); ++i) { @@ -80,24 +76,30 @@ InputTextDialog::InputTextDialog(GuiObject* boss, const GUI::Font& font, myInput.push_back(w); ypos += lineHeight + 5; } - addToFocusList(wid); xpos = 10; myTitle = new StaticTextWidget(this, font, xpos, ypos, _w - 2*xpos, fontHeight, "", kTextAlignCenter); myTitle->setColor(kTextColorEm); + ButtonWidget* b; #ifndef MAC_OSX - new ButtonWidget(this, font, _w - 2 * (bwidth + 10), _h - bheight - 10, - bwidth, bheight, "OK", kAcceptCmd, 0); - new ButtonWidget(this, font, _w - (bwidth + 10), _h - bheight - 10, - bwidth, bheight, "Cancel", kCloseCmd, 0); + b = new ButtonWidget(this, font, _w - 2 * (bwidth + 10), _h - bheight - 10, + bwidth, bheight, "OK", kAcceptCmd); + wid.push_back(b); + b = new ButtonWidget(this, font, _w - (bwidth + 10), _h - bheight - 10, + bwidth, bheight, "Cancel", kCloseCmd); + wid.push_back(b); #else - new ButtonWidget(this, font, _w - 2 * (bwidth + 10), _h - bheight - 10, - bwidth, bheight, "Cancel", kCloseCmd, 0); - new ButtonWidget(this, font, _w - (bwidth + 10), _h - bheight - 10, - bwidth, bheight, "OK", kAcceptCmd, 0); + b = new ButtonWidget(this, font, _w - 2 * (bwidth + 10), _h - bheight - 10, + bwidth, bheight, "Cancel", kCloseCmd); + wid.push_back(b); + b = new ButtonWidget(this, font, _w - (bwidth + 10), _h - bheight - 10, + bwidth, bheight, "OK", kAcceptCmd); + wid.push_back(b); #endif + + addToFocusList(wid); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/stella/src/gui/InputTextDialog.hxx b/stella/src/gui/InputTextDialog.hxx index ddcd1488d..7bedde1e1 100644 --- a/stella/src/gui/InputTextDialog.hxx +++ b/stella/src/gui/InputTextDialog.hxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: InputTextDialog.hxx,v 1.6 2005-12-20 00:56:31 stephena Exp $ +// $Id: InputTextDialog.hxx,v 1.7 2006-05-04 17:45:25 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -56,6 +56,10 @@ class InputTextDialog : public Dialog, public CommandSender bool myErrorFlag; int myCmd; + + enum { + kAcceptCmd = 'ACPT' + }; }; #endif diff --git a/stella/src/gui/LauncherDialog.cxx b/stella/src/gui/LauncherDialog.cxx index cebaf30e6..b23a377aa 100644 --- a/stella/src/gui/LauncherDialog.cxx +++ b/stella/src/gui/LauncherDialog.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: LauncherDialog.cxx,v 1.53 2006-04-12 13:32:06 stephena Exp $ +// $Id: LauncherDialog.cxx,v 1.54 2006-05-04 17:45:25 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -83,8 +83,7 @@ LauncherDialog::LauncherDialog(OSystem* osystem, DialogContainer* parent, _w - 20, _h - 28 - bheight - 2*fontHeight); myList->setNumberingMode(kListNumberingOff); myList->setEditable(false); - myList->setFlags(WIDGET_STICKY_FOCUS); -//wid.push_back(myList); + wid.push_back(myList); // Add note textwidget to show any notes for the currently selected ROM xpos += 5; ypos += myList->getHeight() + 4; @@ -100,45 +99,37 @@ LauncherDialog::LauncherDialog(OSystem* osystem, DialogContainer* parent, xpos = 10; ypos += myNote->getHeight() + 4; #ifndef MAC_OSX myStartButton = new ButtonWidget(this, font, xpos, ypos, bwidth, bheight, - "Select", kStartCmd, 0); - myStartButton->setEditable(true); + "Select", kStartCmd); wid.push_back(myStartButton); xpos += bwidth + 8; myPrevDirButton = new ButtonWidget(this, font, xpos, ypos, bwidth, bheight, - "Go Up", kPrevDirCmd, 0); - myPrevDirButton->setEditable(true); + "Go Up", kPrevDirCmd); wid.push_back(myPrevDirButton); xpos += bwidth + 8; myOptionsButton = new ButtonWidget(this, font, xpos, ypos, bwidth, bheight, - "Options", kOptionsCmd, 0); - myOptionsButton->setEditable(true); + "Options", kOptionsCmd); wid.push_back(myOptionsButton); xpos += bwidth + 8; myQuitButton = new ButtonWidget(this, font, xpos, ypos, bwidth, bheight, - "Quit", kQuitCmd, 0); - myQuitButton->setEditable(true); + "Quit", kQuitCmd); wid.push_back(myQuitButton); xpos += bwidth + 8; mySelectedItem = 0; // Highlight 'Select' button #else myQuitButton = new ButtonWidget(this, font, xpos, ypos, bwidth, bheight, - "Quit", kQuitCmd, 0); - myQuitButton->setEditable(true); + "Quit", kQuitCmd); wid.push_back(myQuitButton); xpos += bwidth + 8; myOptionsButton = new ButtonWidget(this, font, xpos, ypos, bwidth, bheight, - "Options", kOptionsCmd, 0); - myOptionsButton->setEditable(true); + "Options", kOptionsCmd); wid.push_back(myOptionsButton); xpos += bwidth + 8; myPrevDirButton = new ButtonWidget(this, font, xpos, ypos, bwidth, bheight, - "Go Up", kPrevDirCmd, 0); - myPrevDirButton->setEditable(true); + "Go Up", kPrevDirCmd); wid.push_back(myPrevDirButton); xpos += bwidth + 8; myStartButton = new ButtonWidget(this, font, xpos, ypos, bwidth, bheight, - "Select", kStartCmd, 0); - myStartButton->setEditable(true); + "Select", kStartCmd); wid.push_back(myStartButton); xpos += bwidth + 8; mySelectedItem = 3; // Highlight 'Select' button @@ -418,67 +409,6 @@ string LauncherDialog::MD5FromFile(const string& path) return md5; } -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void LauncherDialog::handleKeyDown(int ascii, int keycode, int modifiers) -{ - // Only detect the cursor keys, otherwise pass to base class - switch(ascii) - { - case kCursorLeft: - mySelectedItem--; - if(mySelectedItem < 0) mySelectedItem = 3; - Dialog::setFocus(getFocusList()[mySelectedItem]); - break; - - case kCursorRight: - mySelectedItem++; - if(mySelectedItem > 3) mySelectedItem = 0; - Dialog::setFocus(getFocusList()[mySelectedItem]); - break; - - case ' ': // Used to activate currently focused button - case '\n': - case '\r': - Dialog::handleKeyDown(ascii, keycode, modifiers); - break; - - default: - if(!myList->handleKeyDown(ascii, keycode, modifiers)) - Dialog::handleKeyDown(ascii, keycode, modifiers); - break; - } -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void LauncherDialog::handleJoyAxis(int stick, int axis, int value) -{ - if(!parent()->joymouse()) - return; - - // We make the (hopefully) valid assumption that all joysticks - // treat axis the same way. Eventually, we may need to remap - // these actions of this assumption is invalid. - // TODO - make this work better with analog axes ... - int key = -1; - if(axis % 2 == 0) // x-direction - { - if(value < 0) - key = kCursorLeft; - else if(value > 0) - key = kCursorRight; - } - else // y-direction - { - if(value < 0) - key = kCursorUp; - else if(value > 0) - key = kCursorDown; - } - - if(key != -1) - handleKeyDown(key, 0, 0); -} - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void LauncherDialog::handleCommand(CommandSender* sender, int cmd, int data, int id) diff --git a/stella/src/gui/LauncherDialog.hxx b/stella/src/gui/LauncherDialog.hxx index e4777257c..71438cd49 100644 --- a/stella/src/gui/LauncherDialog.hxx +++ b/stella/src/gui/LauncherDialog.hxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: LauncherDialog.hxx,v 1.20 2006-03-19 23:11:31 stephena Exp $ +// $Id: LauncherDialog.hxx,v 1.21 2006-05-04 17:45:25 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -52,15 +52,11 @@ class LauncherDialog : public Dialog ~LauncherDialog(); protected: - virtual void handleKeyDown(int ascii, int keycode, int modifiers); - virtual void handleJoyAxis(int stick, int axis, int value); virtual void handleCommand(CommandSender* sender, int cmd, int data, int id); void updateListing(bool fullReload = false); void loadConfig(); - virtual bool wantsEvents() { return true; } - protected: ButtonWidget* myStartButton; ButtonWidget* myPrevDirButton; diff --git a/stella/src/gui/LauncherOptionsDialog.cxx b/stella/src/gui/LauncherOptionsDialog.cxx index 9fe240ad9..51ef6a57d 100644 --- a/stella/src/gui/LauncherOptionsDialog.cxx +++ b/stella/src/gui/LauncherOptionsDialog.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: LauncherOptionsDialog.cxx,v 1.16 2006-03-19 20:57:55 stephena Exp $ +// $Id: LauncherOptionsDialog.cxx,v 1.17 2006-05-04 17:45:25 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -39,6 +39,9 @@ LauncherOptionsDialog::LauncherOptionsDialog( { const int vBorder = 4; int xpos, ypos, bwidth, bheight; + WidgetArray wid; + ButtonWidget* b; + int tabID; bwidth = font.getStringWidth("Cancel") + 20; bheight = font.getLineHeight() + 4; @@ -46,14 +49,17 @@ LauncherOptionsDialog::LauncherOptionsDialog( // The tab widget xpos = 2; ypos = vBorder; myTab = new TabWidget(this, font, xpos, ypos, _w - 2*xpos, _h - 2*bheight - ypos); + addTabWidget(myTab); // 1) The ROM locations tab - myTab->addTab("ROM Settings"); + wid.clear(); + tabID = myTab->addTab("ROM Settings"); // ROM path xpos = 15; ypos += 5; - new ButtonWidget(myTab, font, xpos, ypos, bwidth, bheight, "Path", - kChooseRomDirCmd, 0); + b = new ButtonWidget(myTab, font, xpos, ypos, bwidth, bheight, "Path", + kChooseRomDirCmd); + wid.push_back(b); xpos += bwidth + 20; myRomPath = new StaticTextWidget(myTab, font, xpos, ypos + 3, _w - xpos - 10, font.getLineHeight(), @@ -63,22 +69,29 @@ LauncherOptionsDialog::LauncherOptionsDialog( xpos = 30; ypos += myRomPath->getHeight() + 8; myBrowseCheckbox = new CheckboxWidget(myTab, font, xpos, ypos, "Browse folders", kBrowseDirCmd); + wid.push_back(myBrowseCheckbox); // Reload current ROM listing xpos += myBrowseCheckbox->getWidth() + 20; myReloadButton = new ButtonWidget(myTab, font, xpos, ypos-2, font.getStringWidth("Reload ROM Listing") + 20, bheight, - "Reload ROM Listing", kReloadRomDirCmd, 0); - + "Reload ROM Listing", kReloadRomDirCmd); +// myReloadButton->setEditable(true); + wid.push_back(myReloadButton); + + // Add focus widgets for ROM tab + addToFocusList(wid, tabID); // 2) The snapshot settings tab - myTab->addTab(" Snapshot Settings "); + wid.clear(); + tabID = myTab->addTab(" Snapshot Settings "); // Snapshot path xpos = 15; ypos = vBorder + 5; - new ButtonWidget(myTab, font, xpos, ypos, bwidth, bheight, "Path", - kChooseSnapDirCmd, 0); + b = new ButtonWidget(myTab, font, xpos, ypos, bwidth, bheight, "Path", + kChooseSnapDirCmd); + wid.push_back(b); xpos += bwidth + 20; mySnapPath = new StaticTextWidget(myTab, font, xpos, ypos + 3, _w - xpos - 10, font.getLineHeight(), @@ -93,31 +106,39 @@ LauncherOptionsDialog::LauncherOptionsDialog( font.getStringWidth("Save snapshot as: "), 0); mySnapTypePopup->appendEntry("romname", 1); mySnapTypePopup->appendEntry("md5sum", 2); + wid.push_back(mySnapTypePopup); // Snapshot single or multiple saves xpos = 30; ypos += mySnapTypePopup->getHeight() + 5; mySnapSingleCheckbox = new CheckboxWidget(myTab, font, xpos, ypos, "Multiple snapshots"); + wid.push_back(mySnapSingleCheckbox); + + // Add focus widgets for Snapshot tab + addToFocusList(wid, tabID); // Activate the first tab myTab->setActiveTab(0); // Add OK & Cancel buttons + wid.clear(); #ifndef MAC_OSX xpos = _w - 2 *(bwidth + 10); ypos = _h - bheight - 8; - new ButtonWidget(this, font, xpos, ypos, bwidth, bheight, "OK", - kOKCmd, 0); + b = new ButtonWidget(this, font, xpos, ypos, bwidth, bheight, "OK", kOKCmd); + wid.push_back(b); xpos += bwidth + 10; - new ButtonWidget(this, font, xpos, ypos, bwidth, bheight, "Cancel", - kCloseCmd, 0); + b = new ButtonWidget(this, font, xpos, ypos, bwidth, bheight, "Cancel", kCloseCmd); + wid.push_back(b); #else xpos = _w - 2 *(bwidth + 10); ypos = _h - bheight - 8; - new ButtonWidget(this, font, xpos, ypos, bwidth, bheight, "Cancel", - kCloseCmd, 0); + b = new ButtonWidget(this, font, xpos, ypos, bwidth, bheight, "Cancel", kCloseCmd); + wid.push_back(b); xpos += bwidth + 10; - new ButtonWidget(this, font, xpos, ypos, bwidth, bheight, "OK", - kOKCmd, 0); + b = new ButtonWidget(this, font, xpos, ypos, bwidth, bheight, "OK", kOKCmd); + wid.push_back(b); #endif + // Add focus widgets for OK/Cancel buttons + addToFocusList(wid); // Create file browser dialog int baseW = instance()->frameBuffer().baseWidth(); diff --git a/stella/src/gui/ListWidget.cxx b/stella/src/gui/ListWidget.cxx index 2b848f52b..6131157e9 100644 --- a/stella/src/gui/ListWidget.cxx +++ b/stella/src/gui/ListWidget.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: ListWidget.cxx,v 1.41 2006-03-19 22:06:20 stephena Exp $ +// $Id: ListWidget.cxx,v 1.42 2006-05-04 17:45:25 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -137,6 +137,9 @@ void ListWidget::recalc() _scrollBar->_numEntries = _list.size(); _scrollBar->_entriesPerPage = _rows; + + // Reset to normal data entry + abortEditMode(); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -269,48 +272,6 @@ bool ListWidget::handleKeyDown(int ascii, int keycode, int modifiers) } break; - case '\n': // enter/return - case '\r': - if (_selectedItem >= 0) - { - // override continuous enter keydown - if (_editable && (_currentKeyDown != '\n' && _currentKeyDown != '\r')) - startEditMode(); - else - sendCommand(kListItemActivatedCmd, _selectedItem, _id); - } - break; - - case kCursorUp: - if (_selectedItem > 0) - _selectedItem--; - break; - - case kCursorDown: - if (_selectedItem < (int)_list.size() - 1) - _selectedItem++; - break; - - case kCursorPgUp: - _selectedItem -= _rows - 1; - if (_selectedItem < 0) - _selectedItem = 0; - break; - - case kCursorPgDn: - _selectedItem += _rows - 1; - if (_selectedItem >= (int)_list.size() ) - _selectedItem = _list.size() - 1; - break; - - case kCursorHome: - _selectedItem = 0; - break; - - case kCursorEnd: - _selectedItem = _list.size() - 1; - break; - default: handled = false; } @@ -336,10 +297,79 @@ bool ListWidget::handleKeyUp(int ascii, int keycode, int modifiers) return true; } +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +bool ListWidget::handleEvent(Event::Type e) +{ + if(_editMode) + return false; + + bool handled = true; + int oldSelectedItem = _selectedItem; + + switch(e) + { + case Event::UISelect: + if (_selectedItem >= 0) + { + if (_editable) + startEditMode(); + else + sendCommand(kListItemActivatedCmd, _selectedItem, _id); + } + break; + + case Event::UIUp: + if (_selectedItem > 0) + _selectedItem--; + break; + + case Event::UIDown: + if (_selectedItem < (int)_list.size() - 1) + _selectedItem++; + break; + + case Event::UIPgUp: + _selectedItem -= _rows - 1; + if (_selectedItem < 0) + _selectedItem = 0; + break; + + case Event::UIPgDown: + _selectedItem += _rows - 1; + if (_selectedItem >= (int)_list.size() ) + _selectedItem = _list.size() - 1; + break; + + case Event::UIHome: + _selectedItem = 0; + break; + + case Event::UIEnd: + _selectedItem = _list.size() - 1; + break; + + default: + handled = false; + } + + if (_selectedItem != oldSelectedItem) + { + _scrollBar->draw(); + scrollToSelected(); + + sendCommand(kListSelectionChangedCmd, _selectedItem, _id); + } + + return handled; +} + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void ListWidget::lostFocusWidget() { _editMode = false; + + // Reset to normal data entry + abortEditMode(); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -408,6 +438,9 @@ void ListWidget::startEditMode() { _editMode = true; setEditString(_list[_selectedItem]); + + // Widget gets raw data while editing + EditableWidget::startEditMode(); } } @@ -417,16 +450,22 @@ void ListWidget::endEditMode() if (!_editMode) return; - // send a message that editing finished with a return/enter key press + // Send a message that editing finished with a return/enter key press _editMode = false; _list[_selectedItem] = _editString; sendCommand(kListItemDataChangedCmd, _selectedItem, _id); + + // Reset to normal data entry + EditableWidget::endEditMode(); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void ListWidget::abortEditMode() { - // undo any changes made + // Undo any changes made assert(_selectedItem >= 0); _editMode = false; + + // Reset to normal data entry + EditableWidget::abortEditMode(); } diff --git a/stella/src/gui/ListWidget.hxx b/stella/src/gui/ListWidget.hxx index 82f86ba98..98189c9d4 100644 --- a/stella/src/gui/ListWidget.hxx +++ b/stella/src/gui/ListWidget.hxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: ListWidget.hxx,v 1.17 2006-03-19 22:06:20 stephena Exp $ +// $Id: ListWidget.hxx,v 1.18 2006-05-04 17:45:25 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -67,10 +67,10 @@ class ListWidget : public EditableWidget virtual void handleMouseWheel(int x, int y, int direction); virtual bool handleKeyDown(int ascii, int keycode, int modifiers); virtual bool handleKeyUp(int ascii, int keycode, int modifiers); + virtual bool handleEvent(Event::Type e); virtual void handleCommand(CommandSender* sender, int cmd, int data, int id); virtual GUI::Rect getRect() const; - virtual bool wantsFocus() { return !isSticky(); } void startEditMode(); void endEditMode(); diff --git a/stella/src/gui/OptionsDialog.cxx b/stella/src/gui/OptionsDialog.cxx index 78cf71652..221b1d5c1 100644 --- a/stella/src/gui/OptionsDialog.cxx +++ b/stella/src/gui/OptionsDialog.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: OptionsDialog.cxx,v 1.38 2006-04-05 12:28:39 stephena Exp $ +// $Id: OptionsDialog.cxx,v 1.39 2006-05-04 17:45:25 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -56,8 +56,8 @@ enum { kMainMenuHeight = 8 * kRowHeight + 10, }; -#define addBigButton(label, cmd, hotkey) \ - new ButtonWidget(this, font, xoffset, yoffset, kBigButtonWidth, 18, label, cmd, hotkey); yoffset += kRowHeight +#define addBigButton(label, cmd) \ + new ButtonWidget(this, font, xoffset, yoffset, kBigButtonWidth, 18, label, cmd); yoffset += kRowHeight // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OptionsDialog::OptionsDialog(OSystem* osystem, DialogContainer* parent) @@ -77,26 +77,38 @@ OptionsDialog::OptionsDialog(OSystem* osystem, DialogContainer* parent) int yoffset = 7; const int xoffset = (_w - kBigButtonWidth) / 2; const GUI::Font& font = instance()->font(); // FIXME - change reference to optionsFont() + WidgetArray wid; ButtonWidget* b = NULL; - b = addBigButton("Video Settings", kVidCmd, 0); -#ifdef SOUND_SUPPORT - addBigButton("Audio Settings", kAudCmd, 0); -#else - b = addBigButton("Audio Settings", kAudCmd, 0); + b = addBigButton("Video Settings", kVidCmd); + wid.push_back(b); + + b = addBigButton("Audio Settings", kAudCmd); +#ifndef SOUND_SUPPORT b->clearFlags(WIDGET_ENABLED); #endif - addBigButton("Input Settings", kInptCmd, 0); - addBigButton("Game Properties", kInfoCmd, 0); -#ifdef CHEATCODE_SUPPORT - addBigButton("Cheat Code", kCheatCmd, 0); -#else - b = addBigButton("Cheat Code", kCheatCmd, 0); + wid.push_back(b); + + b = addBigButton("Input Settings", kInptCmd); + wid.push_back(b); + + b = addBigButton("Game Properties", kInfoCmd); + wid.push_back(b); + + b = addBigButton("Cheat Code", kCheatCmd); +#ifndef CHEATCODE_SUPPORT b->clearFlags(WIDGET_ENABLED); #endif - addBigButton("Help", kHelpCmd, 0); - addBigButton("About", kAboutCmd, 0); - addBigButton("Exit Menu", kExitCmd, 0); + wid.push_back(b); + + b = addBigButton("Help", kHelpCmd); + wid.push_back(b); + + b = addBigButton("About", kAboutCmd); + wid.push_back(b); + + b = addBigButton("Exit Menu", kExitCmd); + wid.push_back(b); // Set some sane values for the dialog boxes int fbWidth = osystem->frameBuffer().baseWidth(); @@ -133,6 +145,8 @@ OptionsDialog::OptionsDialog(OSystem* osystem, DialogContainer* parent) w = 255; h = 150; checkBounds(fbWidth, fbHeight, &x, &y, &w, &h); myAboutDialog = new AboutDialog(myOSystem, parent, font, x, y, w, h); + + addToFocusList(wid); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/stella/src/gui/PopUpWidget.cxx b/stella/src/gui/PopUpWidget.cxx index 0cbb4824a..37e4898a0 100644 --- a/stella/src/gui/PopUpWidget.cxx +++ b/stella/src/gui/PopUpWidget.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: PopUpWidget.cxx,v 1.24 2006-02-22 17:38:04 stephena Exp $ +// $Id: PopUpWidget.cxx,v 1.25 2006-05-04 17:45:25 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -137,25 +137,43 @@ void PopUpDialog::handleKeyDown(int ascii, int keycode, int modifiers) switch (ascii) { - case '\n': // enter/return - case '\r': - sendSelection(); - break; case 27: // escape cancelSelection(); break; - case 256+17: // up arrow + default: + { + Event::Type e = instance()->eventHandler().eventForKey(ascii, + kMenuOverlay); + handleEvent(e); + break; + } + } +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void PopUpDialog::handleEvent(Event::Type e) +{ + switch(e) + { + case Event::UISelect: + sendSelection(); + break; + case Event::UIUp: + case Event::UILeft: moveUp(); break; - case 256+18: // down arrow + case Event::UIDown: + case Event::UIRight: moveDown(); break; - case 256+22: // home + case Event::UIHome: setSelection(0); break; - case 256+23: // end + case Event::UIEnd: setSelection(_popUpBoss->_entries.size()-1); break; + default: + break; } } @@ -389,8 +407,7 @@ PopUpWidget::PopUpWidget(GuiObject* boss, const GUI::Font& font, _labelWidth(labelWidth), _cmd(cmd) { - _flags = WIDGET_ENABLED | WIDGET_CLEARBG | WIDGET_RETAIN_FOCUS | - WIDGET_NODRAW_FOCUS; + _flags = WIDGET_ENABLED | WIDGET_CLEARBG | WIDGET_RETAIN_FOCUS; _type = kPopUpWidget; _selectedItem = -1; @@ -424,6 +441,19 @@ void PopUpWidget::handleMouseDown(int x, int y, int button, int clickCount) } } +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +bool PopUpWidget::handleEvent(Event::Type e) +{ + switch(e) + { + case Event::UISelect: + handleMouseDown(0, 0, 1, 0); + return true; + default: + return false; + } +} + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void PopUpWidget::appendEntry(const string& entry, int tag) { diff --git a/stella/src/gui/PopUpWidget.hxx b/stella/src/gui/PopUpWidget.hxx index 3dce6e462..7a912299d 100644 --- a/stella/src/gui/PopUpWidget.hxx +++ b/stella/src/gui/PopUpWidget.hxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: PopUpWidget.hxx,v 1.12 2006-02-22 17:38:04 stephena Exp $ +// $Id: PopUpWidget.hxx,v 1.13 2006-05-04 17:45:25 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -65,6 +65,9 @@ class PopUpWidget : public Widget, public CommandSender ~PopUpWidget(); void handleMouseDown(int x, int y, int button, int clickCount); + bool handleEvent(Event::Type e); + + bool wantsFocus() { return true; } void appendEntry(const string& entry, int tag = (int)-1); void clearEntries(); @@ -75,9 +78,12 @@ class PopUpWidget : public Widget, public CommandSender /** Select the first entry matching the given tag. */ void setSelectedTag(int tag); - int getSelected() const { return _selectedItem; } - int getSelectedTag() const { return (_selectedItem >= 0) ? _entries[_selectedItem].tag : (int)-1; } - const string& getSelectedString() const { return (_selectedItem >= 0) ? _entries[_selectedItem].name : EmptyString; } + int getSelected() const + { return _selectedItem; } + int getSelectedTag() const + { return (_selectedItem >= 0) ? _entries[_selectedItem].tag : (int)-1; } + const string& getSelectedString() const + { return (_selectedItem >= 0) ? _entries[_selectedItem].name : EmptyString; } protected: void drawWidget(bool hilite); @@ -104,9 +110,9 @@ class PopUpDialog : public Dialog void drawDialog(); void handleMouseDown(int x, int y, int button, int clickCount); - void handleMouseWheel(int x, int y, int direction); // Scroll through entries with scroll wheel - void handleMouseMoved(int x, int y, int button); // Redraw selections depending on mouse position - void handleKeyDown(int ascii, int keycode, int modifiers); // Scroll through entries with arrow keys etc. + void handleMouseWheel(int x, int y, int direction); // Scroll through entries with scroll wheel + void handleMouseMoved(int x, int y, int button); // Redraw selections depending on mouse position + void handleKeyDown(int ascii, int keycode, int modifiers); // Scroll through entries with arrow keys etc protected: void drawMenuEntry(int entry, bool hilite); @@ -122,6 +128,7 @@ class PopUpDialog : public Dialog private: void sendSelection(); void cancelSelection(); + void handleEvent(Event::Type e); protected: PopUpWidget* _popUpBoss; diff --git a/stella/src/gui/StringListWidget.cxx b/stella/src/gui/StringListWidget.cxx index 5291607f8..a9c46ac32 100644 --- a/stella/src/gui/StringListWidget.cxx +++ b/stella/src/gui/StringListWidget.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: StringListWidget.cxx,v 1.6 2006-03-25 00:34:17 stephena Exp $ +// $Id: StringListWidget.cxx,v 1.7 2006-05-04 17:45:25 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -68,7 +68,7 @@ void StringListWidget::drawWidget(bool hilite) // Draw the selected item inverted, on a highlighted background. if (_selectedItem == pos) { - if ((_hasFocus && !_editMode) || isSticky()) + if (_hasFocus && !_editMode) fb.fillRect(_x + 1, _y + 1 + _fontHeight * i, _w - 1, _fontHeight, kTextColorHi); else fb.frameRect(_x + 1, _y + 1 + _fontHeight * i, _w - 1, _fontHeight, kTextColorHi); diff --git a/stella/src/gui/VideoDialog.cxx b/stella/src/gui/VideoDialog.cxx index 9260feea9..d2f30bf0c 100644 --- a/stella/src/gui/VideoDialog.cxx +++ b/stella/src/gui/VideoDialog.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: VideoDialog.cxx,v 1.29 2006-03-25 00:34:17 stephena Exp $ +// $Id: VideoDialog.cxx,v 1.30 2006-05-04 17:45:25 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -36,13 +36,14 @@ // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - VideoDialog::VideoDialog(OSystem* osystem, DialogContainer* parent, const GUI::Font& font, int x, int y, int w, int h) - : Dialog(osystem, parent, x, y, w, h) + : Dialog(osystem, parent, x, y, w, h) { const int lineHeight = font.getLineHeight(), fontHeight = font.getFontHeight(); int xpos, ypos; int lwidth = font.getStringWidth("Dirty Rects: "), pwidth = font.getStringWidth("Software"); + WidgetArray wid; // Use dirty rectangle updates xpos = 5; ypos = 10; @@ -50,6 +51,7 @@ VideoDialog::VideoDialog(OSystem* osystem, DialogContainer* parent, pwidth, lineHeight, "Dirty Rects: ", lwidth); myDirtyPopup->appendEntry("Yes", 1); myDirtyPopup->appendEntry("No", 2); + wid.push_back(myDirtyPopup); ypos += lineHeight + 4; // Video renderer @@ -63,6 +65,7 @@ VideoDialog::VideoDialog(OSystem* osystem, DialogContainer* parent, #ifdef DISPLAY_OPENGL myRendererPopup->appendEntry("OpenGL", 3); #endif + wid.push_back(myRendererPopup); ypos += lineHeight + 4; // Video filter @@ -70,12 +73,14 @@ VideoDialog::VideoDialog(OSystem* osystem, DialogContainer* parent, pwidth, lineHeight, "GL Filter: ", lwidth); myFilterPopup->appendEntry("Linear", 1); myFilterPopup->appendEntry("Nearest", 2); + wid.push_back(myFilterPopup); ypos += lineHeight + 4; // Aspect ratio myAspectRatioSlider = new SliderWidget(this, font, xpos, ypos, pwidth, lineHeight, "GL Aspect: ", lwidth, kAspectRatioChanged); myAspectRatioSlider->setMinValue(1); myAspectRatioSlider->setMaxValue(100); + wid.push_back(myAspectRatioSlider); myAspectRatioLabel = new StaticTextWidget(this, font, xpos + myAspectRatioSlider->getWidth() + 4, ypos + 1, @@ -89,6 +94,7 @@ VideoDialog::VideoDialog(OSystem* osystem, DialogContainer* parent, myPalettePopup->appendEntry("Standard", 1); myPalettePopup->appendEntry("Original", 2); myPalettePopup->appendEntry("Z26", 3); + wid.push_back(myPalettePopup); ypos += lineHeight + 4; // Move over to the next column @@ -98,6 +104,7 @@ VideoDialog::VideoDialog(OSystem* osystem, DialogContainer* parent, myFrameRateSlider = new SliderWidget(this, font, xpos, ypos, 30, lineHeight, "Framerate: ", lwidth, kFrameRateChanged); myFrameRateSlider->setMinValue(1); myFrameRateSlider->setMaxValue(300); + wid.push_back(myFrameRateSlider); myFrameRateLabel = new StaticTextWidget(this, font, xpos + myFrameRateSlider->getWidth() + 4, ypos + 1, @@ -109,6 +116,7 @@ VideoDialog::VideoDialog(OSystem* osystem, DialogContainer* parent, myZoomSlider = new SliderWidget(this, font, xpos, ypos, 30, lineHeight, "Zoom: ", lwidth, kZoomChanged); myZoomSlider->setMinValue(0); myZoomSlider->setMaxValue(50); + wid.push_back(myZoomSlider); myZoomLabel = new StaticTextWidget(this, font, xpos + myZoomSlider->getWidth() + 4, ypos + 1, @@ -118,26 +126,36 @@ VideoDialog::VideoDialog(OSystem* osystem, DialogContainer* parent, myFullscreenCheckbox = new CheckboxWidget(this, font, xpos + 5, ypos, "Fullscreen mode"); + wid.push_back(myFullscreenCheckbox); ypos += lineHeight + 4; myUseDeskResCheckbox = new CheckboxWidget(this, font, xpos + 5, ypos, "Desktop Res in FS"); + wid.push_back(myUseDeskResCheckbox); ypos += lineHeight + 4; myTiaDefaultsCheckbox = new CheckboxWidget(this, font, xpos + 5, ypos, "Use TIA defaults"); - + wid.push_back(myTiaDefaultsCheckbox); ypos += lineHeight + 20; // Add Defaults, OK and Cancel buttons - addButton(font, 10, _h - 24, "Defaults", kDefaultsCmd, 0); + ButtonWidget* b; + b = addButton(font, 10, _h - 24, "Defaults", kDefaultsCmd); + wid.push_back(b); #ifndef MAC_OSX - addButton(font, _w - 2 * (kButtonWidth + 7), _h - 24, "OK", kOKCmd, 0); - addButton(font, _w - (kButtonWidth + 10), _h - 24, "Cancel", kCloseCmd, 0); + b = addButton(font, _w - 2 * (kButtonWidth + 7), _h - 24, "OK", kOKCmd); + wid.push_back(b); + b = addButton(font, _w - (kButtonWidth + 10), _h - 24, "Cancel", kCloseCmd); + wid.push_back(b); #else - addButton(font, _w - 2 * (kButtonWidth + 7), _h - 24, "Cancel", kCloseCmd, 0); - addButton(font, _w - (kButtonWidth + 10), _h - 24, "OK", kOKCmd, 0); + b = addButton(font, _w - 2 * (kButtonWidth + 7), _h - 24, "Cancel", kCloseCmd); + wid.push_back(b); + b = addButton(font, _w - (kButtonWidth + 10), _h - 24, "OK", kOKCmd); + wid.push_back(b); #endif + + addToFocusList(wid); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/stella/src/gui/Widget.cxx b/stella/src/gui/Widget.cxx index 74e4ea4bd..3bab1c4af 100644 --- a/stella/src/gui/Widget.cxx +++ b/stella/src/gui/Widget.cxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: Widget.cxx,v 1.43 2006-03-25 00:34:17 stephena Exp $ +// $Id: Widget.cxx,v 1.44 2006-05-04 17:45:25 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -239,8 +239,7 @@ Widget* Widget::setFocusForChain(GuiObject* boss, WidgetArray& arr, if(tmp->_hasFocus) { tmp->lostFocus(); - if(!(tmp->_flags & WIDGET_NODRAW_FOCUS)) - fb.frameRect(x, y, w, h, kBGColor); + fb.frameRect(x, y, w, h, kBGColor); tmp->setDirty(); tmp->draw(); fb.addDirtyRect(x, y, w, h); @@ -279,8 +278,7 @@ Widget* Widget::setFocusForChain(GuiObject* boss, WidgetArray& arr, w = rect.width(), h = rect.height(); tmp->receivedFocus(); - if(!(tmp->_flags & WIDGET_NODRAW_FOCUS)) - fb.frameRect(x, y, w, h, kTextColorEm, kDashLine); + fb.frameRect(x, y, w, h, kTextColorEm, kDashLine); tmp->setDirty(); tmp->draw(); fb.addDirtyRect(x, y, w, h); @@ -338,12 +336,11 @@ void StaticTextWidget::drawWidget(bool hilite) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ButtonWidget::ButtonWidget(GuiObject *boss, const GUI::Font& font, int x, int y, int w, int h, - const string& label, int cmd, uInt8 hotkey) + const string& label, int cmd) : StaticTextWidget(boss, font, x, y, w, h, label, kTextAlignCenter), CommandSender(boss), _cmd(cmd), - _editable(false), - _hotkey(hotkey) + _editable(false) { _flags = WIDGET_ENABLED | WIDGET_BORDER | WIDGET_CLEARBG; _type = kButtonWidget; @@ -364,14 +361,11 @@ void ButtonWidget::handleMouseLeft(int button) } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool ButtonWidget::handleKeyDown(int ascii, int keycode, int modifiers) +bool ButtonWidget::handleEvent(Event::Type e) { - // (De)activate with space or return - switch(ascii) + switch(e) { - case '\n': // enter/return - case '\r': - case ' ' : // space + case Event::UISelect: // Simulate mouse event handleMouseUp(0, 0, 1, 0); return true; @@ -380,14 +374,6 @@ bool ButtonWidget::handleKeyDown(int ascii, int keycode, int modifiers) } } -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void ButtonWidget::handleJoyDown(int stick, int button) -{ - // Any button activates the button, but only while in joymouse mode - if(DialogContainer::joymouse()) - handleMouseUp(0, 0, 1, 0); -} - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void ButtonWidget::handleMouseUp(int x, int y, int button, int clickCount) { @@ -398,22 +384,6 @@ void ButtonWidget::handleMouseUp(int x, int y, int button, int clickCount) } } -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool ButtonWidget::wantsFocus() -{ - return _editable; -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void ButtonWidget::setEditable(bool editable) -{ - _editable = editable; - if(_editable) - setFlags(WIDGET_RETAIN_FOCUS); - else - clearFlags(WIDGET_RETAIN_FOCUS); -} - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void ButtonWidget::drawWidget(bool hilite) { @@ -440,7 +410,7 @@ static unsigned int checked_img[8] = CheckboxWidget::CheckboxWidget(GuiObject *boss, const GUI::Font& font, int x, int y, const string& label, int cmd) - : ButtonWidget(boss, font, x, y, 16, 16, label, cmd, 0), + : ButtonWidget(boss, font, x, y, 16, 16, label, cmd), _state(false), _editable(true), _holdFocus(true), @@ -450,7 +420,7 @@ CheckboxWidget::CheckboxWidget(GuiObject *boss, const GUI::Font& font, _boxY(0), _textY(0) { - _flags = WIDGET_ENABLED | WIDGET_RETAIN_FOCUS; + _flags = WIDGET_ENABLED; _type = kCheckboxWidget; if(label == "") @@ -480,36 +450,10 @@ void CheckboxWidget::handleMouseUp(int x, int y, int button, int clickCount) } } -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool CheckboxWidget::handleKeyDown(int ascii, int keycode, int modifiers) -{ - // (De)activate with space or return - switch(ascii) - { - case '\n': // enter/return - case '\r': - case ' ' : // space - // Simulate mouse event - handleMouseUp(0, 0, 1, 0); - return true; - default: - return false; - } -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -bool CheckboxWidget::wantsFocus() -{ - if(!_holdFocus) - return false; - else - return _editable; -} - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void CheckboxWidget::setEditable(bool editable) { - _holdFocus = _editable = editable; + _editable = editable; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -553,10 +497,10 @@ void CheckboxWidget::drawWidget(bool hilite) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SliderWidget::SliderWidget(GuiObject *boss, const GUI::Font& font, int x, int y, int w, int h, - const string& label, int labelWidth, int cmd, uInt8 hotkey) - : ButtonWidget(boss, font, x, y, w, h, label, cmd, hotkey), + const string& label, int labelWidth, int cmd) + : ButtonWidget(boss, font, x, y, w, h, label, cmd), _value(0), - _oldValue(0), + _stepValue(5), _valueMin(0), _valueMax(100), _isDragging(false), @@ -574,8 +518,35 @@ SliderWidget::SliderWidget(GuiObject *boss, const GUI::Font& font, // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void SliderWidget::setValue(int value) { - _value = value; - setDirty(); draw(); +/*cerr << "SliderWidget::setValue: " << value + << ", max = " << _valueMax + << ", min = " << _valueMin + << endl;*/ + if(value < _valueMin) + value = _valueMin; + else if(value > _valueMax) + value = _valueMax; + + if(value != _value) + { + _value = value; + setDirty(); draw(); + sendCommand(_cmd, _value, _id); + } +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void SliderWidget::setMinValue(int value) +{ + _valueMin = value; + _stepValue = (int) ((_valueMax - _valueMin) * 0.05); // Step at 5% intervals +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void SliderWidget::setMaxValue(int value) +{ + _valueMax = value; + _stepValue = (int) ((_valueMax - _valueMin) * 0.05); // Step at 5% intervals } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -584,21 +555,7 @@ void SliderWidget::handleMouseMoved(int x, int y, int button) // TODO: when the mouse is dragged outside the widget, the slider should // snap back to the old value. if(isEnabled() && _isDragging && x >= (int)_labelWidth) - { - int newValue = posToValue(x - _labelWidth); - - if(newValue < _valueMin) - newValue = _valueMin; - else if (newValue > _valueMax) - newValue = _valueMax; - - if(newValue != _value) - { - _value = newValue; - setDirty(); draw(); - sendCommand(_cmd, _value, _id); - } - } + setValue(posToValue(x - _labelWidth)); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -620,6 +577,38 @@ void SliderWidget::handleMouseUp(int x, int y, int button, int clickCount) _isDragging = false; } +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +bool SliderWidget::handleEvent(Event::Type e) +{ + switch(e) + { + case Event::UILeft: + case Event::UIDown: + case Event::UIPgDown: + setValue(_value - _stepValue); + break; + + case Event::UIRight: + case Event::UIUp: + case Event::UIPgUp: + setValue(_value + _stepValue); + break; + + case Event::UIHome: + setValue(_valueMin); + break; + + case Event::UIEnd: + setValue(_valueMax); + break; + + default: + return false; + break; + } + return true; +} + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void SliderWidget::drawWidget(bool hilite) { diff --git a/stella/src/gui/Widget.hxx b/stella/src/gui/Widget.hxx index 2f657693e..b7d249300 100644 --- a/stella/src/gui/Widget.hxx +++ b/stella/src/gui/Widget.hxx @@ -13,7 +13,7 @@ // See the file "license" for information on usage and redistribution of // this file, and for a DISCLAIMER OF ALL WARRANTIES. // -// $Id: Widget.hxx,v 1.49 2006-03-25 00:34:17 stephena Exp $ +// $Id: Widget.hxx,v 1.50 2006-05-04 17:45:25 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -26,6 +26,7 @@ class Dialog; #include +#include "Event.hxx" #include "OSystem.hxx" #include "FrameBuffer.hxx" #include "GuiObject.hxx" @@ -36,18 +37,16 @@ class Dialog; #include "bspf.hxx" enum { - WIDGET_ENABLED = 1 << 0, - WIDGET_INVISIBLE = 1 << 1, - WIDGET_HILITED = 1 << 2, - WIDGET_BORDER = 1 << 3, - WIDGET_INV_BORDER = 1 << 4, - WIDGET_CLEARBG = 1 << 5, - WIDGET_TRACK_MOUSE = 1 << 6, - WIDGET_RETAIN_FOCUS = 1 << 7, - WIDGET_NODRAW_FOCUS = 1 << 8, - WIDGET_STICKY_FOCUS = 1 << 9, - WIDGET_WANTS_TAB = 1 << 10, - WIDGET_WANTS_EVENTS = 1 << 11 + WIDGET_ENABLED = 1 << 0, + WIDGET_INVISIBLE = 1 << 1, + WIDGET_HILITED = 1 << 2, + WIDGET_BORDER = 1 << 3, + WIDGET_INV_BORDER = 1 << 4, + WIDGET_CLEARBG = 1 << 5, + WIDGET_TRACK_MOUSE = 1 << 6, + WIDGET_RETAIN_FOCUS = 1 << 7, + WIDGET_WANTS_TAB = 1 << 8, + WIDGET_WANTS_RAWDATA = 1 << 9 }; enum { @@ -75,7 +74,7 @@ enum { This is the base class for all widgets. @author Stephen Anthony - @version $Id: Widget.hxx,v 1.49 2006-03-25 00:34:17 stephena Exp $ + @version $Id: Widget.hxx,v 1.50 2006-05-04 17:45:25 stephena Exp $ */ class Widget : public GuiObject { @@ -100,6 +99,7 @@ class Widget : public GuiObject virtual void handleJoyUp(int stick, int button) {} virtual void handleJoyAxis(int stick, int axis, int value) {} virtual bool handleJoyHat(int stick, int hat, int value) { return false; } + virtual bool handleEvent(Event::Type event) { return false; } void draw(); void receivedFocus(); @@ -107,7 +107,6 @@ class Widget : public GuiObject void addFocusWidget(Widget* w) { _focusList.push_back(w); } virtual GUI::Rect getRect() const; - virtual bool wantsFocus() { return false; } /** Set/clear WIDGET_ENABLED flag and immediately redraw */ void setEnabled(bool e); @@ -116,10 +115,11 @@ class Widget : public GuiObject void clearFlags(int flags) { _flags &= ~flags; } int getFlags() const { return _flags; } - bool isEnabled() const { return _flags & WIDGET_ENABLED; } - bool isVisible() const { return !(_flags & WIDGET_INVISIBLE); } - bool isSticky() const { return _flags & WIDGET_STICKY_FOCUS; } - bool wantsEvents() const { return _flags & WIDGET_WANTS_EVENTS; } + bool isEnabled() const { return _flags & WIDGET_ENABLED; } + bool isVisible() const { return !(_flags & WIDGET_INVISIBLE); } + bool wantsFocus() const { return _flags & WIDGET_RETAIN_FOCUS; } + bool wantsTab() const { return _flags & WIDGET_WANTS_TAB; } + bool wantsRaw() const { return _flags & WIDGET_WANTS_RAWDATA; } void setID(int id) { _id = id; } int getID() { return _id; } @@ -185,7 +185,6 @@ class StaticTextWidget : public Widget void setLabel(const string& label); void setAlign(TextAlignment align) { _align = align; } const string& getLabel() const { return _label; } - void setEditable(bool editable); protected: void drawWidget(bool hilite); @@ -203,19 +202,15 @@ class ButtonWidget : public StaticTextWidget, public CommandSender public: ButtonWidget(GuiObject* boss, const GUI::Font& font, int x, int y, int w, int h, - const string& label, int cmd = 0, uInt8 hotkey = 0); + const string& label, int cmd = 0); void setCmd(int cmd) { _cmd = cmd; } int getCmd() const { return _cmd; } - void handleMouseUp(int x, int y, int button, int clickCount); - void handleMouseEntered(int button); - void handleMouseLeft(int button); - bool handleKeyDown(int ascii, int keycode, int modifiers); - void handleJoyDown(int stick, int button); - - bool wantsFocus(); - void setEditable(bool editable); + virtual void handleMouseUp(int x, int y, int button, int clickCount); + virtual void handleMouseEntered(int button); + virtual void handleMouseLeft(int button); + virtual bool handleEvent(Event::Type event); protected: void drawWidget(bool hilite); @@ -223,7 +218,6 @@ class ButtonWidget : public StaticTextWidget, public CommandSender protected: int _cmd; bool _editable; - uInt8 _hotkey; }; @@ -237,10 +231,6 @@ class CheckboxWidget : public ButtonWidget void handleMouseUp(int x, int y, int button, int clickCount); virtual void handleMouseEntered(int button) {} virtual void handleMouseLeft(int button) {} - virtual bool handleKeyDown(int ascii, int keycode, int modifiers); - - bool wantsFocus(); - void holdFocus(bool status) { _holdFocus = status; } void setEditable(bool editable); void setFill(bool fill) { _fillRect = fill; } @@ -276,19 +266,20 @@ class SliderWidget : public ButtonWidget public: SliderWidget(GuiObject *boss, const GUI::Font& font, int x, int y, int w, int h, const string& label = "", - int labelWidth = 0, int cmd = 0, uInt8 hotkey = 0); + int labelWidth = 0, int cmd = 0); void setValue(int value); int getValue() const { return _value; } - void setMinValue(int value) { _valueMin = value; } + void setMinValue(int value); int getMinValue() const { return _valueMin; } - void setMaxValue(int value) { _valueMax = value; } + void setMaxValue(int value); int getMaxValue() const { return _valueMax; } - void handleMouseMoved(int x, int y, int button); - void handleMouseDown(int x, int y, int button, int clickCount); - void handleMouseUp(int x, int y, int button, int clickCount); + virtual void handleMouseMoved(int x, int y, int button); + virtual void handleMouseDown(int x, int y, int button, int clickCount); + virtual void handleMouseUp(int x, int y, int button, int clickCount); + virtual bool handleEvent(Event::Type event); protected: void drawWidget(bool hilite); @@ -297,7 +288,7 @@ class SliderWidget : public ButtonWidget int posToValue(int pos); protected: - int _value, _oldValue; + int _value, _stepValue; int _valueMin, _valueMax; bool _isDragging; int _labelWidth;