From 61d3922e70374f82f0038b1eeeb4189534f7f619 Mon Sep 17 00:00:00 2001 From: stephena Date: Tue, 17 May 2005 18:42:23 +0000 Subject: [PATCH] Added a ProgressDialog class, which shows a sliderwidget that represents the progress of some activity. Some additions to the LauncherDialog. When populating the ROM list by directly examining the ROM files, it now uses a ProgressDialog to show the current status (since this operation sometimes take a long time). The last selected ROM is now re-selected when starting Stella. Some minor code refactoring to take into account zipped ROM support (yes, its coming soon). Re-added paddle support. Still TODO is tweak the sensitivity of mouse movements. Also still TODO is re-add joystick support. git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@427 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba --- stella/src/build/makefile | 8 +- stella/src/emucore/EventHandler.cxx | 70 ++++++++------ stella/src/emucore/EventHandler.hxx | 16 +++- stella/src/emucore/FrameBuffer.hxx | 6 +- stella/src/emucore/OSystem.cxx | 39 +++++--- stella/src/emucore/OSystem.hxx | 15 ++- stella/src/emucore/Settings.cxx | 3 +- stella/src/gui/LauncherDialog.cxx | 144 ++++++++++++++++------------ stella/src/gui/LauncherDialog.hxx | 12 ++- stella/src/gui/ProgressDialog.cxx | 92 ++++++++++++++++++ stella/src/gui/ProgressDialog.hxx | 51 ++++++++++ 11 files changed, 337 insertions(+), 119 deletions(-) create mode 100644 stella/src/gui/ProgressDialog.cxx create mode 100644 stella/src/gui/ProgressDialog.hxx diff --git a/stella/src/build/makefile b/stella/src/build/makefile index 1bb352db0..77fcd55e9 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.79 2005-05-16 00:02:30 stephena Exp $ +## $Id: makefile,v 1.80 2005-05-17 18:42:22 stephena Exp $ ##============================================================================ ##============================================================================ @@ -159,7 +159,8 @@ GUI_OBJS = StellaFont.o Menu.o Launcher.o \ Widget.o PopUpWidget.o ScrollBarWidget.o ListWidget.o TabWidget.o \ Dialog.o DialogContainer.o OptionsDialog.o VideoDialog.o AudioDialog.o \ EventMappingDialog.o GameInfoDialog.o HelpDialog.o AboutDialog.o \ - LauncherDialog.o LauncherOptionsDialog.o BrowserDialog.o GameList.o + LauncherDialog.o LauncherOptionsDialog.o BrowserDialog.o GameList.o \ + ProgressDialog.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 \ @@ -438,3 +439,6 @@ BrowserDialog.o: $(GUI)/BrowserDialog.cxx $(GUI)/BrowserDialog.hxx GameList.o: $(GUI)/GameList.cxx $(GUI)/GameList.hxx $(CXX) -c $(FLAGS) $(OPTIONS) $(LDFLAGS) $(GUI)/GameList.cxx + +ProgressDialog.o: $(GUI)/ProgressDialog.cxx $(GUI)/ProgressDialog.hxx + $(CXX) -c $(FLAGS) $(OPTIONS) $(LDFLAGS) $(GUI)/ProgressDialog.cxx diff --git a/stella/src/emucore/EventHandler.cxx b/stella/src/emucore/EventHandler.cxx index f7c2fd86e..96175f251 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.56 2005-05-16 00:02:31 stephena Exp $ +// $Id: EventHandler.cxx,v 1.57 2005-05-17 18:42:22 stephena Exp $ //============================================================================ #include @@ -422,38 +422,26 @@ void EventHandler::handleMouseMotionEvent(SDL_Event& event) switch(myState) { case S_EMULATE: -// FIXME - add code here to generate paddle events -/* - uInt32 zoom = theDisplay->zoomLevel(); - Int32 width = theDisplay->width() * zoom; + { + // Take window zooming into account + Int32 x = event.motion.x, y = event.motion.y; + myOSystem->frameBuffer().translateCoords(&x, &y); + int w = myOSystem->frameBuffer().baseWidth(); - // Grabmouse introduces some lag into the mouse movement, - // so we need to fudge the numbers a bit - if(theGrabMouseIndicator && theHideCursorIndicator) - mouseX = (int)((float)mouseX + (float)event.motion.xrel - * 1.5 * (float) zoom); - else - mouseX = mouseX + event.motion.xrel * zoom; - - // Check to make sure mouseX is within the game window - if(mouseX < 0) - mouseX = 0; - else if(mouseX > width) - mouseX = width; - - Int32 resistance = (Int32)(1000000.0 * (width - mouseX) / width); - - theOSystem->eventHandler().handleEvent(Paddle_Resistance[thePaddleMode], resistance); -*/ + // Grabmouse introduces some lag into the mouse movement, + // so we need to fudge the numbers a bit + // FIXME - possibly do x *= 1.5 ?? + int resistance = (int)(1000000.0 * (w - x) / w); + handleEvent(Paddle_Resistance[myPaddleMode], resistance); break; + } case S_MENU: { // 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->menu().handleMouseMotionEvent(x, y, 0); break; } @@ -463,7 +451,6 @@ void EventHandler::handleMouseMotionEvent(SDL_Event& event) // 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; } @@ -486,11 +473,7 @@ void EventHandler::handleMouseButtonEvent(SDL_Event& event, uInt8 state) switch(myState) { case S_EMULATE: -// FIXME - add code here to generate paddle buttons -/* - Int32 value = event.button.type == SDL_MOUSEBUTTONDOWN ? 1 : 0; - theOSystem->eventHandler().handleEvent(Paddle_Button[thePaddleMode], value); -*/ + handleEvent(Paddle_Button[myPaddleMode], state); break; case S_MENU: @@ -1354,3 +1337,30 @@ ActionList EventHandler::ourActionList[61] = { { Event::KeyboardOne0, "P2 GamePad 0", "" }, { Event::KeyboardOnePound, "P2 GamePad #", "" } }; + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Event::Type EventHandler::Paddle_Resistance[4] = { + Event::PaddleZeroResistance, Event::PaddleOneResistance, + Event::PaddleTwoResistance, Event::PaddleThreeResistance +}; + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Event::Type EventHandler::Paddle_Button[4] = { + Event::PaddleZeroFire, Event::PaddleOneFire, + Event::PaddleTwoFire, Event::PaddleThreeFire +}; + +#ifdef JOYSTICK_SUPPORT +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Event::Type EventHandler::SA_Axis[2][2][3] = { + Event::JoystickZeroLeft, Event::JoystickZeroRight, Event::PaddleZeroResistance, + Event::JoystickZeroUp, Event::JoystickZeroDown, Event::PaddleOneResistance, + Event::JoystickOneLeft, Event::JoystickOneRight, Event::PaddleTwoResistance, + Event::JoystickOneUp, Event::JoystickOneDown, Event::PaddleThreeResistance +}; + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +Event::Type EventHandler::SA_DrivingValue[2] = { + Event::DrivingZeroValue, Event::DrivingOneValue +}; +#endif diff --git a/stella/src/emucore/EventHandler.hxx b/stella/src/emucore/EventHandler.hxx index 2885d52a2..52a50e342 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.28 2005-05-16 00:02:31 stephena Exp $ +// $Id: EventHandler.hxx,v 1.29 2005-05-17 18:42:22 stephena Exp $ //============================================================================ #ifndef EVENTHANDLER_HXX @@ -57,7 +57,7 @@ struct ActionList { mapping can take place. @author Stephen Anthony - @version $Id: EventHandler.hxx,v 1.28 2005-05-16 00:02:31 stephena Exp $ + @version $Id: EventHandler.hxx,v 1.29 2005-05-17 18:42:22 stephena Exp $ */ class EventHandler { @@ -153,6 +153,18 @@ class EventHandler // Holds static strings for the remap menu static ActionList ourActionList[61]; + // Lookup table for paddle resistance events + static Event::Type Paddle_Resistance[4]; + + // Lookup table for paddle button events + static Event::Type Paddle_Button[4]; + +#ifdef JOYSTICK_SUPPORT + // Static lookup tables for Stelladaptor axis support + static Event::Type SA_Axis[2][2][3]; + static Event::Type SA_DrivingValue[2]; +#endif + private: /** Send an event directly to the event handler. diff --git a/stella/src/emucore/FrameBuffer.hxx b/stella/src/emucore/FrameBuffer.hxx index 1ecbe7187..5eef052d4 100644 --- a/stella/src/emucore/FrameBuffer.hxx +++ b/stella/src/emucore/FrameBuffer.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: FrameBuffer.hxx,v 1.32 2005-05-12 18:45:21 stephena Exp $ +// $Id: FrameBuffer.hxx,v 1.33 2005-05-17 18:42:22 stephena Exp $ //============================================================================ #ifndef FRAMEBUFFER_HXX @@ -41,7 +41,7 @@ class OSystem; All GUI elements (ala ScummVM) are drawn here as well. @author Stephen Anthony - @version $Id: FrameBuffer.hxx,v 1.32 2005-05-12 18:45:21 stephena Exp $ + @version $Id: FrameBuffer.hxx,v 1.33 2005-05-17 18:42:22 stephena Exp $ */ class FrameBuffer { @@ -138,7 +138,7 @@ class FrameBuffer // cerr << "refresh() " << myNumRedraws++ << endl; theRedrawEntireFrameIndicator = true; myMenuRedraws = 2; - if(now) drawMediaSource(); + if(now) update(); } /** diff --git a/stella/src/emucore/OSystem.cxx b/stella/src/emucore/OSystem.cxx index fcade7fd2..577ada239 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.15 2005-05-16 00:02:32 stephena Exp $ +// $Id: OSystem.cxx,v 1.16 2005-05-17 18:42:23 stephena Exp $ //============================================================================ #include @@ -256,20 +256,10 @@ bool OSystem::createConsole(const string& romfile) myRomFile = romfile; // Open the cartridge image and read it in - ifstream in(myRomFile.c_str(), ios_base::binary); - if(!in) + uInt8* image; + int size; + if(openROM(myRomFile, &image, &size)) { - cerr << "ERROR: Couldn't open " << myRomFile << "..." << endl; -// myEventHandler->quit(); - retval = false; - } - else - { - uInt8* image = new uInt8[512 * 1024]; - in.read((char*)image, 512 * 1024); - uInt32 size = in.gcount(); - in.close(); - delete myConsole; myConsole = NULL; // Create an instance of the 2600 game console @@ -288,6 +278,12 @@ bool OSystem::createConsole(const string& romfile) myEventHandler->reset(EventHandler::S_EMULATE); myFrameBuffer->setCursorState(); } + else + { + cerr << "ERROR: Couldn't open " << myRomFile << "..." << endl; +// myEventHandler->quit(); + retval = false; + } return retval; } @@ -309,6 +305,21 @@ void OSystem::createLauncher() mySound->mute(true); } +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +bool OSystem::openROM(const string& rom, uInt8** image, int* size) +{ + ifstream in(rom.c_str(), ios_base::binary); + if(!in) + return false; + + *image = new uInt8[512 * 1024]; + in.read((char*)(*image), 512 * 1024); + *size = in.gcount(); + in.close(); + + return true; +} + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - OSystem::OSystem(const OSystem& osystem) { diff --git a/stella/src/emucore/OSystem.hxx b/stella/src/emucore/OSystem.hxx index da989b33b..67b994bed 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.14 2005-05-16 00:02:32 stephena Exp $ +// $Id: OSystem.hxx,v 1.15 2005-05-17 18:42:23 stephena Exp $ //============================================================================ #ifndef OSYSTEM_HXX @@ -38,7 +38,7 @@ class Launcher; other objects belong. @author Stephen Anthony - @version $Id: OSystem.hxx,v 1.14 2005-05-16 00:02:32 stephena Exp $ + @version $Id: OSystem.hxx,v 1.15 2005-05-17 18:42:23 stephena Exp $ */ class OSystem { @@ -262,6 +262,17 @@ class OSystem */ const string& features() { return myFeatures; } + /** + Open the given ROM and return an array containing its contents. + + @param rom The absolute pathname of the ROM file + @param image A pointer to store the ROM data + Note, the calling method is responsible for deleting this + @param size The amount of data read into the image array + @return False on any errors, else true + */ + bool openROM(const string& rom, uInt8** image, int* size); + public: ////////////////////////////////////////////////////////////////////// // The following methods are system-specific and must be implemented diff --git a/stella/src/emucore/Settings.cxx b/stella/src/emucore/Settings.cxx index 76b86792b..930d862fb 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.43 2005-05-14 03:26:28 stephena Exp $ +// $Id: Settings.cxx,v 1.44 2005-05-17 18:42:23 stephena Exp $ //============================================================================ #include @@ -66,6 +66,7 @@ Settings::Settings(OSystem* osystem) set("sssingle", "false"); set("romdir", ""); + set("lastrom", ""); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/stella/src/gui/LauncherDialog.cxx b/stella/src/gui/LauncherDialog.cxx index 184b4ce47..ca03edac3 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.14 2005-05-16 15:37:30 stephena Exp $ +// $Id: LauncherDialog.cxx,v 1.15 2005-05-17 18:42:23 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -34,6 +34,7 @@ #include "DialogContainer.hxx" #include "GuiUtils.hxx" #include "BrowserDialog.hxx" +#include "ProgressDialog.hxx" #include "LauncherOptionsDialog.hxx" #include "LauncherDialog.hxx" @@ -50,8 +51,13 @@ enum { LauncherDialog::LauncherDialog(OSystem* osystem, DialogContainer* parent, int x, int y, int w, int h) : Dialog(osystem, parent, x, y, w, h), + myStartButton(NULL), + myOptionsButton(NULL), + myReloadButton(NULL), + myQuitButton(NULL), myList(NULL), - myGameList(NULL) + myGameList(NULL), + myProgressBar(NULL) { // Show game name new StaticTextWidget(this, 10, 8, 200, kLineHeight, @@ -68,22 +74,22 @@ LauncherDialog::LauncherDialog(OSystem* osystem, DialogContainer* parent, int xpos = border; #ifndef MAC_OSX - new ButtonWidget(this, xpos, _h - 24, width, 16, "Play", kStartCmd, 'S'); + myStartButton = new ButtonWidget(this, xpos, _h - 24, width, 16, "Play", kStartCmd, 'S'); xpos += space + width; - new ButtonWidget(this, xpos, _h - 24, width, 16, "Options", kOptionsCmd, 'O'); + myOptionsButton = new ButtonWidget(this, xpos, _h - 24, width, 16, "Options", kOptionsCmd, 'O'); xpos += space + width; - new ButtonWidget(this, xpos, _h - 24, width, 16, "Reload", kReloadCmd, 'R'); + myReloadButton = 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'); + myQuitButton = new ButtonWidget(this, xpos, _h - 24, width, 16, "Quit", kQuitCmd, 'Q'); xpos += space + width; #else - new ButtonWidget(this, xpos, _h - 24, width, 16, "Quit", kQuitCmd, 'Q'); + myQuitButton = new ButtonWidget(this, xpos, _h - 24, width, 16, "Quit", kQuitCmd, 'Q'); xpos += space + width; - new ButtonWidget(this, xpos, _h - 24, width, 16, "Options", kOptionsCmd, 'O'); + myOptionsButton = new ButtonWidget(this, xpos, _h - 24, width, 16, "Options", kOptionsCmd, 'O'); xpos += space + width; - new ButtonWidget(this, xpos, _h - 24, width, 16, "Reload", kReloadCmd, 'R'); + myReloadButton = new ButtonWidget(this, xpos, _h - 24, width, 16, "Reload", kReloadCmd, 'R'); xpos += space + width; - new ButtonWidget(this, xpos, _h - 24, width, 16, "Start", kStartCmd, 'Q'); + myStartButton = new ButtonWidget(this, xpos, _h - 24, width, 16, "Start", kStartCmd, 'Q'); xpos += space + width; #endif @@ -97,24 +103,6 @@ LauncherDialog::LauncherDialog(OSystem* osystem, DialogContainer* parent, myNote = new StaticTextWidget(this, 50, _h - 43, w - 70, 16, "", kTextAlignLeft); - // 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; - } - } - } -*/ - // Create the launcher options dialog, where you can change ROM // and snapshot paths myOptions = new LauncherOptionsDialog(osystem, parent, 20, 60, _w - 40, _h - 120); @@ -140,36 +128,26 @@ void LauncherDialog::loadConfig() updateListing(); } -// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void LauncherDialog::close() -{ - // Save romdir specified by the browser -/* - FilesystemNode dir(myBrowser->getResult()); - instance()->settings().setString("romdir", dir.path()); -*/ -/* - // 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::reset() { myOptions->reset(); } +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void LauncherDialog::enableButtons(bool enable) +{ + myStartButton->setEnabled(enable); + myOptionsButton->setEnabled(enable); + myReloadButton->setEnabled(enable); + myQuitButton->setEnabled(enable); +} + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void LauncherDialog::updateListing(bool fullReload) { + enableButtons(false); + // Figure out if the ROM dir has changed since we last accessed it. // If so, we do a full reload from disk (takes quite some time). // Otherwise, we can use the cache file (which is much faster). @@ -204,18 +182,54 @@ void LauncherDialog::updateListing(bool fullReload) ostringstream buf; buf << myGameList->size() << " files found"; myRomCount->setLabel(buf.str()); + + enableButtons(true); + + // Restore last selection + if(!myList->getList().isEmpty()) + { + string lastrom = instance()->settings().getString("lastrom"); + if(lastrom == "") + myList->setSelected(0); + else + { + unsigned int itemToSelect = 0; + StringList::const_iterator iter; + for (iter = myList->getList().begin(); iter != myList->getList().end(); + ++iter, ++itemToSelect) + { + if (lastrom == *iter) + { + myList->setSelected(itemToSelect); + break; + } + } + if(itemToSelect > myList->getList().size()) + myList->setSelected(0); + } + } } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - void LauncherDialog::loadListFromDisk() { - Properties props; - string romdir = instance()->settings().getString("romdir"); FilesystemNode dir(romdir); FSList files = dir.listDir(FilesystemNode::kListAll); + // Create a progress dialog box to show the progress of processing + // the ROMs, since this is usually a time-consuming operation + string message = "Loading ROM's from disk ..."; + int w = instance()->frameBuffer().font().getStringWidth(message) + 20, + h = kLineHeight * 4; + int x = (_w - w) / 2, + y = (_h - h) / 2; + ProgressDialog progress(instance(), parent(), x, y, w, h); + progress.setMessage(message); + progress.setRange(0, files.size() - 1, 10); + // Create a entry for the GameList for each file + Properties props; string path = dir.path(), rom, md5, name, note; for (unsigned int idx = 0; idx < files.size(); idx++) { @@ -234,7 +248,11 @@ void LauncherDialog::loadListFromDisk() name = files[idx].displayName(); myGameList->appendGame(rom, name, note); + + // Update the progress bar, indicating one more ROM has been processed + progress.setProgress(idx); } + progress.done(); // Sort the list by rom name (since that's what we see in the listview) myGameList->sortByName(); @@ -303,19 +321,17 @@ void LauncherDialog::createListCache() // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - string LauncherDialog::MD5FromFile(const string& path) { - ifstream in(path.c_str(), ios_base::binary); - if(!in) + uInt8* image; + int size; + + if(instance()->openROM(path, &image, &size)) + { + string md5 = MD5(image, size); + delete[] image; + return md5; + } + else return ""; - - uInt8* image = new uInt8[512 * 1024]; - in.read((char*)image, 512 * 1024); - int size = (int) in.gcount(); - in.close(); - - string md5 = MD5(image, size); - delete[] image; - - return md5; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -331,7 +347,9 @@ void LauncherDialog::handleCommand(CommandSender* sender, int cmd, int data) item = myList->getSelected(); if(item >= 0) { + string s = myList->getSelectedString(); instance()->createConsole(myGameList->rom(item)); + instance()->settings().setString("lastrom", s); close(); } break; diff --git a/stella/src/gui/LauncherDialog.hxx b/stella/src/gui/LauncherDialog.hxx index a5f7b9f33..797c10395 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.7 2005-05-16 15:37:30 stephena Exp $ +// $Id: LauncherDialog.hxx,v 1.8 2005-05-17 18:42:23 stephena Exp $ // // Based on code from ScummVM - Scumm Interpreter // Copyright (C) 2002-2004 The ScummVM project @@ -24,9 +24,11 @@ class DialogContainer; class LauncherOptionsDialog; +class ProgressDialog; class CommandSender; class StaticTextWidget; class ListWidget; +class ButtonWidget; class OSystem; #include "Dialog.hxx" @@ -45,19 +47,25 @@ class LauncherDialog : public Dialog protected: void updateListing(bool fullReload = false); - void close(); void reset(); void loadConfig(); protected: + ButtonWidget* myStartButton; + ButtonWidget* myOptionsButton; + ButtonWidget* myReloadButton; + ButtonWidget* myQuitButton; + ListWidget* myList; StaticTextWidget* myNote; StaticTextWidget* myRomCount; GameList* myGameList; LauncherOptionsDialog* myOptions; + ProgressDialog* myProgressBar; private: + void enableButtons(bool enable); void loadListFromDisk(); void loadListFromCache(); void createListCache(); diff --git a/stella/src/gui/ProgressDialog.cxx b/stella/src/gui/ProgressDialog.cxx new file mode 100644 index 000000000..01e76d88b --- /dev/null +++ b/stella/src/gui/ProgressDialog.cxx @@ -0,0 +1,92 @@ +//============================================================================ +// +// 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: ProgressDialog.cxx,v 1.1 2005-05-17 18:42:23 stephena Exp $ +// +// Based on code from ScummVM - Scumm Interpreter +// Copyright (C) 2002-2004 The ScummVM project +//============================================================================ + +#include "OSystem.hxx" +#include "Widget.hxx" +#include "Dialog.hxx" +#include "DialogContainer.hxx" +#include "ProgressDialog.hxx" +#include "GuiUtils.hxx" + +#include "bspf.hxx" + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +ProgressDialog::ProgressDialog(OSystem* osystem, DialogContainer* parent, + int x, int y, int w, int h) + : Dialog(osystem, parent, x, y, w, h), + myMessage(NULL), + mySlider(NULL), + myStart(0), + myFinish(0), + myStep(0) +{ + myMessage = new StaticTextWidget(this, 0, 10, w, kLineHeight, "", kTextAlignCenter); + myMessage->setColor(kTextColorEm); + mySlider = new SliderWidget(this, 10, 15 + kLineHeight, w - 20, kLineHeight, "", 0, 0); + mySlider->setMinValue(100); + mySlider->setMaxValue(200); + mySlider->setValue(100); // Prevents the slider from initially drawing + // across the entire screen for a split-second + + parent->addDialog(this); + instance()->frameBuffer().refresh(true); +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +ProgressDialog::~ProgressDialog() +{ +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void ProgressDialog::done() +{ + parent()->removeDialog(); + instance()->frameBuffer().refresh(true); +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void ProgressDialog::setMessage(const string& message) +{ + myMessage->setLabel(message); +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void ProgressDialog::setRange(int start, int finish, int step) +{ + myStart = start; + myFinish = finish; + myStep = step; + myCurrentStep = 100; +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void ProgressDialog::setProgress(int progress) +{ + // Only increase the progress bar if we have arrived at a new step + // IE, we only increase in intervals specified by setRange() + int p = (int) (((double)progress / myFinish) * 100 + 100); + if(p >= myCurrentStep) + { + myCurrentStep += myStep; + mySlider->setValue(p); + instance()->frameBuffer().refresh(true); + } +} diff --git a/stella/src/gui/ProgressDialog.hxx b/stella/src/gui/ProgressDialog.hxx new file mode 100644 index 000000000..e1e919f32 --- /dev/null +++ b/stella/src/gui/ProgressDialog.hxx @@ -0,0 +1,51 @@ +//============================================================================ +// +// 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 and the Stella team +// +// See the file "license" for information on usage and redistribution of +// this file, and for a DISCLAIMER OF ALL WARRANTIES. +// +// $Id: ProgressDialog.hxx,v 1.1 2005-05-17 18:42:23 stephena Exp $ +// +// Based on code from ScummVM - Scumm Interpreter +// Copyright (C) 2002-2004 The ScummVM project +//============================================================================ + +#ifndef PROGRESS_DIALOG_HXX +#define PROGRESS_DIALOG_HXX + +class DialogContainer; +class StaticTextWidget; +class SliderWidget; + +#include "OSystem.hxx" +#include "bspf.hxx" + +class ProgressDialog : public Dialog +{ + public: + ProgressDialog(OSystem* osystem, DialogContainer* parent, + int x, int y, int w, int h); + ~ProgressDialog(); + + void setMessage(const string& message); + void setRange(int begin, int end, int step); + void setProgress(int progress); + void done(); + + protected: + StaticTextWidget* myMessage; + SliderWidget* mySlider; + + int myStart, myFinish, myStep, myCurrentStep; +}; + +#endif