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