From 3aed9378a8686efacbf5968815217cfc3ddbdff9 Mon Sep 17 00:00:00 2001 From: stephena Date: Thu, 18 Jun 2009 13:07:51 +0000 Subject: [PATCH] Updated filename handling so that paths saved to the config files and shown within the UI use the '~' symbol whenever possible. This means that paths from the settings file are now truly relative; change your home directory, and the settings file will still work (it no longer contains absolute path names). git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@1776 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba --- docs/graphics/launcher.png | Bin 22586 -> 22968 bytes docs/graphics/rom_browser.png | Bin 6017 -> 6138 bytes docs/graphics/romaudit.png | Bin 3183 -> 3046 bytes docs/index.html | 8 ++++++-- src/emucore/FSNode.cxx | 7 +++++++ src/emucore/FSNode.hxx | 20 ++++++++++++++++++-- src/gui/BrowserDialog.cxx | 12 +++++++++++- src/gui/BrowserDialog.hxx | 6 ++++-- src/gui/FileSnapDialog.cxx | 14 +++++++------- src/gui/LauncherDialog.cxx | 2 +- src/unix/FSNodePOSIX.cxx | 23 ++++++++++++++++++++++- src/win32/FSNodeWin32.cxx | 22 ++++++++++++++++++++++ 12 files changed, 98 insertions(+), 16 deletions(-) diff --git a/docs/graphics/launcher.png b/docs/graphics/launcher.png index 86f1318cd2ab51cecc945aa21787114873042f23..4405921166c64e987c4a64a9a607536121fa390f 100644 GIT binary patch literal 22968 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 H_tt*^#W!n9 diff --git a/docs/graphics/rom_browser.png b/docs/graphics/rom_browser.png index 3fca4021e1b23906c6ef87d02555af685e3e2721..2139b1196d54e4532aefcb5c380cb89c909f0e89 100644 GIT binary patch literal 6138 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 O4=hfcK3--@i2Elv5276cqcKtTaZ zQ0Y=b2~pnwB27SgAdW~+Kw1VO@ZZeLzusH_djDHlH}~Y+le^CT_TJyO&%Sxe))KcB zzZC$0JAUlQX#gM&az$;%ATyGI7YmRZL^*AF7!=h6U%!9nn2YY!c zPcWdpS9_OcLFtXm4}JRWlT&*P zCGww(J>>6>_rXpb=YckTlY|n=&Bt0z zus(S^&rNmEx^OwW;>T$tyM}INn#-)OO_3$vrC~i0_lU9@>Cs=2FA1gFy}zHBlKRQo zwI!MkgBE4Yk3U=;I%7Ykg?92|d47OXJp$^#A@nv^ju`d5I6e@4HKAdH- zxb#vdA!>|A^A_7?Qo93&+@;X=Nn2Uf*>P4FH@$}d>(YFG);?F2N5c@LubE-6LU$lu zfdTg4{DXK(IDtHJ>6&_})TMvcKi#8zk
    ^5~=iW25_r2u6EXZA0K2Y*mBF_ww;e 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 RCejQC$1QA+6doqg{s(R45PJXs diff --git a/docs/graphics/romaudit.png b/docs/graphics/romaudit.png index 7aa89eaaaf6f7763fa83d309d10d5c60492ac1db..f4f3a370efe449a2aabf492bd9bba45a2eebd524 100644 GIT binary patch literal 3046 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

    Selecting a new path for an item is done by clicking the appropriate button(s) - (in this case, 'Rom path' was selected). Note that although the rom path - was '~/src/stella', it expands to '/home/stephena/src/stella' in the browser:

    + (in this case, 'Rom path' was selected), which will show a browser as follows:

    +

    The browser should be self-explanatory. The 'Go Up' button moves to the parent + folder (if it exists), and the 'Base Dir' button moves to the base directory where, + by default, all Stella-related files are stored. Click 'Choose' to select an item, + or 'Cancel' to exit the browser.

    +

    Once you've changed your settings, you can start emulation by selecting a ROM and pressing 'Enter' or clicking 'Select', or double-clicking a ROM. Note that some games require you to 'Reset' the console before you start playing. In this diff --git a/src/emucore/FSNode.cxx b/src/emucore/FSNode.cxx index 367185fbb..a6cf6feb7 100644 --- a/src/emucore/FSNode.cxx +++ b/src/emucore/FSNode.cxx @@ -129,6 +129,13 @@ string FilesystemNode::getPath() const return _realNode->getPath(); } +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +string FilesystemNode::getRelativePath() const +{ + assert(_realNode); + return _realNode->getRelativePath(); +} + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bool FilesystemNode::isDirectory() const { diff --git a/src/emucore/FSNode.hxx b/src/emucore/FSNode.hxx index cdb1147f2..b7bc9f6fb 100644 --- a/src/emucore/FSNode.hxx +++ b/src/emucore/FSNode.hxx @@ -165,8 +165,7 @@ class FilesystemNode virtual string getName() const; /** - * Return a string representation of the file which can be passed to fopen(), - * and is suitable for archiving (i.e. writing to the config file). + * Return a string representation of the file which can be passed to fopen(). * This will usually be a 'path' (hence the name of the method), but can * be anything that fulfills the above criterions. * @@ -177,6 +176,18 @@ class FilesystemNode */ virtual string getPath() const; + /** + * Return a string representation of the file which contains the '~' + * symbol (if applicable), and is suitable for archiving (i.e. writing + * to the config file). + * + * @note Do not assume that this string contains (back)slashes or any + * other kind of 'path separators'. + * + * @return the 'path' represented by this filesystem node + */ + virtual string getRelativePath() const; + /** * Determine whether this node has a parent. */ @@ -294,6 +305,11 @@ class AbstractFilesystemNode */ virtual string getPath() const = 0; + /** + * Returns the 'path' of the current node, containing '~' and for archiving. + */ + virtual string getRelativePath() const = 0; + /** * Indicates whether this path refers to a directory or not. */ diff --git a/src/gui/BrowserDialog.cxx b/src/gui/BrowserDialog.cxx index 3fb96a22f..aa9cdd96d 100644 --- a/src/gui/BrowserDialog.cxx +++ b/src/gui/BrowserDialog.cxx @@ -81,6 +81,11 @@ BrowserDialog::BrowserDialog(GuiObject* boss, const GUI::Font& font) buttonWidth, buttonHeight, "Go up", kGoUpCmd); addFocusWidget(_goUpButton); + _basedirButton = + new ButtonWidget(this, font, 15 + buttonWidth, _h - buttonHeight - 10, + buttonWidth, buttonHeight, "Base Dir", kBaseDirCmd); + addFocusWidget(_basedirButton); + #ifndef MAC_OSX b = new ButtonWidget(this, font, _w - 2 * (buttonWidth + 7), _h - buttonHeight - 10, buttonWidth, buttonHeight, "Choose", kChooseCmd); @@ -157,7 +162,7 @@ void BrowserDialog::updateListing() _nodeList->clear(); // Update the path display - _currentPath->setLabel(_node.getPath()); + _currentPath->setLabel(_node.getRelativePath()); // Read in the data from the file system FSList content; @@ -210,6 +215,11 @@ void BrowserDialog::handleCommand(CommandSender* sender, int cmd, updateListing(); break; + case kBaseDirCmd: + _node = FilesystemNode(instance().baseDir(false)); + updateListing(); + break; + case kListItemActivatedCmd: case kListItemDoubleClickedCmd: { diff --git a/src/gui/BrowserDialog.hxx b/src/gui/BrowserDialog.hxx index 3f6f582f4..757120e82 100644 --- a/src/gui/BrowserDialog.hxx +++ b/src/gui/BrowserDialog.hxx @@ -51,8 +51,9 @@ class BrowserDialog : public Dialog, public CommandSender private: enum { - kChooseCmd = 'CHOS', - kGoUpCmd = 'GOUP' + kChooseCmd = 'CHOS', + kGoUpCmd = 'GOUP', + kBaseDirCmd = 'BADR' }; int _cmd; @@ -61,6 +62,7 @@ class BrowserDialog : public Dialog, public CommandSender StaticTextWidget* _currentPath; StaticTextWidget* _title; ButtonWidget* _goUpButton; + ButtonWidget* _basedirButton; FilesystemNode _node; GameList* _nodeList; diff --git a/src/gui/FileSnapDialog.cxx b/src/gui/FileSnapDialog.cxx index 81dde1345..0ad49c8f0 100644 --- a/src/gui/FileSnapDialog.cxx +++ b/src/gui/FileSnapDialog.cxx @@ -273,49 +273,49 @@ void FileSnapDialog::handleCommand(CommandSender* sender, int cmd, case kRomDirChosenCmd: { FilesystemNode dir(myBrowser->getResult()); - myRomPath->setEditString(dir.getPath()); + myRomPath->setEditString(dir.getRelativePath()); break; } case kStateDirChosenCmd: { FilesystemNode dir(myBrowser->getResult()); - myStatePath->setEditString(dir.getPath()); + myStatePath->setEditString(dir.getRelativePath()); break; } case kCheatFileChosenCmd: { FilesystemNode dir(myBrowser->getResult()); - myCheatFile->setEditString(dir.getPath()); + myCheatFile->setEditString(dir.getRelativePath()); break; } case kPaletteFileChosenCmd: { FilesystemNode dir(myBrowser->getResult()); - myPaletteFile->setEditString(dir.getPath()); + myPaletteFile->setEditString(dir.getRelativePath()); break; } case kPropsFileChosenCmd: { FilesystemNode dir(myBrowser->getResult()); - myPropsFile->setEditString(dir.getPath()); + myPropsFile->setEditString(dir.getRelativePath()); break; } case kSnapDirChosenCmd: { FilesystemNode dir(myBrowser->getResult()); - mySnapPath->setEditString(dir.getPath()); + mySnapPath->setEditString(dir.getRelativePath()); break; } case kEEPROMDirChosenCmd: { FilesystemNode dir(myBrowser->getResult()); - myEEPROMPath->setEditString(dir.getPath()); + myEEPROMPath->setEditString(dir.getRelativePath()); break; } diff --git a/src/gui/LauncherDialog.cxx b/src/gui/LauncherDialog.cxx index dfaf2334e..521d5ea87 100644 --- a/src/gui/LauncherDialog.cxx +++ b/src/gui/LauncherDialog.cxx @@ -266,7 +266,7 @@ void LauncherDialog::updateListing() myPrevDirButton->setEnabled(myCurrentNode.hasParent()); // Show current directory - myDir->setLabel(myCurrentNode.getPath()); + myDir->setLabel(myCurrentNode.getRelativePath()); // Now fill the list widget with the contents of the GameList StringList l; diff --git a/src/unix/FSNodePOSIX.cxx b/src/unix/FSNodePOSIX.cxx index 7eef8a0b5..7d562b441 100644 --- a/src/unix/FSNodePOSIX.cxx +++ b/src/unix/FSNodePOSIX.cxx @@ -61,6 +61,7 @@ class POSIXFilesystemNode : public AbstractFilesystemNode virtual string getDisplayName() const { return _displayName; } virtual string getName() const { return _displayName; } virtual string getPath() const { return _path; } + virtual string getRelativePath() const; virtual bool isDirectory() const { return _isDirectory; } virtual bool isReadable() const { return access(_path.c_str(), R_OK) == 0; } virtual bool isWritable() const { return access(_path.c_str(), W_OK) == 0; } @@ -135,7 +136,7 @@ POSIXFilesystemNode::POSIXFilesystemNode(const string& p, bool verify) if (home != NULL && strlen(home) < MAXPATHLEN) { _path = home; - // Skip over the tilda. We know that p contains at least + // Skip over the tilde. We know that p contains at least // two chars, so this is safe: _path += p.c_str() + 1; } @@ -162,6 +163,26 @@ POSIXFilesystemNode::POSIXFilesystemNode(const string& p, bool verify) setFlags(); } +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +string POSIXFilesystemNode::getRelativePath() const +{ + // If the path starts with the home directory, replace it with '~' + const char* home = getenv("HOME"); + if(home != NULL) + { + int len = strlen(home); + if(strncmp(_path.c_str(), home, len) == 0) + { + string path = "~"; + const char* offset = _path.c_str() + len; + if(*offset != '/') path += "/"; + path += offset; + return path; + } + } + return _path; +} + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bool POSIXFilesystemNode::getChildren(AbstractFSList& myList, ListMode mode, bool hidden) const diff --git a/src/win32/FSNodeWin32.cxx b/src/win32/FSNodeWin32.cxx index 92074dbb6..45e5cb0f8 100644 --- a/src/win32/FSNodeWin32.cxx +++ b/src/win32/FSNodeWin32.cxx @@ -139,6 +139,7 @@ class WindowsFilesystemNode : public AbstractFilesystemNode virtual string getDisplayName() const { return _displayName; } virtual string getName() const { return _displayName; } virtual string getPath() const { return _path; } + virtual string getRelativePath() const; virtual bool isDirectory() const { return _isDirectory; } virtual bool isReadable() const { return _access(_path.c_str(), R_OK) == 0; } virtual bool isWritable() const { return _access(_path.c_str(), W_OK) == 0; } @@ -328,6 +329,27 @@ WindowsFilesystemNode::WindowsFilesystemNode(const string& p) _isPseudoRoot = false; } +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +string WindowsFilesystemNode::getRelativePath() const +{ + // If the path starts with the home directory, replace it with '~' + const string& home = myDocsFinder.getPath(); + if(home != "") + { + // Windows file system not case sensitive + int len = home.length(); + if(BSPF_strncasecmp(home.c_str(), _path.substr(0, len).c_str()) == 0) + { + string path = "~"; + const char* offset = _path.c_str() + len; + if(*offset != '\\') path += '\\'; + path += offset; + return path; + } + } + return _path; +} + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bool WindowsFilesystemNode:: getChildren(AbstractFSList& myList, ListMode mode, bool hidden) const