Fix highlighting parent directory in filtered browser

master
Andrzej Rybczak 9 years ago
parent 7d502e42ba
commit 6d2ed00e6a
  1. 102
      src/screens/browser.cpp

@ -461,74 +461,60 @@ bool Browser::enterDirectory()
void Browser::getDirectory(std::string directory) void Browser::getDirectory(std::string directory)
{ {
ScopedUnfilteredMenu<MPD::Item> sunfilter(ReapplyFilter::Yes, w); {
ScopedUnfilteredMenu<MPD::Item> sunfilter(ReapplyFilter::Yes, w);
m_scroll_beginning = 0; m_scroll_beginning = 0;
w.clear(); w.clear();
// reset the position if we change directories // Reset the position if we change directories.
if (m_current_directory != directory) if (m_current_directory != directory)
w.reset(); w.reset();
// check if it's a parent directory // Check if it's a parent directory.
if (isStringParentDirectory(directory)) if (isStringParentDirectory(directory))
{ {
directory.resize(directory.length()-3); directory.resize(directory.length()-3);
directory = getParentDirectory(directory); directory = getParentDirectory(directory);
} }
// when we go down to root, it can be empty // When we go down to root, it can be empty.
if (directory.empty()) if (directory.empty())
directory = "/"; directory = "/";
std::vector<MPD::Item> items;
if (m_local_browser)
getLocalDirectory(items, directory);
else
{
std::copy(std::make_move_iterator(Mpd.GetDirectory(directory)),
std::make_move_iterator(MPD::ItemIterator()),
std::back_inserter(items));
}
std::vector<MPD::Item> items; if (Config.browser_sort_mode != SortMode::NoOp)
if (m_local_browser) {
getLocalDirectory(items, directory); std::sort(items.begin(), items.end(),
else LocaleBasedItemSorting(std::locale(), Config.ignore_leading_the, Config.browser_sort_mode));
{ }
std::copy(
std::make_move_iterator(Mpd.GetDirectory(directory)),
std::make_move_iterator(MPD::ItemIterator()),
std::back_inserter(items)
);
}
// sort items // If the requested directory is not root, add parent directory.
if (Config.browser_sort_mode != SortMode::NoOp) if (!isRootDirectory(directory))
{ {
std::sort(items.begin(), items.end(), // Make it so that display function doesn't have to handle special cases.
LocaleBasedItemSorting(std::locale(), Config.ignore_leading_the, Config.browser_sort_mode) w.addItem(MPD::Directory(directory + "/.."), NC::List::Properties::None);
); }
}
// if the requested directory is not root, add parent directory for (const auto &item : items)
if (!isRootDirectory(directory)) w.addItem(std::move(item));
{
// make it so that display function doesn't have to handle special cases
w.addItem(MPD::Directory(directory + "/.."), NC::List::Properties::None);
} }
for (const auto &item : items) for (size_t i = 0; i < w.size(); ++i)
{ {
switch (item.type()) if (w[i].value().type() == MPD::Item::Type::Directory
&& w[i].value().directory().path() == m_current_directory)
{ {
case MPD::Item::Type::Playlist: w.highlight(i);
{ break;
w.addItem(std::move(item));
break;
}
case MPD::Item::Type::Directory:
{
bool is_current = item.directory().path() == m_current_directory;
w.addItem(std::move(item));
if (is_current)
w.highlight(w.size()-1);
break;
}
case MPD::Item::Type::Song:
{
w.addItem(std::move(item));
break;
}
} }
} }
m_current_directory = directory; m_current_directory = directory;

Loading…
Cancel
Save