mirror of https://github.com/stella-emu/stella.git
added path info to launcher tooltips when displaying sub directories
fixed launcher files list when filtering was canceled added persisting 'incl. subdirectories' setting
This commit is contained in:
parent
53f24729fd
commit
9274a72d51
|
@ -336,7 +336,7 @@ void FBSurface::splitString(const GUI::Font& font, const string& s, int w,
|
|||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
bool FBSurface::isWhiteSpace(const char s) const
|
||||
{
|
||||
const string WHITESPACES = " ,.;:+-*/'([\n";
|
||||
const string WHITESPACES = " ,.;:+-*/\\'([\n";
|
||||
|
||||
for(size_t i = 0; i < WHITESPACES.length(); ++i)
|
||||
if(s == WHITESPACES[i])
|
||||
|
|
|
@ -145,6 +145,7 @@ Settings::Settings()
|
|||
setPermanent("launcherres", Common::Size(900, 600));
|
||||
setPermanent("launcherfont", "medium");
|
||||
setPermanent("launcherroms", "true");
|
||||
setPermanent("launchersubdirs", "false");
|
||||
setPermanent("romviewer", "1");
|
||||
setPermanent("lastrom", "");
|
||||
|
||||
|
@ -542,6 +543,7 @@ void Settings::usage() const
|
|||
<< " large12|large14|\n"
|
||||
<< " large16>\n"
|
||||
<< " -launcherroms <1|0> Show only ROMs in the launcher (vs. all files)\n"
|
||||
<< " -launchersubdirs <1|0> Show files from subdirectories too\n"
|
||||
<< " -romviewer <float> Show ROM info viewer at given zoom level in ROM\n"
|
||||
<< " launcher (use 0 for off)\n"
|
||||
<< " -followlauncher <0|1> Default ROM path follows launcher navigation\n"
|
||||
|
|
|
@ -75,7 +75,7 @@ void FileListWidget::setLocation(const FilesystemNode& node,
|
|||
{
|
||||
progress().resetProgress();
|
||||
progress().open();
|
||||
FilesystemNode::CancelCheck isCancelled = []() {
|
||||
class FilesystemNode::CancelCheck isCancelled = []() {
|
||||
return myProgressDialog->isCancelled();
|
||||
};
|
||||
|
||||
|
@ -96,17 +96,26 @@ void FileListWidget::setLocation(const FilesystemNode& node,
|
|||
_node.getChildren(_fileList, _fsmode, _filter, false, true, isCancelled);
|
||||
}
|
||||
|
||||
if(!isCancelled())
|
||||
{
|
||||
// Now fill the list widget with the names from the file list
|
||||
StringList l;
|
||||
for(const auto& file : _fileList)
|
||||
l.push_back(file.getName());
|
||||
// Now fill the list widget with the names from the file list,
|
||||
// even if cancelled
|
||||
StringList l;
|
||||
size_t orgLen = node.getShortPath().length();
|
||||
|
||||
setList(l);
|
||||
setSelected(select);
|
||||
_dirList.clear();
|
||||
for(const auto& file : _fileList)
|
||||
{
|
||||
const string path = file.getShortPath();
|
||||
|
||||
l.push_back(file.getName());
|
||||
// display only relative path in tooltip
|
||||
if(path.length() >= orgLen)
|
||||
_dirList.push_back(path.substr(orgLen));
|
||||
else
|
||||
_dirList.push_back(path);
|
||||
}
|
||||
|
||||
setList(l);
|
||||
setSelected(select);
|
||||
ListWidget::recalc();
|
||||
|
||||
progress().close();
|
||||
|
@ -237,6 +246,27 @@ void FileListWidget::handleCommand(CommandSender* sender, int cmd, int data, int
|
|||
setTarget(this);
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
string FileListWidget::getToolTip(const Common::Point& pos) const
|
||||
{
|
||||
Common::Rect rect = getEditRect();
|
||||
int idx = getToolTipIndex(pos);
|
||||
|
||||
if(idx < 0)
|
||||
return EmptyString;
|
||||
|
||||
if(_includeSubDirs && _dirList.size() > idx)
|
||||
return _toolTipText + _dirList[idx];
|
||||
|
||||
const string value = _list[idx];
|
||||
|
||||
if(uInt32(_font.getStringWidth(value)) > rect.w())
|
||||
return _toolTipText + value;
|
||||
else
|
||||
return _toolTipText;
|
||||
}
|
||||
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
uInt64 FileListWidget::_QUICK_SELECT_DELAY = 300;
|
||||
|
||||
|
|
|
@ -53,6 +53,8 @@ class FileListWidget : public StringListWidget
|
|||
int x, int y, int w, int h);
|
||||
~FileListWidget() override = default;
|
||||
|
||||
string getToolTip(const Common::Point& pos) const override;
|
||||
|
||||
/** Determines how to display files/folders; either setDirectory or reload
|
||||
must be called after any of these are called. */
|
||||
void setListMode(FilesystemNode::ListMode mode) { _fsmode = mode; }
|
||||
|
@ -69,6 +71,7 @@ class FileListWidget : public StringListWidget
|
|||
@param node The directory to display. If this is a file, its parent
|
||||
will instead be used, and the file will be selected
|
||||
@param select An optional entry to select (if applicable)
|
||||
@param recursive Recursively list sub-directories too
|
||||
*/
|
||||
void setDirectory(const FilesystemNode& node,
|
||||
const string& select = EmptyString);
|
||||
|
@ -112,6 +115,8 @@ class FileListWidget : public StringListWidget
|
|||
FSList _fileList;
|
||||
bool _includeSubDirs{false};
|
||||
|
||||
StringList _dirList;
|
||||
|
||||
Common::FixedStack<string> _history;
|
||||
uInt32 _selected{0};
|
||||
string _selectedFile;
|
||||
|
|
|
@ -15,9 +15,6 @@
|
|||
// this file, and for a DISCLAIMER OF ALL WARRANTIES.
|
||||
//============================================================================
|
||||
|
||||
// TODO:
|
||||
// - abort current file list reload when typing
|
||||
|
||||
#include "bspf.hxx"
|
||||
#include "Bankswitch.hxx"
|
||||
#include "BrowserDialog.hxx"
|
||||
|
@ -90,10 +87,10 @@ LauncherDialog::LauncherDialog(OSystem& osystem, DialogContainer& parent,
|
|||
|
||||
int lwSelect = font.getStringWidth(lblSelect);
|
||||
int cwAllFiles = font.getStringWidth(lblAllFiles) + CheckboxWidget::prefixSize(font);
|
||||
int lwFilter = font.getStringWidth(lblFilter);
|
||||
int cwSubDirs = font.getStringWidth(lblSubDirs) + CheckboxWidget::prefixSize(font);
|
||||
int lwFilter = font.getStringWidth(lblFilter);
|
||||
int lwFound = font.getStringWidth(lblFound);
|
||||
int wTotal = HBORDER * 2 + lwSelect + cwAllFiles + lwFilter + cwSubDirs + lwFound
|
||||
int wTotal = HBORDER * 2 + lwSelect + cwAllFiles + cwSubDirs + lwFilter + lwFound
|
||||
+ EditTextWidget::calcWidth(font, "123456") + LBL_GAP * 7;
|
||||
bool noSelect = false;
|
||||
|
||||
|
@ -174,13 +171,6 @@ LauncherDialog::LauncherDialog(OSystem& osystem, DialogContainer& parent,
|
|||
xpos - cwSubDirs - lwFilter - cwAllFiles
|
||||
- lwSelect - HBORDER - LBL_GAP * (noSelect ? 5 : 7));
|
||||
|
||||
// Show the subdirectories checkbox
|
||||
xpos -= cwSubDirs + LBL_GAP;
|
||||
mySubDirs = new CheckboxWidget(this, font, xpos, ypos, lblSubDirs, kSubDirsCmd);
|
||||
ostringstream tip;
|
||||
tip << "Search files in subdirectories too.";
|
||||
mySubDirs->setToolTip(tip.str());
|
||||
|
||||
// Show the filter input field
|
||||
xpos -= fwFilter + LBL_GAP;
|
||||
myPattern = new EditTextWidget(this, font, xpos, ypos - 2, fwFilter, lineHeight, "");
|
||||
|
@ -191,11 +181,18 @@ LauncherDialog::LauncherDialog(OSystem& osystem, DialogContainer& parent,
|
|||
xpos -= lwFilter + LBL_GAP;
|
||||
new StaticTextWidget(this, font, xpos, ypos, lblFilter);
|
||||
|
||||
// Show the subdirectories checkbox
|
||||
xpos -= cwSubDirs + LBL_GAP * 2;
|
||||
mySubDirs = new CheckboxWidget(this, font, xpos, ypos, lblSubDirs, kSubDirsCmd);
|
||||
ostringstream tip;
|
||||
tip << "Search files in subdirectories too.";
|
||||
mySubDirs->setToolTip(tip.str());
|
||||
|
||||
// Show the checkbox for all files
|
||||
if(noSelect)
|
||||
xpos = HBORDER;
|
||||
else
|
||||
xpos -= cwAllFiles + LBL_GAP * 2;
|
||||
xpos -= cwAllFiles + LBL_GAP;
|
||||
myAllFiles = new CheckboxWidget(this, font, xpos, ypos, lblAllFiles, kAllfilesCmd);
|
||||
myAllFiles->setToolTip("Uncheck to show ROM files only.");
|
||||
|
||||
|
@ -386,6 +383,10 @@ void LauncherDialog::loadConfig()
|
|||
instance().settings().setValue("stella.version", STELLA_VERSION);
|
||||
}
|
||||
|
||||
bool subDirs = instance().settings().getBool("launchersubdirs");
|
||||
mySubDirs->setState(subDirs);
|
||||
myList->setIncludeSubDirs(subDirs);
|
||||
|
||||
// Assume that if the list is empty, this is the first time that loadConfig()
|
||||
// has been called (and we should reload the list)
|
||||
if(myList->getList().empty())
|
||||
|
@ -408,6 +409,7 @@ void LauncherDialog::loadConfig()
|
|||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void LauncherDialog::saveConfig()
|
||||
{
|
||||
instance().settings().setValue("launchersubdirs", mySubDirs->getState());
|
||||
if(instance().settings().getBool("followlauncher"))
|
||||
instance().settings().setValue("romdir", myList->currentDir().getShortPath());
|
||||
}
|
||||
|
|
|
@ -41,6 +41,7 @@ class StringListWidget : public ListWidget
|
|||
void lostFocusWidget() override { setDirty(); }
|
||||
|
||||
bool hasToolTip() const override { return true; }
|
||||
int getToolTipIndex(const Common::Point& pos) const;
|
||||
|
||||
void drawWidget(bool hilite) override;
|
||||
Common::Rect getEditRect() const override;
|
||||
|
@ -49,9 +50,6 @@ class StringListWidget : public ListWidget
|
|||
bool _hilite{false};
|
||||
int _textOfs{0};
|
||||
|
||||
private:
|
||||
int getToolTipIndex(const Common::Point& pos) const;
|
||||
|
||||
private:
|
||||
// Following constructors and assignment operators not supported
|
||||
StringListWidget() = delete;
|
||||
|
|
Loading…
Reference in New Issue