From 2caf08aaa783cfabf54212bcb0197afc1db24440 Mon Sep 17 00:00:00 2001 From: Andrzej Rybczak Date: Sun, 17 May 2015 18:10:42 +0200 Subject: [PATCH] split PressSpace action into modular pieces --- NEWS | 1 + doc/bindings | 12 +++-- doc/config | 4 -- doc/ncmpcpp.1 | 3 -- src/actions.cpp | 55 ++++++++++++++++++++--- src/actions.h | 56 +++++++++++++++++------- src/bindings.cpp | 8 +++- src/browser.cpp | 94 ++++++++++++++++++---------------------- src/browser.h | 2 +- src/clock.h | 1 - src/help.cpp | 12 ++--- src/help.h | 1 - src/helpers.cpp | 54 +++++++++++------------ src/interfaces.h | 1 + src/lastfm.h | 1 - src/lyrics.cpp | 8 ---- src/lyrics.h | 3 +- src/media_library.cpp | 59 ++++++++----------------- src/media_library.h | 4 +- src/outputs.h | 1 - src/playlist.h | 2 +- src/playlist_editor.cpp | 65 ++++++++++++--------------- src/playlist_editor.h | 4 +- src/screen.h | 3 -- src/search_engine.cpp | 24 ++++------ src/search_engine.h | 2 +- src/sel_items_adder.h | 1 - src/server_info.h | 1 - src/song_info.h | 1 - src/sort_playlist.h | 1 - src/tag_editor.cpp | 10 ++++- src/tag_editor.h | 2 +- src/tiny_tag_editor.h | 1 - src/utility/functional.h | 30 +++++++++++++ src/visualizer.cpp | 52 +++++++++++----------- src/visualizer.h | 2 +- 36 files changed, 306 insertions(+), 275 deletions(-) diff --git a/NEWS b/NEWS index 3c700acd..82a2f84a 100644 --- a/NEWS +++ b/NEWS @@ -24,6 +24,7 @@ ncmpcpp-0.7 (????-??-??) * Support for Alt, Ctrl and Shift modifiers as well as Escape key was added. * Action that updates the environment can now be used in bindings configuration file. * Searching in text fields now respects regular expression configuration. +* Monolithic 'press_space' action was split into 'add_item_to_playlist', 'toggle_lyrics_update_on_song_change' and 'toggle_visualization_type'. ncmpcpp-0.6.4 (2015-05-02) diff --git a/doc/bindings b/doc/bindings index 1f5a5daf..8bd51f9a 100644 --- a/doc/bindings +++ b/doc/bindings @@ -184,12 +184,18 @@ #def_key "insert" # select_item # -#def_key "space" -# press_space -# #def_key "enter" # press_enter # +#def_key "space" +# add_item_to_playlist +# +#def_key "space" +# toggle_lyrics_update_on_song_change +# +#def_key "space" +# toggle_visualization_type +# #def_key "delete" # delete_playlist_items # diff --git a/doc/config b/doc/config index 200483c7..19bb8456 100644 --- a/doc/config +++ b/doc/config @@ -377,10 +377,6 @@ ## #lastfm_preferred_language = en # -## Available values: add_remove, always_add. -## -#space_add_mode = always_add -# #show_hidden_files_in_local_browser = no # ## diff --git a/doc/ncmpcpp.1 b/doc/ncmpcpp.1 index 14dfe87e..a9d9b6b4 100644 --- a/doc/ncmpcpp.1 +++ b/doc/ncmpcpp.1 @@ -245,9 +245,6 @@ If set to yes, it will be possible to physically delete files and directories fr .B lastfm_preferred_language = ISO 639 alpha-2 language code If set, ncmpcpp will try to get info from last.fm in language you set and if it fails, it will fall back to english. Otherwise it will use english the first time. .TP -.B space_add_mode = add_remove/always_add -If set to add_remove, pressing space on item which is already in playlist will remove it, otherwise add it again. -.TP .B show_hidden_files_in_local_browser = yes/no Trigger for displaying in local browser files and directories that begin with '.' .TP diff --git a/src/actions.cpp b/src/actions.cpp index 9ffd144d..06b762b7 100644 --- a/src/actions.cpp +++ b/src/actions.cpp @@ -512,11 +512,6 @@ void PressEnter::run() myScreen->enterPressed(); } -void PressSpace::run() -{ - myScreen->spacePressed(); -} - bool PreviousColumn::canBeRun() { auto hc = hasColumns(myScreen); @@ -593,6 +588,23 @@ void VolumeDown::run() Mpd.SetVolume(volume); } +bool AddItemToPlaylist::canBeRun() +{ + if (m_hs != static_cast(myScreen)) + m_hs = dynamic_cast(myScreen); + return m_hs != nullptr; +} + +void AddItemToPlaylist::run() +{ + bool success = m_hs->addItemToPlaylist(); + if (success) + { + myScreen->scroll(NC::Scroll::Down); + listsChangeFinisher(); + } +} + bool DeletePlaylistItems::canBeRun() { return (myScreen == myPlaylist && !myPlaylist->main().empty()) @@ -1060,6 +1072,19 @@ void ToggleSeparatorsBetweenAlbums::run() ); } +bool ToggleLyricsUpdateOnSongChange::canBeRun() +{ + return myScreen == myLyrics; +} + +void ToggleLyricsUpdateOnSongChange::run() +{ + Config.now_playing_lyrics = !Config.now_playing_lyrics; + Statusbar::printf("Update lyrics if song changes: %1%", + Config.now_playing_lyrics ? "on" : "off" + ); +} + #ifndef HAVE_CURL_CURL_H bool ToggleLyricsFetcher::canBeRun() { @@ -2121,6 +2146,22 @@ void SetSelectedItemsPriority::run() myPlaylist->SetSelectedItemsPriority(prio); } +bool ToggleVisualizationType::canBeRun() +{ +# ifdef ENABLE_VISUALIZER + return myScreen == myVisualizer; +# else + return false; +# endif // ENABLE_VISUALIZER +} + +void ToggleVisualizationType::run() +{ +# ifdef ENABLE_VISUALIZER + myVisualizer->ToggleVisualizationType(); +# endif // ENABLE_VISUALIZER +} + bool SetVisualizerSampleMultiplier::canBeRun() { # ifdef ENABLE_VISUALIZER @@ -2472,7 +2513,6 @@ void populateActions() insert_action(new Actions::ToggleInterface()); insert_action(new Actions::JumpToParentDirectory()); insert_action(new Actions::PressEnter()); - insert_action(new Actions::PressSpace()); insert_action(new Actions::SelectItem()); insert_action(new Actions::PreviousColumn()); insert_action(new Actions::NextColumn()); @@ -2480,6 +2520,7 @@ void populateActions() insert_action(new Actions::SlaveScreen()); insert_action(new Actions::VolumeUp()); insert_action(new Actions::VolumeDown()); + insert_action(new Actions::AddItemToPlaylist()); insert_action(new Actions::DeletePlaylistItems()); insert_action(new Actions::DeleteStoredPlaylist()); insert_action(new Actions::DeleteBrowserItems()); @@ -2500,6 +2541,7 @@ void populateActions() insert_action(new Actions::SeekBackward()); insert_action(new Actions::ToggleDisplayMode()); insert_action(new Actions::ToggleSeparatorsBetweenAlbums()); + insert_action(new Actions::ToggleLyricsUpdateOnSongChange()); insert_action(new Actions::ToggleLyricsFetcher()); insert_action(new Actions::ToggleFetchingLyricsInBackground()); insert_action(new Actions::TogglePlayingSongCentering()); @@ -2553,6 +2595,7 @@ void populateActions() insert_action(new Actions::ToggleMediaLibrarySortMode()); insert_action(new Actions::RefetchLyrics()); insert_action(new Actions::SetSelectedItemsPriority()); + insert_action(new Actions::ToggleVisualizationType()); insert_action(new Actions::SetVisualizerSampleMultiplier()); insert_action(new Actions::ShowSongInfo()); insert_action(new Actions::ShowArtistInfo()); diff --git a/src/actions.h b/src/actions.h index f099ca92..db8ee5d1 100644 --- a/src/actions.h +++ b/src/actions.h @@ -37,15 +37,15 @@ enum class Type MacroUtility = 0, Dummy, UpdateEnvironment, MouseEvent, ScrollUp, ScrollDown, ScrollUpArtist, ScrollUpAlbum, ScrollDownArtist, ScrollDownAlbum, PageUp, PageDown, MoveHome, MoveEnd, - ToggleInterface, JumpToParentDirectory, PressEnter, PressSpace, PreviousColumn, - NextColumn, MasterScreen, SlaveScreen, VolumeUp, VolumeDown, DeletePlaylistItems, - DeleteStoredPlaylist, DeleteBrowserItems, ReplaySong, Previous, Next, Pause, - Stop, ExecuteCommand, SavePlaylist, MoveSortOrderUp, MoveSortOrderDown, + ToggleInterface, JumpToParentDirectory, PressEnter, PreviousColumn, + NextColumn, MasterScreen, SlaveScreen, VolumeUp, VolumeDown, AddItemToPlaylist, + DeletePlaylistItems, DeleteStoredPlaylist, DeleteBrowserItems, ReplaySong, Previous, + Next, Pause, Stop, ExecuteCommand, SavePlaylist, MoveSortOrderUp, MoveSortOrderDown, MoveSelectedItemsUp, MoveSelectedItemsDown, MoveSelectedItemsTo, Add, SeekForward, SeekBackward, ToggleDisplayMode, ToggleSeparatorsBetweenAlbums, - ToggleLyricsFetcher, ToggleFetchingLyricsInBackground, TogglePlayingSongCentering, - UpdateDatabase, JumpToPlayingSong, ToggleRepeat, Shuffle, ToggleRandom, - StartSearching, SaveTagChanges, ToggleSingle, ToggleConsume, ToggleCrossfade, + ToggleLyricsUpdateOnSongChange, ToggleLyricsFetcher, ToggleFetchingLyricsInBackground, + TogglePlayingSongCentering, UpdateDatabase, JumpToPlayingSong, ToggleRepeat, Shuffle, + ToggleRandom, StartSearching, SaveTagChanges, ToggleSingle, ToggleConsume, ToggleCrossfade, SetCrossfade, SetVolume, EditSong, EditLibraryTag, EditLibraryAlbum, EditDirectoryName, EditPlaylistName, EditLyrics, JumpToBrowser, JumpToMediaLibrary, JumpToPlaylistEditor, ToggleScreenLock, JumpToTagEditor, JumpToPositionInSong, @@ -56,7 +56,7 @@ enum class Type ToggleAddMode, ToggleMouse, ToggleBitrateVisibility, AddRandomItems, ToggleBrowserSortMode, ToggleLibraryTagType, ToggleMediaLibrarySortMode, RefetchLyrics, - SetSelectedItemsPriority, SetVisualizerSampleMultiplier, + SetSelectedItemsPriority, ToggleVisualizationType, SetVisualizerSampleMultiplier, ShowSongInfo, ShowArtistInfo, ShowLyrics, Quit, NextScreen, PreviousScreen, ShowHelp, ShowPlaylist, ShowBrowser, ChangeBrowseMode, ShowSearchEngine, ResetSearchEngine, ShowMediaLibrary, ToggleMediaLibraryColumnsMode, @@ -272,14 +272,6 @@ private: virtual void run() OVERRIDE; }; -struct PressSpace: BaseAction -{ - PressSpace(): BaseAction(Type::PressSpace, "press_space") { } - -private: - virtual void run() OVERRIDE; -}; - struct PreviousColumn: BaseAction { PreviousColumn(): BaseAction(Type::PreviousColumn, "previous_column") { } @@ -332,6 +324,17 @@ private: virtual void run() OVERRIDE; }; +struct AddItemToPlaylist: BaseAction +{ + AddItemToPlaylist(): BaseAction(Type::AddItemToPlaylist, "add_item_to_playlist") { } + +private: + virtual bool canBeRun() OVERRIDE; + virtual void run() OVERRIDE; + + HasSongs *m_hs; +}; + struct DeletePlaylistItems: BaseAction { DeletePlaylistItems(): BaseAction(Type::DeletePlaylistItems, "delete_playlist_items") { } @@ -506,6 +509,16 @@ private: virtual void run() OVERRIDE; }; +struct ToggleLyricsUpdateOnSongChange: BaseAction +{ + ToggleLyricsUpdateOnSongChange() + : BaseAction(Type::ToggleLyricsUpdateOnSongChange, "toggle_lyrics_update_on_song_change") { } + +private: + virtual bool canBeRun() OVERRIDE; + virtual void run() OVERRIDE; +}; + struct ToggleLyricsFetcher: BaseAction { ToggleLyricsFetcher(): BaseAction(Type::ToggleLyricsFetcher, "toggle_lyrics_fetcher") { } @@ -998,6 +1011,17 @@ private: virtual void run() OVERRIDE; }; +struct ToggleVisualizationType: BaseAction +{ + ToggleVisualizationType() + : BaseAction(Type::ToggleVisualizationType, "toggle_visualization_type") { } + +private: + + virtual bool canBeRun() OVERRIDE; + virtual void run() OVERRIDE; +}; + struct SetVisualizerSampleMultiplier: BaseAction { SetVisualizerSampleMultiplier() diff --git a/src/bindings.cpp b/src/bindings.cpp index 18e03ecd..3a9e824e 100644 --- a/src/bindings.cpp +++ b/src/bindings.cpp @@ -472,10 +472,14 @@ void BindingsConfiguration::generateDefaults() bind(k, Actions::Type::MoveEnd); if (notBound(k = stringToKey("insert"))) bind(k, Actions::Type::SelectItem); - if (notBound(k = stringToKey("space"))) - bind(k, Actions::Type::PressSpace); if (notBound(k = stringToKey("enter"))) bind(k, Actions::Type::PressEnter); + if (notBound(k = stringToKey("space"))) + { + bind(k, Actions::Type::AddItemToPlaylist); + bind(k, Actions::Type::ToggleLyricsUpdateOnSongChange); + bind(k, Actions::Type::ToggleVisualizationType); + } if (notBound(k = stringToKey("delete"))) { bind(k, Actions::Type::DeletePlaylistItems); diff --git a/src/browser.cpp b/src/browser.cpp index 08bd93ca..5fbce701 100644 --- a/src/browser.cpp +++ b/src/browser.cpp @@ -243,46 +243,6 @@ void Browser::enterPressed() } } -void Browser::spacePressed() -{ - if (w.empty()) - return; - - const MPD::Item &item = w.current()->value(); - // ignore parent directory - if (isParentDirectory(item)) - return; - - switch (item.type()) - { - case MPD::Item::Type::Directory: - { - bool success = true; - if (m_local_browser) - { - std::vector songs; - getLocalDirectoryRecursively(songs, item.directory().path()); - success = addSongsToPlaylist(songs.begin(), songs.end(), false, -1); - } - else - Mpd.Add(item.directory().path()); - Statusbar::printf("Directory \"%1%\" added%2%", - item.directory().path(), withErrors(success) - ); - break; - } - case MPD::Item::Type::Song: - addSongToPlaylist(item.song(), false); - break; - case MPD::Item::Type::Playlist: - Mpd.LoadPlaylist(item.playlist().path()); - Statusbar::printf("Playlist \"%1%\" loaded", item.playlist().path()); - break; - } - - w.scroll(NC::Scroll::Down); -} - void Browser::mouseButtonPressed(MEVENT me) { if (w.empty() || !w.hasCoords(me.x, me.y) || size_t(me.y) >= w.size()) @@ -299,22 +259,12 @@ void Browser::mouseButtonPressed(MEVENT me) drawHeader(); } else - { - size_t pos = w.choice(); - spacePressed(); - if (pos < w.size()-1) - w.scroll(NC::Scroll::Up); - } + addItemToPlaylist(); break; case MPD::Item::Type::Playlist: case MPD::Item::Type::Song: if (me.bstate & BUTTON1_PRESSED) - { - size_t pos = w.choice(); - spacePressed(); - if (pos < w.size()-1) - w.scroll(NC::Scroll::Up); - } + addItemToPlaylist(); else enterPressed(); break; @@ -351,6 +301,46 @@ bool Browser::find(SearchDirection direction, bool wrap, bool skip_current) /***********************************************************************/ +bool Browser::addItemToPlaylist() +{ + bool result = false; + if (w.empty()) + return result; + + const MPD::Item &item = w.current()->value(); + // ignore parent directory + if (isParentDirectory(item)) + return result; + + switch (item.type()) + { + case MPD::Item::Type::Directory: + { + if (m_local_browser) + { + std::vector songs; + getLocalDirectoryRecursively(songs, item.directory().path()); + result = addSongsToPlaylist(songs.begin(), songs.end(), false, -1); + } + else + Mpd.Add(item.directory().path()); + Statusbar::printf("Directory \"%1%\" added%2%", + item.directory().path(), withErrors(result) + ); + break; + } + case MPD::Item::Type::Song: + result = addSongToPlaylist(item.song(), false); + break; + case MPD::Item::Type::Playlist: + Mpd.LoadPlaylist(item.playlist().path()); + Statusbar::printf("Playlist \"%1%\" loaded", item.playlist().path()); + result = true; + break; + } + return result; +} + std::vector Browser::getSelectedSongs() { std::vector songs; diff --git a/src/browser.h b/src/browser.h index 51ac02f0..6ff46039 100644 --- a/src/browser.h +++ b/src/browser.h @@ -57,7 +57,6 @@ struct Browser: Screen, HasSongs, Searchable, Tabbable virtual void update() OVERRIDE; virtual void enterPressed() OVERRIDE; - virtual void spacePressed() OVERRIDE; virtual void mouseButtonPressed(MEVENT me) OVERRIDE; virtual bool isLockable() OVERRIDE { return true; } @@ -70,6 +69,7 @@ struct Browser: Screen, HasSongs, Searchable, Tabbable virtual bool find(SearchDirection direction, bool wrap, bool skip_current) OVERRIDE; // HasSongs implementation + virtual bool addItemToPlaylist() OVERRIDE; virtual std::vector getSelectedSongs() OVERRIDE; // private members diff --git a/src/clock.h b/src/clock.h index 5f44aa15..08ced206 100644 --- a/src/clock.h +++ b/src/clock.h @@ -43,7 +43,6 @@ struct Clock: Screen, Tabbable virtual void scroll(NC::Scroll) OVERRIDE { } virtual void enterPressed() OVERRIDE { } - virtual void spacePressed() OVERRIDE { } virtual void mouseButtonPressed(MEVENT) OVERRIDE { } virtual bool isLockable() OVERRIDE { return false; } diff --git a/src/help.cpp b/src/help.cpp index 6e86fd49..c0f98b0c 100644 --- a/src/help.cpp +++ b/src/help.cpp @@ -246,7 +246,7 @@ void write_bindings(NC::Scrollpad &w) key_section(w, "Browser"); key(w, Type::PressEnter, "Enter directory/Add item to playlist and play it"); - key(w, Type::PressSpace, "Add item to playlist"); + key(w, Type::AddItemToPlaylist, "Add item to playlist"); # ifdef HAVE_TAGLIB_H key(w, Type::EditSong, "Edit song"); # endif // HAVE_TAGLIB_H @@ -261,7 +261,7 @@ void write_bindings(NC::Scrollpad &w) key_section(w, "Search engine"); key(w, Type::PressEnter, "Add item to playlist and play it/change option"); - key(w, Type::PressSpace, "Add item to playlist"); + key(w, Type::AddItemToPlaylist, "Add item to playlist"); # ifdef HAVE_TAGLIB_H key(w, Type::EditSong, "Edit song"); # endif // HAVE_TAGLIB_H @@ -273,7 +273,7 @@ void write_bindings(NC::Scrollpad &w) key(w, Type::PreviousColumn, "Previous column"); key(w, Type::NextColumn, "Next column"); key(w, Type::PressEnter, "Add item to playlist and play it"); - key(w, Type::PressSpace, "Add item to playlist"); + key(w, Type::AddItemToPlaylist, "Add item to playlist"); # ifdef HAVE_TAGLIB_H key(w, Type::EditSong, "Edit song"); # endif // HAVE_TAGLIB_H @@ -285,7 +285,7 @@ void write_bindings(NC::Scrollpad &w) key(w, Type::PreviousColumn, "Previous column"); key(w, Type::NextColumn, "Next column"); key(w, Type::PressEnter, "Add item to playlist and play it"); - key(w, Type::PressSpace, "Add item to playlist"); + key(w, Type::AddItemToPlaylist, "Add item to playlist"); # ifdef HAVE_TAGLIB_H key(w, Type::EditSong, "Edit song"); # endif // HAVE_TAGLIB_H @@ -298,7 +298,7 @@ void write_bindings(NC::Scrollpad &w) key(w, Type::CropPlaylist, "Clear playlist except selected items"); key_section(w, "Lyrics"); - key(w, Type::PressSpace, "Toggle reloading lyrics upon song change"); + key(w, Type::ToggleLyricsUpdateOnSongChange, "Toggle lyrics update on song change"); key(w, Type::EditLyrics, "Open lyrics in external editor"); key(w, Type::RefetchLyrics, "Refetch lyrics"); @@ -322,7 +322,7 @@ void write_bindings(NC::Scrollpad &w) # if defined(ENABLE_VISUALIZER) && defined(HAVE_FFTW3_H) key_section(w, "Music visualizer"); - key(w, Type::PressSpace, "Toggle visualization type"); + key(w, Type::ToggleVisualizationType, "Toggle visualization type"); key(w, Type::SetVisualizerSampleMultiplier, "Set visualizer sample multiplier"); # endif // ENABLE_VISUALIZER && HAVE_FFTW3_H diff --git a/src/help.h b/src/help.h index 0a3ed220..3d7e4a4c 100644 --- a/src/help.h +++ b/src/help.h @@ -38,7 +38,6 @@ struct Help: Screen, Tabbable virtual void update() OVERRIDE { } virtual void enterPressed() OVERRIDE { } - virtual void spacePressed() OVERRIDE { } virtual bool isLockable() OVERRIDE { return true; } virtual bool isMergable() OVERRIDE { return true; } diff --git a/src/helpers.cpp b/src/helpers.cpp index 502bca1f..211957e6 100644 --- a/src/helpers.cpp +++ b/src/helpers.cpp @@ -24,6 +24,7 @@ #include "helpers.h" #include "playlist.h" #include "statusbar.h" +#include "utility/functional.h" const MPD::Song *currentSong(const BaseScreen *screen) { @@ -88,41 +89,36 @@ bool addSongsToPlaylist(VectorSongIterator first, VectorSongIterator last, bool return result; } +void removeSongFromPlaylist(const SongMenu &playlist, const MPD::Song &s) +{ + Mpd.StartCommandsList(); + for (auto &item : reverse_iteration(playlist)) + if (item.value() == s) + Mpd.Delete(item.value().getPosition()); + Mpd.CommitCommandsList(); +} + bool addSongToPlaylist(const MPD::Song &s, bool play, int position) { bool result = false; - if (Config.space_add_mode == SpaceAddMode::AddRemove && myPlaylist->checkForSong(s)) + if (Config.space_add_mode == SpaceAddMode::AddRemove + && !play + && myPlaylist->checkForSong(s) + ) { - auto &w = myPlaylist->main(); - if (play) - { - auto song = std::find(w.beginV(), w.endV(), s); - assert(song != w.endV()); - Mpd.PlayID(song->getID()); - result = true; - } - else - { - Mpd.StartCommandsList(); - for (auto it = w.rbeginV(); it != w.rendV(); ++it) - if (*it == s) - Mpd.Delete(it->getPosition()); - Mpd.CommitCommandsList(); - // we return false in this case - } + result = true; + removeSongFromPlaylist(myPlaylist->main(), s); + return result; } - else + int id = Mpd.AddSong(s, position); + if (id >= 0) { - int id = Mpd.AddSong(s, position); - if (id >= 0) - { - Statusbar::printf("Added to playlist: %s", - Format::stringify(Config.song_status_format, &s) - ); - if (play) - Mpd.PlayID(id); - result = true; - } + Statusbar::printf("Added to playlist: %s", + Format::stringify(Config.song_status_format, &s) + ); + if (play) + Mpd.PlayID(id); + result = true; } return result; } diff --git a/src/interfaces.h b/src/interfaces.h index b601f391..f18068e1 100644 --- a/src/interfaces.h +++ b/src/interfaces.h @@ -39,6 +39,7 @@ struct Searchable struct HasSongs { + virtual bool addItemToPlaylist() = 0; virtual std::vector getSelectedSongs() = 0; }; diff --git a/src/lastfm.h b/src/lastfm.h index 7ece2b9c..7c77c6bf 100644 --- a/src/lastfm.h +++ b/src/lastfm.h @@ -46,7 +46,6 @@ struct Lastfm: Screen, Tabbable virtual void update() OVERRIDE; virtual void enterPressed() OVERRIDE { } - virtual void spacePressed() OVERRIDE { } virtual bool isLockable() OVERRIDE { return false; } virtual bool isMergable() OVERRIDE { return true; } diff --git a/src/lyrics.cpp b/src/lyrics.cpp index 7f470c13..755efcb3 100644 --- a/src/lyrics.cpp +++ b/src/lyrics.cpp @@ -137,14 +137,6 @@ std::wstring Lyrics::title() return result; } -void Lyrics::spacePressed() -{ - Config.now_playing_lyrics = !Config.now_playing_lyrics; - Statusbar::printf("Reload lyrics if song changes: %1%", - Config.now_playing_lyrics ? "on" : "off" - ); -} - #ifdef HAVE_CURL_CURL_H void Lyrics::DownloadInBackground(const MPD::Song &s) { diff --git a/src/lyrics.h b/src/lyrics.h index b5500566..09903e92 100644 --- a/src/lyrics.h +++ b/src/lyrics.h @@ -43,7 +43,6 @@ struct Lyrics: Screen, Tabbable virtual void update() OVERRIDE; virtual void enterPressed() OVERRIDE { } - virtual void spacePressed() OVERRIDE; virtual bool isLockable() OVERRIDE { return false; } virtual bool isMergable() OVERRIDE { return true; } @@ -54,7 +53,7 @@ struct Lyrics: Screen, Tabbable # ifdef HAVE_CURL_CURL_H void Refetch(); - + static void ToggleFetcher(); static void DownloadInBackground(const MPD::Song &s); # endif // HAVE_CURL_CURL_H diff --git a/src/media_library.cpp b/src/media_library.cpp index 409657e3..b8bb9dd9 100644 --- a/src/media_library.cpp +++ b/src/media_library.cpp @@ -451,12 +451,7 @@ int MediaLibrary::windowTimeout() void MediaLibrary::enterPressed() { - AddToPlaylist(true); -} - -void MediaLibrary::spacePressed() -{ - AddToPlaylist(false); + addItemToPlaylist(true); } void MediaLibrary::mouseButtonPressed(MEVENT me) @@ -491,12 +486,7 @@ void MediaLibrary::mouseButtonPressed(MEVENT me) { Tags.Goto(me.y); if (me.bstate & BUTTON3_PRESSED) - { - size_t pos = Tags.choice(); - spacePressed(); - if (pos < Tags.size()-1) - Tags.scroll(NC::Scroll::Up); - } + addItemToPlaylist(); } else Screen::mouseButtonPressed(me); @@ -519,12 +509,7 @@ void MediaLibrary::mouseButtonPressed(MEVENT me) { Albums.Goto(me.y); if (me.bstate & BUTTON3_PRESSED) - { - size_t pos = Albums.choice(); - spacePressed(); - if (pos < Albums.size()-1) - Albums.scroll(NC::Scroll::Up); - } + addItemToPlaylist(); } else Screen::mouseButtonPressed(me); @@ -538,12 +523,7 @@ void MediaLibrary::mouseButtonPressed(MEVENT me) { Songs.Goto(me.y); if (me.bstate & BUTTON1_PRESSED) - { - size_t pos = Songs.choice(); - spacePressed(); - if (pos < Songs.size()-1) - Songs.scroll(NC::Scroll::Up); - } + addItemToPlaylist(); else enterPressed(); } @@ -608,6 +588,11 @@ bool MediaLibrary::find(SearchDirection direction, bool wrap, bool skip_current) /***********************************************************************/ +bool MediaLibrary::addItemToPlaylist() +{ + return addItemToPlaylist(false); +} + std::vector MediaLibrary::getSelectedSongs() { std::vector result; @@ -923,10 +908,11 @@ void MediaLibrary::LocateSong(const MPD::Song &s) refresh(); } -void MediaLibrary::AddToPlaylist(bool add_n_play) +bool MediaLibrary::addItemToPlaylist(bool play) { + bool result = false; if (isActiveWindow(Songs) && !Songs.empty()) - addSongToPlaylist(Songs.current()->value(), add_n_play); + result = addSongToPlaylist(Songs.current()->value(), play); else { if ((!Tags.empty() && isActiveWindow(Tags)) @@ -938,11 +924,11 @@ void MediaLibrary::AddToPlaylist(bool add_n_play) std::make_move_iterator(Mpd.CommitSearchSongs()), std::make_move_iterator(MPD::SongIterator()) ); - bool success = addSongsToPlaylist(list.begin(), list.end(), add_n_play, -1); + result = addSongsToPlaylist(list.begin(), list.end(), play, -1); std::string tag_type = boost::locale::to_lower( tagTypeToString(Config.media_lib_primary_tag)); Statusbar::printf("Songs with %1% \"%2%\" added%3%", - tag_type, Tags.current()->value().tag(), withErrors(success) + tag_type, Tags.current()->value().tag(), withErrors(result) ); } else if (isActiveWindow(Albums)) @@ -951,24 +937,13 @@ void MediaLibrary::AddToPlaylist(bool add_n_play) std::make_move_iterator(getSongsFromAlbum(Albums.current()->value())), std::make_move_iterator(MPD::SongIterator()) ); - bool success = addSongsToPlaylist(list.begin(), list.end(), add_n_play, -1); + result = addSongsToPlaylist(list.begin(), list.end(), play, -1); Statusbar::printf("Songs from album \"%1%\" added%2%", - Albums.current()->value().entry().album(), withErrors(success) + Albums.current()->value().entry().album(), withErrors(result) ); } } - - if (!add_n_play) - { - w->scroll(NC::Scroll::Down); - if (isActiveWindow(Tags)) - { - Albums.clear(); - Songs.clear(); - } - else if (isActiveWindow(Albums)) - Songs.clear(); - } + return result; } namespace { diff --git a/src/media_library.h b/src/media_library.h index f2fa6434..22e858a8 100644 --- a/src/media_library.h +++ b/src/media_library.h @@ -44,7 +44,6 @@ struct MediaLibrary: Screen, HasColumns, HasSongs, Searchable, Tab virtual int windowTimeout() OVERRIDE; virtual void enterPressed() OVERRIDE; - virtual void spacePressed() OVERRIDE; virtual void mouseButtonPressed(MEVENT me) OVERRIDE; virtual bool isLockable() OVERRIDE { return true; } @@ -57,6 +56,7 @@ struct MediaLibrary: Screen, HasColumns, HasSongs, Searchable, Tab virtual bool find(SearchDirection direction, bool wrap, bool skip_current) OVERRIDE; // HasSongs implementation + virtual bool addItemToPlaylist() OVERRIDE; virtual std::vector getSelectedSongs() OVERRIDE; // HasColumns implementation @@ -133,7 +133,7 @@ struct MediaLibrary: Screen, HasColumns, HasSongs, Searchable, Tab SongMenu Songs; private: - void AddToPlaylist(bool); + bool addItemToPlaylist(bool play); bool m_tags_update_request; bool m_albums_update_request; diff --git a/src/outputs.h b/src/outputs.h index c7817bbf..1d066b92 100644 --- a/src/outputs.h +++ b/src/outputs.h @@ -44,7 +44,6 @@ struct Outputs: Screen>, Tabbable virtual void update() OVERRIDE { } virtual void enterPressed() OVERRIDE; - virtual void spacePressed() OVERRIDE { } virtual void mouseButtonPressed(MEVENT me) OVERRIDE; virtual bool isLockable() OVERRIDE { return true; } diff --git a/src/playlist.h b/src/playlist.h index 50759487..c94c060b 100644 --- a/src/playlist.h +++ b/src/playlist.h @@ -44,7 +44,6 @@ struct Playlist: Screen, HasSongs, Searchable, Tabbable virtual void update() OVERRIDE; virtual void enterPressed() OVERRIDE; - virtual void spacePressed() OVERRIDE { } virtual void mouseButtonPressed(MEVENT me) OVERRIDE; virtual bool isLockable() OVERRIDE { return true; } @@ -57,6 +56,7 @@ struct Playlist: Screen, HasSongs, Searchable, Tabbable virtual bool find(SearchDirection direction, bool wrap, bool skip_current) OVERRIDE; // HasSongs implementation + virtual bool addItemToPlaylist() OVERRIDE { return false; }; virtual std::vector getSelectedSongs() OVERRIDE; // private members diff --git a/src/playlist_editor.cpp b/src/playlist_editor.cpp index 6117093d..36fe3d5a 100644 --- a/src/playlist_editor.cpp +++ b/src/playlist_editor.cpp @@ -225,34 +225,9 @@ int PlaylistEditor::windowTimeout() return Screen::windowTimeout(); } -void PlaylistEditor::AddToPlaylist(bool add_n_play) -{ - if (isActiveWindow(Playlists) && !Playlists.empty()) - { - std::vector list( - std::make_move_iterator(Mpd.GetPlaylistContent(Playlists.current()->value().path())), - std::make_move_iterator(MPD::SongIterator()) - ); - bool success = addSongsToPlaylist(list.begin(), list.end(), add_n_play, -1); - Statusbar::printf("Playlist \"%1%\" loaded%2%", - Playlists.current()->value().path(), withErrors(success) - ); - } - else if (isActiveWindow(Content) && !Content.empty()) - addSongToPlaylist(Content.current()->value(), add_n_play); - - if (!add_n_play) - w->scroll(NC::Scroll::Down); -} - void PlaylistEditor::enterPressed() { - AddToPlaylist(true); -} - -void PlaylistEditor::spacePressed() -{ - AddToPlaylist(false); + addItemToPlaylist(true); } void PlaylistEditor::mouseButtonPressed(MEVENT me) @@ -270,12 +245,7 @@ void PlaylistEditor::mouseButtonPressed(MEVENT me) { Playlists.Goto(me.y); if (me.bstate & BUTTON3_PRESSED) - { - size_t pos = Playlists.choice(); - spacePressed(); - if (pos < Playlists.size()-1) - Playlists.scroll(NC::Scroll::Up); - } + addItemToPlaylist(); } else Screen::mouseButtonPressed(me); @@ -294,12 +264,7 @@ void PlaylistEditor::mouseButtonPressed(MEVENT me) { Content.Goto(me.y); if (me.bstate & BUTTON1_PRESSED) - { - size_t pos = Content.choice(); - spacePressed(); - if (pos < Content.size()-1) - Content.scroll(NC::Scroll::Up); - } + addItemToPlaylist(); else enterPressed(); } @@ -353,6 +318,11 @@ bool PlaylistEditor::find(SearchDirection direction, bool wrap, bool skip_curren /***********************************************************************/ +bool PlaylistEditor::addItemToPlaylist() +{ + return addItemToPlaylist(false); +} + std::vector PlaylistEditor::getSelectedSongs() { std::vector result; @@ -450,6 +420,25 @@ void PlaylistEditor::Locate(const MPD::Playlist &playlist) } } +bool PlaylistEditor::addItemToPlaylist(bool play) +{ + bool result = false; + if (isActiveWindow(Playlists) && !Playlists.empty()) + { + std::vector list( + std::make_move_iterator(Mpd.GetPlaylistContent(Playlists.current()->value().path())), + std::make_move_iterator(MPD::SongIterator()) + ); + result = addSongsToPlaylist(list.begin(), list.end(), play, -1); + Statusbar::printf("Playlist \"%1%\" loaded%2%", + Playlists.current()->value().path(), withErrors(result) + ); + } + else if (isActiveWindow(Content) && !Content.empty()) + result = addSongToPlaylist(Content.current()->value(), play); + return result; +} + namespace { std::string SongToString(const MPD::Song &s) diff --git a/src/playlist_editor.h b/src/playlist_editor.h index 16f7043d..92583c9e 100644 --- a/src/playlist_editor.h +++ b/src/playlist_editor.h @@ -44,7 +44,6 @@ struct PlaylistEditor: Screen, HasColumns, HasSongs, Searchable, T virtual int windowTimeout() OVERRIDE; virtual void enterPressed() OVERRIDE; - virtual void spacePressed() OVERRIDE; virtual void mouseButtonPressed(MEVENT me) OVERRIDE; virtual bool isLockable() OVERRIDE { return true; } @@ -57,6 +56,7 @@ struct PlaylistEditor: Screen, HasColumns, HasSongs, Searchable, T virtual bool find(SearchDirection direction, bool wrap, bool skip_current) OVERRIDE; // HasSongs implementation + virtual bool addItemToPlaylist() OVERRIDE; virtual std::vector getSelectedSongs() OVERRIDE; // HasColumns implementation @@ -78,7 +78,7 @@ struct PlaylistEditor: Screen, HasColumns, HasSongs, Searchable, T SongMenu Content; private: - void AddToPlaylist(bool); + bool addItemToPlaylist(bool play); bool m_playlists_update_requested; bool m_content_update_requested; diff --git a/src/screen.h b/src/screen.h index d9fab1f6..67ba2b31 100644 --- a/src/screen.h +++ b/src/screen.h @@ -76,9 +76,6 @@ struct BaseScreen /// Invoked after Enter was pressed virtual void enterPressed() = 0; - /// Invoked after Space was pressed - virtual void spacePressed() = 0; - /// @see Screen::mouseButtonPressed() virtual void mouseButtonPressed(MEVENT me) = 0; diff --git a/src/search_engine.cpp b/src/search_engine.cpp index 6f1a35e1..eb6b5ac4 100644 --- a/src/search_engine.cpp +++ b/src/search_engine.cpp @@ -268,15 +268,6 @@ void SearchEngine::enterPressed() addSongToPlaylist(w.current()->value().song(), true); } -void SearchEngine::spacePressed() -{ - if (w.current()->value().isSong()) - { - addSongToPlaylist(w.current()->value().song(), false); - w.scroll(NC::Scroll::Down); - } -} - void SearchEngine::mouseButtonPressed(MEVENT me) { if (w.empty() || !w.hasCoords(me.x, me.y) || size_t(me.y) >= w.size()) @@ -291,12 +282,7 @@ void SearchEngine::mouseButtonPressed(MEVENT me) else if (w.choice() >= StaticOptions) { if (me.bstate & BUTTON1_PRESSED) - { - size_t pos = w.choice(); - spacePressed(); - if (pos < w.size()-1) - w.scroll(NC::Scroll::Up); - } + addItemToPlaylist(); else enterPressed(); } @@ -332,6 +318,14 @@ bool SearchEngine::find(SearchDirection direction, bool wrap, bool skip_current) /***********************************************************************/ +bool SearchEngine::addItemToPlaylist() +{ + bool result = false; + if (!w.empty() && w.current()->value().isSong()) + result = addSongToPlaylist(w.current()->value().song(), false); + return result; +} + std::vector SearchEngine::getSelectedSongs() { std::vector result; diff --git a/src/search_engine.h b/src/search_engine.h index 95b9057e..cd81750a 100644 --- a/src/search_engine.h +++ b/src/search_engine.h @@ -105,7 +105,6 @@ struct SearchEngine: Screen, HasSongs, Searchable, Tabbable virtual void update() OVERRIDE { } virtual void enterPressed() OVERRIDE; - virtual void spacePressed() OVERRIDE; virtual void mouseButtonPressed(MEVENT me) OVERRIDE; virtual bool isLockable() OVERRIDE { return true; } @@ -118,6 +117,7 @@ struct SearchEngine: Screen, HasSongs, Searchable, Tabbable virtual bool find(SearchDirection direction, bool wrap, bool skip_current) OVERRIDE; // HasSongs implementation + virtual bool addItemToPlaylist() OVERRIDE; virtual std::vector getSelectedSongs() OVERRIDE; // private members diff --git a/src/sel_items_adder.h b/src/sel_items_adder.h index 5adfcd5a..b22f7f22 100644 --- a/src/sel_items_adder.h +++ b/src/sel_items_adder.h @@ -44,7 +44,6 @@ struct SelectedItemsAdder: Screen> *> virtual void update() OVERRIDE { } virtual void enterPressed() OVERRIDE; - virtual void spacePressed() OVERRIDE { } virtual void mouseButtonPressed(MEVENT me) OVERRIDE; virtual bool isLockable() OVERRIDE { return false; } diff --git a/src/server_info.h b/src/server_info.h index 54d0b362..e0550c81 100644 --- a/src/server_info.h +++ b/src/server_info.h @@ -40,7 +40,6 @@ struct ServerInfo: Screen, Tabbable virtual void update() OVERRIDE; virtual void enterPressed() OVERRIDE { } - virtual void spacePressed() OVERRIDE { } virtual bool isLockable() OVERRIDE { return false; } virtual bool isMergable() OVERRIDE { return false; } diff --git a/src/song_info.h b/src/song_info.h index 5d3195e1..57bd1d2c 100644 --- a/src/song_info.h +++ b/src/song_info.h @@ -46,7 +46,6 @@ struct SongInfo: Screen, Tabbable virtual void update() OVERRIDE { } virtual void enterPressed() OVERRIDE { } - virtual void spacePressed() OVERRIDE { } virtual bool isLockable() OVERRIDE { return false; } virtual bool isMergable() OVERRIDE { return true; } diff --git a/src/sort_playlist.h b/src/sort_playlist.h index 9459c8ad..c3e66c38 100644 --- a/src/sort_playlist.h +++ b/src/sort_playlist.h @@ -42,7 +42,6 @@ struct SortPlaylistDialog virtual void update() OVERRIDE { } virtual void enterPressed() OVERRIDE; - virtual void spacePressed() OVERRIDE { } virtual void mouseButtonPressed(MEVENT me) OVERRIDE; virtual bool isLockable() OVERRIDE { return false; } diff --git a/src/tag_editor.cpp b/src/tag_editor.cpp index 62a763a2..517983b9 100644 --- a/src/tag_editor.cpp +++ b/src/tag_editor.cpp @@ -714,8 +714,6 @@ void TagEditor::mouseButtonPressed(MEVENT me) Dirs->Goto(me.y); if (me.bstate & BUTTON1_PRESSED) enterPressed(); - else - spacePressed(); } else Screen::mouseButtonPressed(me); @@ -806,6 +804,14 @@ bool TagEditor::find(SearchDirection direction, bool wrap, bool skip_current) /***********************************************************************/ +bool TagEditor::addItemToPlaylist() +{ + bool result = false; + if (w == Tags && !Tags->empty()) + result = addSongToPlaylist(*Tags->currentV(), false); + return result; +} + std::vector TagEditor::getSelectedSongs() { std::vector result; diff --git a/src/tag_editor.h b/src/tag_editor.h index 9be679cc..7b9a86d6 100644 --- a/src/tag_editor.h +++ b/src/tag_editor.h @@ -63,7 +63,6 @@ struct TagEditor: Screen, HasColumns, HasSongs, Searchable, Tabbab virtual void update() OVERRIDE; virtual void enterPressed() OVERRIDE; - virtual void spacePressed() OVERRIDE { } virtual void mouseButtonPressed(MEVENT) OVERRIDE; virtual bool isLockable() OVERRIDE { return true; } @@ -76,6 +75,7 @@ struct TagEditor: Screen, HasColumns, HasSongs, Searchable, Tabbab virtual bool find(SearchDirection direction, bool wrap, bool skip_current) OVERRIDE; // HasSongs implementation + virtual bool addItemToPlaylist() OVERRIDE; virtual std::vector getSelectedSongs() OVERRIDE; // HasColumns implementation diff --git a/src/tiny_tag_editor.h b/src/tiny_tag_editor.h index 53a32707..2506d954 100644 --- a/src/tiny_tag_editor.h +++ b/src/tiny_tag_editor.h @@ -43,7 +43,6 @@ struct TinyTagEditor: Screen> virtual void update() OVERRIDE { } virtual void enterPressed() OVERRIDE; - virtual void spacePressed() OVERRIDE { } virtual void mouseButtonPressed(MEVENT me) OVERRIDE; virtual bool isLockable() OVERRIDE { return false; } diff --git a/src/utility/functional.h b/src/utility/functional.h index a5e9a607..54480edd 100644 --- a/src/utility/functional.h +++ b/src/utility/functional.h @@ -24,6 +24,36 @@ #include #include +template +struct reversed_iteration +{ + reversed_iteration(BaseT &base_) + : base(base_) { } + + BaseT &base; +}; + +template +reversed_iteration reverse_iteration(BaseT &base_) { + return reversed_iteration(base_); +} +template +auto begin(reversed_iteration &rev) -> decltype(rev.base.rbegin()) { + return rev.base.rbegin(); +} +template +auto begin(reversed_iteration &rev) -> decltype(rev.base.rbegin()) { + return rev.base.rbegin(); +} +template +auto end(reversed_iteration &rev) -> decltype(rev.base.rend()) { + return rev.base.rend(); +} +template +auto end(reversed_iteration &rev) -> decltype(rev.base.rend()) { + return rev.base.rend(); +} + template struct pointer_extractor { diff --git a/src/visualizer.cpp b/src/visualizer.cpp index 6d722d33..2ba53ad7 100644 --- a/src/visualizer.cpp +++ b/src/visualizer.cpp @@ -187,32 +187,6 @@ int Visualizer::windowTimeout() return Screen::windowTimeout(); } -void Visualizer::spacePressed() -{ - switch (Config.visualizer_type) - { - case VisualizerType::Wave: - Config.visualizer_type = VisualizerType::WaveFilled; - break; - case VisualizerType::WaveFilled: -# ifdef HAVE_FFTW3_H - Config.visualizer_type = VisualizerType::Spectrum; -# else - Config.visualizer_type = VisualizerType::Ellipse; -# endif // HAVE_FFTW3_H - break; -# ifdef HAVE_FFTW3_H - case VisualizerType::Spectrum: - Config.visualizer_type = VisualizerType::Ellipse; - break; -# endif // HAVE_FFTW3_H - case VisualizerType::Ellipse: - Config.visualizer_type = VisualizerType::Wave; - break; - } - Statusbar::printf("Visualization type: %1%", Config.visualizer_type); -} - /**********************************************************************/ void Visualizer::DrawSoundWave(int16_t *buf, ssize_t samples, size_t y_offset, size_t height) @@ -443,6 +417,32 @@ void Visualizer::DrawFrequencySpectrumStereo(int16_t *buf_left, int16_t *buf_rig /**********************************************************************/ +void Visualizer::ToggleVisualizationType() +{ + switch (Config.visualizer_type) + { + case VisualizerType::Wave: + Config.visualizer_type = VisualizerType::WaveFilled; + break; + case VisualizerType::WaveFilled: +# ifdef HAVE_FFTW3_H + Config.visualizer_type = VisualizerType::Spectrum; +# else + Config.visualizer_type = VisualizerType::Ellipse; +# endif // HAVE_FFTW3_H + break; +# ifdef HAVE_FFTW3_H + case VisualizerType::Spectrum: + Config.visualizer_type = VisualizerType::Ellipse; + break; +# endif // HAVE_FFTW3_H + case VisualizerType::Ellipse: + Config.visualizer_type = VisualizerType::Wave; + break; + } + Statusbar::printf("Visualization type: %1%", Config.visualizer_type); +} + void Visualizer::SetFD() { if (m_fifo < 0 && (m_fifo = open(Config.visualizer_fifo_path.c_str(), O_RDONLY | O_NONBLOCK)) < 0) diff --git a/src/visualizer.h b/src/visualizer.h index f756e955..48fd4d5f 100644 --- a/src/visualizer.h +++ b/src/visualizer.h @@ -50,13 +50,13 @@ struct Visualizer: Screen, Tabbable virtual int windowTimeout() OVERRIDE; virtual void enterPressed() OVERRIDE { } - virtual void spacePressed() OVERRIDE; virtual void mouseButtonPressed(MEVENT) OVERRIDE { } virtual bool isLockable() OVERRIDE { return true; } virtual bool isMergable() OVERRIDE { return true; } // private members + void ToggleVisualizationType(); void SetFD(); void ResetFD(); void FindOutputID();