Fixed selection of previous dir in FileListWidget.

I was going to have it remember descending directories too, but it's just too much fooling
around for a minor feature.  Maybe someone else can take a stab at it ...
This commit is contained in:
Stephen Anthony 2019-08-17 18:13:15 -02:30
parent 98267b7ab3
commit a8c1cd3730
4 changed files with 49 additions and 14 deletions

View File

@ -266,7 +266,6 @@ class LinkedObjectPool
for(const auto& i: p.myList) for(const auto& i: p.myList)
os << i << (p.current() == i ? "* " : " "); os << i << (p.current() == i ? "* " : " ");
return os; return os;
} }
private: private:

View File

@ -49,6 +49,13 @@ class FixedStack
T pop() { return std::move(_stack[--_size]); } T pop() { return std::move(_stack[--_size]); }
uInt32 size() const { return _size; } uInt32 size() const { return _size; }
// Reverse the contents of the stack
// This operation isn't needed very often, but it's handy to have
void reverse() {
for(uInt32 i = 0, j = _size - 1; i < j; ++i, --j)
std::swap(_stack[i], _stack[j]);
}
// Apply the given function to every item in the stack // Apply the given function to every item in the stack
// We do it this way so the stack API can be preserved, // We do it this way so the stack API can be preserved,
// and no access to individual elements is allowed outside // and no access to individual elements is allowed outside
@ -58,6 +65,12 @@ class FixedStack
func(_stack[i]); func(_stack[i]);
} }
friend ostream& operator<<(ostream& os, const FixedStack<T>& s) {
for(uInt32 pos = 0; pos < s._size; ++pos)
os << s._stack[pos] << " ";
return os;
}
private: private:
// Following constructors and assignment operators not supported // Following constructors and assignment operators not supported
FixedStack(const FixedStack&) = delete; FixedStack(const FixedStack&) = delete;

View File

@ -50,6 +50,31 @@ void FileListWidget::setDirectory(const FilesystemNode& node, string select)
_node = _node.getParent(); _node = _node.getParent();
} }
// Initialize history
FilesystemNode tmp = _node;
while(tmp.hasParent())
{
string name = tmp.getName();
if(name.back() == '/' || name.back() == '\\')
name.pop_back();
if(!BSPF::startsWithIgnoreCase(name, " ["))
name = " [" + name + "]";
_history.push(name);
tmp = tmp.getParent();
}
// History is in reverse order; we need to fix that
_history.reverse();
// Finally, go to this location
setLocation(_node, select);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void FileListWidget::setLocation(const FilesystemNode& node, const string& select)
{
_node = node;
// Read in the data from the file system (start with an empty list) // Read in the data from the file system (start with an empty list)
_fileList.clear(); _fileList.clear();
_fileList.reserve(512); _fileList.reserve(512);
@ -67,9 +92,10 @@ void FileListWidget::setDirectory(const FilesystemNode& node, string select)
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void FileListWidget::setLocation(const FilesystemNode& node, string select) void FileListWidget::selectDirectory()
{ {
setDirectory(node, select); _history.push(selected().getName());
setLocation(selected());
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -77,13 +103,7 @@ void FileListWidget::selectParent()
{ {
if(_node.hasParent()) if(_node.hasParent())
{ {
// Make sure 'selected' has the proper directory naming scheme const string& select = !_history.empty() ? _history.pop() : EmptyString;
string select = _node.getName();
if(select.back() == '/' || select.back() == '\\')
select.pop_back();
if(!BSPF::startsWithIgnoreCase(select, " ["))
select = " [" + select + "]";
setLocation(_node.getParent(), select); setLocation(_node.getParent(), select);
} }
} }
@ -115,7 +135,7 @@ void FileListWidget::handleCommand(CommandSender* sender, int cmd, int data, int
if(selected().isDirectory()) if(selected().isDirectory())
{ {
cmd = ItemChanged; cmd = ItemChanged;
setLocation(selected(), ""); selectDirectory();
} }
else else
cmd = ItemActivated; cmd = ItemActivated;

View File

@ -21,7 +21,7 @@
class CommandSender; class CommandSender;
#include "FSNode.hxx" #include "FSNode.hxx"
#include "LinkedObjectPool.hxx" #include "Stack.hxx"
#include "StringListWidget.hxx" #include "StringListWidget.hxx"
/** /**
@ -74,7 +74,10 @@ class FileListWidget : public StringListWidget
private: private:
/** Very similar to setDirectory(), but also updates the history */ /** Very similar to setDirectory(), but also updates the history */
void setLocation(const FilesystemNode& node, string select); void setLocation(const FilesystemNode& node, const string& select = EmptyString);
/** Descend into currently selected directory */
void selectDirectory();
void handleCommand(CommandSender* sender, int cmd, int data, int id) override; void handleCommand(CommandSender* sender, int cmd, int data, int id) override;
@ -83,7 +86,7 @@ class FileListWidget : public StringListWidget
FilesystemNode _node; FilesystemNode _node;
FSList _fileList; FSList _fileList;
Common::LinkedObjectPool<string> _history; Common::FixedStack<string> _history;
string _extension; string _extension;
uInt32 _selected; uInt32 _selected;