From 14587cb4ec92f078b8f20cf717e7a4e92ae75c5c Mon Sep 17 00:00:00 2001 From: Andrzej Rybczak Date: Sat, 15 Sep 2012 22:27:50 +0200 Subject: [PATCH] abstract shared parts of switchTo methods away --- src/Makefile.am | 1 + src/actions.cpp | 67 ++++++++++++++++------------------ src/actions.h | 6 ---- src/browser.cpp | 37 ++++++++----------- src/browser.h | 3 +- src/clock.cpp | 35 ++++++------------ src/clock.h | 6 ++-- src/global.cpp | 2 -- src/global.h | 6 ---- src/help.cpp | 17 ++------- src/help.h | 4 +-- src/interfaces.h | 20 +++++++++++ src/lastfm.cpp | 33 +++++++---------- src/lastfm.h | 4 +-- src/lyrics.cpp | 79 +++++++++++++++-------------------------- src/lyrics.h | 8 ++--- src/media_library.cpp | 30 ++++++---------- src/media_library.h | 3 +- src/ncmpcpp.cpp | 7 ---- src/outputs.cpp | 17 ++------- src/outputs.h | 4 +-- src/playlist.cpp | 19 ++-------- src/playlist.h | 3 +- src/playlist_editor.cpp | 19 ++-------- src/playlist_editor.h | 3 +- src/screen.cpp | 3 +- src/screen.h | 4 --- src/screen_switcher.h | 60 +++++++++++++++++++++++++++++++ src/search_engine.cpp | 30 +++++----------- src/search_engine.h | 4 +-- src/sel_items_adder.cpp | 24 +++++-------- src/sel_items_adder.h | 6 ++-- src/server_info.cpp | 31 +++++----------- src/server_info.h | 4 +-- src/song_info.cpp | 46 ++++++++++-------------- src/song_info.h | 6 ++-- src/sort_playlist.cpp | 21 +++-------- src/sort_playlist.h | 4 +-- src/status.cpp | 2 +- src/tag_editor.cpp | 16 ++------- src/tag_editor.h | 4 +-- src/tags.cpp | 8 ++--- src/tiny_tag_editor.cpp | 20 ++++------- src/tiny_tag_editor.h | 7 ++-- src/visualizer.cpp | 25 +++---------- src/visualizer.h | 6 ++-- 46 files changed, 301 insertions(+), 463 deletions(-) create mode 100644 src/screen_switcher.h diff --git a/src/Makefile.am b/src/Makefile.am index 8729f874..35e601c8 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -87,6 +87,7 @@ noinst_HEADERS = \ regex_filter.h \ regexes.h \ screen.h \ + screen_switcher.h \ scrollpad.h \ search_engine.h \ sel_items_adder.h \ diff --git a/src/actions.cpp b/src/actions.cpp index a1c24003..ac740ea4 100644 --- a/src/actions.cpp +++ b/src/actions.cpp @@ -2284,15 +2284,10 @@ void Quit::Run() void NextScreen::Run() { - using Global::myOldScreen; - using Global::myPrevScreen; - if (Config.screen_switcher_previous) { - if (myScreen->isTabbable()) - myPrevScreen->switchTo(); - else - myOldScreen->switchTo(); + if (auto tababble = dynamic_cast(myScreen)) + tababble->switchToPreviousScreen(); } else if (!Config.screens_seq.empty()) { @@ -2306,15 +2301,10 @@ void NextScreen::Run() void PreviousScreen::Run() { - using Global::myOldScreen; - using Global::myPrevScreen; - if (Config.screen_switcher_previous) { - if (myScreen->isTabbable()) - myPrevScreen->switchTo(); - else - myOldScreen->switchTo(); + if (auto tababble = dynamic_cast(myScreen)) + tababble->switchToPreviousScreen(); } else if (!Config.screens_seq.empty()) { @@ -2326,24 +2316,27 @@ void PreviousScreen::Run() } } -#ifdef HAVE_TAGLIB_H bool ShowHelp::canBeRun() const { - return myScreen != myTinyTagEditor; + return myScreen != myHelp +# ifdef HAVE_TAGLIB_H + && myScreen != myTinyTagEditor +# endif // HAVE_TAGLIB_H + ; } -#endif // HAVE_TAGLIB_H void ShowHelp::Run() { myHelp->switchTo(); } -#ifdef HAVE_TAGLIB_H bool ShowPlaylist::canBeRun() const { - return myScreen != myTinyTagEditor; + return myScreen != myPlaylist +# ifdef HAVE_TAGLIB_H + && myScreen != myTinyTagEditor; +# endif // HAVE_TAGLIB_H } -#endif // HAVE_TAGLIB_H void ShowPlaylist::Run() { @@ -2386,12 +2379,13 @@ void ShowMediaLibrary::Run() myLibrary->switchTo(); } -#ifdef HAVE_TAGLIB_H bool ShowPlaylistEditor::canBeRun() const { - return myScreen != myTinyTagEditor; + return myScreen != myPlaylistEditor +# ifdef HAVE_TAGLIB_H + && myScreen != myTinyTagEditor; +# endif // HAVE_TAGLIB_H } -#endif // HAVE_TAGLIB_H void ShowPlaylistEditor::Run() { @@ -2401,7 +2395,8 @@ void ShowPlaylistEditor::Run() bool ShowTagEditor::canBeRun() const { # ifdef HAVE_TAGLIB_H - return myScreen != myTinyTagEditor; + return myScreen != myTagEditor + && myScreen != myTinyTagEditor; # else return false; # endif // HAVE_TAGLIB_H @@ -2418,11 +2413,11 @@ void ShowTagEditor::Run() bool ShowOutputs::canBeRun() const { # ifdef ENABLE_OUTPUTS -# ifdef HAVE_TAGLIB_H - return myScreen != myTinyTagEditor; -# else - return true; + return myScreen != myOutputs +# ifdef HAVE_TAGLIB_H + && myScreen != myTinyTagEditor # endif // HAVE_TAGLIB_H + ; # else return false; # endif // ENABLE_OUTPUTS @@ -2437,15 +2432,15 @@ void ShowOutputs::Run() bool ShowVisualizer::canBeRun() const { -# ifdef ENABLE_OUTPUTS +# ifdef ENABLE_VISUALIZER + return myScreen != myVisualizer # ifdef HAVE_TAGLIB_H - return myScreen != myTinyTagEditor; -# else - return true; + && myScreen != myTinyTagEditor # endif // HAVE_TAGLIB_H + ; # else return false; -# endif // ENABLE_OUTPUTS +# endif // ENABLE_VISUALIZER } void ShowVisualizer::Run() @@ -2458,11 +2453,11 @@ void ShowVisualizer::Run() bool ShowClock::canBeRun() const { # ifdef ENABLE_CLOCK + return myScreen != myClock # ifdef HAVE_TAGLIB_H - return myScreen != myTinyTagEditor; -# else - return true; + && myScreen != myTinyTagEditor # endif // HAVE_TAGLIB_H + ; # else return false; # endif // ENABLE_CLOCK diff --git a/src/actions.h b/src/actions.h index d3c4a736..5f44401f 100644 --- a/src/actions.h +++ b/src/actions.h @@ -979,9 +979,7 @@ struct ShowHelp : public Action ShowHelp() : Action(aShowHelp, "show_help") { } protected: -# ifdef HAVE_TAGLIB_H virtual bool canBeRun() const; -# endif // HAVE_TAGLIB_H virtual void Run(); }; @@ -990,9 +988,7 @@ struct ShowPlaylist : public Action ShowPlaylist() : Action(aShowPlaylist, "show_playlist") { } protected: -# ifdef HAVE_TAGLIB_H virtual bool canBeRun() const; -# endif // HAVE_TAGLIB_H virtual void Run(); }; @@ -1034,9 +1030,7 @@ struct ShowPlaylistEditor : public Action ShowPlaylistEditor() : Action(aShowPlaylistEditor, "show_playlist_editor") { } protected: -# ifdef HAVE_TAGLIB_H virtual bool canBeRun() const; -# endif // HAVE_TAGLIB_H virtual void Run(); }; diff --git a/src/browser.cpp b/src/browser.cpp index 23bc1b5e..5fa32e46 100644 --- a/src/browser.cpp +++ b/src/browser.cpp @@ -38,6 +38,7 @@ #include "utility/comparators.h" #include "title.h" #include "tags.h" +#include "screen_switcher.h" using namespace std::placeholders; @@ -87,34 +88,26 @@ void Browser::resize() void Browser::switchTo() { - using Global::myLockedScreen; - using Global::myInactiveScreen; - if (myScreen == this) { # ifndef WIN32 - myBrowser->ChangeBrowseMode(); + ChangeBrowseMode(); # endif // !WIN32 } - - if (myLockedScreen) - updateInactiveScreen(this); - - if (hasToBeResized || myLockedScreen) - resize(); - - if (isLocal() && Config.browser_sort_mode == smMTime) // local browser doesn't support sorting by mtime - Config.browser_sort_mode = smName; - - if (w.empty()) - myBrowser->GetDirectory(itsBrowsedDir); else - markSongsInPlaylist(getProxySongList()); - - if (myScreen != this && myScreen->isTabbable()) - Global::myPrevScreen = myScreen; - myScreen = this; - drawHeader(); + { + SwitchTo::execute(this); + + if (isLocal() && Config.browser_sort_mode == smMTime) // local browser doesn't support sorting by mtime + Config.browser_sort_mode = smName; + + if (w.empty()) + GetDirectory(itsBrowsedDir); + else + markSongsInPlaylist(getProxySongList()); + + drawHeader(); + } } std::wstring Browser::title() diff --git a/src/browser.h b/src/browser.h index 3623817b..31a0ad50 100644 --- a/src/browser.h +++ b/src/browser.h @@ -25,7 +25,7 @@ #include "mpdpp.h" #include "screen.h" -struct Browser : public Screen>, public Filterable, public HasSongs, public Searchable +struct Browser: Screen>, Filterable, HasSongs, Searchable, Tabbable { Browser(); @@ -41,7 +41,6 @@ struct Browser : public Screen>, public Filterable, public H virtual void spacePressed() OVERRIDE; virtual void mouseButtonPressed(MEVENT me) OVERRIDE; - virtual bool isTabbable() OVERRIDE { return true; } virtual bool isMergable() OVERRIDE { return true; } // Filterable implementation diff --git a/src/clock.cpp b/src/clock.cpp index 2ff31a0c..12970323 100644 --- a/src/clock.cpp +++ b/src/clock.cpp @@ -33,6 +33,7 @@ #include "status.h" #include "statusbar.h" #include "title.h" +#include "screen_switcher.h" using Global::MainHeight; using Global::MainStartY; @@ -76,36 +77,20 @@ void Clock::resize() void Clock::switchTo() { - using Global::myLockedScreen; - - if (myScreen == this) - return; - - if (myLockedScreen) - updateInactiveScreen(this); - size_t x_offset, width; getWindowResizeParams(x_offset, width, false); if (Width > width || Height > MainHeight) - { Statusbar::msg("Screen is too small to display clock"); - if (myLockedScreen) - updateInactiveScreen(myLockedScreen); - return; + else + { + SwitchTo::execute(this); + drawHeader(); + Prepare(); + m_pane.refresh(); + // clearing screen apparently fixes the problem with last digits being misrendered + w.clear(); + w.display(); } - - if (hasToBeResized || myLockedScreen) - resize(); - - if (myScreen != this && myScreen->isTabbable()) - Global::myPrevScreen = myScreen; - myScreen = this; - drawHeader(); - Prepare(); - m_pane.refresh(); - // clearing screen apparently fixes the problem with last digits being misrendered - w.clear(); - w.display(); } std::wstring Clock::title() diff --git a/src/clock.h b/src/clock.h index 6bba336f..dd835806 100644 --- a/src/clock.h +++ b/src/clock.h @@ -25,10 +25,11 @@ #ifdef ENABLE_CLOCK -#include "window.h" +#include "interfaces.h" #include "screen.h" +#include "window.h" -struct Clock : public Screen +struct Clock: Screen, Tabbable { Clock(); @@ -44,7 +45,6 @@ struct Clock : public Screen virtual void spacePressed() OVERRIDE { } virtual void mouseButtonPressed(MEVENT) OVERRIDE { } - virtual bool isTabbable() OVERRIDE { return true; } virtual bool isMergable() OVERRIDE { return true; } protected: diff --git a/src/global.cpp b/src/global.cpp index cc55beab..22bc28bc 100644 --- a/src/global.cpp +++ b/src/global.cpp @@ -23,8 +23,6 @@ namespace Global {// BasicScreen *myScreen; -BasicScreen *myOldScreen; -BasicScreen *myPrevScreen; BasicScreen *myLockedScreen; BasicScreen *myInactiveScreen; diff --git a/src/global.h b/src/global.h index e63eb9ae..d49e1d41 100644 --- a/src/global.h +++ b/src/global.h @@ -31,12 +31,6 @@ namespace Global {// // currently active screen (displayed in main window) extern BasicScreen *myScreen; -// for info, lyrics, popups to remember which screen return to -extern BasicScreen *myOldScreen; - -// "real" screen switching (browser, search, etc.) -extern BasicScreen *myPrevScreen; - // points at the screen that was locked (or is null if no screen is locked) extern BasicScreen *myLockedScreen; diff --git a/src/help.cpp b/src/help.cpp index 13fcd1aa..6793bafa 100644 --- a/src/help.cpp +++ b/src/help.cpp @@ -27,6 +27,7 @@ #include "status.h" #include "utility/wide_string.h" #include "title.h" +#include "screen_switcher.h" using Global::MainHeight; using Global::MainStartY; @@ -113,21 +114,7 @@ void Help::resize() void Help::switchTo() { - using Global::myScreen; - using Global::myLockedScreen; - - if (myScreen == this) - return; - - if (myLockedScreen) - updateInactiveScreen(this); - - if (hasToBeResized || myLockedScreen) - resize(); - - if (myScreen != this && myScreen->isTabbable()) - Global::myPrevScreen = myScreen; - myScreen = this; + SwitchTo::execute(this); drawHeader(); } diff --git a/src/help.h b/src/help.h index 4a6e067c..543c9ee0 100644 --- a/src/help.h +++ b/src/help.h @@ -22,9 +22,10 @@ #define _HELP_H #include "actions.h" +#include "interfaces.h" #include "screen.h" -struct Help : public Screen +struct Help: Screen, Tabbable { Help(); @@ -38,7 +39,6 @@ struct Help : public Screen virtual void enterPressed() OVERRIDE { } virtual void spacePressed() OVERRIDE { } - virtual bool isTabbable() OVERRIDE { return true; } virtual bool isMergable() OVERRIDE { return true; } protected: diff --git a/src/interfaces.h b/src/interfaces.h index a8a989e6..c8e3d8a1 100644 --- a/src/interfaces.h +++ b/src/interfaces.h @@ -23,6 +23,7 @@ #include #include "gcc.h" +#include "screen.h" #include "song.h" #include "proxy_song_list.h" @@ -59,4 +60,23 @@ struct HasColumns virtual void nextColumn() = 0; }; +struct Tabbable +{ + Tabbable() : m_previous_screen(0) { } + + void switchToPreviousScreen() const { + if (m_previous_screen) + m_previous_screen->switchTo(); + } + void setPreviousScreen(BasicScreen *screen) { + m_previous_screen = screen; + } + BasicScreen *previousScreen() const { + return m_previous_screen; + } + +private: + BasicScreen *m_previous_screen; +}; + #endif // _INTERFACES_H diff --git a/src/lastfm.cpp b/src/lastfm.cpp index 07d103f2..4d58dfe6 100644 --- a/src/lastfm.cpp +++ b/src/lastfm.cpp @@ -39,6 +39,7 @@ #include "global.h" #include "statusbar.h" #include "title.h" +#include "screen_switcher.h" using Global::MainHeight; using Global::MainStartY; @@ -83,27 +84,17 @@ void Lastfm::Take() void Lastfm::switchTo() { using Global::myScreen; - using Global::myOldScreen; - using Global::myLockedScreen; - - if (myScreen == this) - return myOldScreen->switchTo(); - - if (myLockedScreen) - updateInactiveScreen(this); - - if (hasToBeResized || myLockedScreen) - resize(); - - // get an old info if it waits - if (isReadyToTake) - Take(); - - Load(); - - myOldScreen = myScreen; - myScreen = this; - drawHeader(); + if (myScreen != this) + { + SwitchTo::execute(this); + // get an old info if it waits + if (isReadyToTake) + Take(); + Load(); + drawHeader(); + } + else + switchToPreviousScreen(); } void Lastfm::Load() diff --git a/src/lastfm.h b/src/lastfm.h index 9b575c15..1f440d0a 100644 --- a/src/lastfm.h +++ b/src/lastfm.h @@ -28,10 +28,11 @@ #include #include +#include "interfaces.h" #include "lastfm_service.h" #include "screen.h" -struct Lastfm : public Screen +struct Lastfm: Screen, Tabbable { Lastfm(); @@ -46,7 +47,6 @@ struct Lastfm : public Screen virtual void spacePressed() OVERRIDE { } virtual bool isMergable() OVERRIDE { return true; } - virtual bool isTabbable() OVERRIDE { return false; } // private members void Refetch(); diff --git a/src/lyrics.cpp b/src/lyrics.cpp index 99219f74..bf1053a1 100644 --- a/src/lyrics.cpp +++ b/src/lyrics.cpp @@ -35,11 +35,10 @@ #include "song.h" #include "statusbar.h" #include "title.h" +#include "screen_switcher.h" using Global::MainHeight; using Global::MainStartY; -using Global::myScreen; -using Global::myOldScreen; #ifdef HAVE_CURL_CURL_H LyricsFetcher **Lyrics::itsFetcher = 0; @@ -96,57 +95,38 @@ void Lyrics::update() void Lyrics::switchTo() { - using Global::myLockedScreen; - using Global::myInactiveScreen; - - if (myScreen == this) - return myOldScreen->switchTo(); - - if (hasToBeResized) - resize(); - - itsScrollBegin = 0; - -# ifdef HAVE_CURL_CURL_H - // take lyrics if they were downloaded - if (isReadyToTake) - Take(); - - if (isDownloadInProgress || itsWorkersNumber > 0) + using Global::myScreen; + if (myScreen != this) { - Statusbar::msg("Lyrics are being downloaded..."); - return; - } -# endif // HAVE_CURL_CURL_H - - const MPD::Song *s = currentSong(myScreen); - if (!s) - return; - - if (!s->getArtist().empty() && !s->getTitle().empty()) - { - myOldScreen = myScreen; - myScreen = this; +# ifdef HAVE_CURL_CURL_H + // take lyrics if they were downloaded + if (isReadyToTake) + Take(); - itsSong = *s; - Load(); + if (isDownloadInProgress || itsWorkersNumber > 0) + { + Statusbar::msg("Lyrics are being downloaded..."); + return; + } +# endif // HAVE_CURL_CURL_H - drawHeader(); + const MPD::Song *s = currentSong(myScreen); + if (!s) + return; + + if (!s->getArtist().empty() && !s->getTitle().empty()) + { + SwitchTo::execute(this); + itsScrollBegin = 0; + itsSong = *s; + Load(); + drawHeader(); + } + else + Statusbar::msg("Song must have both artist and title tag set"); } else - { - Statusbar::msg("Song must have both artist and title tag set"); - return; - } - - // if we resize for locked screen, we have to do that in the end since - // fetching lyrics may fail (eg. if tags are missing) and we don't want - // to adjust screen size then. - if (myLockedScreen) // BUG - { - updateInactiveScreen(this); - resize(); - } + switchToPreviousScreen(); } std::wstring Lyrics::title() @@ -366,8 +346,7 @@ void Lyrics::Load() void Lyrics::Edit() { - if (myScreen != this) - return; + assert(Global::myScreen == this); if (Config.external_editor.empty()) { diff --git a/src/lyrics.h b/src/lyrics.h index 3cdc0992..aace697d 100644 --- a/src/lyrics.h +++ b/src/lyrics.h @@ -24,11 +24,12 @@ #include #include -#include "mpdpp.h" -#include "screen.h" +#include "interfaces.h" #include "lyrics_fetcher.h" +#include "screen.h" +#include "song.h" -struct Lyrics : public Screen +struct Lyrics: Screen, Tabbable { Lyrics(); @@ -44,7 +45,6 @@ struct Lyrics : public Screen virtual void spacePressed() OVERRIDE; virtual bool isMergable() OVERRIDE { return true; } - virtual bool isTabbable() OVERRIDE { return false; } // private members void Edit(); diff --git a/src/media_library.cpp b/src/media_library.cpp index d22e7c7d..108c753a 100644 --- a/src/media_library.cpp +++ b/src/media_library.cpp @@ -35,6 +35,7 @@ #include "utility/comparators.h" #include "utility/type_conversions.h" #include "title.h" +#include "screen_switcher.h" using namespace std::placeholders; @@ -197,16 +198,11 @@ void MediaLibrary::refresh() void MediaLibrary::switchTo() { - using Global::myLockedScreen; - if (myScreen == this) { - if (Config.media_library_disable_two_column_mode) - return; - else + if (!Config.media_library_disable_two_column_mode) { hasTwoColumns = !hasTwoColumns; - hasToBeResized = 1; Tags.clear(); Albums.clear(); Albums.reset(); @@ -225,21 +221,17 @@ void MediaLibrary::switchTo() } else Albums.setTitle(Config.titles_visibility ? "Albums" : ""); + resize(); + refresh(); } } - - if (myLockedScreen) - updateInactiveScreen(this); - - if (hasToBeResized || myLockedScreen) - resize(); - - if (myScreen != this && myScreen->isTabbable()) - Global::myPrevScreen = myScreen; - myScreen = this; - drawHeader(); - markSongsInPlaylist(songsProxyList()); - refresh(); + else + { + SwitchTo::execute(this); + markSongsInPlaylist(songsProxyList()); + drawHeader(); + refresh(); + } } std::wstring MediaLibrary::title() diff --git a/src/media_library.h b/src/media_library.h index dfdee790..fa0b1fac 100644 --- a/src/media_library.h +++ b/src/media_library.h @@ -24,7 +24,7 @@ #include "interfaces.h" #include "screen.h" -struct MediaLibrary : public Screen, public Filterable, public HasColumns, public HasSongs, public Searchable +struct MediaLibrary: Screen, Filterable, HasColumns, HasSongs, Searchable, Tabbable { MediaLibrary(); @@ -40,7 +40,6 @@ struct MediaLibrary : public Screen, public Filterable, public Has virtual void spacePressed() OVERRIDE; virtual void mouseButtonPressed(MEVENT me) OVERRIDE; - virtual bool isTabbable() OVERRIDE { return true; } virtual bool isMergable() OVERRIDE { return true; } // Filterable implementation diff --git a/src/ncmpcpp.cpp b/src/ncmpcpp.cpp index 9e8d7f30..c297f45f 100644 --- a/src/ncmpcpp.cpp +++ b/src/ncmpcpp.cpp @@ -79,8 +79,6 @@ namespace int main(int argc, char **argv) { using Global::myScreen; - using Global::myOldScreen; - using Global::myPrevScreen; using Global::myLockedScreen; using Global::myInactiveScreen; @@ -165,11 +163,6 @@ int main(int argc, char **argv) wFooter->addFDCallback(Mpd.GetFD(), Statusbar::Helpers::mpd); wFooter->createHistory(); - // initialize screens to browser as default previous screen - myScreen = myBrowser; - myPrevScreen = myBrowser; - myOldScreen = myBrowser; - // initialize global timer gettimeofday(&Timer, 0); diff --git a/src/outputs.cpp b/src/outputs.cpp index 2b043f22..287885ba 100644 --- a/src/outputs.cpp +++ b/src/outputs.cpp @@ -28,6 +28,7 @@ #include "status.h" #include "statusbar.h" #include "title.h" +#include "screen_switcher.h" using Global::MainHeight; using Global::MainStartY; @@ -47,21 +48,7 @@ Outputs::Outputs() void Outputs::switchTo() { - using Global::myLockedScreen; - - if (myScreen == this) - return; - - if (myLockedScreen) - updateInactiveScreen(this); - - if (hasToBeResized || myLockedScreen) - resize(); - - if (myScreen != this && myScreen->isTabbable()) - Global::myPrevScreen = myScreen; - myScreen = this; - w.Window::clear(); + SwitchTo::execute(this); drawHeader(); } diff --git a/src/outputs.h b/src/outputs.h index 45f314fa..4aac7be5 100644 --- a/src/outputs.h +++ b/src/outputs.h @@ -25,11 +25,12 @@ #ifdef ENABLE_OUTPUTS +#include "interfaces.h" #include "menu.h" #include "mpdpp.h" #include "screen.h" -struct Outputs : public Screen> +struct Outputs: Screen>, Tabbable { Outputs(); @@ -45,7 +46,6 @@ struct Outputs : public Screen> virtual void spacePressed() OVERRIDE { } virtual void mouseButtonPressed(MEVENT me) OVERRIDE; - virtual bool isTabbable() OVERRIDE { return true; } virtual bool isMergable() OVERRIDE { return true; } // private members diff --git a/src/playlist.cpp b/src/playlist.cpp index 98b279fc..632711eb 100644 --- a/src/playlist.cpp +++ b/src/playlist.cpp @@ -27,6 +27,7 @@ #include "menu.h" #include "playlist.h" #include "regex_filter.h" +#include "screen_switcher.h" #include "song.h" #include "status.h" #include "statusbar.h" @@ -66,24 +67,8 @@ Playlist::Playlist() : itsTotalLength(0), itsRemainingTime(0), itsScrollBegin(0) void Playlist::switchTo() { - using Global::myScreen; - using Global::myLockedScreen; - using Global::myInactiveScreen; - - if (myScreen == this) - return; - + SwitchTo::execute(this); itsScrollBegin = 0; - - if (myLockedScreen) - updateInactiveScreen(this); - - if (hasToBeResized || myLockedScreen) - resize(); - - if (myScreen != this && myScreen->isTabbable()) - Global::myPrevScreen = myScreen; - myScreen = this; EnableHighlighting(); drawHeader(); } diff --git a/src/playlist.h b/src/playlist.h index cfef8b55..10e81ed5 100644 --- a/src/playlist.h +++ b/src/playlist.h @@ -27,7 +27,7 @@ #include "screen.h" #include "song.h" -struct Playlist : public Screen>, public Filterable, public HasSongs, public Searchable +struct Playlist: Screen>, Filterable, HasSongs, Searchable, Tabbable { Playlist(); @@ -43,7 +43,6 @@ struct Playlist : public Screen>, public Filterable, public virtual void spacePressed() OVERRIDE; virtual void mouseButtonPressed(MEVENT me) OVERRIDE; - virtual bool isTabbable() OVERRIDE { return true; } virtual bool isMergable() OVERRIDE { return true; } // Filterable implementation diff --git a/src/playlist_editor.cpp b/src/playlist_editor.cpp index 9bb99ff9..47674257 100644 --- a/src/playlist_editor.cpp +++ b/src/playlist_editor.cpp @@ -34,6 +34,7 @@ #include "tag_editor.h" #include "utility/comparators.h" #include "title.h" +#include "screen_switcher.h" using namespace std::placeholders; @@ -116,23 +117,9 @@ void PlaylistEditor::refresh() void PlaylistEditor::switchTo() { - using Global::myScreen; - using Global::myLockedScreen; - - if (myScreen == this) - return; - - if (myLockedScreen) - updateInactiveScreen(this); - - if (hasToBeResized || myLockedScreen) - resize(); - - if (myScreen != this && myScreen->isTabbable()) - Global::myPrevScreen = myScreen; - myScreen = this; - drawHeader(); + SwitchTo::execute(this); markSongsInPlaylist(contentProxyList()); + drawHeader(); refresh(); } diff --git a/src/playlist_editor.h b/src/playlist_editor.h index f3fc7d57..e96407e8 100644 --- a/src/playlist_editor.h +++ b/src/playlist_editor.h @@ -24,7 +24,7 @@ #include "interfaces.h" #include "screen.h" -struct PlaylistEditor : public Screen, public Filterable, public HasColumns, public HasSongs, public Searchable +struct PlaylistEditor: Screen, Filterable, HasColumns, HasSongs, Searchable, Tabbable { PlaylistEditor(); @@ -40,7 +40,6 @@ struct PlaylistEditor : public Screen, public Filterable, public H virtual void spacePressed() OVERRIDE; virtual void mouseButtonPressed(MEVENT me) OVERRIDE; - virtual bool isTabbable() OVERRIDE { return true; } virtual bool isMergable() OVERRIDE { return true; } // Filterable implementation diff --git a/src/screen.cpp b/src/screen.cpp index 56d7f372..cb1d9582 100644 --- a/src/screen.cpp +++ b/src/screen.cpp @@ -117,7 +117,8 @@ void BasicScreen::unlock() { if (myInactiveScreen && myInactiveScreen != myLockedScreen) myScreen = myInactiveScreen; - myLockedScreen->switchTo(); + if (myScreen != myLockedScreen) + myLockedScreen->switchTo(); myLockedScreen = 0; myInactiveScreen = 0; } diff --git a/src/screen.h b/src/screen.h index a82012d4..0704c169 100644 --- a/src/screen.h +++ b/src/screen.h @@ -73,10 +73,6 @@ struct BasicScreen /// @see Screen::mouseButtonPressed() virtual void mouseButtonPressed(MEVENT me) = 0; - /// When this is overwritten with a function returning true, the - /// screen will be used in tab switching. - virtual bool isTabbable() = 0; - /// @return true if screen is mergable, ie. can be "proper" subwindow /// if one of the screens is locked. Screens that somehow resemble popups /// will want to return false here. diff --git a/src/screen_switcher.h b/src/screen_switcher.h new file mode 100644 index 00000000..6e7c5e89 --- /dev/null +++ b/src/screen_switcher.h @@ -0,0 +1,60 @@ +/*************************************************************************** + * Copyright (C) 2008-2012 by Andrzej Rybczak * + * electricityispower@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#ifndef _SCREEN_SWITCHER_H +#define _SCREEN_SWITCHER_H + +#include "global.h" + +class SwitchTo +{ + template struct TabbableAction_ { + static void execute(ScreenT *) { } + }; + template struct TabbableAction_ { + static void execute(ScreenT *screen) { + using Global::myScreen; + // it has to work only if both current and previous screens are Tabbable + if (dynamic_cast(myScreen)) + screen->setPreviousScreen(myScreen); + } + }; + +public: + template + static void execute(ScreenT *screen) + { + using Global::myScreen; + using Global::myLockedScreen; + + const bool isScreenMergable = screen->isMergable() && myLockedScreen; + const bool isScreenTabbable = std::is_base_of::value; + + assert(myScreen != screen); + if (isScreenMergable) + updateInactiveScreen(screen); + if (screen->hasToBeResized || isScreenMergable) + screen->resize(); + TabbableAction_::execute(screen); + myScreen = screen; + } +}; + +#endif // _SCREEN_SWITCHER_H diff --git a/src/search_engine.cpp b/src/search_engine.cpp index d2eb5ec9..c670fd0b 100644 --- a/src/search_engine.cpp +++ b/src/search_engine.cpp @@ -32,6 +32,7 @@ #include "statusbar.h" #include "utility/comparators.h" #include "title.h" +#include "screen_switcher.h" using namespace std::placeholders; @@ -125,29 +126,16 @@ void SearchEngine::resize() void SearchEngine::switchTo() { - using Global::myScreen; - using Global::myLockedScreen; - - if (myScreen == this) + if (Global::myScreen != this) { - reset(); - return; + SwitchTo::execute(this); + if (w.empty()) + Prepare(); + markSongsInPlaylist(getProxySongList()); + drawHeader(); } - - if (myLockedScreen) - updateInactiveScreen(this); - - if (hasToBeResized || myLockedScreen) - resize(); - - if (w.empty()) - Prepare(); - - if (myScreen != this && myScreen->isTabbable()) - Global::myPrevScreen = myScreen; - myScreen = this; - drawHeader(); - markSongsInPlaylist(getProxySongList()); + else + reset(); } std::wstring SearchEngine::title() diff --git a/src/search_engine.h b/src/search_engine.h index e2c71967..47336879 100644 --- a/src/search_engine.h +++ b/src/search_engine.h @@ -73,7 +73,7 @@ struct SEItem MPD::Song itsSong; }; -struct SearchEngine : public Screen>, public Filterable, public HasSongs, public Searchable +struct SearchEngine: Screen>, Filterable, HasSongs, Searchable, Tabbable { SearchEngine(); @@ -89,7 +89,6 @@ struct SearchEngine : public Screen>, public Filterable, public virtual void spacePressed() OVERRIDE; virtual void mouseButtonPressed(MEVENT me) OVERRIDE; - virtual bool isTabbable() OVERRIDE { return true; } virtual bool isMergable() OVERRIDE { return true; } // Filterable implementation @@ -111,7 +110,6 @@ struct SearchEngine : public Screen>, public Filterable, public virtual MPD::SongList getSelectedSongs() OVERRIDE; // private members - static size_t StaticOptions; static size_t SearchButton; static size_t ResetButton; diff --git a/src/sel_items_adder.cpp b/src/sel_items_adder.cpp index 4bff5d38..6ae46e22 100644 --- a/src/sel_items_adder.cpp +++ b/src/sel_items_adder.cpp @@ -29,6 +29,7 @@ #include "settings.h" #include "statusbar.h" #include "utility/comparators.h" +#include "screen_switcher.h" SelectedItemsAdder *mySelectedItemsAdder; @@ -103,7 +104,6 @@ void SelectedItemsAdder::switchTo() { using Global::myScreen; - assert(myScreen != this); auto hs = hasSongs(myScreen); if (!hs || !hs->allowsSelection()) return; @@ -115,15 +115,10 @@ void SelectedItemsAdder::switchTo() Statusbar::msg("List of selected items is empty"); return; } - - if (hasToBeResized) - resize(); - populatePlaylistSelector(myScreen); - + SwitchTo::execute(this); // default to main window w = &m_playlist_selector; - myScreen = this; } void SelectedItemsAdder::resize() @@ -141,10 +136,10 @@ void SelectedItemsAdder::resize() (COLS-m_position_selector_width)/2, MainStartY+(MainHeight-m_position_selector_height)/2 ); - if (m_old_screen && m_old_screen->hasToBeResized) // resize background window + if (previousScreen() && previousScreen()->hasToBeResized) // resize background window { - m_old_screen->resize(); - m_old_screen->refresh(); + previousScreen()->resize(); + previousScreen()->refresh(); } hasToBeResized = 0; } @@ -162,7 +157,7 @@ void SelectedItemsAdder::refresh() std::wstring SelectedItemsAdder::title() { - return m_old_screen->title(); + return previousScreen()->title(); } void SelectedItemsAdder::enterPressed() @@ -187,7 +182,6 @@ void SelectedItemsAdder::mouseButtonPressed(MEVENT me) void SelectedItemsAdder::populatePlaylistSelector(BasicScreen *old_screen) { typedef SelectedItemsAdder Self; - m_old_screen = old_screen; m_playlist_selector.reset(); m_playlist_selector.clear(); if (old_screen != myPlaylist) @@ -245,7 +239,7 @@ void SelectedItemsAdder::addToExistingPlaylist(const std::string &playlist) cons if (Mpd.CommitCommandsList()) { Statusbar::msg("Selected item(s) added to playlist \"%s\"", playlist.c_str()); - m_old_screen->switchTo(); + switchToPreviousScreen(); } } @@ -301,7 +295,7 @@ void SelectedItemsAdder::addAfterHighlightedSong() const void SelectedItemsAdder::cancel() { if (isActiveWindow(m_playlist_selector)) - m_old_screen->switchTo(); + switchToPreviousScreen(); else if (isActiveWindow(m_position_selector)) w = &m_playlist_selector; } @@ -309,7 +303,7 @@ void SelectedItemsAdder::cancel() void SelectedItemsAdder::exitSuccessfully() const { Statusbar::msg("Selected items added"); - m_old_screen->switchTo(); + switchToPreviousScreen(); } void SelectedItemsAdder::setDimensions() diff --git a/src/sel_items_adder.h b/src/sel_items_adder.h index 21dc56c7..be742dad 100644 --- a/src/sel_items_adder.h +++ b/src/sel_items_adder.h @@ -22,10 +22,11 @@ #define _SEL_ITEMS_ADDER_H #include "exec_item.h" +#include "interfaces.h" #include "screen.h" #include "song.h" -struct SelectedItemsAdder : public Screen> *> +struct SelectedItemsAdder: Screen> *>, Tabbable { typedef typename std::remove_pointer::type Component; @@ -44,7 +45,6 @@ struct SelectedItemsAdder : public Screen virtual void mouseButtonPressed(MEVENT me) OVERRIDE; virtual bool isMergable() OVERRIDE { return false; } - virtual bool isTabbable() OVERRIDE { return false; } protected: virtual bool isLockable() OVERRIDE { return false; } @@ -65,8 +65,6 @@ private: void setDimensions(); - BasicScreen *m_old_screen; - size_t m_playlist_selector_width; size_t m_playlist_selector_height; diff --git a/src/server_info.cpp b/src/server_info.cpp index a87e2ebe..a49e5362 100644 --- a/src/server_info.cpp +++ b/src/server_info.cpp @@ -25,10 +25,10 @@ #include "helpers.h" #include "server_info.h" #include "statusbar.h" +#include "screen_switcher.h" using Global::MainHeight; using Global::MainStartY; -using Global::myOldScreen; ServerInfo *myServerInfo; @@ -43,41 +43,28 @@ ServerInfo::ServerInfo() void ServerInfo::switchTo() { using Global::myScreen; - - if (myScreen == this) - { - myOldScreen->switchTo(); - return; - } - - // resize() can fall back to old screen, so we need it updated - myOldScreen = myScreen; - - if (hasToBeResized) - resize(); - - myScreen = this; - //w.Window::clear(); + if (myScreen != this) + SwitchTo::execute(this); + else + switchToPreviousScreen(); } void ServerInfo::resize() { SetDimensions(); - if (itsHeight < 5) // screen too low to display this window - return myOldScreen->switchTo(); w.resize(itsWidth, itsHeight); w.moveTo((COLS-itsWidth)/2, (MainHeight-itsHeight)/2+MainStartY); - if (myOldScreen && myOldScreen->hasToBeResized) // resize background window + if (previousScreen() && previousScreen()->hasToBeResized) // resize background window { - myOldScreen->resize(); - myOldScreen->refresh(); + previousScreen()->resize(); + previousScreen()->refresh(); } hasToBeResized = 0; } std::wstring ServerInfo::title() { - return myOldScreen->title(); + return previousScreen()->title(); } void ServerInfo::update() diff --git a/src/server_info.h b/src/server_info.h index 1b8364d9..48877bdc 100644 --- a/src/server_info.h +++ b/src/server_info.h @@ -21,9 +21,10 @@ #ifndef _SERVER_INFO #define _SERVER_INFO +#include "interfaces.h" #include "screen.h" -struct ServerInfo : public Screen +struct ServerInfo: Screen, Tabbable { ServerInfo(); @@ -39,7 +40,6 @@ struct ServerInfo : public Screen virtual void spacePressed() OVERRIDE { } virtual bool isMergable() OVERRIDE { return false; } - virtual bool isTabbable() OVERRIDE { return false; } protected: virtual bool isLockable() OVERRIDE { return false; } diff --git a/src/song_info.cpp b/src/song_info.cpp index 35244875..1964acd2 100644 --- a/src/song_info.cpp +++ b/src/song_info.cpp @@ -23,6 +23,7 @@ #include "song_info.h" #include "tag_editor.h" #include "title.h" +#include "screen_switcher.h" #ifdef HAVE_TAGLIB_H # include "fileref.h" @@ -71,34 +72,23 @@ std::wstring SongInfo::title() void SongInfo::switchTo() { using Global::myScreen; - using Global::myOldScreen; - using Global::myLockedScreen; - - if (myScreen == this) - return myOldScreen->switchTo(); - - if (myLockedScreen) - updateInactiveScreen(this); - - auto s = currentSong(myScreen); - if (!s) - return; - - if (hasToBeResized || myLockedScreen) - resize(); - - myOldScreen = myScreen; - myScreen = this; - - w.clear(); - w.reset(); - PrepareSong(*s); - w.flush(); - - // redraw header after we're done with the file, since reading it from disk - // takes a bit of time and having header updated before content of a window - // is displayed doesn't look nice. - drawHeader(); + if (myScreen != this) + { + auto s = currentSong(myScreen); + if (!s) + return; + SwitchTo::execute(this); + w.clear(); + w.reset(); + PrepareSong(*s); + w.flush(); + // redraw header after we're done with the file, since reading it from disk + // takes a bit of time and having header updated before content of a window + // is displayed doesn't look nice. + drawHeader(); + } + else + switchToPreviousScreen(); } void SongInfo::PrepareSong(MPD::Song &s) diff --git a/src/song_info.h b/src/song_info.h index 7062578e..6c00e5a1 100644 --- a/src/song_info.h +++ b/src/song_info.h @@ -21,10 +21,11 @@ #ifndef _SONG_INFO_H #define _SONG_INFO_H -#include "screen.h" +#include "interfaces.h" #include "mutable_song.h" +#include "screen.h" -struct SongInfo : public Screen +struct SongInfo: Screen, Tabbable { struct Metadata { @@ -47,7 +48,6 @@ struct SongInfo : public Screen virtual void spacePressed() OVERRIDE { } virtual bool isMergable() OVERRIDE { return true; } - virtual bool isTabbable() OVERRIDE { return false; } // private members static const Metadata Tags[]; diff --git a/src/sort_playlist.cpp b/src/sort_playlist.cpp index 9484b25c..bb5f0bb1 100644 --- a/src/sort_playlist.cpp +++ b/src/sort_playlist.cpp @@ -25,6 +25,7 @@ #include "sort_playlist.h" #include "statusbar.h" #include "utility/comparators.h" +#include "screen_switcher.h" using Global::MainHeight; using Global::MainStartY; @@ -62,19 +63,7 @@ SortPlaylistDialog::SortPlaylistDialog() void SortPlaylistDialog::switchTo() { - using Global::myScreen; - using Global::myOldScreen; - using Global::myLockedScreen; - using Global::myInactiveScreen; - - assert(myScreen != this); - - if (hasToBeResized) - resize(); - - myOldScreen = myScreen; - myScreen = this; - + SwitchTo::execute(this); w.reset(); refresh(); } @@ -90,7 +79,7 @@ void SortPlaylistDialog::resize() std::wstring SortPlaylistDialog::title() { - return Global::myOldScreen->title(); + return previousScreen()->title(); } void SortPlaylistDialog::enterPressed() @@ -154,11 +143,11 @@ void SortPlaylistDialog::enterPressed() if (Mpd.CommitCommandsList()) Statusbar::msg("Playlist sorted"); - Global::myOldScreen->switchTo(); + switchToPreviousScreen(); } else if (*option == m_cancel_entry) { - Global::myOldScreen->switchTo(); + switchToPreviousScreen(); } else Statusbar::msg("Move tag types up and down to adjust sort order"); diff --git a/src/sort_playlist.h b/src/sort_playlist.h index 577f85e3..005a4b1d 100644 --- a/src/sort_playlist.h +++ b/src/sort_playlist.h @@ -21,10 +21,11 @@ #ifndef _SORT_PLAYLIST #define _SORT_PLAYLIST +#include "interfaces.h" #include "screen.h" #include "song.h" -struct SortPlaylistDialog : public Screen>> +struct SortPlaylistDialog: Screen>>, Tabbable { SortPlaylistDialog(); @@ -39,7 +40,6 @@ struct SortPlaylistDialog : public Screenmain().isFiltered()) myPlaylist->main().highlight(Mpd.GetCurrentlyPlayingSongPos()); - if (Config.now_playing_lyrics && isVisible(myLyrics) && Global::myOldScreen == myPlaylist) + if (Config.now_playing_lyrics && isVisible(myLyrics) && myLyrics->previousScreen() == myPlaylist) myLyrics->ReloadNP = 1; elapsedTime(); diff --git a/src/tag_editor.cpp b/src/tag_editor.cpp index d0fcf839..1cc34fed 100644 --- a/src/tag_editor.cpp +++ b/src/tag_editor.cpp @@ -37,6 +37,7 @@ #include "utility/comparators.h" #include "title.h" #include "tags.h" +#include "screen_switcher.h" using namespace std::placeholders; @@ -194,20 +195,7 @@ std::wstring TagEditor::title() void TagEditor::switchTo() { - using Global::myLockedScreen; - - if (myScreen == this) - return; - - if (myLockedScreen) - updateInactiveScreen(this); - - if (hasToBeResized || myLockedScreen) - resize(); - - if (myScreen != this && myScreen->isTabbable()) - Global::myPrevScreen = myScreen; - myScreen = this; + SwitchTo::execute(this); drawHeader(); refresh(); } diff --git a/src/tag_editor.h b/src/tag_editor.h index 9210fd16..0270e07e 100644 --- a/src/tag_editor.h +++ b/src/tag_editor.h @@ -28,12 +28,11 @@ #include #include "interfaces.h" -#include "mpdpp.h" #include "mutable_song.h" #include "regex_filter.h" #include "screen.h" -struct TagEditor : public Screen, public Filterable, public HasColumns, public HasSongs, public Searchable +struct TagEditor: Screen, Filterable, HasColumns, HasSongs, Searchable, Tabbable { TagEditor(); @@ -49,7 +48,6 @@ struct TagEditor : public Screen, public Filterable, public HasCol virtual void spacePressed() OVERRIDE; virtual void mouseButtonPressed(MEVENT) OVERRIDE; - virtual bool isTabbable() OVERRIDE { return true; } virtual bool isMergable() OVERRIDE { return true; } // Filterable implementation diff --git a/src/tags.cpp b/src/tags.cpp index 501c0d7a..4e084775 100644 --- a/src/tags.cpp +++ b/src/tags.cpp @@ -33,9 +33,6 @@ #include #include -#include "browser.h" -#include "playlist.h" - #include "global.h" #include "settings.h" #include "utility/numeric_conversions.h" @@ -253,7 +250,8 @@ bool write(MPD::MutableSong &s) new_name += s.getDirectory() + "/" + s.getNewURI(); if (std::rename(old_name.c_str(), new_name.c_str()) == 0 && !s.isFromDatabase()) { - if (Global::myOldScreen == myPlaylist) + // FIXME + /*if (myTinyTagEditor == myPlaylist) { // if we rename local file, it won't get updated // so just remove it from playlist and add again @@ -269,7 +267,7 @@ bool write(MPD::MutableSong &s) Mpd.CommitCommandsList(); } else // only myBrowser->main() - myBrowser->GetDirectory(myBrowser->CurrentDir()); + myBrowser->GetDirectory(myBrowser->CurrentDir());*/ } } return true; diff --git a/src/tiny_tag_editor.cpp b/src/tiny_tag_editor.cpp index 8307cd42..585cf30d 100644 --- a/src/tiny_tag_editor.cpp +++ b/src/tiny_tag_editor.cpp @@ -38,10 +38,10 @@ #include "tag_editor.h" #include "title.h" #include "tags.h" +#include "screen_switcher.h" using Global::MainHeight; using Global::MainStartY; -using Global::myOldScreen; TinyTagEditor *myTinyTagEditor; @@ -66,22 +66,14 @@ void TinyTagEditor::resize() void TinyTagEditor::switchTo() { using Global::myScreen; - using Global::myLockedScreen; - if (itsEdited.isStream()) { Statusbar::msg("Streams can't be edited"); } else if (getTags()) { - if (myLockedScreen) - updateInactiveScreen(this); - - if (hasToBeResized || myLockedScreen) - resize(); - - myOldScreen = myScreen; - myScreen = this; + m_previous_screen = myScreen; + SwitchTo::execute(this); drawHeader(); } else @@ -139,9 +131,9 @@ void TinyTagEditor::enterPressed() Mpd.UpdateDirectory(itsEdited.getDirectory()); else { - if (myOldScreen == myPlaylist) + if (m_previous_screen == myPlaylist) myPlaylist->main().current().value() = itsEdited; - else if (myOldScreen == myBrowser) + else if (m_previous_screen == myBrowser) myBrowser->GetDirectory(myBrowser->CurrentDir()); } } @@ -149,7 +141,7 @@ void TinyTagEditor::enterPressed() Statusbar::msg("Error while writing tags"); } if (option > 21) - myOldScreen->switchTo(); + m_previous_screen->switchTo(); } void TinyTagEditor::mouseButtonPressed(MEVENT me) diff --git a/src/tiny_tag_editor.h b/src/tiny_tag_editor.h index 4df1f8c9..2aa97fe0 100644 --- a/src/tiny_tag_editor.h +++ b/src/tiny_tag_editor.h @@ -25,10 +25,11 @@ #ifdef HAVE_TAGLIB_H +#include "interfaces.h" #include "mutable_song.h" #include "screen.h" -struct TinyTagEditor : public Screen> +struct TinyTagEditor: Screen> { TinyTagEditor(); @@ -45,17 +46,17 @@ struct TinyTagEditor : public Screen> virtual void mouseButtonPressed(MEVENT me) OVERRIDE; virtual bool isMergable() OVERRIDE { return true; } - virtual bool isTabbable() OVERRIDE { return false; } // private members void SetEdited(const MPD::Song &); protected: - virtual bool isLockable() OVERRIDE { return true; } + virtual bool isLockable() OVERRIDE { return false; } private: bool getTags(); MPD::MutableSong itsEdited; + BasicScreen *m_previous_screen; }; extern TinyTagEditor *myTinyTagEditor; diff --git a/src/visualizer.cpp b/src/visualizer.cpp index fb32f6d9..8ebd2004 100644 --- a/src/visualizer.cpp +++ b/src/visualizer.cpp @@ -36,6 +36,7 @@ #include "status.h" #include "statusbar.h" #include "title.h" +#include "screen_switcher.h" using Global::MainStartY; using Global::MainHeight; @@ -62,31 +63,13 @@ Visualizer::Visualizer() void Visualizer::switchTo() { - using Global::myScreen; - using Global::myLockedScreen; - - if (myScreen == this) - return; - - if (myLockedScreen) - updateInactiveScreen(this); - - if (hasToBeResized || myLockedScreen) - resize(); - - if (myScreen != this && myScreen->isTabbable()) - Global::myPrevScreen = myScreen; - myScreen = this; - drawHeader(); + SwitchTo::execute(this); w.clear(); - SetFD(); - - m_timer.tv_sec = 0; - m_timer.tv_usec = 0; - + m_timer = { 0, 0 }; if (m_fifo >= 0) Global::wFooter->setTimeout(WindowTimeout); + drawHeader(); } void Visualizer::resize() diff --git a/src/visualizer.h b/src/visualizer.h index f25349a7..4285212d 100644 --- a/src/visualizer.h +++ b/src/visualizer.h @@ -25,14 +25,15 @@ #ifdef ENABLE_VISUALIZER -#include "window.h" +#include "interfaces.h" #include "screen.h" +#include "window.h" #ifdef HAVE_FFTW3_H # include #endif -struct Visualizer : public Screen +struct Visualizer: Screen, Tabbable { Visualizer(); @@ -48,7 +49,6 @@ struct Visualizer : public Screen virtual void spacePressed() OVERRIDE; virtual void mouseButtonPressed(MEVENT) OVERRIDE { } - virtual bool isTabbable() OVERRIDE { return true; } virtual bool isMergable() OVERRIDE { return true; } // private members