actions: implement filtering playlist on priorities

This commit is contained in:
Andrzej Rybczak
2012-09-08 00:28:02 +02:00
parent 45a097a45b
commit a26b1f62f9
6 changed files with 42 additions and 7 deletions

View File

@@ -2204,9 +2204,9 @@ void SetSelectedItemsPriority::Run()
Statusbar() << "Set priority [0-255]: ";
std::string strprio = wFooter->getString();
UnlockStatusbar();
if (!isInteger(strprio.c_str()))
if (!isInteger(strprio.c_str(), true))
return;
int prio = atoi(strprio.c_str());
int prio = stringToInt(strprio);
if (prio < 0 || prio > 255)
{
ShowMessage("Number is out of range");
@@ -2215,6 +2215,29 @@ void SetSelectedItemsPriority::Run()
myPlaylist->SetSelectedItemsPriority(prio);
}
bool FilterPlaylistOnPriorities::canBeRun() const
{
return myScreen->ActiveWindow() == myPlaylist->Items;
}
void FilterPlaylistOnPriorities::Run()
{
using Global::wFooter;
LockStatusbar();
Statusbar() << "Show songs with priority higher than: ";
std::string strprio = wFooter->getString();
UnlockStatusbar();
if (!isInteger(strprio.c_str(), false))
return;
unsigned prio = stringToInt(strprio);
myPlaylist->Items->filter(myPlaylist->Items->begin(), myPlaylist->Items->end(),
[prio](const NC::Menu<MPD::Song>::Item &s) {
return s.value().getPrio() > prio;
});
ShowMessage("Playlist filtered (songs with priority higher than %u)", prio);
}
void ShowSongInfo::Run()
{
mySongInfo->SwitchTo();
@@ -2578,6 +2601,7 @@ void populateActions()
insertAction(new RefetchLyrics());
insertAction(new RefetchArtistInfo());
insertAction(new SetSelectedItemsPriority());
insertAction(new FilterPlaylistOnPriorities());
insertAction(new ShowSongInfo());
insertAction(new ShowArtistInfo());
insertAction(new ShowLyrics());

View File

@@ -44,7 +44,8 @@ enum ActionType
aApplyFilter, aFind, aFindItemForward, aFindItemBackward, aNextFoundItem,
aPreviousFoundItem, aToggleFindMode, aToggleReplayGainMode, aToggleSpaceMode, aToggleAddMode,
aToggleMouse, aToggleBitrateVisibility, aAddRandomItems, aToggleBrowserSortMode, aToggleLibraryTagType,
aRefetchLyrics, aRefetchArtistInfo, aSetSelectedItemsPriority, aShowSongInfo, aShowArtistInfo,
aRefetchLyrics, aRefetchArtistInfo, aSetSelectedItemsPriority, aFilterPlaylistOnPriorities,
aShowSongInfo, aShowArtistInfo,
aShowLyrics, aQuit, aNextScreen, aPreviousScreen, aShowHelp, aShowPlaylist, aShowBrowser,
aShowSearchEngine, aShowMediaLibrary, aShowPlaylistEditor, aShowTagEditor, aShowOutputs,
aShowVisualizer, aShowClock, aShowServerInfo
@@ -915,6 +916,16 @@ protected:
virtual void Run();
};
struct FilterPlaylistOnPriorities : public Action
{
FilterPlaylistOnPriorities()
: Action(aFilterPlaylistOnPriorities, "filter_playlist_on_priorities") { }
protected:
virtual bool canBeRun() const;
virtual void Run();
};
struct ShowSongInfo : public Action
{
ShowSongInfo() : Action(aShowSongInfo, "show_song_info") { }

View File

@@ -493,7 +493,6 @@ void BindingsConfiguration::generateDefaults()
if (notBound(k = stringToKey("q")))
bind(k, aQuit);
if (notBound(k = stringToKey("-")))
bind(k, aVolumeDown);
}

View File

@@ -297,6 +297,7 @@ void Help::GetKeybindings()
KeyDesc(aSavePlaylist, "Save playlist");
KeyDesc(aSortPlaylist, "Sort playlist");
KeyDesc(aReversePlaylist, "Reverse playlist");
KeyDesc(aFilterPlaylistOnPriorities, "Filter playlist on priorities");
KeyDesc(aJumpToPlayingSong, "Jump to playing song");
KeyDesc(aTogglePlayingSongCentering, "Toggle playing song centering");

View File

@@ -33,13 +33,13 @@ long stringToLongInt(const std::string &s)
return atol(s.c_str());
}
bool isInteger(const char *s)
bool isInteger(const char *s, bool accept_signed)
{
assert(s);
if (*s == '\0')
return false;
for (const char *it = s; *it != '\0'; ++it)
if (!isdigit(*it) && (it != s || *it != '-'))
if (!(isdigit(*it) || (accept_signed && it == s && *it == '-')))
return false;
return true;
}

View File

@@ -54,7 +54,7 @@ template <size_t N> struct print<N, std::wstring> {
int stringToInt(const std::string &s);
long stringToLongInt(const std::string &s);
bool isInteger(const char *s);
bool isInteger(const char *s, bool accept_signed);
std::string ToString(const std::wstring &ws);
std::wstring ToWString(const std::string &s);