Fix crash when directory doesn't exist in BrowserWidget (fixes #888).

This commit is contained in:
Stephen Anthony 2022-05-14 14:59:22 -02:30
parent 65f8823ba8
commit 859dfc79db
2 changed files with 33 additions and 11 deletions

View File

@ -43,13 +43,17 @@ void FileListWidget::setDirectory(const FilesystemNode& node,
_node = node; _node = node;
// We always want a directory listing // We always want a directory listing
if(!isDirectory(_node) && _node.hasParent()) if(_node.isDirectory())
{
_selectedFile = _node.getName();
_node = _node.getParent();
}
else
_selectedFile = select; _selectedFile = select;
else
{
// Otherwise, keeping going up in the directory name until a valid
// one is found
while(!_node.isDirectory() && _node.hasParent())
_node = _node.getParent();
_selectedFile = _node.getName();
}
// Initialize history // Initialize history
FilesystemNode tmp = _node; FilesystemNode tmp = _node;
@ -279,6 +283,22 @@ void FileListWidget::reload()
} }
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
const FilesystemNode& FileListWidget::selected()
{
if(_fileList.size() > 0)
{
_selected = BSPF::clamp(_selected, 0U, static_cast<uInt32>(_fileList.size()-1));
return _fileList[_selected];
}
else
{
// This should never happen, but we'll error-check out-of-bounds
// array access anyway
return ourDefaultNode;
}
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ProgressDialog& FileListWidget::progress() ProgressDialog& FileListWidget::progress()
{ {
@ -709,3 +729,6 @@ string FileListWidget::getToolTip(const Common::Point& pos) const
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
uInt64 FileListWidget::_QUICK_SELECT_DELAY = 300; uInt64 FileListWidget::_QUICK_SELECT_DELAY = 300;
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FilesystemNode FileListWidget::ourDefaultNode = FilesystemNode("~");

View File

@ -99,10 +99,7 @@ class FileListWidget : public StringListWidget
void reload(); void reload();
/** Gets current node(s) */ /** Gets current node(s) */
const FilesystemNode& selected() { const FilesystemNode& selected();
_selected = BSPF::clamp(_selected, 0U, static_cast<uInt32>(_fileList.size()-1));
return _fileList[_selected];
}
const FilesystemNode& currentDir() const { return _node; } const FilesystemNode& currentDir() const { return _node; }
static void setQuickSelectDelay(uInt64 time) { _QUICK_SELECT_DELAY = time; } static void setQuickSelectDelay(uInt64 time) { _QUICK_SELECT_DELAY = time; }
@ -115,7 +112,7 @@ class FileListWidget : public StringListWidget
struct HistoryType struct HistoryType
{ {
FilesystemNode node; FilesystemNode node;
string selected; string selected;
explicit HistoryType(const FilesystemNode& _hnode, const string& _hselected) explicit HistoryType(const FilesystemNode& _hnode, const string& _hselected)
: node{_hnode}, selected{_hselected} {} : node{_hnode}, selected{_hselected} {}
@ -190,6 +187,8 @@ class FileListWidget : public StringListWidget
unique_ptr<ProgressDialog> myProgressDialog; unique_ptr<ProgressDialog> myProgressDialog;
static FilesystemNode ourDefaultNode;
private: private:
// Following constructors and assignment operators not supported // Following constructors and assignment operators not supported
FileListWidget() = delete; FileListWidget() = delete;