diff --git a/stella/src/build/makefile b/stella/src/build/makefile index e985539b9..d82d4777e 100644 --- a/stella/src/build/makefile +++ b/stella/src/build/makefile @@ -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: makefile,v 1.74 2005-05-04 19:04:38 stephena Exp $ +## $Id: makefile,v 1.75 2005-05-06 18:38:59 stephena Exp $ ##============================================================================ ##============================================================================ @@ -155,9 +155,11 @@ win32-gl: ############################################################################### M6502_OBJS = D6502.o Device.o M6502.o M6502Low.o M6502Hi.o NullDev.o System.o -GUI_OBJS = StellaFont.o Menu.o Widget.o PopUpWidget.o ScrollBarWidget.o ListWidget.o \ +GUI_OBJS = StellaFont.o Menu.o Launcher.o \ + Widget.o PopUpWidget.o ScrollBarWidget.o ListWidget.o \ Dialog.o DialogContainer.o OptionsDialog.o VideoDialog.o AudioDialog.o \ - EventMappingDialog.o GameInfoDialog.o HelpDialog.o + EventMappingDialog.o GameInfoDialog.o HelpDialog.o \ + LauncherDialog.o BrowserDialog.o CORE_OBJS = Booster.o Cart.o Cart2K.o Cart3F.o Cart4K.o CartAR.o CartDPC.o \ CartE0.o CartE7.o CartF4.o CartF4SC.o CartF6.o CartF6SC.o \ @@ -371,6 +373,9 @@ StellaFont.o: $(GUI)/StellaFont.cxx $(GUI)/StellaFont.hxx Menu.o: $(GUI)/Menu.cxx $(GUI)/Menu.hxx $(CXX) -c $(FLAGS) $(OPTIONS) $(LDFLAGS) $(GUI)/Menu.cxx +Launcher.o: $(GUI)/Launcher.cxx $(GUI)/Launcher.hxx + $(CXX) -c $(FLAGS) $(OPTIONS) $(LDFLAGS) $(GUI)/Launcher.cxx + Widget.o: $(GUI)/Widget.cxx $(GUI)/Widget.hxx $(CXX) -c $(FLAGS) $(OPTIONS) $(LDFLAGS) $(GUI)/Widget.cxx @@ -406,3 +411,9 @@ GameInfoDialog.o: $(GUI)/GameInfoDialog.cxx $(GUI)/GameInfoDialog.hxx HelpDialog.o: $(GUI)/HelpDialog.cxx $(GUI)/HelpDialog.hxx $(CXX) -c $(FLAGS) $(OPTIONS) $(LDFLAGS) $(GUI)/HelpDialog.cxx + +LauncherDialog.o: $(GUI)/LauncherDialog.cxx $(GUI)/LauncherDialog.hxx + $(CXX) -c $(FLAGS) $(OPTIONS) $(LDFLAGS) $(GUI)/LauncherDialog.cxx + +BrowserDialog.o: $(GUI)/BrowserDialog.cxx $(GUI)/BrowserDialog.hxx + $(CXX) -c $(FLAGS) $(OPTIONS) $(LDFLAGS) $(GUI)/BrowserDialog.cxx diff --git a/stella/src/common/mainSDL.cxx b/stella/src/common/mainSDL.cxx index a9dc5f0b4..1c48a7894 100644 --- a/stella/src/common/mainSDL.cxx +++ b/stella/src/common/mainSDL.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: mainSDL.cxx,v 1.36 2005-05-05 19:00:44 stephena Exp $ +// $Id: mainSDL.cxx,v 1.37 2005-05-06 18:38:59 stephena Exp $ //============================================================================ #include @@ -62,15 +62,6 @@ void SetupProperties(PropertiesSet& set) string theAltPropertiesFile = theOSystem->settings().getString("altpro"); string thePropertiesFile = theOSystem->propertiesInputFilename(); -/* - // When 'listrominfo' or 'mergeprops' is specified, we need to have the - // full list in memory - if(theOSystem->settings().getBool("listrominfo") || - theOSystem->settings().getBool("mergeprops") || - theOSystem->settings().getBool("browser")) - useMemList = true; -*/ - stringstream buf; if(theAltPropertiesFile != "") { @@ -195,17 +186,13 @@ int main(int argc, char* argv[]) //// Main loop //// // First we check if a ROM is specified on the commandline. If so, and if // the ROM actually exists, use it to create a new console. - // If not, use the built-in ROM browser. In this case, we enter 'browser' + // If not, use the built-in ROM launcher. In this case, we enter 'launcher' // mode and let the main event loop take care of opening a new console/ROM. string romfile = argv[argc - 1]; - if(theOSystem->fileExists(romfile)) - { - theOSystem->createConsole(romfile); - } + if(argc == 1 || !theOSystem->fileExists(romfile)) + theOSystem->createLauncher(); else - { - theOSystem->eventHandler().reset(EventHandler::S_BROWSER); - } + theOSystem->createConsole(romfile); // Start the main loop, and don't exit until the user issues a QUIT command theOSystem->mainLoop(); diff --git a/stella/src/emucore/EventHandler.cxx b/stella/src/emucore/EventHandler.cxx index 962d40242..5197a0996 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.51 2005-05-05 19:00:46 stephena Exp $ +// $Id: EventHandler.cxx,v 1.52 2005-05-06 18:38:59 stephena Exp $ //============================================================================ #include @@ -29,6 +29,7 @@ #include "Sound.hxx" #include "OSystem.hxx" #include "Menu.hxx" +#include "Launcher.hxx" #include "bspf.hxx" #include "GuiUtils.hxx" @@ -45,6 +46,7 @@ EventHandler::EventHandler(OSystem* osystem) myExitGameFlag(false), myQuitFlag(false), myGrabMouseFlag(false), + myUseLauncherFlag(false), myPaddleMode(0) { // Add this eventhandler object to the OSystem @@ -108,6 +110,25 @@ void EventHandler::reset(State state) myExitGameFlag = false; myQuitFlag = false; myPaddleMode = 0; + + switch(myState) + { + case S_EMULATE: + break; + + case S_MENU: + break; + + case S_LAUNCHER: + myUseLauncherFlag = true; + break; + + case S_DEBUGGER: + break; + + default: + break; + } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -381,8 +402,8 @@ void EventHandler::handleKeyEvent(SDLKey key, SDLMod mod, uInt8 state) myOSystem->menu().handleKeyEvent((uInt16) key, (Int32) mod, state); break; - case S_BROWSER: -//FIXME myOSystem->browser().handleKeyEvent(key, mod, state); + case S_LAUNCHER: + myOSystem->launcher().handleKeyEvent((uInt16) key, (Int32) mod, state); break; case S_DEBUGGER: @@ -438,8 +459,15 @@ void EventHandler::handleMouseMotionEvent(SDL_Event& event) break; } - case S_BROWSER: - // Not yet implemented + case S_LAUNCHER: + { + // Take window zooming into account + Int32 x = event.motion.x, y = event.motion.y; + myOSystem->frameBuffer().translateCoords(&x, &y); +//cerr << "Motion: x = " << x << ", y = " << y << endl; + myOSystem->launcher().handleMouseMotionEvent(x, y, 0); + break; + } break; case S_DEBUGGER: @@ -467,6 +495,7 @@ void EventHandler::handleMouseButtonEvent(SDL_Event& event, uInt8 state) break; case S_MENU: + case S_LAUNCHER: { // Take window zooming into account Int32 x = event.button.x, y = event.button.y; @@ -497,14 +526,14 @@ void EventHandler::handleMouseButtonEvent(SDL_Event& event, uInt8 state) else break; } - myOSystem->menu().handleMouseButtonEvent(button, x, y, state); + + if(myState == S_MENU) + myOSystem->menu().handleMouseButtonEvent(button, x, y, state); + else + myOSystem->launcher().handleMouseButtonEvent(button, x, y, state); break; } - case S_BROWSER: - // Not yet implemented - break; - case S_DEBUGGER: // Not yet implemented break; @@ -568,10 +597,14 @@ void EventHandler::handleEvent(Event::Type event, Int32 state) } else if(event == Event::ExitGame) { - myExitGameFlag = true; - myOSystem->sound().mute(true); - myOSystem->settings().saveConfig(); - return; + // ExitGame will only work when we've launched stella using the ROM + // launcher. Otherwise, the only way to exit the main loop is to Quit. + if(myState == S_EMULATE && myUseLauncherFlag) + { + myOSystem->settings().saveConfig(); + myOSystem->createLauncher(); + return; + } } else if(event == Event::Quit) { diff --git a/stella/src/emucore/EventHandler.hxx b/stella/src/emucore/EventHandler.hxx index 68308f7f5..798368fcc 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.25 2005-05-05 00:10:48 stephena Exp $ +// $Id: EventHandler.hxx,v 1.26 2005-05-06 18:38:59 stephena Exp $ //============================================================================ #ifndef EVENTHANDLER_HXX @@ -57,7 +57,7 @@ struct ActionList { mapping can take place. @author Stephen Anthony - @version $Id: EventHandler.hxx,v 1.25 2005-05-05 00:10:48 stephena Exp $ + @version $Id: EventHandler.hxx,v 1.26 2005-05-06 18:38:59 stephena Exp $ */ class EventHandler { @@ -73,7 +73,7 @@ class EventHandler virtual ~EventHandler(); // Enumeration representing the different states of operation - enum State { S_NONE, S_EMULATE, S_BROWSER, S_MENU, S_DEBUGGER }; + enum State { S_NONE, S_EMULATE, S_LAUNCHER, S_MENU, S_DEBUGGER }; /** Returns the event object associated with this handler class. @@ -251,6 +251,9 @@ class EventHandler // Indicates whether the mouse cursor is grabbed bool myGrabMouseFlag; + // Indicates whether to use launcher mode when exiting a game + bool myUseLauncherFlag; + // Indicates which paddle the mouse currently emulates Int8 myPaddleMode; diff --git a/stella/src/emucore/FrameBuffer.cxx b/stella/src/emucore/FrameBuffer.cxx index 9f9841610..f4bfa615c 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.31 2005-05-05 00:10:48 stephena Exp $ +// $Id: FrameBuffer.cxx,v 1.32 2005-05-06 18:38:59 stephena Exp $ //============================================================================ #include @@ -29,6 +29,7 @@ #include "StellaFont.hxx" #include "GuiUtils.hxx" #include "Menu.hxx" +#include "Launcher.hxx" #include "OSystem.hxx" #include "stella.xpm" // The Stella icon @@ -55,7 +56,7 @@ FrameBuffer::FrameBuffer(OSystem* osystem) {0, 0, 0}, {64, 64, 64}, {32, 160, 32}, - {0, 255, 0} + {0, 255, 0} // FIXME - add kTextColorEm }; for(uInt8 i = 0; i < 5; i++) @@ -212,9 +213,27 @@ void FrameBuffer::update() break; } - case EventHandler::S_BROWSER: - // FIXME myOSystem->gui().browser().draw(); + case EventHandler::S_LAUNCHER: + { + // Only update the screen if it's been invalidated or the menus have changed + if(theRedrawEntireFrameIndicator || theMenuChangedIndicator) + { + // Overlay the ROM launcher + myOSystem->launcher().draw(); + + // Now the screen is up to date + theRedrawEntireFrameIndicator = false; + + // This is a performance hack to only draw the menus when necessary + // Software mode is single-buffered, so we don't have to worry + // However, OpenGL mode is double-buffered, so we need to draw the + // menus at least twice (so they'll be in both buffers) + // Otherwise, we get horrible flickering + myMenuRedraws--; + theMenuChangedIndicator = (myMenuRedraws != 0); + } break; + } case EventHandler::S_DEBUGGER: // Not yet implemented @@ -497,124 +516,3 @@ void FrameBuffer::frameRect(uInt32 x, uInt32 y, uInt32 w, uInt32 h, vLine(x, y, y + h - 1, color); vLine(x + w - 1, y, y + h - 1, color); } - -/* -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void FrameBuffer::sendKeyEvent(StellaEvent::KeyCode key, Int32 state) -{ - if(myCurrentWidget == W_NONE || state != 1) - return; - - // Redraw the menus whenever a key event is received - theMenuChangedIndicator = true; - myMenuRedraws = 2; - - // Check which type of widget is pending - switch(myCurrentWidget) - { - case MAIN_MENU: - if(key == StellaEvent::KCODE_RETURN) - myCurrentWidget = currentSelectedWidget(); - else if(key == StellaEvent::KCODE_UP) - moveCursorUp(1); - else if(key == StellaEvent::KCODE_DOWN) - moveCursorDown(1); - else if(key == StellaEvent::KCODE_PAGEUP) - moveCursorUp(4); - else if(key == StellaEvent::KCODE_PAGEDOWN) - moveCursorDown(4); - - break; // MAIN_MENU - - case REMAP_MENU: - if(myRemapEventSelectedFlag) - { - if(key == StellaEvent::KCODE_ESCAPE) - deleteBinding(mySelectedEvent); - else - addKeyBinding(mySelectedEvent, key); - - myRemapEventSelectedFlag = false; - } - else if(key == StellaEvent::KCODE_RETURN) - { - mySelectedEvent = currentSelectedEvent(); - myRemapEventSelectedFlag = true; - } - else if(key == StellaEvent::KCODE_UP) - moveCursorUp(1); - else if(key == StellaEvent::KCODE_DOWN) - moveCursorDown(1); - else if(key == StellaEvent::KCODE_PAGEUP) - moveCursorUp(4); - else if(key == StellaEvent::KCODE_PAGEDOWN) - moveCursorDown(4); - else if(key == StellaEvent::KCODE_ESCAPE) - { - myCurrentWidget = MAIN_MENU; - theRedrawEntireFrameIndicator = true; - } - - break; // REMAP_MENU - - case INFO_MENU: - if(key == StellaEvent::KCODE_ESCAPE) - { - myCurrentWidget = MAIN_MENU; - theRedrawEntireFrameIndicator = true; - } - - break; // INFO_MENU - - default: - break; - } -} - -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void FrameBuffer::sendJoyEvent(StellaEvent::JoyStick stick, - StellaEvent::JoyCode code, Int32 state) -{ - if(myCurrentWidget == W_NONE || state != 1) - return; - - // Redraw the menus whenever a joy event is received - theMenuChangedIndicator = true; - - // Check which type of widget is pending - switch(myCurrentWidget) - { - case MAIN_MENU: -// if(key == StellaEvent::KCODE_RETURN) -// myCurrentWidget = currentSelectedWidget(); - if(code == StellaEvent::JAXIS_UP) - moveCursorUp(1); - else if(code == StellaEvent::JAXIS_DOWN) - moveCursorDown(1); - - break; // MAIN_MENU - - case REMAP_MENU: - if(myRemapEventSelectedFlag) - { - addJoyBinding(mySelectedEvent, stick, code); - myRemapEventSelectedFlag = false; - } - else if(code == StellaEvent::JAXIS_UP) - moveCursorUp(1); - else if(code == StellaEvent::JAXIS_DOWN) - moveCursorDown(1); -// else if(key == StellaEvent::KCODE_PAGEUP) -// movePageUp(); -// else if(key == StellaEvent::KCODE_PAGEDOWN) -// movePageDown(); -// else if(key == StellaEvent::KCODE_ESCAPE) -// myCurrentWidget = MAIN_MENU; - - break; // REMAP_MENU - - default: - break; - } -} -*/ diff --git a/stella/src/emucore/OSystem.cxx b/stella/src/emucore/OSystem.cxx index 7e50d5d26..6cd139ebe 100644 --- a/stella/src/emucore/OSystem.cxx +++ b/stella/src/emucore/OSystem.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: OSystem.cxx,v 1.10 2005-05-05 19:00:47 stephena Exp $ +// $Id: OSystem.cxx,v 1.11 2005-05-06 18:38:59 stephena Exp $ //============================================================================ #include @@ -36,7 +36,7 @@ #include "PropsSet.hxx" #include "EventHandler.hxx" #include "Menu.hxx" -//#include "Browser.hxx" +#include "Launcher.hxx" #include "bspf.hxx" #include "OSystem.hxx" @@ -49,19 +49,19 @@ OSystem::OSystem() myPropSet(NULL), myConsole(NULL), myMenu(NULL), -// myBrowser(NULL), + myLauncher(NULL), myRomFile("") { - // Create gui-related classes + // Create menu and launcher GUI objects myMenu = new Menu(this); -// myBrowser = new Browser(this); + myLauncher = new Launcher(this); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OSystem::~OSystem() { delete myMenu; -// delete myBrowser; + delete myLauncher; // Remove any game console that is currently attached delete myConsole; @@ -159,8 +159,8 @@ bool OSystem::createFrameBuffer(bool showmessage) } break; // S_EMULATE, S_MENU - case EventHandler::S_BROWSER: - break; // S_BROWSER + case EventHandler::S_LAUNCHER: + break; // S_LAUNCHER case EventHandler::S_DEBUGGER: break; @@ -211,8 +211,8 @@ void OSystem::createSound() myConsole->initializeAudio(); break; // S_EMULATE, S_MENU - case EventHandler::S_BROWSER: - break; // S_BROWSER + case EventHandler::S_LAUNCHER: + break; // S_LAUNCHER case EventHandler::S_DEBUGGER: break; @@ -275,6 +275,23 @@ bool OSystem::createConsole(const string& romfile) return retval; } +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void OSystem::createLauncher() +{ + myEventHandler->reset(EventHandler::S_LAUNCHER); + + // Create the window + string title = "Stella: ROM Launcher"; // FIXME - include version of Stella + myFrameBuffer->initialize(title, kLauncherWidth, kLauncherHeight); + + // And start the base dialog + myLauncher->initialize(); + myLauncher->reStack(); + myFrameBuffer->refresh(); + myFrameBuffer->setCursorState(); + mySound->mute(true); +} + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OSystem::OSystem(const OSystem& osystem) { diff --git a/stella/src/emucore/OSystem.hxx b/stella/src/emucore/OSystem.hxx index b5cf0b624..c354ad2d8 100644 --- a/stella/src/emucore/OSystem.hxx +++ b/stella/src/emucore/OSystem.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: OSystem.hxx,v 1.10 2005-05-05 19:00:47 stephena Exp $ +// $Id: OSystem.hxx,v 1.11 2005-05-06 18:38:59 stephena Exp $ //============================================================================ #ifndef OSYSTEM_HXX @@ -22,7 +22,7 @@ class PropertiesSet; class Menu; -class Browser; +class Launcher; #include "EventHandler.hxx" #include "FrameBuffer.hxx" @@ -38,7 +38,7 @@ class Browser; other objects belong. @author Stephen Anthony - @version $Id: OSystem.hxx,v 1.10 2005-05-05 19:00:47 stephena Exp $ + @version $Id: OSystem.hxx,v 1.11 2005-05-06 18:38:59 stephena Exp $ */ class OSystem { @@ -125,11 +125,11 @@ class OSystem Menu& menu(void) const { return *myMenu; } /** - Get the ROM browser of the system. + Get the ROM launcher of the system. - @return The browser object + @return The launcher object */ - Browser& browser(void) const { return *myBrowser; } + Launcher& launcher(void) const { return *myLauncher; } /** Set the framerate for the video system. It's placed in this class since @@ -229,6 +229,11 @@ class OSystem */ bool createConsole(const string& romfile = ""); + /** + Creates a new ROM launcher, to select a new ROM to emulate. + */ + void createLauncher(); + public: ////////////////////////////////////////////////////////////////////// // The following methods are system-specific and must be implemented @@ -299,8 +304,8 @@ class OSystem // Pointer to the Menu object Menu* myMenu; - // Pointer to the Browser object - Browser* myBrowser; + // Pointer to the Launcher object + Launcher* myLauncher; // Time per frame for a video update, based on the current framerate uInt32 myTimePerFrame; diff --git a/stella/src/emucore/Settings.cxx b/stella/src/emucore/Settings.cxx index 22fab9ca4..27b872746 100644 --- a/stella/src/emucore/Settings.cxx +++ b/stella/src/emucore/Settings.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: Settings.cxx,v 1.37 2005-05-05 19:00:48 stephena Exp $ +// $Id: Settings.cxx,v 1.38 2005-05-06 18:38:59 stephena Exp $ //============================================================================ #include @@ -119,13 +119,6 @@ void Settings::loadConfig() // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bool Settings::loadCommandLine(Int32 argc, char** argv) { - // Make sure we have the correct number of command line arguments - if(argc == 1) - { - usage(); - return false; - } - for(Int32 i = 1; i < argc; ++i) { // strip off the '-' character diff --git a/stella/src/gui/BrowserDialog.cxx b/stella/src/gui/BrowserDialog.cxx new file mode 100644 index 000000000..43a48e200 --- /dev/null +++ b/stella/src/gui/BrowserDialog.cxx @@ -0,0 +1,53 @@ +//============================================================================ +// +// SSSS tt lll lll +// SS SS tt ll ll +// SS tttttt eeee ll ll aaaa +// SSSS tt ee ee ll ll aa +// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator" +// SS SS tt ee ll ll aa aa +// SSSS ttt eeeee llll llll aaaaa +// +// Copyright (c) 1995-2005 by Bradford W. Mott +// +// 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.1 2005-05-06 18:39:00 stephena Exp $ +// +// Based on code from ScummVM - Scumm Interpreter +// Copyright (C) 2002-2004 The ScummVM project +//============================================================================ + +#include "OSystem.hxx" +#include "Widget.hxx" +#include "ListWidget.hxx" +#include "Dialog.hxx" +#include "GuiUtils.hxx" +#include "Event.hxx" +#include "EventHandler.hxx" +#include "BrowserDialog.hxx" + +#include "bspf.hxx" + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +BrowserDialog::BrowserDialog(OSystem* osystem, uInt16 x, uInt16 y, + uInt16 w, uInt16 h) + : Dialog(osystem, x, y, w, h) +{ +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +BrowserDialog::~BrowserDialog() +{ +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void BrowserDialog::handleKeyDown(uInt16 ascii, Int32 keycode, Int32 modifiers) +{ +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void BrowserDialog::handleCommand(CommandSender* sender, uInt32 cmd, uInt32 data) +{ +} diff --git a/stella/src/gui/BrowserDialog.hxx b/stella/src/gui/BrowserDialog.hxx new file mode 100644 index 000000000..000ffc91c --- /dev/null +++ b/stella/src/gui/BrowserDialog.hxx @@ -0,0 +1,56 @@ +//============================================================================ +// +// SSSS tt lll lll +// SS SS tt ll ll +// SS tttttt eeee ll ll aaaa +// SSSS tt ee ee ll ll aa +// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator" +// SS SS tt ee ll ll aa aa +// SSSS ttt eeeee llll llll aaaaa +// +// Copyright (c) 1995-2005 by Bradford W. Mott +// +// See the file "license" for information on usage and redistribution of +// this file, and for a DISCLAIMER OF ALL WARRANTIES. +// +// $Id: BrowserDialog.hxx,v 1.1 2005-05-06 18:39:00 stephena Exp $ +// +// Based on code from ScummVM - Scumm Interpreter +// Copyright (C) 2002-2004 The ScummVM project +//============================================================================ + +#ifndef BROWSER_DIALOG_HXX +#define BROWSER_DIALOG_HXX + +class CommandSender; +class ButtonWidget; +class StaticTextWidget; +class ListWidget; + +#include "Dialog.hxx" +#include "OSystem.hxx" +#include "bspf.hxx" + +class BrowserDialog : public Dialog +{ + public: + BrowserDialog(OSystem* osystem, uInt16 x, uInt16 y, uInt16 w, uInt16 h); + ~BrowserDialog(); + + virtual void handleKeyDown(uInt16 ascii, Int32 keycode, Int32 modifiers); + + protected: + + private: + enum { + kStartMapCmd = 'map ', + kEraseCmd = 'eras', + kStopMapCmd = 'smap' + }; + + virtual void handleCommand(CommandSender* sender, uInt32 cmd, uInt32 data); + + private: +}; + +#endif diff --git a/stella/src/gui/Launcher.cxx b/stella/src/gui/Launcher.cxx new file mode 100644 index 000000000..278d8ab62 --- /dev/null +++ b/stella/src/gui/Launcher.cxx @@ -0,0 +1,39 @@ +//============================================================================ +// +// SSSS tt lll lll +// SS SS tt ll ll +// SS tttttt eeee ll ll aaaa +// SSSS tt ee ee ll ll aa +// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator" +// SS SS tt ee ll ll aa aa +// SSSS ttt eeeee llll llll aaaaa +// +// Copyright (c) 1995-2005 by Bradford W. Mott +// +// See the file "license" for information on usage and redistribution of +// this file, and for a DISCLAIMER OF ALL WARRANTIES. +// +// $Id: Launcher.cxx,v 1.1 2005-05-06 18:39:00 stephena Exp $ +//============================================================================ + +#include "LauncherDialog.hxx" +#include "bspf.hxx" +#include "Launcher.hxx" + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Launcher::Launcher(OSystem* osystem) + : DialogContainer(osystem) +{ +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Launcher::~Launcher() +{ +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void Launcher::initialize() +{ + delete myBaseDialog; + myBaseDialog = new LauncherDialog(myOSystem, 0, 0, kLauncherWidth, kLauncherHeight); +} diff --git a/stella/src/gui/Launcher.hxx b/stella/src/gui/Launcher.hxx new file mode 100644 index 000000000..df7924c78 --- /dev/null +++ b/stella/src/gui/Launcher.hxx @@ -0,0 +1,57 @@ +//============================================================================ +// +// SSSS tt lll lll +// SS SS tt ll ll +// SS tttttt eeee ll ll aaaa +// SSSS tt ee ee ll ll aa +// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator" +// SS SS tt ee ll ll aa aa +// SSSS ttt eeeee llll llll aaaaa +// +// Copyright (c) 1995-2005 by Bradford W. Mott +// +// See the file "license" for information on usage and redistribution of +// this file, and for a DISCLAIMER OF ALL WARRANTIES. +// +// $Id: Launcher.hxx,v 1.1 2005-05-06 18:39:00 stephena Exp $ +//============================================================================ + +#ifndef LAUNCHER_HXX +#define LAUNCHER_HXX + +class OSystem; + +#include "DialogContainer.hxx" + +enum { + kLauncherWidth = 400, + kLauncherHeight = 300 +}; + +/** + The base dialog for the ROM launcher in Stella. + + @author Stephen Anthony + @version $Id: Launcher.hxx,v 1.1 2005-05-06 18:39:00 stephena Exp $ +*/ +class Launcher : public DialogContainer +{ + public: + /** + Create a new menu stack + */ + Launcher(OSystem* osystem); + + /** + Destructor + */ + virtual ~Launcher(); + + public: + /** + Updates the basedialog to be of the type defined for this derived class. + */ + void initialize(); +}; + +#endif diff --git a/stella/src/gui/LauncherDialog.cxx b/stella/src/gui/LauncherDialog.cxx new file mode 100644 index 000000000..225db5112 --- /dev/null +++ b/stella/src/gui/LauncherDialog.cxx @@ -0,0 +1,340 @@ +//============================================================================ +// +// SSSS tt lll lll +// SS SS tt ll ll +// SS tttttt eeee ll ll aaaa +// SSSS tt ee ee ll ll aa +// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator" +// SS SS tt ee ll ll aa aa +// SSSS ttt eeeee llll llll aaaaa +// +// Copyright (c) 1995-2005 by Bradford W. Mott +// +// 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.1 2005-05-06 18:39:00 stephena Exp $ +// +// Based on code from ScummVM - Scumm Interpreter +// Copyright (C) 2002-2004 The ScummVM project +//============================================================================ + +#include "OSystem.hxx" +#include "Widget.hxx" +#include "ListWidget.hxx" +#include "Dialog.hxx" +#include "GuiUtils.hxx" +#include "Event.hxx" +#include "EventHandler.hxx" +#include "BrowserDialog.hxx" +#include "LauncherDialog.hxx" + +#include "bspf.hxx" + +enum { + kStartCmd = 'STRT', + kLocationCmd = 'LOCA', + kReloadCmd = 'RELO', + kQuitCmd = 'QUIT', + + kCmdGlobalGraphicsOverride = 'OGFX', + kCmdGlobalAudioOverride = 'OSFX', + kCmdGlobalVolumeOverride = 'OVOL', + + kCmdExtraBrowser = 'PEXT', + kCmdGameBrowser = 'PGME', + kCmdSaveBrowser = 'PSAV' +}; + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +LauncherDialog::LauncherDialog(OSystem* osystem, uInt16 x, uInt16 y, + uInt16 w, uInt16 h) + : Dialog(osystem, x, y, w, h) +{ + // Show game name + new StaticTextWidget(this, 10, 8, 300, kLineHeight, "Select a game from the list ...", + kTextAlignCenter); + + // Add three buttons at the bottom + const int border = 10; + const int space = 8; + const int buttons = 4; + const int width = (_w - 2 * border - space * (buttons - 1)) / buttons; + int xpos = border; + + new ButtonWidget(this, xpos, _h - 24, width, 16, "Play", kStartCmd, 'S'); + xpos += space + width; + new ButtonWidget(this, xpos, _h - 24, width, 16, "Options", kLocationCmd, 'O'); + xpos += space + width; + new ButtonWidget(this, xpos, _h - 24, width, 16, "Reload", kReloadCmd, 'R'); + xpos += space + width; + new ButtonWidget(this, xpos, _h - 24, width, 16, "Quit", kQuitCmd, 'Q'); + xpos += space + width; + + // Add list with game titles + myList = new ListWidget(this, 10, 24, 300, 142); + myList->setEditable(false); + myList->setNumberingMode(kListNumberingOff); + + // Populate the list + updateListing(); + + // Restore last selection +/* + string last = ConfMan.get(String("lastselectedgame"), ConfigManager::kApplicationDomain); + if (!last.isEmpty()) + { + int itemToSelect = 0; + StringList::const_iterator iter; + for (iter = _domains.begin(); iter != _domains.end(); ++iter, ++itemToSelect) + { + if (last == *iter) + { + myList->setSelected(itemToSelect); + break; + } + } + } +*/ + // En-/Disable the buttons depending on the list selection + updateButtons(); + + // Create file browser dialog +//FIXME myBrowser = new BrowserDialog("Select directory with game data"); +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +LauncherDialog::~LauncherDialog() +{ + delete myBrowser; +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void LauncherDialog::loadConfig() +{ +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void LauncherDialog::close() +{ +/* + // Save last selection + const int sel = _list->getSelected(); + if (sel >= 0) + ConfMan.set(String("lastselectedgame"), _domains[sel], ConfigManager::kApplicationDomain); + else + ConfMan.removeKey(String("lastselectedgame"), ConfigManager::kApplicationDomain); + + ConfMan.flushToDisk(); + Dialog::close(); +*/ +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void LauncherDialog::updateListing() +{ +// FIXME - add bulk of KStella code here wrt loading from stella.cache +cerr << "LauncherDialog::updateListing()\n"; +/* + Common::StringList l; + + // Retrieve a list of all games defined in the config file + _domains.clear(); + const ConfigManager::DomainMap &domains = ConfMan.getGameDomains(); + ConfigManager::DomainMap::const_iterator iter = domains.begin(); + for (iter = domains.begin(); iter != domains.end(); ++iter) { + String name(iter->_value.get("gameid")); + String description(iter->_value.get("description")); + + if (name.isEmpty()) + name = iter->_key; + if (description.isEmpty()) { + GameSettings g = GameDetector::findGame(name); + if (g.description) + description = g.description; + } + + if (!name.isEmpty() && !description.isEmpty()) { + // Insert the game into the launcher list + int pos = 0, size = l.size(); + + while (pos < size && (scumm_stricmp(description.c_str(), l[pos].c_str()) > 0)) + pos++; + l.insert_at(pos, description); + _domains.insert_at(pos, iter->_key); + } + } + + _list->setList(l); + updateButtons(); +*/ +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void LauncherDialog::reloadListing() +{ +// FIXME - add bulk of KStella code here wrt loading from disk +cerr << "LauncherDialog::reloadListing()\n"; +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void LauncherDialog::addGame() +{ +/* + // Allow user to add a new game to the list. + // 1) show a dir selection dialog which lets the user pick the directory + // the game data resides in. + // 2) try to auto detect which game is in the directory, if we cannot + // determine it uniquely preent a list of candidates to the user + // to pick from + // 3) Display the 'Edit' dialog for that item, letting the user specify + // an alternate description (to distinguish multiple versions of the + // game, e.g. 'Monkey German' and 'Monkey English') and set default + // options for that game. + + if (_browser->runModal() > 0) { + // User made his choice... + FilesystemNode dir(_browser->getResult()); + FSList files = dir.listDir(FilesystemNode::kListAll); + + // ...so let's determine a list of candidates, games that + // could be contained in the specified directory. + DetectedGameList candidates(PluginManager::instance().detectGames(files)); + + int idx; + if (candidates.isEmpty()) { + // No game was found in the specified directory + MessageDialog alert("ScummVM could not find any game in the specified directory!"); + alert.runModal(); + idx = -1; + } else if (candidates.size() == 1) { + // Exact match + idx = 0; + } else { + // Display the candidates to the user and let her/him pick one + StringList list; + for (idx = 0; idx < (int)candidates.size(); idx++) + list.push_back(candidates[idx].description); + + ChooserDialog dialog("Pick the game:"); + dialog.setList(list); + idx = dialog.runModal(); + } + if (0 <= idx && idx < (int)candidates.size()) { + DetectedGame result = candidates[idx]; + + // The auto detector or the user made a choice. + // Pick a domain name which does not yet exist (after all, we + // are *adding* a game to the config, not replacing). + String domain(result.name); + if (ConfMan.hasGameDomain(domain)) { + char suffix = 'a'; + domain += suffix; + while (ConfMan.hasGameDomain(domain)) { + assert(suffix < 'z'); + domain.deleteLastChar(); + suffix++; + domain += suffix; + } + ConfMan.set("gameid", result.name, domain); + ConfMan.set("description", result.description, domain); + } + ConfMan.set("path", dir.path(), domain); + + const bool customLanguage = (result.language != Common::UNK_LANG); + const bool customPlatform = (result.platform != Common::kPlatformUnknown); + + // Set language if specified + if (customLanguage) + ConfMan.set("language", Common::getLanguageCode(result.language), domain); + + // Set platform if specified + if (customPlatform) + ConfMan.set("platform", Common::getPlatformCode(result.platform), domain); + + // Adapt the description string if custom platform/language is set + if (customLanguage || customPlatform) { + String desc = result.description; + desc += " ("; + if (customLanguage) + desc += Common::getLanguageDescription(result.language); + if (customLanguage && customPlatform) + desc += "/"; + if (customPlatform) + desc += Common::getPlatformDescription(result.platform); + desc += ")"; + + ConfMan.set("description", desc, domain); + } + + // Display edit dialog for the new entry + EditGameDialog editDialog(domain, result); + if (editDialog.runModal() > 0) { + // User pressed OK, so make changes permanent + + // Write config to disk + ConfMan.flushToDisk(); + + // Update the ListWidget and force a redraw + updateListing(); + draw(); + } else { + // User aborted, remove the the new domain again + ConfMan.removeGameDomain(domain); + } + } + } +*/ +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void LauncherDialog::handleCommand(CommandSender* sender, uInt32 cmd, uInt32 data) +{ + Int32 item = myList->getSelected(); + + switch (cmd) + { + case kStartCmd: + case kListItemActivatedCmd: + case kListItemDoubleClickedCmd: + cerr << "Game selected: " << item << endl; + // FIXME - start a new console based on the filename selected + // this is only here for testing + instance()->createConsole("frostbite.a26"); + close(); + break; + + case kLocationCmd: + cerr << "kLocationCmd from LauncherDialog\n"; +// instance()->launcher().addDialog(myLocationDialog); + break; + + case kReloadCmd: + reloadListing(); + break; + + case kListSelectionChangedCmd: + updateButtons(); + break; + + case kQuitCmd: + close(); + instance()->eventHandler().quit(); + break; + + default: + Dialog::handleCommand(sender, cmd, data); + } +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void LauncherDialog::updateButtons() +{ +/* + bool enable = (myList->getSelected() >= 0); + if (enable != _startButton->isEnabled()) { + _startButton->setEnabled(enable); + _startButton->draw(); + } +*/ +} diff --git a/stella/src/gui/LauncherDialog.hxx b/stella/src/gui/LauncherDialog.hxx new file mode 100644 index 000000000..abf90a578 --- /dev/null +++ b/stella/src/gui/LauncherDialog.hxx @@ -0,0 +1,60 @@ +//============================================================================ +// +// SSSS tt lll lll +// SS SS tt ll ll +// SS tttttt eeee ll ll aaaa +// SSSS tt ee ee ll ll aa +// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator" +// SS SS tt ee ll ll aa aa +// SSSS ttt eeeee llll llll aaaaa +// +// Copyright (c) 1995-2005 by Bradford W. Mott +// +// 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.1 2005-05-06 18:39:00 stephena Exp $ +// +// Based on code from ScummVM - Scumm Interpreter +// Copyright (C) 2002-2004 The ScummVM project +//============================================================================ + +#ifndef LAUNCHER_DIALOG_HXX +#define LAUNCHER_DIALOG_HXX + +class CommandSender; +class ButtonWidget; +class StaticTextWidget; +class BrowserDialog; +class ListWidget; + +#include "Dialog.hxx" +#include "Launcher.hxx" +#include "OSystem.hxx" +#include "bspf.hxx" + +class LauncherDialog : public Dialog +{ + public: + LauncherDialog(OSystem* osystem, uInt16 x, uInt16 y, uInt16 w, uInt16 h); + ~LauncherDialog(); + + virtual void handleCommand(CommandSender* sender, uInt32 cmd, uInt32 data); + + protected: + void updateListing(); + void reloadListing(); + void updateButtons(); + + void close(); + virtual void addGame(); + void removeGame(int item); + void editGame(int item); + void loadConfig(); + + protected: + ListWidget* myList; + BrowserDialog* myBrowser; +}; + +#endif diff --git a/stella/src/unix/OSystemUNIX.cxx b/stella/src/unix/OSystemUNIX.cxx index 9767120d1..4ce859f84 100644 --- a/stella/src/unix/OSystemUNIX.cxx +++ b/stella/src/unix/OSystemUNIX.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: OSystemUNIX.cxx,v 1.5 2005-05-05 00:10:49 stephena Exp $ +// $Id: OSystemUNIX.cxx,v 1.6 2005-05-06 18:39:00 stephena Exp $ //============================================================================ #include @@ -115,7 +115,8 @@ void OSystemUNIX::mainLoop() } } - if(mySettings->getBool("showinfo")) + // Only print console information if a console was actually created + if(mySettings->getBool("showinfo") && myConsole) { double executionTime = (double) frameTime / 1000000.0; double framesPerSecond = (double) numberOfFrames / executionTime;