stella/src/gui/ConfigPathDialog.cxx

278 lines
9.2 KiB
C++

//============================================================================
//
// 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-2016 by Bradford W. Mott, Stephen Anthony
// and the Stella Team
//
// See the file "License.txt" for information on usage and redistribution of
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
//
// $Id$
//============================================================================
#include "bspf.hxx"
#include "BrowserDialog.hxx"
#include "EditTextWidget.hxx"
#include "FSNode.hxx"
#include "LauncherDialog.hxx"
#include "PopUpWidget.hxx"
#include "Settings.hxx"
#include "ConfigPathDialog.hxx"
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ConfigPathDialog::ConfigPathDialog(
OSystem& osystem, DialogContainer& parent,
const GUI::Font& font, GuiObject* boss,
int max_w, int max_h)
: Dialog(osystem, parent),
CommandSender(boss),
myBrowser(nullptr),
myIsGlobal(boss != nullptr)
{
const int lineHeight = font.getLineHeight(),
fontWidth = font.getMaxCharWidth(),
buttonWidth = font.getStringWidth("Properties file:") + 20,
buttonHeight = font.getLineHeight() + 4;
const int vBorder = 8;
int xpos, ypos;
WidgetArray wid;
ButtonWidget* b;
// Set real dimensions
_w = 56 * fontWidth + 8;
_h = 9 * (lineHeight + 4) + 10;
xpos = vBorder; ypos = vBorder;
// ROM path
ButtonWidget* romButton =
new ButtonWidget(this, font, xpos, ypos, buttonWidth, buttonHeight,
"Rom path:", kChooseRomDirCmd);
wid.push_back(romButton);
xpos += buttonWidth + 10;
myRomPath = new EditTextWidget(this, font, xpos, ypos + 2,
_w - xpos - 10, lineHeight, "");
wid.push_back(myRomPath);
// Cheat file
xpos = vBorder; ypos += romButton->getHeight() + 3;
b = new ButtonWidget(this, font, xpos, ypos, buttonWidth, buttonHeight,
"Cheat file:", kChooseCheatFileCmd);
wid.push_back(b);
xpos += buttonWidth + 10;
myCheatFile = new EditTextWidget(this, font, xpos, ypos + 2,
_w - xpos - 10, lineHeight, "");
wid.push_back(myCheatFile);
// Palette file
xpos = vBorder; ypos += b->getHeight() + 3;
b = new ButtonWidget(this, font, xpos, ypos, buttonWidth, buttonHeight,
"Palette file:", kChoosePaletteFileCmd);
wid.push_back(b);
xpos += buttonWidth + 10;
myPaletteFile = new EditTextWidget(this, font, xpos, ypos + 2,
_w - xpos - 10, lineHeight, "");
wid.push_back(myPaletteFile);
// Properties file
xpos = vBorder; ypos += b->getHeight() + 3;
b = new ButtonWidget(this, font, xpos, ypos, buttonWidth, buttonHeight,
"Properties file:", kChoosePropsFileCmd);
wid.push_back(b);
xpos += buttonWidth + 10;
myPropsFile = new EditTextWidget(this, font, xpos, ypos + 2,
_w - xpos - 10, lineHeight, "");
wid.push_back(myPropsFile);
// State directory
xpos = vBorder; ypos += b->getHeight() + 3;
b = new ButtonWidget(this, font, xpos, ypos, buttonWidth, buttonHeight,
"State path:", kChooseStateDirCmd);
wid.push_back(b);
xpos += buttonWidth + 10;
myStatePath = new EditTextWidget(this, font, xpos, ypos + 2,
_w - xpos - 10, lineHeight, "");
wid.push_back(myStatePath);
// NVRAM directory
xpos = vBorder; ypos += b->getHeight() + 3;
b = new ButtonWidget(this, font, xpos, ypos, buttonWidth, buttonHeight,
"NVRAM path:", kChooseNVRamDirCmd);
wid.push_back(b);
xpos += buttonWidth + 10;
myNVRamPath = new EditTextWidget(this, font, xpos, ypos + 2,
_w - xpos - 10, lineHeight, "");
wid.push_back(myNVRamPath);
// Add Defaults, OK and Cancel buttons
b = new ButtonWidget(this, font, 10, _h - buttonHeight - 10,
font.getStringWidth("Defaults") + 20, buttonHeight,
"Defaults", kDefaultsCmd);
wid.push_back(b);
addOKCancelBGroup(wid, font);
addToFocusList(wid);
// All ROM settings are disabled while in game mode
if(!myIsGlobal)
{
romButton->clearFlags(WIDGET_ENABLED);
myRomPath->setEditable(false);
}
// Create file browser dialog
myBrowser = make_ptr<BrowserDialog>(this, font, max_w, max_h);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ConfigPathDialog::~ConfigPathDialog()
{
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void ConfigPathDialog::loadConfig()
{
const Settings& settings = instance().settings();
myRomPath->setText(settings.getString("romdir"));
myCheatFile->setText(settings.getString("cheatfile"));
myPaletteFile->setText(settings.getString("palettefile"));
myPropsFile->setText(settings.getString("propsfile"));
myNVRamPath->setText(settings.getString("nvramdir"));
myStatePath->setText(settings.getString("statedir"));
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void ConfigPathDialog::saveConfig()
{
instance().settings().setValue("romdir", myRomPath->getText());
instance().settings().setValue("cheatfile", myCheatFile->getText());
instance().settings().setValue("palettefile", myPaletteFile->getText());
instance().settings().setValue("propsfile", myPropsFile->getText());
instance().settings().setValue("statedir", myStatePath->getText());
instance().settings().setValue("nvramdir", myNVRamPath->getText());
// Flush changes to disk and inform the OSystem
instance().saveConfig();
instance().setConfigPaths();
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void ConfigPathDialog::setDefaults()
{
FilesystemNode node;
const string& basedir = instance().baseDir();
node = FilesystemNode("~");
myRomPath->setText(node.getShortPath());
const string& cheatfile = basedir + "stella.cht";
node = FilesystemNode(cheatfile);
myCheatFile->setText(node.getShortPath());
const string& palettefile = basedir + "stella.pal";
node = FilesystemNode(palettefile);
myPaletteFile->setText(node.getShortPath());
const string& propsfile = basedir + "stella.pro";
node = FilesystemNode(propsfile);
myPropsFile->setText(node.getShortPath());
const string& nvramdir = basedir + "nvram";
node = FilesystemNode(nvramdir);
myNVRamPath->setText(node.getShortPath());
const string& statedir = basedir + "state";
node = FilesystemNode(statedir);
myStatePath->setText(node.getShortPath());
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void ConfigPathDialog::handleCommand(CommandSender* sender, int cmd,
int data, int id)
{
switch (cmd)
{
case kOKCmd:
saveConfig();
close();
if(myIsGlobal) // Let the boss know romdir has changed
sendCommand(LauncherDialog::kRomDirChosenCmd, 0, 0);
break;
case kDefaultsCmd:
setDefaults();
break;
case kChooseRomDirCmd:
myBrowser->show("Select ROM directory:", myRomPath->getText(),
BrowserDialog::Directories, LauncherDialog::kRomDirChosenCmd);
break;
case kChooseCheatFileCmd:
myBrowser->show("Select cheat file:", myCheatFile->getText(),
BrowserDialog::FileLoad, kCheatFileChosenCmd);
break;
case kChoosePaletteFileCmd:
myBrowser->show("Select palette file:", myPaletteFile->getText(),
BrowserDialog::FileLoad, kPaletteFileChosenCmd);
break;
case kChoosePropsFileCmd:
myBrowser->show("Select properties file:", myPropsFile->getText(),
BrowserDialog::FileLoad, kPropsFileChosenCmd);
break;
case kChooseNVRamDirCmd:
myBrowser->show("Select NVRAM directory:", myNVRamPath->getText(),
BrowserDialog::Directories, kNVRamDirChosenCmd);
break;
case kChooseStateDirCmd:
myBrowser->show("Select state directory:", myStatePath->getText(),
BrowserDialog::Directories, kStateDirChosenCmd);
break;
case LauncherDialog::kRomDirChosenCmd:
myRomPath->setText(myBrowser->getResult().getShortPath());
break;
case kCheatFileChosenCmd:
myCheatFile->setText(myBrowser->getResult().getShortPath());
break;
case kPaletteFileChosenCmd:
myPaletteFile->setText(myBrowser->getResult().getShortPath());
break;
case kPropsFileChosenCmd:
myPropsFile->setText(myBrowser->getResult().getShortPath());
break;
case kNVRamDirChosenCmd:
myNVRamPath->setText(myBrowser->getResult().getShortPath());
break;
case kStateDirChosenCmd:
myStatePath->setText(myBrowser->getResult().getShortPath());
break;
case LauncherDialog::kReloadRomDirCmd:
sendCommand(LauncherDialog::kReloadRomDirCmd, 0, 0);
break;
default:
Dialog::handleCommand(sender, cmd, data, 0);
break;
}
}