mirror of https://github.com/stella-emu/stella.git
Improved BrowserDialog usage, eliminating redundant code in several places.
This class now uses a lambda function to do the work when clicking OK or Cancel. This commit also adds the changes from the previously reverted commit.
This commit is contained in:
parent
d1fe35cdfa
commit
9c39540a21
|
@ -259,30 +259,6 @@ void DebuggerDialog::handleCommand(CommandSender* sender, int cmd,
|
|||
loadConfig();
|
||||
break;
|
||||
|
||||
case kSvAccessCmd:
|
||||
runCommand("saveaccess");
|
||||
break;
|
||||
|
||||
case kSvDisCmd:
|
||||
runCommand("savedis");
|
||||
break;
|
||||
|
||||
case kSvRomCmd:
|
||||
runCommand("saverom");
|
||||
break;
|
||||
|
||||
case kSvScriptCmd:
|
||||
runCommand("save");
|
||||
break;
|
||||
|
||||
case kSvSessionCmd:
|
||||
runCommand("saveses");
|
||||
break;
|
||||
|
||||
case kBdCancelCmd:
|
||||
runCommand();
|
||||
break;
|
||||
|
||||
case RomWidget::kInvalidateListing:
|
||||
// Only do a full redraw if the disassembly tab is actually showing
|
||||
myRom->invalidate(myRomTab->getActiveTab() == 0);
|
||||
|
@ -427,79 +403,63 @@ void DebuggerDialog::createFont()
|
|||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void DebuggerDialog::showBrowser(BrowserType type, const string& defaultName)
|
||||
{
|
||||
int cmd;
|
||||
string title;
|
||||
string title, command;
|
||||
|
||||
switch(type)
|
||||
{
|
||||
case BrowserType::svAccess:
|
||||
cmd = kSvAccessCmd;
|
||||
title = "Access Counters";
|
||||
command = "saveaccess";
|
||||
break;
|
||||
|
||||
case BrowserType::svDis:
|
||||
cmd = kSvDisCmd;
|
||||
title = "Disassembly";
|
||||
command = "savedis";
|
||||
break;
|
||||
|
||||
case BrowserType::svRom:
|
||||
cmd = kSvRomCmd;
|
||||
title = "ROM";
|
||||
command = "saverom";
|
||||
break;
|
||||
|
||||
case BrowserType::svScript:
|
||||
cmd = kSvScriptCmd;
|
||||
title = "Workbench";
|
||||
command = "save";
|
||||
break;
|
||||
|
||||
case BrowserType::svSession:
|
||||
cmd = kSvSessionCmd;
|
||||
title = "Session";
|
||||
command = "saveses";
|
||||
break;
|
||||
|
||||
default:
|
||||
cmd = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
if(cmd)
|
||||
if(command != EmptyString)
|
||||
{
|
||||
createBrowser("Save " + title + " as");
|
||||
|
||||
const string path = instance().userDir().getPath() + defaultName;
|
||||
myBrowser->show(path, BrowserDialog::FileSave, cmd, kBdCancelCmd);
|
||||
BrowserDialog::show(this, instance().frameBuffer().font(), "Save " + title + " as",
|
||||
instance().userDir().getPath() + defaultName,
|
||||
BrowserDialog::Mode::FileSave,
|
||||
[this, command](bool OK, const FilesystemNode& node) {
|
||||
if(OK) runCommand(node, command);
|
||||
else runCommand(node);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void DebuggerDialog::runCommand(const string& command)
|
||||
void DebuggerDialog::runCommand(const FilesystemNode& node, const string& command)
|
||||
{
|
||||
if(command != EmptyString)
|
||||
{
|
||||
FilesystemNode dir(myBrowser->getResult());
|
||||
|
||||
string result = instance().debugger().parser().run(command + " {" + dir.getShortPath() + "}");
|
||||
string result = instance().debugger().parser().run(command + " {" +
|
||||
node.getPath() + "}");
|
||||
prompt().print(result + '\n');
|
||||
}
|
||||
prompt().printPrompt();
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void DebuggerDialog::createBrowser(const string& title)
|
||||
{
|
||||
uInt32 w = 0, h = 0;
|
||||
getDynamicBounds(w, h);
|
||||
if(w > uInt32(_font.getMaxCharWidth() * 80))
|
||||
w = _font.getMaxCharWidth() * 80;
|
||||
|
||||
// Create file browser dialog
|
||||
if(!myBrowser || uInt32(myBrowser->getWidth()) != w ||
|
||||
uInt32(myBrowser->getHeight()) != h)
|
||||
myBrowser = make_unique<BrowserDialog>(this, instance().frameBuffer().font(), w, h, title);
|
||||
else
|
||||
myBrowser->setTitle(title);
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void DebuggerDialog::showFatalMessage(const string& msg)
|
||||
{
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
class Debugger;
|
||||
class OSystem;
|
||||
class DialogContainer;
|
||||
class FilesystemNode;
|
||||
class ButtonWidget;
|
||||
class CpuWidget;
|
||||
class PromptWidget;
|
||||
|
@ -34,7 +35,6 @@ class TiaZoomWidget;
|
|||
class CartDebugWidget;
|
||||
class CartRamWidget;
|
||||
class OptionsDialog;
|
||||
class BrowserDialog;
|
||||
|
||||
namespace GUI {
|
||||
class MessageBox;
|
||||
|
@ -124,17 +124,11 @@ class DebuggerDialog : public Dialog
|
|||
kDDUnwindCmd = 'DDuw',
|
||||
kDDRunCmd = 'DDex',
|
||||
kDDExitFatalCmd = 'DDer',
|
||||
kDDOptionsCmd = 'DDop',
|
||||
kSvAccessCmd = 'SvAc',
|
||||
kSvDisCmd = 'SvDs',
|
||||
kSvRomCmd = 'SvRm',
|
||||
kSvScriptCmd = 'SvSc',
|
||||
kSvSessionCmd = 'SvSs',
|
||||
kBdCancelCmd = 'SvCn'
|
||||
kDDOptionsCmd = 'DDop'
|
||||
};
|
||||
|
||||
void runCommand(const string& command = EmptyString);
|
||||
void createBrowser(const string& title);
|
||||
void runCommand(const FilesystemNode& node,
|
||||
const string& command = EmptyString);
|
||||
|
||||
TabWidget *myTab{nullptr}, *myRomTab{nullptr};
|
||||
|
||||
|
@ -154,7 +148,6 @@ class DebuggerDialog : public Dialog
|
|||
|
||||
unique_ptr<GUI::MessageBox> myFatalError;
|
||||
unique_ptr<OptionsDialog> myOptions;
|
||||
unique_ptr<BrowserDialog> myBrowser;
|
||||
|
||||
unique_ptr<GUI::Font> myLFont; // used for labels
|
||||
unique_ptr<GUI::Font> myNFont; // used for normal text
|
||||
|
|
|
@ -26,16 +26,10 @@
|
|||
#include "Font.hxx"
|
||||
#include "BrowserDialog.hxx"
|
||||
|
||||
/* We want to use this as a general directory selector at some point... possible uses
|
||||
* - to select the data dir for a game
|
||||
* - to select the place where save games are stored
|
||||
* - others???
|
||||
*/
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
BrowserDialog::BrowserDialog(GuiObject* boss, const GUI::Font& font,
|
||||
int max_w, int max_h, const string& title)
|
||||
: Dialog(boss->instance(), boss->parent(), font, title),
|
||||
CommandSender(boss)
|
||||
: Dialog(boss->instance(), boss->parent(), font, title)
|
||||
{
|
||||
// Set real dimensions
|
||||
_w = max_w;
|
||||
|
@ -120,24 +114,42 @@ BrowserDialog::BrowserDialog(GuiObject* boss, const GUI::Font& font,
|
|||
addFocusWidget(_savePathBox);
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void BrowserDialog::show(GuiObject* parent, const GUI::Font& font,
|
||||
const string& title, const string& startpath,
|
||||
BrowserDialog::Mode mode,
|
||||
const Command& command,
|
||||
const FilesystemNode::NameFilter& namefilter)
|
||||
{
|
||||
uInt32 w = 0, h = 0;
|
||||
static_cast<Dialog*>(parent)->getDynamicBounds(w, h);
|
||||
if(w > uInt32(font.getMaxCharWidth() * 80))
|
||||
w = font.getMaxCharWidth() * 80;
|
||||
|
||||
static unique_ptr<BrowserDialog> ourBrowser =
|
||||
make_unique<BrowserDialog>(parent, font, w, h, title);
|
||||
|
||||
ourBrowser->show(startpath, mode, command, namefilter);
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void BrowserDialog::show(const string& startpath,
|
||||
BrowserDialog::ListMode mode, int cmd, int cancelCmd,
|
||||
const string& ext)
|
||||
BrowserDialog::Mode mode,
|
||||
const Command& command,
|
||||
const FilesystemNode::NameFilter& namefilter)
|
||||
{
|
||||
const int fontWidth = _font.getMaxCharWidth(),
|
||||
fontHeight = _font.getFontHeight(),
|
||||
VGAP = fontHeight / 4;
|
||||
|
||||
_mode = mode;
|
||||
_cmd = cmd;
|
||||
_cancelCmd = cancelCmd;
|
||||
string directory;// = EmptyString;
|
||||
string fileName;// = EmptyString;
|
||||
_command = command;
|
||||
string directory;
|
||||
string fileName;
|
||||
bool fileSelected = true;
|
||||
|
||||
// Set start path
|
||||
if(_mode != Directories)
|
||||
if(_mode != Mode::Directories)
|
||||
{
|
||||
// split startpath into path and filename
|
||||
FilesystemNode fs = FilesystemNode(startpath);
|
||||
|
@ -147,11 +159,9 @@ void BrowserDialog::show(const string& startpath,
|
|||
|
||||
switch(_mode)
|
||||
{
|
||||
case FileLoad:
|
||||
case Mode::FileLoad:
|
||||
_fileList->setListMode(FilesystemNode::ListMode::All);
|
||||
_fileList->setNameFilter([ext](const FilesystemNode& node) {
|
||||
return BSPF::endsWithIgnoreCase(node.getName(), ext);
|
||||
});
|
||||
_fileList->setNameFilter(namefilter);
|
||||
_fileList->setHeight(_selected->getTop() - VGAP * 2 - _fileList->getTop());
|
||||
|
||||
_currentPath->setWidth(_savePathBox->getLeft() - _currentPath->getLeft() - fontWidth);
|
||||
|
@ -166,11 +176,9 @@ void BrowserDialog::show(const string& startpath,
|
|||
_okWidget->setLabel("Load");
|
||||
break;
|
||||
|
||||
case FileSave:
|
||||
case Mode::FileSave:
|
||||
_fileList->setListMode(FilesystemNode::ListMode::All);
|
||||
_fileList->setNameFilter([ext](const FilesystemNode& node) {
|
||||
return BSPF::endsWithIgnoreCase(node.getName(), ext);
|
||||
});
|
||||
_fileList->setNameFilter(namefilter);
|
||||
_fileList->setHeight(_selected->getTop() - VGAP * 2 - _fileList->getTop());
|
||||
|
||||
_currentPath->setWidth(_savePathBox->getLeft() - _currentPath->getLeft() - fontWidth);
|
||||
|
@ -187,7 +195,7 @@ void BrowserDialog::show(const string& startpath,
|
|||
fileSelected = false;
|
||||
break;
|
||||
|
||||
case Directories:
|
||||
case Mode::Directories:
|
||||
_fileList->setListMode(FilesystemNode::ListMode::DirectoriesOnly);
|
||||
_fileList->setNameFilter([](const FilesystemNode&) { return true; });
|
||||
// TODO: scrollbar affected too!
|
||||
|
@ -206,7 +214,7 @@ void BrowserDialog::show(const string& startpath,
|
|||
}
|
||||
|
||||
// Set start path
|
||||
if(_mode != Directories)
|
||||
if(_mode != Mode::Directories)
|
||||
_fileList->setDirectory(FilesystemNode(directory), fileName);
|
||||
else
|
||||
_fileList->setDirectory(FilesystemNode(startpath));
|
||||
|
@ -220,12 +228,12 @@ void BrowserDialog::show(const string& startpath,
|
|||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
const FilesystemNode& BrowserDialog::getResult() const
|
||||
{
|
||||
if(_mode == FileLoad || _mode == FileSave)
|
||||
if(_mode == Mode::FileLoad || _mode == Mode::FileSave)
|
||||
{
|
||||
static FilesystemNode node;
|
||||
|
||||
return node
|
||||
= FilesystemNode(_fileList->currentDir().getShortPath() + _selected->getText());
|
||||
= FilesystemNode(_fileList->currentDir().getPath() + _selected->getText());
|
||||
}
|
||||
else
|
||||
return _fileList->currentDir();
|
||||
|
@ -240,8 +248,7 @@ void BrowserDialog::handleCommand(CommandSender* sender, int cmd,
|
|||
case kChooseCmd:
|
||||
case FileListWidget::ItemActivated:
|
||||
// Send a signal to the calling class that a selection has been made
|
||||
// Since we aren't derived from a widget, we don't have a 'data' or 'id'
|
||||
if(_mode != Directories)
|
||||
if(_mode != Mode::Directories)
|
||||
{
|
||||
// TODO: check if affected by '-baseDir'and 'basedirinapp' params
|
||||
bool savePath = _savePathBox->getState();
|
||||
|
@ -250,14 +257,13 @@ void BrowserDialog::handleCommand(CommandSender* sender, int cmd,
|
|||
if(savePath)
|
||||
instance().setUserDir(_fileList->currentDir().getShortPath());
|
||||
}
|
||||
if(_cmd) sendCommand(_cmd, -1, -1);
|
||||
_command(true, getResult());
|
||||
close();
|
||||
break;
|
||||
|
||||
case kCloseCmd:
|
||||
// Send a signal to the calling class that the dialog was closed without selection
|
||||
// Since we aren't derived from a widget, we don't have a 'data' or 'id'
|
||||
if(_cancelCmd) sendCommand(_cancelCmd, -1, -1);
|
||||
_command(false, getResult());
|
||||
close();
|
||||
break;
|
||||
|
||||
|
@ -300,7 +306,7 @@ void BrowserDialog::updateUI(bool fileSelected)
|
|||
// Enable/disable OK button based on current mode and status
|
||||
bool enable = true;
|
||||
|
||||
if(_mode != Directories)
|
||||
if(_mode != Mode::Directories)
|
||||
enable = !_selected->getText().empty();
|
||||
_okWidget->setEnabled(enable);
|
||||
|
||||
|
|
|
@ -23,34 +23,62 @@ class ButtonWidget;
|
|||
class EditTextWidget;
|
||||
class FileListWidget;
|
||||
class StaticTextWidget;
|
||||
class FilesystemNode;
|
||||
|
||||
#include "Dialog.hxx"
|
||||
#include "Command.hxx"
|
||||
#include "FSNode.hxx"
|
||||
#include "bspf.hxx"
|
||||
|
||||
class BrowserDialog : public Dialog, public CommandSender
|
||||
class BrowserDialog : public Dialog
|
||||
{
|
||||
public:
|
||||
enum ListMode {
|
||||
enum class Mode {
|
||||
FileLoad, // File selector, no input from user
|
||||
FileSave, // File selector, filename changable by user
|
||||
Directories // Directories only, no input from user
|
||||
};
|
||||
|
||||
/** Function which is run when the user clicks OK or Cancel.
|
||||
Boolean parameter is passed as 'true' when OK is clicked, else 'false'.
|
||||
FilesystemNode parameter is what is currently selected in the browser.
|
||||
*/
|
||||
using Command = std::function<void(bool, const FilesystemNode&)>;
|
||||
|
||||
public:
|
||||
// NOTE: Do not call this c'tor directly! Use the static show method below
|
||||
// There is no point in doing so, since the result can't be returned
|
||||
BrowserDialog(GuiObject* boss, const GUI::Font& font, int max_w, int max_h,
|
||||
const string& title = "");
|
||||
const string& title);
|
||||
~BrowserDialog() override = default;
|
||||
|
||||
/**
|
||||
Place the browser window onscreen, using the given attributes.
|
||||
|
||||
@param parent The parent object of the browser (cannot be nullptr)
|
||||
@param font The font to use in the browser
|
||||
@param title The title of the browser window
|
||||
@param startpath The initial path to select in the browser
|
||||
@param mode The functionality to use (load/save/display)
|
||||
@param command The command to run when 'OK' or 'Cancel' is clicked
|
||||
@param namefilter Filter files/directories in browser display
|
||||
*/
|
||||
static void show(GuiObject* parent, const GUI::Font& font,
|
||||
const string& title, const string& startpath,
|
||||
BrowserDialog::Mode mode,
|
||||
const Command& command,
|
||||
const FilesystemNode::NameFilter& namefilter = {
|
||||
[](const FilesystemNode&) { return true; }});
|
||||
|
||||
private:
|
||||
/** Place the browser window onscreen, using the given attributes */
|
||||
void show(const string& startpath,
|
||||
BrowserDialog::ListMode mode, int cmd, int cancelCmd = 0, const string& ext = "");
|
||||
BrowserDialog::Mode mode,
|
||||
const Command& command,
|
||||
const FilesystemNode::NameFilter& namefilter);
|
||||
|
||||
/** Get resulting file node (called after receiving kChooseCmd) */
|
||||
const FilesystemNode& getResult() const;
|
||||
|
||||
private:
|
||||
void handleCommand(CommandSender* sender, int cmd, int data, int id) override;
|
||||
void updateUI(bool fileSelected);
|
||||
|
||||
|
@ -62,8 +90,9 @@ class BrowserDialog : public Dialog, public CommandSender
|
|||
kHomeDirCmd = 'HODR'
|
||||
};
|
||||
|
||||
int _cmd{0};
|
||||
int _cancelCmd{0};
|
||||
// Called when the user selects OK (bool is true) or Cancel (bool is false)
|
||||
// FSNode will be set to whatever is active (basically, getResult())
|
||||
Command _command{[](bool, const FilesystemNode&){}};
|
||||
|
||||
FileListWidget* _fileList{nullptr};
|
||||
EditTextWidget* _currentPath{nullptr};
|
||||
|
@ -72,7 +101,7 @@ class BrowserDialog : public Dialog, public CommandSender
|
|||
ButtonWidget* _goUpButton{nullptr};
|
||||
CheckboxWidget* _savePathBox{nullptr};
|
||||
|
||||
BrowserDialog::ListMode _mode{Directories};
|
||||
BrowserDialog::Mode _mode{Mode::Directories};
|
||||
|
||||
private:
|
||||
// Following constructors and assignment operators not supported
|
||||
|
|
|
@ -666,22 +666,6 @@ GameInfoDialog::~GameInfoDialog()
|
|||
{
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void GameInfoDialog::createBrowser(const string& title)
|
||||
{
|
||||
uInt32 w = 0, h = 0;
|
||||
getDynamicBounds(w, h);
|
||||
if(w > uInt32(_font.getMaxCharWidth() * 80))
|
||||
w = _font.getMaxCharWidth() * 80;
|
||||
|
||||
// Create file browser dialog
|
||||
if(!myBrowser || uInt32(myBrowser->getWidth()) != w ||
|
||||
uInt32(myBrowser->getHeight()) != h)
|
||||
myBrowser = make_unique<BrowserDialog>(this, _font, w, h, title);
|
||||
else
|
||||
myBrowser->setTitle(title);
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void GameInfoDialog::loadConfig()
|
||||
{
|
||||
|
@ -1358,7 +1342,7 @@ void GameInfoDialog::setAddressVal(EditTextWidget* addressWidget, EditTextWidget
|
|||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void GameInfoDialog::exportCurrentPropertiesToDisk()
|
||||
void GameInfoDialog::exportCurrentPropertiesToDisk(const FilesystemNode& node)
|
||||
{
|
||||
saveProperties();
|
||||
stringstream out;
|
||||
|
@ -1366,9 +1350,7 @@ void GameInfoDialog::exportCurrentPropertiesToDisk()
|
|||
|
||||
try
|
||||
{
|
||||
FilesystemNode propfile(myBrowser->getResult().getShortPath());
|
||||
|
||||
propfile.write(out);
|
||||
node.write(out);
|
||||
instance().frameBuffer().showTextMessage("ROM properties exported");
|
||||
}
|
||||
catch(...)
|
||||
|
@ -1393,16 +1375,13 @@ void GameInfoDialog::handleCommand(CommandSender* sender, int cmd,
|
|||
break;
|
||||
|
||||
case kExportPressed:
|
||||
// This dialog is resizable under certain conditions, so we need
|
||||
// to re-create it as necessary
|
||||
createBrowser("Export Properties as");
|
||||
|
||||
myBrowser->show(instance().userDir().getPath() + myGameFile.getNameWithExt(".pro"),
|
||||
BrowserDialog::FileSave, kExportChosen);
|
||||
break;
|
||||
|
||||
case kExportChosen:
|
||||
exportCurrentPropertiesToDisk();
|
||||
BrowserDialog::show(this, _font, "Export Properties as",
|
||||
instance().userDir().getPath() +
|
||||
myGameFile.getNameWithExt(".pro"),
|
||||
BrowserDialog::Mode::FileSave,
|
||||
[this](bool OK, const FilesystemNode& node) {
|
||||
if(OK) exportCurrentPropertiesToDisk(node);
|
||||
});
|
||||
break;
|
||||
|
||||
case TabWidget::kTabChangedCmd:
|
||||
|
|
|
@ -27,7 +27,6 @@ class RadioButtonGroup;
|
|||
class TabWidget;
|
||||
class SliderWidget;
|
||||
class QuadTariDialog;
|
||||
class BrowserDialog;
|
||||
|
||||
#include "Dialog.hxx"
|
||||
#include "Command.hxx"
|
||||
|
@ -78,8 +77,7 @@ class GameInfoDialog : public Dialog, public CommandSender
|
|||
// set formatted memory value for given address field
|
||||
void setAddressVal(EditTextWidget* address, EditTextWidget* val,
|
||||
bool isBCD = true, bool zeroBased = false, uInt8 maxVal = 255);
|
||||
void exportCurrentPropertiesToDisk();
|
||||
void createBrowser(const string& title);
|
||||
void exportCurrentPropertiesToDisk(const FilesystemNode& node);
|
||||
|
||||
private:
|
||||
TabWidget* myTab{nullptr};
|
||||
|
@ -170,8 +168,6 @@ class GameInfoDialog : public Dialog, public CommandSender
|
|||
StaticTextWidget* myHighScoreNotesLabel{nullptr};
|
||||
EditTextWidget* myHighScoreNotes{nullptr};
|
||||
|
||||
unique_ptr<BrowserDialog> myBrowser;
|
||||
|
||||
enum {
|
||||
kVCenterChanged = 'Vcch',
|
||||
kPhosphorChanged = 'PPch',
|
||||
|
@ -184,8 +180,7 @@ class GameInfoDialog : public Dialog, public CommandSender
|
|||
kHiScoresChanged = 'HSch',
|
||||
kPXCenterChanged = 'Pxch',
|
||||
kPYCenterChanged = 'Pych',
|
||||
kExportPressed = 'Expr',
|
||||
kExportChosen = 'Exch'
|
||||
kExportPressed = 'Expr'
|
||||
};
|
||||
|
||||
// Game properties for currently loaded ROM
|
||||
|
|
|
@ -22,7 +22,6 @@ class ButtonWidget;
|
|||
class CommandSender;
|
||||
class ContextMenu;
|
||||
class DialogContainer;
|
||||
class BrowserDialog;
|
||||
class OptionsDialog;
|
||||
class HighScoresDialog;
|
||||
class GlobalPropsDialog;
|
||||
|
@ -168,7 +167,6 @@ class LauncherDialog : public Dialog
|
|||
unique_ptr<StellaSettingsDialog> myStellaSettingsDialog;
|
||||
unique_ptr<ContextMenu> myMenu;
|
||||
unique_ptr<GlobalPropsDialog> myGlobalProps;
|
||||
unique_ptr<BrowserDialog> myRomDir;
|
||||
unique_ptr<WhatsNewDialog> myWhatsNewDialog;
|
||||
|
||||
// automatically sized font for ROM info viewer
|
||||
|
|
|
@ -89,27 +89,6 @@ LoggerDialog::LoggerDialog(OSystem& osystem, DialogContainer& parent,
|
|||
addToFocusList(wid);
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
LoggerDialog::~LoggerDialog()
|
||||
{
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void LoggerDialog::createBrowser(const string& title)
|
||||
{
|
||||
uInt32 w = 0, h = 0;
|
||||
getDynamicBounds(w, h);
|
||||
if(w > uInt32(_font.getMaxCharWidth() * 80))
|
||||
w = _font.getMaxCharWidth() * 80;
|
||||
|
||||
// Create file browser dialog
|
||||
if(!myBrowser || uInt32(myBrowser->getWidth()) != w ||
|
||||
uInt32(myBrowser->getHeight()) != h)
|
||||
myBrowser = make_unique<BrowserDialog>(this, _font, w, h, title);
|
||||
else
|
||||
myBrowser->setTitle(title);
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void LoggerDialog::loadConfig()
|
||||
{
|
||||
|
@ -136,10 +115,8 @@ void LoggerDialog::saveConfig()
|
|||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void LoggerDialog::saveLogFile()
|
||||
void LoggerDialog::saveLogFile(const FilesystemNode& node)
|
||||
{
|
||||
FilesystemNode node(myBrowser->getResult().getShortPath());
|
||||
|
||||
try
|
||||
{
|
||||
stringstream out;
|
||||
|
@ -165,16 +142,12 @@ void LoggerDialog::handleCommand(CommandSender* sender, int cmd,
|
|||
break;
|
||||
|
||||
case GuiObject::kDefaultsCmd:
|
||||
// This dialog is resizable under certain conditions, so we need
|
||||
// to re-create it as necessary
|
||||
createBrowser("Save Log as");
|
||||
|
||||
myBrowser->show(instance().userDir().getPath() + "stella.log",
|
||||
BrowserDialog::FileSave, kSaveCmd);
|
||||
break;
|
||||
|
||||
case kSaveCmd:
|
||||
saveLogFile();
|
||||
BrowserDialog::show(this, _font, "Save Log as",
|
||||
instance().userDir().getPath() + "stella.log",
|
||||
BrowserDialog::Mode::FileSave,
|
||||
[this](bool OK, const FilesystemNode& node) {
|
||||
if(OK) saveLogFile(node);
|
||||
});
|
||||
break;
|
||||
|
||||
default:
|
||||
|
|
|
@ -22,7 +22,6 @@ class GuiObject;
|
|||
class CheckboxWidget;
|
||||
class PopUpWidget;
|
||||
class StringListWidget;
|
||||
class BrowserDialog;
|
||||
|
||||
#include "Dialog.hxx"
|
||||
#include "bspf.hxx"
|
||||
|
@ -33,14 +32,12 @@ class LoggerDialog : public Dialog
|
|||
LoggerDialog(OSystem& osystem, DialogContainer& parent,
|
||||
const GUI::Font& font, int max_w, int max_h,
|
||||
bool useLargeFont = true);
|
||||
~LoggerDialog() override;
|
||||
~LoggerDialog() override = default;
|
||||
|
||||
private:
|
||||
void createBrowser(const string& title);
|
||||
|
||||
void loadConfig() override;
|
||||
void saveConfig() override;
|
||||
void saveLogFile();
|
||||
void saveLogFile(const FilesystemNode& node);
|
||||
|
||||
void handleCommand(CommandSender* sender, int cmd, int data, int id) override;
|
||||
|
||||
|
@ -49,13 +46,6 @@ class LoggerDialog : public Dialog
|
|||
PopUpWidget* myLogLevel{nullptr};
|
||||
CheckboxWidget* myLogToConsole{nullptr};
|
||||
|
||||
unique_ptr<BrowserDialog> myBrowser;
|
||||
|
||||
enum {
|
||||
kSaveCmd = 'SvLg'
|
||||
};
|
||||
|
||||
|
||||
private:
|
||||
// Following constructors and assignment operators not supported
|
||||
LoggerDialog() = delete;
|
||||
|
|
|
@ -37,7 +37,6 @@
|
|||
RomAuditDialog::RomAuditDialog(OSystem& osystem, DialogContainer& parent,
|
||||
const GUI::Font& font, int max_w, int max_h)
|
||||
: Dialog(osystem, parent, font, "Audit ROMs"),
|
||||
myFont{font},
|
||||
myMaxWidth{max_w},
|
||||
myMaxHeight{max_h}
|
||||
{
|
||||
|
@ -186,7 +185,7 @@ void RomAuditDialog::handleCommand(CommandSender* sender, int cmd,
|
|||
msg.push_back("If you're sure you want to proceed with the");
|
||||
msg.push_back("audit, click 'OK', otherwise click 'Cancel'.");
|
||||
myConfirmMsg = make_unique<GUI::MessageBox>
|
||||
(this, myFont, msg, myMaxWidth, myMaxHeight, kConfirmAuditCmd,
|
||||
(this, _font, msg, myMaxWidth, myMaxHeight, kConfirmAuditCmd,
|
||||
"OK", "Cancel", "ROM Audit", false);
|
||||
}
|
||||
myConfirmMsg->show();
|
||||
|
@ -198,38 +197,20 @@ void RomAuditDialog::handleCommand(CommandSender* sender, int cmd,
|
|||
break;
|
||||
|
||||
case kChooseAuditDirCmd:
|
||||
createBrowser("Select ROM Directory to Audit");
|
||||
myBrowser->show(myRomPath->getText(),
|
||||
BrowserDialog::Directories, kAuditDirChosenCmd);
|
||||
BrowserDialog::show(this, _font, "Select ROM Directory to Audit",
|
||||
myRomPath->getText(),
|
||||
BrowserDialog::Mode::Directories,
|
||||
[this](bool OK, const FilesystemNode& node) {
|
||||
if(OK) {
|
||||
myRomPath->setText(node.getShortPath());
|
||||
myResults1->setText("");
|
||||
myResults2->setText("");
|
||||
}
|
||||
});
|
||||
break;
|
||||
|
||||
case kAuditDirChosenCmd:
|
||||
{
|
||||
FilesystemNode dir(myBrowser->getResult());
|
||||
myRomPath->setText(dir.getShortPath());
|
||||
myResults1->setText("");
|
||||
myResults2->setText("");
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
Dialog::handleCommand(sender, cmd, data, 0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void RomAuditDialog::createBrowser(const string& title)
|
||||
{
|
||||
uInt32 w = 0, h = 0;
|
||||
getDynamicBounds(w, h);
|
||||
if(w > uInt32(_font.getMaxCharWidth() * 80))
|
||||
w = _font.getMaxCharWidth() * 80;
|
||||
|
||||
// Create file browser dialog
|
||||
if(!myBrowser || uInt32(myBrowser->getWidth()) != w ||
|
||||
uInt32(myBrowser->getHeight()) != h)
|
||||
myBrowser = make_unique<BrowserDialog>(this, myFont, w, h, title);
|
||||
else
|
||||
myBrowser->setTitle(title);
|
||||
}
|
||||
|
|
|
@ -23,7 +23,6 @@ class GuiObject;
|
|||
class DialogContainer;
|
||||
class EditTextWidget;
|
||||
class StaticTextWidget;
|
||||
class BrowserDialog;
|
||||
namespace GUI {
|
||||
class MessageBox;
|
||||
}
|
||||
|
@ -42,20 +41,14 @@ class RomAuditDialog : public Dialog
|
|||
private:
|
||||
void loadConfig() override;
|
||||
void auditRoms();
|
||||
void createBrowser(const string& title);
|
||||
void handleCommand(CommandSender* sender, int cmd, int data, int id) override;
|
||||
|
||||
private:
|
||||
enum {
|
||||
kChooseAuditDirCmd = 'RAsl', // audit dir select
|
||||
kAuditDirChosenCmd = 'RAch', // audit dir changed
|
||||
kConfirmAuditCmd = 'RAcf' // confirm rom audit
|
||||
};
|
||||
|
||||
// Select a new ROM audit path
|
||||
unique_ptr<BrowserDialog> myBrowser;
|
||||
const GUI::Font& myFont;
|
||||
|
||||
// ROM audit path
|
||||
EditTextWidget* myRomPath{nullptr};
|
||||
|
||||
|
|
|
@ -28,8 +28,7 @@
|
|||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SnapshotDialog::SnapshotDialog(OSystem& osystem, DialogContainer& parent,
|
||||
const GUI::Font& font, int max_w, int max_h)
|
||||
: Dialog(osystem, parent, font, "Snapshot settings"),
|
||||
myFont{font}
|
||||
: Dialog(osystem, parent, font, "Snapshot settings")
|
||||
{
|
||||
const int lineHeight = font.getLineHeight(),
|
||||
fontHeight = _font.getFontHeight(),
|
||||
|
@ -98,11 +97,6 @@ SnapshotDialog::SnapshotDialog(OSystem& osystem, DialogContainer& parent,
|
|||
addToFocusList(wid);
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
SnapshotDialog::~SnapshotDialog()
|
||||
{
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void SnapshotDialog::loadConfig()
|
||||
{
|
||||
|
@ -154,15 +148,12 @@ void SnapshotDialog::handleCommand(CommandSender* sender, int cmd,
|
|||
break;
|
||||
|
||||
case kChooseSnapSaveDirCmd:
|
||||
// This dialog is resizable under certain conditions, so we need
|
||||
// to re-create it as necessary
|
||||
createBrowser("Select Snapshot Save Directory");
|
||||
myBrowser->show(mySnapSavePath->getText(),
|
||||
BrowserDialog::Directories, kSnapSaveDirChosenCmd);
|
||||
break;
|
||||
|
||||
case kSnapSaveDirChosenCmd:
|
||||
mySnapSavePath->setText(myBrowser->getResult().getShortPath());
|
||||
BrowserDialog::show(this, _font, "Select Snapshot Save Directory",
|
||||
mySnapSavePath->getText(),
|
||||
BrowserDialog::Mode::Directories,
|
||||
[this](bool OK, const FilesystemNode& node) {
|
||||
if(OK) mySnapSavePath->setText(node.getShortPath());
|
||||
});
|
||||
break;
|
||||
|
||||
case kSnapshotInterval:
|
||||
|
@ -177,19 +168,3 @@ void SnapshotDialog::handleCommand(CommandSender* sender, int cmd,
|
|||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void SnapshotDialog::createBrowser(const string& title)
|
||||
{
|
||||
uInt32 w = 0, h = 0;
|
||||
getDynamicBounds(w, h);
|
||||
if(w > uInt32(_font.getMaxCharWidth() * 80))
|
||||
w = _font.getMaxCharWidth() * 80;
|
||||
|
||||
// Create file browser dialog
|
||||
if(!myBrowser || uInt32(myBrowser->getWidth()) != w ||
|
||||
uInt32(myBrowser->getHeight()) != h)
|
||||
myBrowser = make_unique<BrowserDialog>(this, myFont, w, h, title);
|
||||
else
|
||||
myBrowser->setTitle(title);
|
||||
}
|
||||
|
|
|
@ -25,7 +25,6 @@ class CheckboxWidget;
|
|||
class EditTextWidget;
|
||||
class SliderWidget;
|
||||
class StaticTextWidget;
|
||||
class BrowserDialog;
|
||||
|
||||
#include "Dialog.hxx"
|
||||
#include "Command.hxx"
|
||||
|
@ -35,7 +34,7 @@ class SnapshotDialog : public Dialog
|
|||
public:
|
||||
SnapshotDialog(OSystem& osystem, DialogContainer& parent,
|
||||
const GUI::Font& font, int max_w, int max_h);
|
||||
~SnapshotDialog() override;
|
||||
~SnapshotDialog() override = default;
|
||||
|
||||
private:
|
||||
void loadConfig() override;
|
||||
|
@ -43,17 +42,13 @@ class SnapshotDialog : public Dialog
|
|||
void setDefaults() override;
|
||||
|
||||
void handleCommand(CommandSender* sender, int cmd, int data, int id) override;
|
||||
void createBrowser(const string& title);
|
||||
|
||||
private:
|
||||
enum {
|
||||
kChooseSnapSaveDirCmd = 'LOss', // snapshot dir (save files)
|
||||
kSnapSaveDirChosenCmd = 'snsc', // snap chosen (save files)
|
||||
kSnapshotInterval = 'SnIn' // snap chosen (load files)
|
||||
};
|
||||
|
||||
const GUI::Font& myFont;
|
||||
|
||||
// Config paths
|
||||
EditTextWidget* mySnapSavePath{nullptr};
|
||||
|
||||
|
@ -63,8 +58,6 @@ class SnapshotDialog : public Dialog
|
|||
CheckboxWidget* mySnapSingle{nullptr};
|
||||
CheckboxWidget* mySnap1x{nullptr};
|
||||
|
||||
unique_ptr<BrowserDialog> myBrowser;
|
||||
|
||||
private:
|
||||
// Following constructors and assignment operators not supported
|
||||
SnapshotDialog() = delete;
|
||||
|
|
|
@ -42,7 +42,6 @@ UIDialog::UIDialog(OSystem& osystem, DialogContainer& parent,
|
|||
const GUI::Font& font, GuiObject* boss, int max_w, int max_h)
|
||||
: Dialog(osystem, parent, font, "User interface settings"),
|
||||
CommandSender(boss),
|
||||
myFont{font},
|
||||
myIsGlobal{boss != nullptr}
|
||||
{
|
||||
const GUI::Font& ifont = instance().frameBuffer().infoFont();
|
||||
|
@ -91,7 +90,6 @@ UIDialog::UIDialog(OSystem& osystem, DialogContainer& parent,
|
|||
wid.push_back(myPalettePopup);
|
||||
ypos += lineHeight + VGAP;
|
||||
|
||||
|
||||
// Dialog font
|
||||
items.clear();
|
||||
VarList::push_back(items, "Small", "small"); // 8x13
|
||||
|
@ -318,11 +316,6 @@ UIDialog::UIDialog(OSystem& osystem, DialogContainer& parent,
|
|||
#endif
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
UIDialog::~UIDialog()
|
||||
{
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void UIDialog::loadConfig()
|
||||
{
|
||||
|
@ -584,15 +577,12 @@ void UIDialog::handleCommand(CommandSender* sender, int cmd, int data, int id)
|
|||
break;
|
||||
|
||||
case kChooseRomDirCmd:
|
||||
// This dialog is resizable under certain conditions, so we need
|
||||
// to re-create it as necessary
|
||||
createBrowser("Select ROM Directory");
|
||||
myBrowser->show(myRomPath->getText(),
|
||||
BrowserDialog::Directories, LauncherDialog::kRomDirChosenCmd);
|
||||
break;
|
||||
|
||||
case LauncherDialog::kRomDirChosenCmd:
|
||||
myRomPath->setText(myBrowser->getResult().getShortPath());
|
||||
BrowserDialog::show(this, _font, "Select ROM Directory",
|
||||
myRomPath->getText(),
|
||||
BrowserDialog::Mode::Directories,
|
||||
[this](bool OK, const FilesystemNode& node) {
|
||||
if(OK) myRomPath->setText(node.getShortPath());
|
||||
});
|
||||
break;
|
||||
|
||||
case kRomViewer:
|
||||
|
@ -600,15 +590,12 @@ void UIDialog::handleCommand(CommandSender* sender, int cmd, int data, int id)
|
|||
break;
|
||||
|
||||
case kChooseSnapLoadDirCmd:
|
||||
// This dialog is resizable under certain conditions, so we need
|
||||
// to re-create it as necessary
|
||||
createBrowser("Select ROM Info Viewer Image Directory");
|
||||
myBrowser->show(mySnapLoadPath->getText(),
|
||||
BrowserDialog::Directories, kSnapLoadDirChosenCmd);
|
||||
break;
|
||||
|
||||
case kSnapLoadDirChosenCmd:
|
||||
mySnapLoadPath->setText(myBrowser->getResult().getShortPath());
|
||||
BrowserDialog::show(this, _font, "Select ROM Info Viewer Image Directory",
|
||||
myRomPath->getText(),
|
||||
BrowserDialog::Mode::Directories,
|
||||
[this](bool OK, const FilesystemNode& node) {
|
||||
if(OK) mySnapLoadPath->setText(node.getShortPath());
|
||||
});
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -700,19 +687,3 @@ void UIDialog::handleRomViewer()
|
|||
myOpenBrowserButton->setEnabled(enable);
|
||||
mySnapLoadPath->setEnabled(enable);
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void UIDialog::createBrowser(const string& title)
|
||||
{
|
||||
uInt32 w = 0, h = 0;
|
||||
getDynamicBounds(w, h);
|
||||
if(w > uInt32(_font.getMaxCharWidth() * 80))
|
||||
w = _font.getMaxCharWidth() * 80;
|
||||
|
||||
// Create file browser dialog
|
||||
if(!myBrowser || uInt32(myBrowser->getWidth()) != w ||
|
||||
uInt32(myBrowser->getHeight()) != h)
|
||||
myBrowser = make_unique<BrowserDialog>(this, myFont, w, h, title);
|
||||
else
|
||||
myBrowser->setTitle(title);
|
||||
}
|
||||
|
|
|
@ -18,14 +18,15 @@
|
|||
#ifndef UI_DIALOG_HXX
|
||||
#define UI_DIALOG_HXX
|
||||
|
||||
class BrowserDialog;
|
||||
#include "Dialog.hxx"
|
||||
#include "bspf.hxx"
|
||||
|
||||
class UIDialog : public Dialog, public CommandSender
|
||||
{
|
||||
public:
|
||||
UIDialog(OSystem& osystem, DialogContainer& parent, const GUI::Font& font,
|
||||
GuiObject* boss, int max_w, int max_h);
|
||||
~UIDialog() override;
|
||||
~UIDialog() override = default;
|
||||
|
||||
private:
|
||||
void loadConfig() override;
|
||||
|
@ -35,7 +36,6 @@ class UIDialog : public Dialog, public CommandSender
|
|||
void handleCommand(CommandSender* sender, int cmd, int data, int id) override;
|
||||
void handleLauncherSize();
|
||||
void handleRomViewer();
|
||||
void createBrowser(const string& title);
|
||||
|
||||
private:
|
||||
enum
|
||||
|
@ -46,11 +46,9 @@ class UIDialog : public Dialog, public CommandSender
|
|||
kControllerDelay = 'UIcd',
|
||||
kChooseRomDirCmd = 'LOrm', // rom select
|
||||
kRomViewer = 'UIRv',
|
||||
kChooseSnapLoadDirCmd = 'UIsl', // snapshot dir (load files)
|
||||
kSnapLoadDirChosenCmd = 'UIsc' // snap chosen (load files)
|
||||
kChooseSnapLoadDirCmd = 'UIsl' // snapshot dir (load files)
|
||||
};
|
||||
|
||||
const GUI::Font& myFont;
|
||||
TabWidget* myTab{nullptr};
|
||||
|
||||
// Launcher options
|
||||
|
@ -76,8 +74,6 @@ class UIDialog : public Dialog, public CommandSender
|
|||
SliderWidget* myControllerDelaySlider{nullptr};
|
||||
SliderWidget* myDoubleClickSlider{nullptr};
|
||||
|
||||
unique_ptr<BrowserDialog> myBrowser;
|
||||
|
||||
// Indicates if this dialog is used for global (vs. in-game) settings
|
||||
bool myIsGlobal{false};
|
||||
|
||||
|
|
Loading…
Reference in New Issue