From ba6c2db0b1f1b574caa7f338a51e250dba3a098e Mon Sep 17 00:00:00 2001 From: Andrzej Rybczak Date: Mon, 16 Feb 2009 00:37:03 +0100 Subject: [PATCH] improve resizing --- src/browser.cpp | 4 ++++ src/clock.cpp | 6 ++++-- src/global.h | 1 - src/help.cpp | 21 +++++++++++---------- src/info.cpp | 16 ++++++++-------- src/lyrics.cpp | 8 ++++---- src/media_library.cpp | 5 +++++ src/mpdpp.cpp | 2 ++ src/mpdpp.h | 3 ++- src/ncmpcpp.cpp | 37 +++++++++++++++---------------------- src/playlist.cpp | 6 +++++- src/playlist_editor.cpp | 9 +++++---- src/screen.h | 4 +++- src/search_engine.cpp | 4 ++++ src/status.cpp | 10 +--------- src/tag_editor.cpp | 24 +++++++++--------------- 16 files changed, 82 insertions(+), 78 deletions(-) diff --git a/src/browser.cpp b/src/browser.cpp index 1258b0be..3812f865 100644 --- a/src/browser.cpp +++ b/src/browser.cpp @@ -53,6 +53,7 @@ void Browser::Init() void Browser::Resize() { w->Resize(COLS, main_height); + hasToBeResized = 0; } void Browser::SwitchTo() @@ -60,6 +61,9 @@ void Browser::SwitchTo() if (myScreen == this) return; + if (hasToBeResized) + Resize(); + CLEAR_FIND_HISTORY; w->Empty() ? myBrowser->GetDirectory(itsBrowsedDir) : myBrowser->UpdateItemList(); myScreen = this; diff --git a/src/clock.cpp b/src/clock.cpp index 27eb44a0..143c9114 100644 --- a/src/clock.cpp +++ b/src/clock.cpp @@ -56,10 +56,9 @@ void Clock::Resize() if (Width <= size_t(COLS) && Height <= main_height) { w->MoveTo((COLS-Width)/2, (LINES-Height)/2); - if (myScreen == myClock) + if (myScreen == this) { myPlaylist->Main()->Hide(); - Prepare(); w->Display(); } } @@ -75,6 +74,9 @@ void Clock::SwitchTo() if (myScreen == this) return; + if (hasToBeResized) + Resize(); + CLEAR_FIND_HISTORY; myScreen = this; myPlaylist->Main()->Hide(); diff --git a/src/global.h b/src/global.h index a01b0455..654229b0 100644 --- a/src/global.h +++ b/src/global.h @@ -49,7 +49,6 @@ namespace Global extern bool block_progressbar_update; extern bool block_item_list_update; - extern bool header_update_status; extern bool messages_allowed; extern bool redraw_header; diff --git a/src/help.cpp b/src/help.cpp index 6edb3b45..e82c352a 100644 --- a/src/help.cpp +++ b/src/help.cpp @@ -40,20 +40,21 @@ void Help::Init() void Help::Resize() { w->Resize(COLS, main_height); + hasToBeResized = 0; } void Help::SwitchTo() { - if (myScreen != myHelp -# ifdef HAVE_TAGLIB_H - && myScreen != myTinyTagEditor -# endif // HAVE_TAGLIB_H - ) - { - myScreen = this; - w->Hide(); - redraw_header = 1; - } + if (myScreen == this) + return; + + if (hasToBeResized) + Resize(); + + myScreen = this; + w->Hide(); + redraw_header = 1; + } std::string Help::Title() diff --git a/src/info.cpp b/src/info.cpp index 64c2b91e..91d9530f 100644 --- a/src/info.cpp +++ b/src/info.cpp @@ -59,6 +59,7 @@ void Info::Init() void Info::Resize() { w->Resize(COLS, main_height); + hasToBeResized = 0; } std::string Info::Title() @@ -83,10 +84,7 @@ void Info::GetSong() { if (myScreen == this) { - w->Hide(); - myScreen = myOldScreen; - redraw_header = 1; - myScreen->Refresh(); + myOldScreen->SwitchTo(); } else { @@ -95,6 +93,9 @@ void Info::GetSong() if (!s) return; + if (hasToBeResized) + Resize(); + myOldScreen = myScreen; myScreen = this; redraw_header = 1; @@ -112,10 +113,7 @@ void Info::GetArtist() { if (myScreen == this) { - w->Hide(); - myScreen = myOldScreen; - redraw_header = 1; - myScreen->Refresh(); + myOldScreen->SwitchTo(); } else { @@ -138,6 +136,8 @@ void Info::GetArtist() if (!artist->empty()) { + if (hasToBeResized) + Resize(); myOldScreen = myScreen; myScreen = this; redraw_header = 1; diff --git a/src/lyrics.cpp b/src/lyrics.cpp index b0154004..34a1433b 100644 --- a/src/lyrics.cpp +++ b/src/lyrics.cpp @@ -63,6 +63,7 @@ void Lyrics::Init() void Lyrics::Resize() { w->Resize(COLS, main_height); + hasToBeResized = 0; } void Lyrics::Update() @@ -86,10 +87,7 @@ void Lyrics::SwitchTo() { if (myScreen == this && !Reload) { - w->Hide(); - myScreen = myOldScreen; - redraw_header = 1; - myScreen->Refresh(); + myOldScreen->SwitchTo(); } else { @@ -114,6 +112,8 @@ void Lyrics::SwitchTo() if (!s->GetArtist().empty() && !s->GetTitle().empty()) { + if (hasToBeResized) + Resize(); itsScrollBegin = 0; itsSong = *s; myOldScreen = myScreen; diff --git a/src/media_library.cpp b/src/media_library.cpp index 44d0abff..fae3b20c 100644 --- a/src/media_library.cpp +++ b/src/media_library.cpp @@ -85,6 +85,8 @@ void MediaLibrary::Resize() Albums->MoveTo(itsMiddleColStartX, main_start_y); Songs->MoveTo(itsRightColStartX, main_start_y); + + hasToBeResized = 0; } void MediaLibrary::Refresh() @@ -106,6 +108,9 @@ void MediaLibrary::SwitchTo() if (myScreen == this) return; + if (hasToBeResized) + Resize(); + CLEAR_FIND_HISTORY; myScreen = this; myPlaylist->Main()->Hide(); // hack, should be myScreen, but it doesn't always have 100% width diff --git a/src/mpdpp.cpp b/src/mpdpp.cpp index 9533663d..f25dcac2 100644 --- a/src/mpdpp.cpp +++ b/src/mpdpp.cpp @@ -181,6 +181,7 @@ void Connection::UpdateStatus() itsChanges.Random = 1; itsChanges.Repeat = 1; itsChanges.PlayerState = 1; + itsChanges.StatusFlags = 1; } else { @@ -194,6 +195,7 @@ void Connection::UpdateStatus() itsChanges.Random = itsOldStatus->random != itsCurrentStatus->random; itsChanges.Repeat = itsOldStatus->repeat != itsCurrentStatus->repeat; itsChanges.PlayerState = itsOldStatus->state != itsCurrentStatus->state; + itsChanges.StatusFlags = itsChanges.Repeat || itsChanges.Random || itsChanges.Crossfade || itsChanges.DBUpdating; } itsUpdater(this, itsChanges, itsErrorHandlerUserdata); } diff --git a/src/mpdpp.h b/src/mpdpp.h index 91db1649..abb604ca 100644 --- a/src/mpdpp.h +++ b/src/mpdpp.h @@ -42,7 +42,7 @@ namespace MPD struct StatusChanges { - StatusChanges() : Playlist(0), SongID(0), Database(0), DBUpdating(0), Volume(0), ElapsedTime(0), Crossfade(0), Random(0), Repeat(0), PlayerState(0) { } + StatusChanges() : Playlist(0), SongID(0), Database(0), DBUpdating(0), Volume(0), ElapsedTime(0), Crossfade(0), Random(0), Repeat(0), PlayerState(0), StatusFlags(0) { } bool Playlist:1; bool SongID:1; bool Database:1; @@ -53,6 +53,7 @@ namespace MPD bool Random:1; bool Repeat:1; bool PlayerState:1; + bool StatusFlags:1; }; typedef std::vector ItemList; diff --git a/src/ncmpcpp.cpp b/src/ncmpcpp.cpp index b5aca65e..afe6ccaf 100644 --- a/src/ncmpcpp.cpp +++ b/src/ncmpcpp.cpp @@ -341,24 +341,26 @@ int main(int argc, char *argv[]) if (!Config.statusbar_visibility) main_height++; - myHelp->Resize(); - myPlaylist->Resize(); - myBrowser->Resize(); - mySearcher->Resize(); - myLibrary->Resize(); - myPlaylistEditor->Resize(); - myInfo->Resize(); - myLyrics->Resize(); + myHelp->hasToBeResized = 1; + myPlaylist->hasToBeResized = 1; + myBrowser->hasToBeResized = 1; + mySearcher->hasToBeResized = 1; + myLibrary->hasToBeResized = 1; + myPlaylistEditor->hasToBeResized = 1; + myInfo->hasToBeResized = 1; + myLyrics->hasToBeResized = 1; # ifdef HAVE_TAGLIB_H - myTinyTagEditor->Resize(); - myTagEditor->Resize(); + myTinyTagEditor->hasToBeResized = 1; + myTagEditor->hasToBeResized = 1; # endif // HAVE_TAGLIB_H # ifdef ENABLE_CLOCK - myClock->Resize(); + myClock->hasToBeResized = 1; # endif // ENABLE_CLOCK + myScreen->Resize(); + if (Config.header_visibility) wHeader->Resize(COLS, wHeader->GetHeight()); @@ -367,9 +369,9 @@ int main(int argc, char *argv[]) wFooter->Resize(COLS, wFooter->GetHeight()); myScreen->Refresh(); - header_update_status = 1; PlayerState mpd_state = Mpd->GetState(); StatusChanges changes; + changes.StatusFlags = 1; // force status update if (mpd_state == psPlay || mpd_state == psPause) changes.ElapsedTime = 1; // restore status else @@ -1340,16 +1342,7 @@ int main(int argc, char *argv[]) size_t id = mDialog->Choice(); - if (myScreen == myLibrary) - { - myLibrary->Refresh(); - } - else if (myScreen == myPlaylistEditor) - { - myPlaylistEditor->Refresh(); - } - else - myScreen->Refresh(); + myScreen->Refresh(); if (id == 0) { diff --git a/src/playlist.cpp b/src/playlist.cpp index 4670bb16..69ea7960 100644 --- a/src/playlist.cpp +++ b/src/playlist.cpp @@ -50,7 +50,10 @@ void Playlist::SwitchTo() { if (myScreen == this) return; - + + if (hasToBeResized) + Resize(); + CLEAR_FIND_HISTORY; myScreen = this; w->Hide(); @@ -61,6 +64,7 @@ void Playlist::Resize() { w->Resize(COLS, main_height); w->SetTitle(Config.columns_in_playlist ? Display::Columns(Config.song_columns_list_format) : ""); + hasToBeResized = 0; } std::string Playlist::Title() diff --git a/src/playlist_editor.cpp b/src/playlist_editor.cpp index 29ed3e1f..a097dcc5 100644 --- a/src/playlist_editor.cpp +++ b/src/playlist_editor.cpp @@ -34,10 +34,6 @@ using namespace Global; using namespace MPD; using std::string; -//Window *Global::wPlaylistEditorActiveCol; -//Menu *Global::List; -//Menu *Global::Content; - PlaylistEditor *myPlaylistEditor = new PlaylistEditor; size_t PlaylistEditor::LeftColumnWidth; @@ -76,6 +72,8 @@ void PlaylistEditor::Resize() Content->Resize(RightColumnWidth, main_height); Content->MoveTo(RightColumnStartX, main_start_y); + + hasToBeResized = 0; } std::string PlaylistEditor::Title() @@ -95,6 +93,9 @@ void PlaylistEditor::SwitchTo() if (myScreen == this) return; + if (hasToBeResized) + Resize(); + CLEAR_FIND_HISTORY; myScreen = this; myPlaylist->Main()->Hide(); // hack, should be myScreen, but it doesn't always have 100% width diff --git a/src/screen.h b/src/screen.h index c6768284..c05e258e 100644 --- a/src/screen.h +++ b/src/screen.h @@ -30,7 +30,7 @@ class BasicScreen { public: - BasicScreen() { } + BasicScreen() : hasToBeResized(0) { } virtual ~BasicScreen() { } virtual void *&Cmp() = 0; @@ -50,6 +50,8 @@ class BasicScreen virtual MPD::Song *CurrentSong() { return 0; } + bool hasToBeResized; + protected: void Select(List *); }; diff --git a/src/search_engine.cpp b/src/search_engine.cpp index 5b02ab97..401e3e7d 100644 --- a/src/search_engine.cpp +++ b/src/search_engine.cpp @@ -55,6 +55,7 @@ void SearchEngine::Init() void SearchEngine::Resize() { w->Resize(COLS, main_height); + hasToBeResized = 0; } void SearchEngine::SwitchTo() @@ -62,6 +63,9 @@ void SearchEngine::SwitchTo() if (myScreen == this) return; + if (hasToBeResized) + Resize(); + CLEAR_FIND_HISTORY; if (w->Empty()) Prepare(); diff --git a/src/status.cpp b/src/status.cpp index 6e29eaa2..52e128d2 100644 --- a/src/status.cpp +++ b/src/status.cpp @@ -40,8 +40,6 @@ using std::string; string Global::volume_state; -bool Global::header_update_status = 0; - namespace { time_t time_of_statusbar_lock; @@ -396,29 +394,24 @@ void NcmpcppStatusChanged(Connection *Mpd, StatusChanges changed, void *) { mpd_repeat = Mpd->GetRepeat() ? 'r' : 0; ShowMessage("Repeat is %s", !mpd_repeat ? "off" : "on"); - header_update_status = 1; - } if (changed.Random) { mpd_random = Mpd->GetRandom() ? 'z' : 0; ShowMessage("Random is %s", !mpd_random ? "off" : "on"); - header_update_status = 1; } if (changed.Crossfade) { int crossfade = Mpd->GetCrossfade(); mpd_crossfade = crossfade ? 'x' : 0; ShowMessage("Crossfade set to %d seconds", crossfade); - header_update_status = 1; } if (changed.DBUpdating) { mpd_db_updating = Mpd->GetDBIsUpdating() ? 'U' : 0; ShowMessage(!mpd_db_updating ? "Database update finished!" : "Database update started!"); - header_update_status = 1; } - if (header_update_status && Config.header_visibility) + if (changed.StatusFlags && Config.header_visibility) { switch_state.clear(); if (mpd_repeat) @@ -445,7 +438,6 @@ void NcmpcppStatusChanged(Connection *Mpd, StatusChanges changed, void *) } attroff(A_BOLD|COLOR_PAIR(Config.state_line_color)); refresh(); - header_update_status = 0; } if (changed.Volume && Config.header_visibility) { diff --git a/src/tag_editor.cpp b/src/tag_editor.cpp index 45b28be5..ba423550 100644 --- a/src/tag_editor.cpp +++ b/src/tag_editor.cpp @@ -56,6 +56,7 @@ void TinyTagEditor::Init() void TinyTagEditor::Resize() { w->Resize(COLS, main_height); + hasToBeResized = 0; } void TinyTagEditor::SwitchTo() @@ -66,6 +67,8 @@ void TinyTagEditor::SwitchTo() } else if (GetTags()) { + if (hasToBeResized) + Resize(); myOldScreen = myScreen; myScreen = this; redraw_header = 1; @@ -205,21 +208,7 @@ void TinyTagEditor::EnterPressed() } case 15: { - w->Clear(); - myScreen = myOldScreen; - redraw_header = 1; - if (myScreen == myLibrary) - { - myLibrary->Refresh(); - } - else if (myScreen == myPlaylistEditor) - { - myPlaylistEditor->Refresh(); - } - else if (myScreen == myTagEditor) - { - myTagEditor->Refresh(); - } + myOldScreen->SwitchTo(); break; } } @@ -352,6 +341,8 @@ void TagEditor::Resize() TagTypes->MoveTo(MiddleColumnStartX, main_start_y); Tags->MoveTo(RightColumnStartX, main_start_y); + + hasToBeResized = 0; } std::string TagEditor::Title() @@ -364,6 +355,9 @@ void TagEditor::SwitchTo() if (myScreen == this) return; + if (hasToBeResized) + Resize(); + CLEAR_FIND_HISTORY; myScreen = this;