From c90545b00809d69cfd640e31ac1582fad95fbeba Mon Sep 17 00:00:00 2001 From: Andrzej Rybczak Date: Tue, 11 Sep 2012 21:52:41 +0200 Subject: [PATCH] move statusbar/progressbar related code to separate file --- src/Makefile.am | 3 + src/actions.cpp | 297 ++++++++++++++++++++-------------------- src/browser.cpp | 17 +-- src/clock.cpp | 3 +- src/global.h | 2 +- src/lastfm.cpp | 3 +- src/lyrics.cpp | 19 +-- src/media_library.cpp | 9 +- src/ncmpcpp.cpp | 13 +- src/outputs.cpp | 5 +- src/playlist.cpp | 19 +-- src/playlist_editor.cpp | 5 +- src/search_engine.cpp | 15 +- src/sel_items_adder.cpp | 19 +-- src/server_info.cpp | 3 +- src/status.cpp | 202 +++------------------------ src/status.h | 26 ---- src/statusbar.cpp | 199 +++++++++++++++++++++++++++ src/statusbar.h | 90 ++++++++++++ src/tag_editor.cpp | 59 ++++---- src/tiny_tag_editor.cpp | 19 +-- src/visualizer.cpp | 7 +- 22 files changed, 577 insertions(+), 457 deletions(-) create mode 100644 src/statusbar.cpp create mode 100644 src/statusbar.h diff --git a/src/Makefile.am b/src/Makefile.am index 71893244..bfeb0479 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -38,6 +38,7 @@ ncmpcpp_SOURCES = \ song.cpp \ song_info.cpp \ status.cpp \ + statusbar.cpp \ tag_editor.cpp \ tiny_tag_editor.cpp \ visualizer.cpp \ @@ -89,6 +90,8 @@ noinst_HEADERS = \ settings.h \ song.h \ song_info.h \ + status.h \ + statusbar.h \ tag_editor.h \ tiny_tag_editor.h \ visualizer.h \ diff --git a/src/actions.cpp b/src/actions.cpp index 7eee21a5..a51bf407 100644 --- a/src/actions.cpp +++ b/src/actions.cpp @@ -31,6 +31,7 @@ #include "global.h" #include "mpdpp.h" #include "helpers.h" +#include "statusbar.h" #include "utility/comparators.h" #include "bindings.h" @@ -191,7 +192,7 @@ void Action::ResizeScreen() RedrawStatusbar = true; NcmpcppStatusChanged(&Mpd, MPD::StatusChanges(), 0); DesignChanged = 0; - ShowMessage("User interface: %s", Config.new_design ? "Alternative" : "Classic"); + Statusbar::msg("User interface: %s", Config.new_design ? "Alternative" : "Classic"); } DrawHeader(); wFooter->refresh(); @@ -228,12 +229,12 @@ void Action::Seek() if (!Mpd.GetTotalTime()) { - ShowMessage("Unknown item length"); + Statusbar::msg("Unknown item length"); return; } - LockProgressbar(); - LockStatusbar(); + Progressbar::lock(); + Statusbar::lock(); int songpos = Mpd.GetElapsedTime(); timeval t = Timer; @@ -307,7 +308,7 @@ void Action::Seek() *wFooter << NC::XY(wFooter->getWidth()-tracklength.length(), 1) << tracklength; } *wFooter << NC::fmtBoldEnd; - DrawProgressbar(songpos, Mpd.GetTotalTime()); + Progressbar::draw(songpos, Mpd.GetTotalTime()); wFooter->refresh(); } SeekingInProgress = false; @@ -315,8 +316,8 @@ void Action::Seek() wFooter->setTimeout(old_timeout); - UnlockProgressbar(); - UnlockStatusbar(); + Progressbar::unlock(); + Statusbar::unlock(); } void Action::FindItem(const FindDirection fd) @@ -327,13 +328,13 @@ void Action::FindItem(const FindDirection fd) assert(w); assert(w->allowsSearching()); - LockStatusbar(); - Statusbar() << "Find " << (fd == fdForward ? "forward" : "backward") << ": "; + Statusbar::lock(); + Statusbar::put() << "Find " << (fd == fdForward ? "forward" : "backward") << ": "; std::string findme = wFooter->getString(); - UnlockStatusbar(); + Statusbar::unlock(); if (!findme.empty()) - ShowMessage("Searching..."); + Statusbar::msg("Searching..."); bool success = w->search(findme); @@ -341,9 +342,9 @@ void Action::FindItem(const FindDirection fd) return; if (success) - ShowMessage("Searching finished"); + Statusbar::msg("Searching finished"); else - ShowMessage("Unable to find \"%s\"", findme.c_str()); + Statusbar::msg("Unable to find \"%s\"", findme.c_str()); if (fd == fdForward) w->nextFound(Config.wrapped_search); @@ -401,8 +402,8 @@ bool Action::AskYesNoQuestion(const std::string &question, void (*callback)()) { using Global::wFooter; - LockStatusbar(); - Statusbar() << question << " [" << NC::fmtBold << 'y' << NC::fmtBoldEnd << '/' << NC::fmtBold << 'n' << NC::fmtBoldEnd << "]"; + Statusbar::lock(); + Statusbar::put() << question << " [" << NC::fmtBold << 'y' << NC::fmtBoldEnd << '/' << NC::fmtBold << 'n' << NC::fmtBoldEnd << "]"; wFooter->refresh(); int answer = 0; do @@ -412,7 +413,7 @@ bool Action::AskYesNoQuestion(const std::string &question, void (*callback)()) answer = wFooter->readKey(); } while (answer != 'y' && answer != 'n'); - UnlockStatusbar(); + Statusbar::unlock(); return answer == 'y'; } @@ -420,7 +421,7 @@ bool Action::isMPDMusicDirSet() { if (Config.mpd_music_dir.empty()) { - ShowMessage("Proper mpd_music_dir variable has to be set in configuration file"); + Statusbar::msg("Proper mpd_music_dir variable has to be set in configuration file"); return false; } return true; @@ -632,8 +633,8 @@ void ToggleInterface::Run() Config.new_design = !Config.new_design; Config.statusbar_visibility = Config.new_design ? 0 : OriginalStatusbarVisibility; SetWindowsDimensions(); - UnlockProgressbar(); - UnlockStatusbar(); + Progressbar::unlock(); + Statusbar::unlock(); DesignChanged = true; ResizeScreen(); } @@ -779,10 +780,10 @@ void Delete::Run() { if (myScreen == myPlaylist && !myPlaylist->Items->empty()) { - ShowMessage("Deleting items..."); + Statusbar::msg("Deleting items..."); auto delete_fun = std::bind(&MPD::Connection::Delete, _1, _2); if (deleteSelectedSongs(*myPlaylist->Items, delete_fun)) - ShowMessage("Item(s) deleted"); + Statusbar::msg("Item(s) deleted"); } # ifndef WIN32 else if (myScreen == myBrowser && !myBrowser->Main()->empty()) @@ -815,12 +816,12 @@ void Delete::Run() if (myBrowser->deleteItem(i)) { const char msg[] = "\"%ls\" deleted"; - ShowMessage(msg, wideShorten(ToWString(name), COLS-const_strlen(msg)).c_str()); + Statusbar::msg(msg, wideShorten(ToWString(name), COLS-const_strlen(msg)).c_str()); } else { const char msg[] = "Couldn't delete \"%ls\": %s"; - ShowMessage(msg, wideShorten(ToWString(name), COLS-const_strlen(msg)-25).c_str(), strerror(errno)); + Statusbar::msg(msg, wideShorten(ToWString(name), COLS-const_strlen(msg)-25).c_str(), strerror(errno)); success = false; break; } @@ -832,7 +833,7 @@ void Delete::Run() } } else - ShowMessage("Aborted"); + Statusbar::msg("Aborted"); } # endif // !WIN32 else if (myScreen == myPlaylistEditor && !myPlaylistEditor->Content->empty()) @@ -856,18 +857,18 @@ void Delete::Run() for (auto it = list.begin(); it != list.end(); ++it) Mpd.DeletePlaylist((*it)->value()); if (Mpd.CommitCommandsList()) - ShowMessage("Playlist%s deleted", list.size() == 1 ? "" : "s"); + Statusbar::msg("Playlist%s deleted", list.size() == 1 ? "" : "s"); } else - ShowMessage("Aborted"); + Statusbar::msg("Aborted"); } else if (myScreen->ActiveWindow() == myPlaylistEditor->Content) { std::string playlist = myPlaylistEditor->Playlists->current().value(); auto delete_fun = std::bind(&MPD::Connection::PlaylistDelete, _1, playlist, _2); - ShowMessage("Deleting items..."); + Statusbar::msg("Deleting items..."); if (deleteSelectedSongs(*myPlaylistEditor->Content, delete_fun)) - ShowMessage("Item(s) deleted"); + Statusbar::msg("Item(s) deleted"); } } } @@ -897,14 +898,14 @@ void SavePlaylist::Run() { using Global::wFooter; - LockStatusbar(); - Statusbar() << "Save playlist as: "; + Statusbar::lock(); + Statusbar::put() << "Save playlist as: "; std::string playlist_name = wFooter->getString(); std::string real_playlist_name = locale_to_utf_cpy(playlist_name); - UnlockStatusbar(); + Statusbar::unlock(); if (playlist_name.find("/") != std::string::npos) { - ShowMessage("Playlist name must not contain slashes"); + Statusbar::msg("Playlist name must not contain slashes"); return; } if (!playlist_name.empty()) @@ -916,14 +917,14 @@ void SavePlaylist::Run() Mpd.AddToPlaylist(real_playlist_name, (*myPlaylist->Items)[i].value()); Mpd.CommitCommandsList(); if (Mpd.GetErrorMessage().empty()) - ShowMessage("Filtered items added to playlist \"%s\"", playlist_name.c_str()); + Statusbar::msg("Filtered items added to playlist \"%s\"", playlist_name.c_str()); } else { int result = Mpd.SavePlaylist(real_playlist_name); if (result == MPD_ERROR_SUCCESS) { - ShowMessage("Playlist saved as \"%s\"", playlist_name.c_str()); + Statusbar::msg("Playlist saved as \"%s\"", playlist_name.c_str()); if (myPlaylistEditor->Main()) // check if initialized myPlaylistEditor->Playlists->clear(); // make playlist's list update itself } @@ -934,10 +935,10 @@ void SavePlaylist::Run() { Mpd.DeletePlaylist(real_playlist_name); if (Mpd.SavePlaylist(real_playlist_name) == MPD_ERROR_SUCCESS) - ShowMessage("Playlist overwritten"); + Statusbar::msg("Playlist overwritten"); } else - ShowMessage("Aborted"); + Statusbar::msg("Aborted"); if (myPlaylistEditor->Main()) // check if initialized myPlaylistEditor->Playlists->clear(); // make playlist's list update itself if (myScreen == myPlaylist) @@ -1058,14 +1059,14 @@ void Add::Run() { using Global::wFooter; - LockStatusbar(); - Statusbar() << (myScreen == myPlaylistEditor ? "Add to playlist: " : "Add: "); + Statusbar::lock(); + Statusbar::put() << (myScreen == myPlaylistEditor ? "Add to playlist: " : "Add: "); std::string path = wFooter->getString(); locale_to_utf(path); - UnlockStatusbar(); + Statusbar::unlock(); if (!path.empty()) { - Statusbar() << "Adding..."; + Statusbar::put() << "Adding..."; wFooter->refresh(); if (myScreen == myPlaylistEditor) Mpd.AddToPlaylist(myPlaylistEditor->Playlists->current().value(), path); @@ -1118,7 +1119,7 @@ void ToggleDisplayMode::Run() if (myScreen == myPlaylist) { Config.columns_in_playlist = !Config.columns_in_playlist; - ShowMessage("Playlist display mode: %s", Config.columns_in_playlist ? "Columns" : "Classic"); + Statusbar::msg("Playlist display mode: %s", Config.columns_in_playlist ? "Columns" : "Classic"); if (Config.columns_in_playlist) { @@ -1137,20 +1138,20 @@ void ToggleDisplayMode::Run() else if (myScreen == myBrowser) { Config.columns_in_browser = !Config.columns_in_browser; - ShowMessage("Browser display mode: %s", Config.columns_in_browser ? "Columns" : "Classic"); + Statusbar::msg("Browser display mode: %s", Config.columns_in_browser ? "Columns" : "Classic"); myBrowser->Main()->setTitle(Config.columns_in_browser && Config.titles_visibility ? Display::Columns(myBrowser->Main()->getWidth()) : ""); } else if (myScreen == mySearcher) { Config.columns_in_search_engine = !Config.columns_in_search_engine; - ShowMessage("Search engine display mode: %s", Config.columns_in_search_engine ? "Columns" : "Classic"); + Statusbar::msg("Search engine display mode: %s", Config.columns_in_search_engine ? "Columns" : "Classic"); if (mySearcher->Main()->size() > SearchEngine::StaticOptions) mySearcher->Main()->setTitle(Config.columns_in_search_engine && Config.titles_visibility ? Display::Columns(mySearcher->Main()->getWidth()) : ""); } else if (myScreen->ActiveWindow() == myPlaylistEditor->Content) { Config.columns_in_playlist_editor = !Config.columns_in_playlist_editor; - ShowMessage("Playlist editor display mode: %s", Config.columns_in_playlist_editor ? "Columns" : "Classic"); + Statusbar::msg("Playlist editor display mode: %s", Config.columns_in_playlist_editor ? "Columns" : "Classic"); if (Config.columns_in_playlist_editor) myPlaylistEditor->Content->setItemDisplayer(std::bind(Display::SongsInColumns, _1, myPlaylistEditor)); else @@ -1166,7 +1167,7 @@ bool ToggleSeparatorsBetweenAlbums::canBeRun() const void ToggleSeparatorsBetweenAlbums::Run() { Config.playlist_separate_albums = !Config.playlist_separate_albums; - ShowMessage("Separators between albums: %s", Config.playlist_separate_albums ? "On" : "Off"); + Statusbar::msg("Separators between albums: %s", Config.playlist_separate_albums ? "On" : "Off"); } #ifndef HAVE_CURL_CURL_H @@ -1194,14 +1195,14 @@ void ToggleFetchingLyricsInBackground::Run() { # ifdef HAVE_CURL_CURL_H Config.fetch_lyrics_in_background = !Config.fetch_lyrics_in_background; - ShowMessage("Fetching lyrics for playing songs in background: %s", Config.fetch_lyrics_in_background ? "On" : "Off"); + Statusbar::msg("Fetching lyrics for playing songs in background: %s", Config.fetch_lyrics_in_background ? "On" : "Off"); # endif // HAVE_CURL_CURL_H } void TogglePlayingSongCentering::Run() { Config.autocenter_mode = !Config.autocenter_mode; - ShowMessage("Centering playing song: %s", Config.autocenter_mode ? "On" : "Off"); + Statusbar::msg("Centering playing song: %s", Config.autocenter_mode ? "On" : "Off"); if (Config.autocenter_mode && Mpd.isPlaying() && !myPlaylist->Items->isFiltered()) myPlaylist->Items->highlight(Mpd.GetCurrentlyPlayingSongPos()); } @@ -1315,10 +1316,10 @@ void SetCrossfade::Run() { using Global::wFooter; - LockStatusbar(); - Statusbar() << "Set crossfade to: "; + Statusbar::lock(); + Statusbar::put() << "Set crossfade to: "; std::string crossfade = wFooter->getString(3); - UnlockStatusbar(); + Statusbar::unlock(); int cf = stringToInt(crossfade); if (cf > 0) { @@ -1361,13 +1362,13 @@ void EditLibraryTag::Run() # ifdef HAVE_TAGLIB_H using Global::wFooter; - LockStatusbar(); - Statusbar() << NC::fmtBold << tagTypeToString(Config.media_lib_primary_tag) << NC::fmtBoldEnd << ": "; + Statusbar::lock(); + Statusbar::put() << NC::fmtBold << tagTypeToString(Config.media_lib_primary_tag) << NC::fmtBoldEnd << ": "; std::string new_tag = wFooter->getString(myLibrary->Tags->current().value()); - UnlockStatusbar(); + Statusbar::unlock(); if (!new_tag.empty() && new_tag != myLibrary->Tags->current().value()) { - ShowMessage("Updating tags..."); + Statusbar::msg("Updating tags..."); Mpd.StartSearch(1); Mpd.AddSearch(Config.media_lib_primary_tag, locale_to_utf_cpy(myLibrary->Tags->current().value())); MPD::MutableSong::SetFunction set = tagTypeToSetFunction(Config.media_lib_primary_tag); @@ -1378,12 +1379,12 @@ void EditLibraryTag::Run() { MPD::MutableSong es = *s; es.setTags(set, new_tag); - ShowMessage("Updating tags in \"%s\"...", es.getName().c_str()); + Statusbar::msg("Updating tags in \"%s\"...", es.getName().c_str()); std::string path = Config.mpd_music_dir + es.getURI(); if (!TagEditor::WriteTags(es)) { const char msg[] = "Error while updating tags in \"%ls\""; - ShowMessage(msg, wideShorten(ToWString(es.getURI()), COLS-const_strlen(msg)).c_str()); + Statusbar::msg(msg, wideShorten(ToWString(es.getURI()), COLS-const_strlen(msg)).c_str()); success = false; break; } @@ -1391,7 +1392,7 @@ void EditLibraryTag::Run() if (success) { Mpd.UpdateDirectory(getSharedDirectory(songs.begin(), songs.end())); - ShowMessage("Tags updated successfully"); + Statusbar::msg("Tags updated successfully"); } } # endif // HAVE_TAGLIB_H @@ -1413,23 +1414,23 @@ void EditLibraryAlbum::Run() # ifdef HAVE_TAGLIB_H using Global::wFooter; - LockStatusbar(); - Statusbar() << NC::fmtBold << "Album: " << NC::fmtBoldEnd; + Statusbar::lock(); + Statusbar::put() << NC::fmtBold << "Album: " << NC::fmtBoldEnd; std::string new_album = wFooter->getString(myLibrary->Albums->current().value().Album); - UnlockStatusbar(); + Statusbar::unlock(); if (!new_album.empty() && new_album != myLibrary->Albums->current().value().Album) { bool success = 1; - ShowMessage("Updating tags..."); + Statusbar::msg("Updating tags..."); for (size_t i = 0; i < myLibrary->Songs->size(); ++i) { - ShowMessage("Updating tags in \"%s\"...", (*myLibrary->Songs)[i].value().getName().c_str()); + Statusbar::msg("Updating tags in \"%s\"...", (*myLibrary->Songs)[i].value().getName().c_str()); std::string path = Config.mpd_music_dir + (*myLibrary->Songs)[i].value().getURI(); TagLib::FileRef f(path.c_str()); if (f.isNull()) { const char msg[] = "Error while opening file \"%ls\""; - ShowMessage(msg, wideShorten(ToWString((*myLibrary->Songs)[i].value().getURI()), COLS-const_strlen(msg)).c_str()); + Statusbar::msg(msg, wideShorten(ToWString((*myLibrary->Songs)[i].value().getURI()), COLS-const_strlen(msg)).c_str()); success = 0; break; } @@ -1437,7 +1438,7 @@ void EditLibraryAlbum::Run() if (!f.save()) { const char msg[] = "Error while writing tags in \"%ls\""; - ShowMessage(msg, wideShorten(ToWString((*myLibrary->Songs)[i].value().getURI()), COLS-const_strlen(msg)).c_str()); + Statusbar::msg(msg, wideShorten(ToWString((*myLibrary->Songs)[i].value().getURI()), COLS-const_strlen(msg)).c_str()); success = 0; break; } @@ -1445,7 +1446,7 @@ void EditLibraryAlbum::Run() if (success) { Mpd.UpdateDirectory(getSharedDirectory(myLibrary->Songs->beginV(), myLibrary->Songs->endV())); - ShowMessage("Tags updated successfully"); + Statusbar::msg("Tags updated successfully"); } } # endif // HAVE_TAGLIB_H @@ -1472,10 +1473,10 @@ void EditDirectoryName::Run() if (myScreen == myBrowser) { std::string old_dir = myBrowser->Main()->current().value().name; - LockStatusbar(); - Statusbar() << NC::fmtBold << "Directory: " << NC::fmtBoldEnd; + Statusbar::lock(); + Statusbar::put() << NC::fmtBold << "Directory: " << NC::fmtBoldEnd; std::string new_dir = wFooter->getString(old_dir); - UnlockStatusbar(); + Statusbar::unlock(); if (!new_dir.empty() && new_dir != old_dir) { std::string full_old_dir; @@ -1490,7 +1491,7 @@ void EditDirectoryName::Run() if (rename_result == 0) { const char msg[] = "Directory renamed to \"%ls\""; - ShowMessage(msg, wideShorten(ToWString(new_dir), COLS-const_strlen(msg)).c_str()); + Statusbar::msg(msg, wideShorten(ToWString(new_dir), COLS-const_strlen(msg)).c_str()); if (!myBrowser->isLocal()) Mpd.UpdateDirectory(locale_to_utf_cpy(getSharedDirectory(old_dir, new_dir))); myBrowser->GetDirectory(myBrowser->CurrentDir()); @@ -1498,7 +1499,7 @@ void EditDirectoryName::Run() else { const char msg[] = "Couldn't rename \"%ls\": %s"; - ShowMessage(msg, wideShorten(ToWString(old_dir), COLS-const_strlen(msg)-25).c_str(), strerror(errno)); + Statusbar::msg(msg, wideShorten(ToWString(old_dir), COLS-const_strlen(msg)-25).c_str(), strerror(errno)); } } } @@ -1506,10 +1507,10 @@ void EditDirectoryName::Run() else if (myScreen->ActiveWindow() == myTagEditor->Dirs) { std::string old_dir = myTagEditor->Dirs->current().value().first; - LockStatusbar(); - Statusbar() << NC::fmtBold << "Directory: " << NC::fmtBoldEnd; + Statusbar::lock(); + Statusbar::put() << NC::fmtBold << "Directory: " << NC::fmtBoldEnd; std::string new_dir = wFooter->getString(old_dir); - UnlockStatusbar(); + Statusbar::unlock(); if (!new_dir.empty() && new_dir != old_dir) { std::string full_old_dir = Config.mpd_music_dir + myTagEditor->CurrentDir() + "/" + locale_to_utf_cpy(old_dir); @@ -1517,13 +1518,13 @@ void EditDirectoryName::Run() if (rename(full_old_dir.c_str(), full_new_dir.c_str()) == 0) { const char msg[] = "Directory renamed to \"%ls\""; - ShowMessage(msg, wideShorten(ToWString(new_dir), COLS-const_strlen(msg)).c_str()); + Statusbar::msg(msg, wideShorten(ToWString(new_dir), COLS-const_strlen(msg)).c_str()); Mpd.UpdateDirectory(myTagEditor->CurrentDir()); } else { const char msg[] = "Couldn't rename \"%ls\": %s"; - ShowMessage(msg, wideShorten(ToWString(old_dir), COLS-const_strlen(msg)-25).c_str(), strerror(errno)); + Statusbar::msg(msg, wideShorten(ToWString(old_dir), COLS-const_strlen(msg)-25).c_str(), strerror(errno)); } } } @@ -1548,16 +1549,16 @@ void EditPlaylistName::Run() old_name = myPlaylistEditor->Playlists->current().value(); else old_name = myBrowser->Main()->current().value().name; - LockStatusbar(); - Statusbar() << NC::fmtBold << "Playlist: " << NC::fmtBoldEnd; + Statusbar::lock(); + Statusbar::put() << NC::fmtBold << "Playlist: " << NC::fmtBoldEnd; std::string new_name = wFooter->getString(old_name); - UnlockStatusbar(); + Statusbar::unlock(); if (!new_name.empty() && new_name != old_name) { if (Mpd.Rename(locale_to_utf_cpy(old_name), locale_to_utf_cpy(new_name))) { const char msg[] = "Playlist renamed to \"%ls\""; - ShowMessage(msg, wideShorten(ToWString(new_name), COLS-const_strlen(msg)).c_str()); + Statusbar::msg(msg, wideShorten(ToWString(new_name), COLS-const_strlen(msg)).c_str()); if (myBrowser->Main() && !myBrowser->isLocal()) myBrowser->GetDirectory("/"); if (myPlaylistEditor->Main()) @@ -1619,31 +1620,31 @@ void ToggleScreenLock::Run() BasicScreen::Unlock(); Action::SetResizeFlags(); myScreen->Resize(); - ShowMessage("Screen unlocked"); + Statusbar::msg("Screen unlocked"); } else { int part = Config.locked_screen_width_part*100; if (Config.ask_for_locked_screen_width_part) { - LockStatusbar(); - Statusbar() << "% of the locked screen's width to be reserved (20-80): "; + Statusbar::lock(); + Statusbar::put() << "% of the locked screen's width to be reserved (20-80): "; std::string str_part = wFooter->getString(intTo::apply(Config.locked_screen_width_part*100)); - UnlockStatusbar(); + Statusbar::unlock(); if (str_part.empty()) return; part = stringToInt(str_part); } if (part < 20 || part > 80) { - ShowMessage("Number is out of range"); + Statusbar::msg("Number is out of range"); return; } Config.locked_screen_width_part = part/100.0; if (myScreen->Lock()) - ShowMessage("Screen locked (with %d%% width)", part); + Statusbar::msg("Screen locked (with %d%% width)", part); else - ShowMessage("Current screen can't be locked"); + Statusbar::msg("Current screen can't be locked"); } } @@ -1675,10 +1676,10 @@ void JumpToPositionInSong::Run() const MPD::Song s = myPlaylist->nowPlayingSong(); - LockStatusbar(); - Statusbar() << "Position to go (in %/mm:ss/seconds(s)): "; + Statusbar::lock(); + Statusbar::put() << "Position to go (in %/mm:ss/seconds(s)): "; std::string position = wFooter->getString(); - UnlockStatusbar(); + Statusbar::unlock(); if (position.empty()) return; @@ -1690,7 +1691,7 @@ void JumpToPositionInSong::Run() if (newpos >= 0 && newpos <= Mpd.GetTotalTime()) Mpd.Seek(newpos); else - ShowMessage("Out of bounds, 0:00-%s possible for mm:ss, %s given", s.getLength().c_str(), MPD::Song::ShowTime(newpos).c_str()); + Statusbar::msg("Out of bounds, 0:00-%s possible for mm:ss, %s given", s.getLength().c_str(), MPD::Song::ShowTime(newpos).c_str()); } else if (position.find('s') != std::string::npos) // probably position in seconds { @@ -1698,7 +1699,7 @@ void JumpToPositionInSong::Run() if (newpos >= 0 && newpos <= Mpd.GetTotalTime()) Mpd.Seek(newpos); else - ShowMessage("Out of bounds, 0-%d possible for seconds, %d given", s.getDuration(), newpos); + Statusbar::msg("Out of bounds, 0-%d possible for seconds, %d given", s.getDuration(), newpos); } else { @@ -1706,7 +1707,7 @@ void JumpToPositionInSong::Run() if (newpos >= 0 && newpos <= 100) Mpd.Seek(Mpd.GetTotalTime()*newpos/100.0); else - ShowMessage("Out of bounds, 0-100 possible for %%, %d given", newpos); + Statusbar::msg("Out of bounds, 0-100 possible for %%, %d given", newpos); } } @@ -1720,7 +1721,7 @@ void ReverseSelection::Run() { auto w = hasSongs(myScreen); w->reverseSelection(); - ShowMessage("Selection reversed"); + Statusbar::msg("Selection reversed"); } bool RemoveSelection::canBeRun() const @@ -1733,7 +1734,7 @@ void RemoveSelection::Run() auto pl = proxySongList(myScreen); for (size_t i = 0; i < pl->size(); ++i) pl->setSelected(i, false); - ShowMessage("Selection removed"); + Statusbar::msg("Selection removed"); } bool SelectAlbum::canBeRun() const @@ -1770,7 +1771,7 @@ void SelectAlbum::Run() else pl->setSelected(pos, true); } - ShowMessage("Album around cursor position selected"); + Statusbar::msg("Album around cursor position selected"); } } @@ -1786,9 +1787,9 @@ void CropMainPlaylist::Run() yes = AskYesNoQuestion("Do you really want to crop main playlist?", TraceMpdStatus); if (yes) { - ShowMessage("Cropping playlist..."); + Statusbar::msg("Cropping playlist..."); if (cropPlaylist(*myPlaylist->Items, std::bind(&MPD::Connection::Delete, _1, _2))) - ShowMessage("Cropping playlist..."); + Statusbar::msg("Cropping playlist..."); } } @@ -1807,9 +1808,9 @@ void CropPlaylist::Run() if (yes) { auto delete_fun = std::bind(&MPD::Connection::PlaylistDelete, _1, playlist, _2); - ShowMessage("Cropping playlist \"%s\"...", playlist.c_str()); + Statusbar::msg("Cropping playlist \"%s\"...", playlist.c_str()); if (cropPlaylist(*myPlaylistEditor->Content, delete_fun)) - ShowMessage("Playlist \"%s\" cropped", playlist.c_str()); + Statusbar::msg("Playlist \"%s\" cropped", playlist.c_str()); } } @@ -1822,9 +1823,9 @@ void ClearMainPlaylist::Run() { auto delete_fun = std::bind(&MPD::Connection::Delete, _1, _2); auto clear_fun = std::bind(&MPD::Connection::ClearMainPlaylist, _1); - ShowMessage("Deleting items..."); + Statusbar::msg("Deleting items..."); if (clearPlaylist(*myPlaylist->Items, delete_fun, clear_fun)) - ShowMessage("Items deleted"); + Statusbar::msg("Items deleted"); } } @@ -1844,9 +1845,9 @@ void ClearPlaylist::Run() { auto delete_fun = std::bind(&MPD::Connection::PlaylistDelete, _1, playlist, _2); auto clear_fun = std::bind(&MPD::Connection::ClearPlaylist, _1, playlist); - ShowMessage("Deleting items from \"%s\"...", playlist.c_str()); + Statusbar::msg("Deleting items from \"%s\"...", playlist.c_str()); if (clearPlaylist(*myPlaylistEditor->Content, delete_fun, clear_fun)) - ShowMessage("Items deleted from \"%s\"", playlist.c_str()); + Statusbar::msg("Items deleted from \"%s\"", playlist.c_str()); } } @@ -1883,21 +1884,21 @@ void ApplyFilter::Run() Filterable *f = dynamic_cast(myScreen); std::string filter = f->currentFilter(); - LockStatusbar(); - Statusbar() << NC::fmtBold << "Apply filter: " << NC::fmtBoldEnd; - wFooter->setGetStringHelper(StatusbarApplyFilterImmediately(f, ToWString(filter))); + Statusbar::lock(); + Statusbar::put() << NC::fmtBold << "Apply filter: " << NC::fmtBoldEnd; + wFooter->setGetStringHelper(Statusbar::Helpers::ApplyFilterImmediately(f, ToWString(filter))); wFooter->getString(filter); - wFooter->setGetStringHelper(StatusbargetStringHelper); - UnlockStatusbar(); + wFooter->setGetStringHelper(Statusbar::Helpers::getString); + Statusbar::unlock(); filter = f->currentFilter(); if (filter.empty()) { myPlaylist->Items->clearFilterResults(); - ShowMessage("Filtering disabled"); + Statusbar::msg("Filtering disabled"); } else - ShowMessage("Using filter \"%s\"", filter.c_str()); + Statusbar::msg("Using filter \"%s\"", filter.c_str()); if (myScreen == myPlaylist) { @@ -1922,15 +1923,15 @@ void Find::Run() { using Global::wFooter; - LockStatusbar(); - Statusbar() << "Find: "; + Statusbar::lock(); + Statusbar::put() << "Find: "; std::string findme = wFooter->getString(); - UnlockStatusbar(); + Statusbar::unlock(); - ShowMessage("Searching..."); + Statusbar::msg("Searching..."); Screen *s = static_cast *>(myScreen); s->Main()->removeFormatting(); - ShowMessage("%s", findme.empty() || s->Main()->setFormatting(NC::fmtReverse, ToWString(findme), NC::fmtReverseEnd, 0) ? "Done!" : "No matching patterns found"); + Statusbar::msg("%s", findme.empty() || s->Main()->setFormatting(NC::fmtReverse, ToWString(findme), NC::fmtReverseEnd, 0) ? "Done!" : "No matching patterns found"); s->Main()->flush(); } @@ -1985,14 +1986,14 @@ void PreviousFoundItem::Run() void ToggleFindMode::Run() { Config.wrapped_search = !Config.wrapped_search; - ShowMessage("Search mode: %s", Config.wrapped_search ? "Wrapped" : "Normal"); + Statusbar::msg("Search mode: %s", Config.wrapped_search ? "Wrapped" : "Normal"); } bool ToggleReplayGainMode::canBeRun() const { if (Mpd.Version() < 16) { - ShowMessage("Replay gain mode control is supported in MPD >= 0.16.0"); + Statusbar::msg("Replay gain mode control is supported in MPD >= 0.16.0"); return false; } return true; @@ -2002,8 +2003,8 @@ void ToggleReplayGainMode::Run() { using Global::wFooter; - LockStatusbar(); - Statusbar() << "Replay gain mode? [" << NC::fmtBold << 'o' << NC::fmtBoldEnd << "ff/" << NC::fmtBold << 't' << NC::fmtBoldEnd << "rack/" << NC::fmtBold << 'a' << NC::fmtBoldEnd << "lbum]"; + Statusbar::lock(); + Statusbar::put() << "Replay gain mode? [" << NC::fmtBold << 'o' << NC::fmtBoldEnd << "ff/" << NC::fmtBold << 't' << NC::fmtBoldEnd << "rack/" << NC::fmtBold << 'a' << NC::fmtBoldEnd << "lbum]"; wFooter->refresh(); int answer = 0; do @@ -2012,42 +2013,42 @@ void ToggleReplayGainMode::Run() answer = wFooter->readKey(); } while (answer != 'o' && answer != 't' && answer != 'a'); - UnlockStatusbar(); + Statusbar::unlock(); Mpd.SetReplayGainMode(answer == 't' ? MPD::rgmTrack : (answer == 'a' ? MPD::rgmAlbum : MPD::rgmOff)); - ShowMessage("Replay gain mode: %s", Mpd.GetReplayGainMode().c_str()); + Statusbar::msg("Replay gain mode: %s", Mpd.GetReplayGainMode().c_str()); } void ToggleSpaceMode::Run() { Config.space_selects = !Config.space_selects; - ShowMessage("Space mode: %s item", Config.space_selects ? "Select" : "Add"); + Statusbar::msg("Space mode: %s item", Config.space_selects ? "Select" : "Add"); } void ToggleAddMode::Run() { Config.ncmpc_like_songs_adding = !Config.ncmpc_like_songs_adding; - ShowMessage("Add mode: %s", Config.ncmpc_like_songs_adding ? "Add item to playlist, remove if already added" : "Always add item to playlist"); + Statusbar::msg("Add mode: %s", Config.ncmpc_like_songs_adding ? "Add item to playlist, remove if already added" : "Always add item to playlist"); } void ToggleMouse::Run() { Config.mouse_support = !Config.mouse_support; mousemask(Config.mouse_support ? ALL_MOUSE_EVENTS : 0, 0); - ShowMessage("Mouse support %s", Config.mouse_support ? "enabled" : "disabled"); + Statusbar::msg("Mouse support %s", Config.mouse_support ? "enabled" : "disabled"); } void ToggleBitrateVisibility::Run() { Config.display_bitrate = !Config.display_bitrate; - ShowMessage("Bitrate visibility %s", Config.display_bitrate ? "enabled" : "disabled"); + Statusbar::msg("Bitrate visibility %s", Config.display_bitrate ? "enabled" : "disabled"); } void AddRandomItems::Run() { using Global::wFooter; - LockStatusbar(); - Statusbar() << "Add random? [" << NC::fmtBold << 's' << NC::fmtBoldEnd << "ongs/" << NC::fmtBold << 'a' << NC::fmtBoldEnd << "rtists/al" << NC::fmtBold << 'b' << NC::fmtBoldEnd << "ums] "; + Statusbar::lock(); + Statusbar::put() << "Add random? [" << NC::fmtBold << 's' << NC::fmtBoldEnd << "ongs/" << NC::fmtBold << 'a' << NC::fmtBoldEnd << "rtists/al" << NC::fmtBold << 'b' << NC::fmtBoldEnd << "ums] "; wFooter->refresh(); int answer = 0; do @@ -2056,7 +2057,7 @@ void AddRandomItems::Run() answer = wFooter->readKey(); } while (answer != 's' && answer != 'a' && answer != 'b'); - UnlockStatusbar(); + Statusbar::unlock(); mpd_tag_type tag_type = MPD_TAG_ARTIST; std::string tag_type_str ; @@ -2068,12 +2069,12 @@ void AddRandomItems::Run() else tag_type_str = "song"; - LockStatusbar(); - Statusbar() << "Number of random " << tag_type_str << "s: "; + Statusbar::lock(); + Statusbar::put() << "Number of random " << tag_type_str << "s: "; size_t number = stringToLongInt(wFooter->getString()); - UnlockStatusbar(); + Statusbar::unlock(); if (number && (answer == 's' ? Mpd.AddRandomSongs(number) : Mpd.AddRandomTag(tag_type, number))) - ShowMessage("%zu random %s%s added to playlist", number, tag_type_str.c_str(), number == 1 ? "" : "s"); + Statusbar::msg("%zu random %s%s added to playlist", number, tag_type_str.c_str(), number == 1 ? "" : "s"); } bool ToggleBrowserSortMode::canBeRun() const @@ -2089,17 +2090,17 @@ void ToggleBrowserSortMode::Run() if (!myBrowser->isLocal()) { Config.browser_sort_mode = smMTime; - ShowMessage("Sort songs by: Modification time"); + Statusbar::msg("Sort songs by: Modification time"); break; } // local browser doesn't support sorting by mtime, so we just skip it. case smMTime: Config.browser_sort_mode = smCustomFormat; - ShowMessage("Sort songs by: Custom format"); + Statusbar::msg("Sort songs by: Custom format"); break; case smCustomFormat: Config.browser_sort_mode = smName; - ShowMessage("Sort songs by: Name"); + Statusbar::msg("Sort songs by: Name"); break; } std::sort(myBrowser->Main()->begin()+(myBrowser->CurrentDir() != "/"), myBrowser->Main()->end(), @@ -2116,8 +2117,8 @@ void ToggleLibraryTagType::Run() { using Global::wFooter; - LockStatusbar(); - Statusbar() << "Tag type? [" << NC::fmtBold << 'a' << NC::fmtBoldEnd << "rtist/album" << NC::fmtBold << 'A' << NC::fmtBoldEnd << "rtist/" << NC::fmtBold << 'y' << NC::fmtBoldEnd << "ear/" << NC::fmtBold << 'g' << NC::fmtBoldEnd << "enre/" << NC::fmtBold << 'c' << NC::fmtBoldEnd << "omposer/" << NC::fmtBold << 'p' << NC::fmtBoldEnd << "erformer] "; + Statusbar::lock(); + Statusbar::put() << "Tag type? [" << NC::fmtBold << 'a' << NC::fmtBoldEnd << "rtist/album" << NC::fmtBold << 'A' << NC::fmtBoldEnd << "rtist/" << NC::fmtBold << 'y' << NC::fmtBoldEnd << "ear/" << NC::fmtBold << 'g' << NC::fmtBoldEnd << "enre/" << NC::fmtBold << 'c' << NC::fmtBoldEnd << "omposer/" << NC::fmtBold << 'p' << NC::fmtBoldEnd << "erformer] "; wFooter->refresh(); int answer = 0; do @@ -2126,7 +2127,7 @@ void ToggleLibraryTagType::Run() answer = wFooter->readKey(); } while (answer != 'a' && answer != 'A' && answer != 'y' && answer != 'g' && answer != 'c' && answer != 'p'); - UnlockStatusbar(); + Statusbar::unlock(); mpd_tag_type new_tagitem = charToTagType(answer); if (new_tagitem != Config.media_lib_primary_tag) { @@ -2148,7 +2149,7 @@ void ToggleLibraryTagType::Run() myLibrary->Tags->clear(); myLibrary->Tags->display(); } - ShowMessage("Switched to list of %s tag", item_type.c_str()); + Statusbar::msg("Switched to list of %s tag", item_type.c_str()); } } @@ -2188,7 +2189,7 @@ bool SetSelectedItemsPriority::canBeRun() const { if (Mpd.Version() < 17) { - ShowMessage("Priorities are supported in MPD >= 0.17.0"); + Statusbar::msg("Priorities are supported in MPD >= 0.17.0"); return false; } return myScreen->ActiveWindow() == myPlaylist->Items && !myPlaylist->Items->empty(); @@ -2198,16 +2199,16 @@ void SetSelectedItemsPriority::Run() { using Global::wFooter; - LockStatusbar(); - Statusbar() << "Set priority [0-255]: "; + Statusbar::lock(); + Statusbar::put() << "Set priority [0-255]: "; std::string strprio = wFooter->getString(); - UnlockStatusbar(); + Statusbar::unlock(); if (!isInteger(strprio.c_str(), true)) return; int prio = stringToInt(strprio); if (prio < 0 || prio > 255) { - ShowMessage("Number is out of range"); + Statusbar::msg("Number is out of range"); return; } myPlaylist->SetSelectedItemsPriority(prio); @@ -2222,10 +2223,10 @@ void FilterPlaylistOnPriorities::Run() { using Global::wFooter; - LockStatusbar(); - Statusbar() << "Show songs with priority higher than: "; + Statusbar::lock(); + Statusbar::put() << "Show songs with priority higher than: "; std::string strprio = wFooter->getString(); - UnlockStatusbar(); + Statusbar::unlock(); if (!isInteger(strprio.c_str(), false)) return; unsigned prio = stringToInt(strprio); @@ -2233,7 +2234,7 @@ void FilterPlaylistOnPriorities::Run() [prio](const NC::Menu::Item &s) { return s.value().getPrio() > prio; }); - ShowMessage("Playlist filtered (songs with priority higher than %u)", prio); + Statusbar::msg("Playlist filtered (songs with priority higher than %u)", prio); } void ShowSongInfo::Run() diff --git a/src/browser.cpp b/src/browser.cpp index 8c05e8db..e90526c4 100644 --- a/src/browser.cpp +++ b/src/browser.cpp @@ -33,6 +33,7 @@ #include "regex_filter.h" #include "settings.h" #include "status.h" +#include "statusbar.h" #include "tag_editor.h" #include "utility/comparators.h" @@ -158,7 +159,7 @@ void Browser::EnterPressed() { if (Mpd.LoadPlaylist(locale_to_utf_cpy(item.name))) { - ShowMessage("Playlist \"%s\" loaded", item.name.c_str()); + Statusbar::msg("Playlist \"%s\" loaded", item.name.c_str()); myPlaylist->PlayNewlyAddedSongs(); } } @@ -194,7 +195,7 @@ void Browser::SpacePressed() { MPD::SongList list; MPD::ItemList items; - ShowMessage("Scanning directory \"%s\"...", item.name.c_str()); + Statusbar::msg("Scanning directory \"%s\"...", item.name.c_str()); myBrowser->GetLocalDirectory(items, item.name, 1); list.reserve(items.size()); for (MPD::ItemList::const_iterator it = items.begin(); it != items.end(); ++it) @@ -205,7 +206,7 @@ void Browser::SpacePressed() # endif // !WIN32 result = Mpd.Add(locale_to_utf_cpy(item.name)); if (result) - ShowMessage("Directory \"%s\" added", item.name.c_str()); + Statusbar::msg("Directory \"%s\" added", item.name.c_str()); break; } case itSong: @@ -216,7 +217,7 @@ void Browser::SpacePressed() case itPlaylist: { if (Mpd.LoadPlaylist(locale_to_utf_cpy(item.name))) - ShowMessage("Playlist \"%s\" loaded", item.name.c_str()); + Statusbar::msg("Playlist \"%s\" loaded", item.name.c_str()); break; } } @@ -551,12 +552,12 @@ void Browser::ClearDirectory(const std::string &path) const if (remove(full_path.c_str()) == 0) { const char msg[] = "Deleting \"%ls\"..."; - ShowMessage(msg, wideShorten(ToWString(full_path), COLS-const_strlen(msg)).c_str()); + Statusbar::msg(msg, wideShorten(ToWString(full_path), COLS-const_strlen(msg)).c_str()); } else { const char msg[] = "Couldn't remove \"%ls\": %s"; - ShowMessage(msg, wideShorten(ToWString(full_path), COLS-const_strlen(msg)-25).c_str(), strerror(errno)); + Statusbar::msg(msg, wideShorten(ToWString(full_path), COLS-const_strlen(msg)-25).c_str(), strerror(errno)); } } closedir(dir); @@ -566,12 +567,12 @@ void Browser::ChangeBrowseMode() { if (Mpd.GetHostname()[0] != '/') { - ShowMessage("For browsing local filesystem connection to MPD via UNIX Socket is required"); + Statusbar::msg("For browsing local filesystem connection to MPD via UNIX Socket is required"); return; } itsBrowseLocally = !itsBrowseLocally; - ShowMessage("Browse mode: %s", itsBrowseLocally ? "Local filesystem" : "MPD database"); + Statusbar::msg("Browse mode: %s", itsBrowseLocally ? "Local filesystem" : "MPD database"); itsBrowsedDir = itsBrowseLocally ? Config.GetHomeDirectory() : "/"; if (itsBrowseLocally && *itsBrowsedDir.rbegin() == '/') itsBrowsedDir.resize(itsBrowsedDir.length()-1); diff --git a/src/clock.cpp b/src/clock.cpp index eb4dba51..38490e54 100644 --- a/src/clock.cpp +++ b/src/clock.cpp @@ -31,6 +31,7 @@ #include "playlist.h" #include "settings.h" #include "status.h" +#include "statusbar.h" using Global::MainHeight; using Global::MainStartY; @@ -90,7 +91,7 @@ void Clock::SwitchTo() GetWindowResizeParams(x_offset, width, false); if (Width > width || Height > MainHeight) { - ShowMessage("Screen is too small to display clock"); + Statusbar::msg("Screen is too small to display clock"); if (myLockedScreen) UpdateInactiveScreen(myLockedScreen); return; diff --git a/src/global.h b/src/global.h index 834a6208..493d3373 100644 --- a/src/global.h +++ b/src/global.h @@ -55,7 +55,7 @@ namespace Global // height of main window extern size_t MainHeight; - // indicates whether messages from ShowMessage function should be shown + // indicates whether messages from Statusbar::msg function should be shown extern bool ShowMessages; // indicates whether seeking action in currently in progress diff --git a/src/lastfm.cpp b/src/lastfm.cpp index 880d7ae1..83299134 100644 --- a/src/lastfm.cpp +++ b/src/lastfm.cpp @@ -37,6 +37,7 @@ #include "helpers.h" #include "charset.h" #include "global.h" +#include "statusbar.h" using Global::MainHeight; using Global::MainStartY; @@ -211,7 +212,7 @@ void Lastfm::Refetch() if (remove(itsFilename.c_str()) && errno != ENOENT) { const char msg[] = "Couldn't remove \"%ls\": %s"; - ShowMessage(msg, wideShorten(ToWString(itsFilename), COLS-const_strlen(msg)-25).c_str(), strerror(errno)); + Statusbar::msg(msg, wideShorten(ToWString(itsFilename), COLS-const_strlen(msg)-25).c_str(), strerror(errno)); return; } Load(); diff --git a/src/lyrics.cpp b/src/lyrics.cpp index f43b6415..e69273f6 100644 --- a/src/lyrics.cpp +++ b/src/lyrics.cpp @@ -33,6 +33,7 @@ #include "scrollpad.h" #include "settings.h" #include "song.h" +#include "statusbar.h" using Global::MainHeight; using Global::MainStartY; @@ -112,7 +113,7 @@ void Lyrics::SwitchTo() if (isDownloadInProgress || itsWorkersNumber > 0) { - ShowMessage("Lyrics are being downloaded..."); + Statusbar::msg("Lyrics are being downloaded..."); return; } # endif // HAVE_CURL_CURL_H @@ -133,7 +134,7 @@ void Lyrics::SwitchTo() } else { - ShowMessage("Song must have both artist and title tag set"); + Statusbar::msg("Song must have both artist and title tag set"); return; } @@ -157,7 +158,7 @@ std::wstring Lyrics::Title() void Lyrics::SpacePressed() { Config.now_playing_lyrics = !Config.now_playing_lyrics; - ShowMessage("Reload lyrics if song changes: %s", Config.now_playing_lyrics ? "On" : "Off"); + Statusbar::msg("Reload lyrics if song changes: %s", Config.now_playing_lyrics ? "On" : "Off"); } #ifdef HAVE_CURL_CURL_H @@ -173,7 +174,7 @@ void Lyrics::DownloadInBackground(const MPD::Song &s) f.close(); return; } - ShowMessage("Fetching lyrics for \"%s\"...", s.toString(Config.song_status_format_no_colors).c_str()); + Statusbar::msg("Fetching lyrics for \"%s\"...", s.toString(Config.song_status_format_no_colors).c_str()); MPD::Song *s_copy = new MPD::Song(s); pthread_mutex_lock(&itsDIBLock); @@ -370,11 +371,11 @@ void Lyrics::Edit() if (Config.external_editor.empty()) { - ShowMessage("Proper external_editor variable has to be set in configuration file"); + Statusbar::msg("Proper external_editor variable has to be set in configuration file"); return; } - ShowMessage("Opening lyrics in external editor..."); + Statusbar::msg("Opening lyrics in external editor..."); GNUC_UNUSED int res; if (Config.use_console_editor) @@ -406,7 +407,7 @@ void Lyrics::Refetch() if (remove(itsFilename.c_str()) && errno != ENOENT) { const char msg[] = "Couldn't remove \"%ls\": %s"; - ShowMessage(msg, wideShorten(ToWString(itsFilename), COLS-const_strlen(msg)-25).c_str(), strerror(errno)); + Statusbar::msg(msg, wideShorten(ToWString(itsFilename), COLS-const_strlen(msg)-25).c_str(), strerror(errno)); return; } Load(); @@ -419,9 +420,9 @@ void Lyrics::ToggleFetcher() else itsFetcher = &lyricsPlugins[0]; if (*itsFetcher) - ShowMessage("Using lyrics database: %s", (*itsFetcher)->name()); + Statusbar::msg("Using lyrics database: %s", (*itsFetcher)->name()); else - ShowMessage("Using all lyrics databases"); + Statusbar::msg("Using all lyrics databases"); } void Lyrics::Take() diff --git a/src/media_library.cpp b/src/media_library.cpp index a32fd7fd..c880948b 100644 --- a/src/media_library.cpp +++ b/src/media_library.cpp @@ -31,6 +31,7 @@ #include "playlist.h" #include "regex_filter.h" #include "status.h" +#include "statusbar.h" #include "utility/comparators.h" #include "utility/type_conversions.h" @@ -766,13 +767,13 @@ void MediaLibrary::LocateSong(const MPD::Song &s) if (primary_tag.empty()) { std::string item_type = lowercase(tagTypeToString(Config.media_lib_primary_tag)); - ShowMessage("Can't use this function because the song has no %s tag set", item_type.c_str()); + Statusbar::msg("Can't use this function because the song has no %s tag set", item_type.c_str()); return; } if (myScreen != this) SwitchTo(); - Statusbar() << "Jumping to song..."; + Statusbar::put() << "Jumping to song..."; Global::wFooter->refresh(); if (!hasTwoColumns) @@ -854,10 +855,10 @@ void MediaLibrary::AddToPlaylist(bool add_n_play) || (w == Albums && Albums->current().value().Date == AllTracksMarker)) { std::string tag_type = lowercase(tagTypeToString(Config.media_lib_primary_tag)); - ShowMessage("Songs with %s = \"%s\" added", tag_type.c_str(), Tags->current().value().c_str()); + Statusbar::msg("Songs with %s = \"%s\" added", tag_type.c_str(), Tags->current().value().c_str()); } else if (w == Albums) - ShowMessage("Songs from album \"%s\" added", Albums->current().value().Album.c_str()); + Statusbar::msg("Songs from album \"%s\" added", Albums->current().value().Album.c_str()); } } diff --git a/src/ncmpcpp.cpp b/src/ncmpcpp.cpp index 72e64f91..83ebfc37 100644 --- a/src/ncmpcpp.cpp +++ b/src/ncmpcpp.cpp @@ -40,6 +40,7 @@ #include "playlist.h" #include "settings.h" #include "status.h" +#include "statusbar.h" #include "visualizer.h" namespace @@ -52,7 +53,7 @@ namespace { if (signal == SIGPIPE) { - ShowMessage("SIGPIPE (broken pipe signal) received"); + Statusbar::msg("SIGPIPE (broken pipe signal) received"); } else if (signal == SIGWINCH) { @@ -157,9 +158,9 @@ int main(int argc, char **argv) wFooter = new NC::Window(0, Action::FooterStartY, COLS, Action::FooterHeight, "", Config.statusbar_color, NC::brNone); wFooter->setTimeout(500); - wFooter->setGetStringHelper(StatusbargetStringHelper); + wFooter->setGetStringHelper(Statusbar::Helpers::getString); if (Mpd.SupportsIdle()) - wFooter->addFDCallback(Mpd.GetFD(), StatusbarMPDCallback); + wFooter->addFDCallback(Mpd.GetFD(), Statusbar::Helpers::mpd); wFooter->createHistory(); // initialize screens to browser as default previous screen @@ -207,13 +208,13 @@ int main(int argc, char **argv) { if (!wFooter->FDCallbacksListEmpty()) wFooter->clearFDCallbacksList(); - ShowMessage("Attempting to reconnect..."); + Statusbar::msg("Attempting to reconnect..."); if (Mpd.Connect()) { - ShowMessage("Connected to %s", Mpd.GetHostname().c_str()); + Statusbar::msg("Connected to %s", Mpd.GetHostname().c_str()); if (Mpd.SupportsIdle()) { - wFooter->addFDCallback(Mpd.GetFD(), StatusbarMPDCallback); + wFooter->addFDCallback(Mpd.GetFD(), Statusbar::Helpers::mpd); Mpd.OrderDataFetching(); // we need info about new connection } ShowMessages = false; diff --git a/src/outputs.cpp b/src/outputs.cpp index 3a0a4804..2b0c7942 100644 --- a/src/outputs.cpp +++ b/src/outputs.cpp @@ -26,6 +26,7 @@ #include "global.h" #include "settings.h" #include "status.h" +#include "statusbar.h" using Global::MainHeight; using Global::MainStartY; @@ -87,12 +88,12 @@ void Outputs::EnterPressed() if (w->current().value().isEnabled()) { if (Mpd.DisableOutput(w->choice())) - ShowMessage("Output \"%s\" disabled", w->current().value().name().c_str()); + Statusbar::msg("Output \"%s\" disabled", w->current().value().name().c_str()); } else { if (Mpd.EnableOutput(w->choice())) - ShowMessage("Output \"%s\" enabled", w->current().value().name().c_str()); + Statusbar::msg("Output \"%s\" enabled", w->current().value().name().c_str()); } if (!Mpd.SupportsIdle()) FetchList(); diff --git a/src/playlist.cpp b/src/playlist.cpp index 4ab041d0..e3eb2253 100644 --- a/src/playlist.cpp +++ b/src/playlist.cpp @@ -29,6 +29,7 @@ #include "regex_filter.h" #include "song.h" #include "status.h" +#include "statusbar.h" #include "utility/comparators.h" using namespace std::placeholders; @@ -187,7 +188,7 @@ void Playlist::EnterPressed() } else { - ShowMessage("Move tag types up and down to adjust sort order"); + Statusbar::msg("Move tag types up and down to adjust sort order"); return; } @@ -227,11 +228,11 @@ void Playlist::EnterPressed() } }; - ShowMessage("Sorting..."); + Statusbar::msg("Sorting..."); Mpd.StartCommandsList(); quick_sort(playlist.begin(), playlist.end()); if (Mpd.CommitCommandsList()) - ShowMessage("Playlist sorted"); + Statusbar::msg("Playlist sorted"); w = Items; } } @@ -378,7 +379,7 @@ bool Playlist::isFiltered() { if (Items->isFiltered()) { - ShowMessage("Function currently unavailable due to filtered playlist"); + Statusbar::msg("Function currently unavailable due to filtered playlist"); return true; } return false; @@ -389,7 +390,7 @@ void Playlist::Sort() if (isFiltered()) return; if (Items->getWidth() < SortDialogWidth || MainHeight < 5) - ShowMessage("Screen is too small to display dialog window"); + Statusbar::msg("Screen is too small to display dialog window"); else { SortDialog->reset(); @@ -401,7 +402,7 @@ void Playlist::Reverse() { if (isFiltered()) return; - ShowMessage("Reversing playlist order..."); + Statusbar::msg("Reversing playlist order..."); size_t beginning = -1, end = -1; for (size_t i = 0; i < Items->size(); ++i) { @@ -421,7 +422,7 @@ void Playlist::Reverse() for (size_t i = beginning, j = end-1; i < (beginning+end)/2; ++i, --j) Mpd.Swap(i, j); if (Mpd.CommitCommandsList()) - ShowMessage("Playlist reversed"); + Statusbar::msg("Playlist reversed"); } void Playlist::EnableHighlighting() @@ -516,7 +517,7 @@ bool Playlist::Add(const MPD::Song &s, bool play, int position) int id = Mpd.AddSong(s, position); if (id >= 0) { - ShowMessage("Added to playlist: %s", s.toString(Config.song_status_format_no_colors).c_str()); + Statusbar::msg("Added to playlist: %s", s.toString(Config.song_status_format_no_colors).c_str()); if (play) Mpd.PlayID(id); return true; @@ -570,7 +571,7 @@ void Playlist::SetSelectedItemsPriority(int prio) for (auto it = list.begin(); it != list.end(); ++it) Mpd.SetPriority((*it)->value(), prio); if (Mpd.CommitCommandsList()) - ShowMessage("Priority set"); + Statusbar::msg("Priority set"); } bool Playlist::checkForSong(const MPD::Song &s) diff --git a/src/playlist_editor.cpp b/src/playlist_editor.cpp index 530256be..653d83e5 100644 --- a/src/playlist_editor.cpp +++ b/src/playlist_editor.cpp @@ -30,6 +30,7 @@ #include "mpdpp.h" #include "regex_filter.h" #include "status.h" +#include "statusbar.h" #include "tag_editor.h" #include "utility/comparators.h" @@ -211,7 +212,7 @@ bool PlaylistEditor::isContentFiltered() { if (Content->isFiltered()) { - ShowMessage("Function currently unavailable due to filtered playlist content"); + Statusbar::msg("Function currently unavailable due to filtered playlist content"); return true; } return false; @@ -278,7 +279,7 @@ void PlaylistEditor::AddToPlaylist(bool add_n_play) { if (Mpd.LoadPlaylist(utf_to_locale_cpy(Playlists->current().value()))) { - ShowMessage("Playlist \"%s\" loaded", Playlists->current().value().c_str()); + Statusbar::msg("Playlist \"%s\" loaded", Playlists->current().value().c_str()); if (add_n_play) myPlaylist->PlayNewlyAddedSongs(); } diff --git a/src/search_engine.cpp b/src/search_engine.cpp index 33d493f2..a0f9b99f 100644 --- a/src/search_engine.cpp +++ b/src/search_engine.cpp @@ -29,6 +29,7 @@ #include "search_engine.h" #include "settings.h" #include "status.h" +#include "statusbar.h" #include "utility/comparators.h" using namespace std::placeholders; @@ -163,12 +164,12 @@ void SearchEngine::EnterPressed() if (option > ConstraintsNumber && option < SearchButton) w->current().value().buffer().clear(); if (option < SearchButton) - LockStatusbar(); + Statusbar::lock(); if (option < ConstraintsNumber) { std::string constraint = ConstraintsNames[option]; - Statusbar() << NC::fmtBold << constraint << NC::fmtBoldEnd << ": "; + Statusbar::put() << NC::fmtBold << constraint << NC::fmtBoldEnd << ": "; itsConstraints[option] = Global::wFooter->getString(itsConstraints[option]); w->current().value().buffer().clear(); constraint.resize(13, ' '); @@ -189,7 +190,7 @@ void SearchEngine::EnterPressed() else if (option == SearchButton) { w->showAll(); - ShowMessage("Searching..."); + Statusbar::msg("Searching..."); if (w->size() > StaticOptions) Prepare(); Search(); @@ -204,7 +205,7 @@ void SearchEngine::EnterPressed() w->at(ResetButton+2).value().mkBuffer() << Config.color1 << "Search results: " << Config.color2 << "Found " << found << (found > 1 ? " songs" : " song") << NC::clDefault; w->insertSeparator(ResetButton+3); markSongsInPlaylist(getProxySongList()); - ShowMessage("Searching finished"); + Statusbar::msg("Searching finished"); if (Config.block_search_constraints_change) for (size_t i = 0; i < StaticOptions-4; ++i) w->at(i).setInactive(true); @@ -212,7 +213,7 @@ void SearchEngine::EnterPressed() w->scroll(NC::wDown); } else - ShowMessage("No results found"); + Statusbar::msg("No results found"); } else if (option == ResetButton) { @@ -222,7 +223,7 @@ void SearchEngine::EnterPressed() myPlaylist->Add(w->current().value().song(), 1); if (option < SearchButton) - UnlockStatusbar(); + Statusbar::unlock(); } void SearchEngine::SpacePressed() @@ -387,7 +388,7 @@ void SearchEngine::reset() itsConstraints[i].clear(); w->reset(); Prepare(); - ShowMessage("Search state reset"); + Statusbar::msg("Search state reset"); } void SearchEngine::Search() diff --git a/src/sel_items_adder.cpp b/src/sel_items_adder.cpp index 490332a2..a7495e91 100644 --- a/src/sel_items_adder.cpp +++ b/src/sel_items_adder.cpp @@ -29,6 +29,7 @@ #include "sel_items_adder.h" #include "settings.h" #include "status.h" +#include "statusbar.h" #include "utility/comparators.h" using Global::MainHeight; @@ -77,7 +78,7 @@ void SelectedItemsAdder::SwitchTo() if (MainHeight < 5) { - ShowMessage("Screen is too small to display this window"); + Statusbar::msg("Screen is too small to display this window"); return; } @@ -95,7 +96,7 @@ void SelectedItemsAdder::SwitchTo() bool playlists_not_active = myScreen == myBrowser && myBrowser->isLocal(); if (playlists_not_active) - ShowMessage("Local items can't be added to stored playlists"); + Statusbar::msg("Local items can't be added to stored playlists"); w->clear(); w->reset(); @@ -172,10 +173,10 @@ void SelectedItemsAdder::EnterPressed() } else if (pos == 1) // create new playlist { - LockStatusbar(); - Statusbar() << "Save playlist as: "; + Statusbar::lock(); + Statusbar::put() << "Save playlist as: "; std::string playlist = Global::wFooter->getString(); - UnlockStatusbar(); + Statusbar::unlock(); if (!playlist.empty()) { std::string utf_playlist = locale_to_utf_cpy(playlist); @@ -183,7 +184,7 @@ void SelectedItemsAdder::EnterPressed() for (auto it = list.begin(); it != list.end(); ++it) Mpd.AddToPlaylist(utf_playlist, *it); if (Mpd.CommitCommandsList()) - ShowMessage("Selected item(s) added to playlist \"%s\"", playlist.c_str()); + Statusbar::msg("Selected item(s) added to playlist \"%s\"", playlist.c_str()); } } else if (pos > 1 && pos < w->size()-1) // add items to existing playlist @@ -193,7 +194,7 @@ void SelectedItemsAdder::EnterPressed() for (auto it = list.begin(); it != list.end(); ++it) Mpd.AddToPlaylist(playlist, *it); if (Mpd.CommitCommandsList()) - ShowMessage("Selected item(s) added to playlist \"%s\"", w->current().value().c_str()); + Statusbar::msg("Selected item(s) added to playlist \"%s\"", w->current().value().c_str()); } if (pos != w->size()-1) { @@ -209,7 +210,7 @@ void SelectedItemsAdder::EnterPressed() // disable adding after current track/album when stopped if (pos > 1 && pos < 4 && !Mpd.isPlaying()) { - ShowMessage("Player is stopped"); + Statusbar::msg("Player is stopped"); return; } @@ -246,7 +247,7 @@ void SelectedItemsAdder::EnterPressed() } if (successful_operation) - ShowMessage("Selected item(s) added"); + Statusbar::msg("Selected item(s) added"); } SwitchTo(); } diff --git a/src/server_info.cpp b/src/server_info.cpp index fe1ba6db..f7a66e95 100644 --- a/src/server_info.cpp +++ b/src/server_info.cpp @@ -24,6 +24,7 @@ #include "global.h" #include "helpers.h" #include "server_info.h" +#include "statusbar.h" using Global::MainHeight; using Global::MainStartY; @@ -53,7 +54,7 @@ void ServerInfo::SwitchTo() } if (MainHeight < 5) { - ShowMessage("Screen is too small to display this window"); + Statusbar::msg("Screen is too small to display this window"); return; } diff --git a/src/status.cpp b/src/status.cpp index 9ef41de7..e20fbaac 100644 --- a/src/status.cpp +++ b/src/status.cpp @@ -37,6 +37,7 @@ #include "sel_items_adder.h" #include "settings.h" #include "status.h" +#include "statusbar.h" #include "tag_editor.h" #include "visualizer.h" @@ -50,16 +51,6 @@ using Global::wHeader; using Global::Timer; using Global::VolumeState; -namespace -{ - timeval time_of_statusbar_lock; - int lock_statusbar_delay = -1; - - bool block_statusbar_update = 0; - bool block_progressbar_update = 0; - bool allow_statusbar_unlock = 1; -} - #ifndef USE_PDCURSES void WindowTitle(const std::string &status) { @@ -76,100 +67,6 @@ void DrawNowPlayingTitle(MPD::Song &np) WindowTitle(np.toString(Config.song_window_title_format)); } -void StatusbarMPDCallback() -{ - Mpd.OrderDataFetching(); -} - -void StatusbargetStringHelper(const std::wstring &) -{ - TraceMpdStatus(); -} - -void StatusbarApplyFilterImmediately::operator()(const std::wstring &ws) -{ - // if input queue is not empty, we don't want to update filter since next - // character will be taken from queue immediately, trigering this function - // again and thus making it inefficient, so let's apply filter only if - // "real" user input arrived. however, we want to apply filter if ENTER - // is next in queue, so its effects will be seen. - if (wFooter->inputQueue().empty() || wFooter->inputQueue().front() == KEY_ENTER) - { - if (m_ws != ws) - { - m_ws = ws; - m_f->applyFilter(ToString(m_ws)); - myScreen->RefreshWindow(); - } - TraceMpdStatus(); - } -} - -void LockProgressbar() -{ - block_progressbar_update = 1; -} - -void UnlockProgressbar() -{ - block_progressbar_update = 0; -} - -void LockStatusbar() -{ - if (Config.statusbar_visibility) - block_statusbar_update = 1; - else - block_progressbar_update = 1; - allow_statusbar_unlock = 0; -} - -void UnlockStatusbar() -{ - allow_statusbar_unlock = 1; - if (lock_statusbar_delay < 0) - { - if (Config.statusbar_visibility) - block_statusbar_update = 0; - else - block_progressbar_update = 0; - } - if (!Mpd.isPlaying()) - { - if (Config.new_design) - DrawProgressbar(Mpd.GetElapsedTime(), Mpd.GetTotalTime()); - else - Statusbar() << wclrtoeol; - wFooter->refresh(); - } -} - -void TryToClearStatusbarMessage() -{ - using Global::Timer; - if (lock_statusbar_delay > 0) - { - if (Timer.tv_sec >= time_of_statusbar_lock.tv_sec+lock_statusbar_delay) - { - lock_statusbar_delay = -1; - - if (Config.statusbar_visibility) - block_statusbar_update = !allow_statusbar_unlock; - else - block_progressbar_update = !allow_statusbar_unlock; - - if (Mpd.GetState() != MPD::psPlay && !block_statusbar_update && !block_progressbar_update) - { - if (Config.new_design) - DrawProgressbar(Mpd.GetElapsedTime(), Mpd.GetTotalTime()); - else - Statusbar() << wclrtoeol; - wFooter->refresh(); - } - } - } -} - void TraceMpdStatus() { static timeval past = { 0, 0 }; @@ -203,7 +100,7 @@ void TraceMpdStatus() myPlaylist->Items->refresh(); } - TryToClearStatusbarMessage(); + Statusbar::tryRedraw(); } void NcmpcppErrorCallback(MPD::Connection *, int errorid, const char *msg, void *) @@ -214,11 +111,11 @@ void NcmpcppErrorCallback(MPD::Connection *, int errorid, const char *msg, void if ((errorid >> 8) == MPD_SERVER_ERROR_PERMISSION) { wFooter->setGetStringHelper(0); - Statusbar() << "Password: "; + Statusbar::put() << "Password: "; Mpd.SetPassword(wFooter->getString(-1, 0, 1)); if (Mpd.SendPassword()) - ShowMessage("Password accepted"); - wFooter->setGetStringHelper(StatusbargetStringHelper); + Statusbar::msg("Password accepted"); + wFooter->setGetStringHelper(Statusbar::Helpers::getString); } else if ((errorid >> 8) == MPD_SERVER_ERROR_NO_EXIST && myScreen == myBrowser) { @@ -226,7 +123,7 @@ void NcmpcppErrorCallback(MPD::Connection *, int errorid, const char *msg, void myBrowser->Refresh(); } else - ShowMessage("MPD: %s", msg); + Statusbar::msg("MPD: %s", msg); } void NcmpcppStatusChanged(MPD::Connection *, MPD::StatusChanges changed, void *) @@ -351,8 +248,8 @@ void NcmpcppStatusChanged(MPD::Connection *, MPD::StatusChanges changed, void *) case MPD::psStop: { WindowTitle("ncmpcpp " VERSION); - if (!block_progressbar_update) - DrawProgressbar(0, 0); + if (Progressbar::isUnlocked()) + Progressbar::draw(0, 0); Playlist::ReloadRemaining = true; if (Config.new_design) { @@ -379,7 +276,7 @@ void NcmpcppStatusChanged(MPD::Connection *, MPD::StatusChanges changed, void *) *wHeader << NC::XY(0, 1) << NC::fmtBold << player_state << NC::fmtBoldEnd; wHeader->refresh(); } - else if (!block_statusbar_update && Config.statusbar_visibility) + else if (Statusbar::isUnlocked() && Config.statusbar_visibility) { *wFooter << NC::XY(0, 1); if (player_state.empty()) @@ -468,7 +365,7 @@ void NcmpcppStatusChanged(MPD::Connection *, MPD::StatusChanges changed, void *) changed.StatusFlags = 1; } - else if (!block_statusbar_update && Config.statusbar_visibility) + else if (Statusbar::isUnlocked() && Config.statusbar_visibility) { if (Config.display_bitrate && Mpd.GetBitrate()) { @@ -501,13 +398,13 @@ void NcmpcppStatusChanged(MPD::Connection *, MPD::StatusChanges changed, void *) np_song.write(*wFooter, playing_song_scroll_begin, wFooter->getWidth()-player_state.length()-tracklength.length(), L" ** "); *wFooter << NC::fmtBold << NC::XY(wFooter->getWidth()-tracklength.length(), 1) << tracklength << NC::fmtBoldEnd; } - if (!block_progressbar_update) - DrawProgressbar(Mpd.GetElapsedTime(), Mpd.GetTotalTime()); + if (Progressbar::isUnlocked()) + Progressbar::draw(Mpd.GetElapsedTime(), Mpd.GetTotalTime()); Global::RedrawStatusbar = false; } else { - if (!block_statusbar_update && Config.statusbar_visibility) + if (Statusbar::isUnlocked() && Config.statusbar_visibility) *wFooter << NC::XY(0, 1) << wclrtoeol; } } @@ -522,28 +419,28 @@ void NcmpcppStatusChanged(MPD::Connection *, MPD::StatusChanges changed, void *) if (changed.Repeat) { mpd_repeat = Mpd.GetRepeat() ? 'r' : 0; - ShowMessage("Repeat mode is %s", !mpd_repeat ? "off" : "on"); + Statusbar::msg("Repeat mode is %s", !mpd_repeat ? "off" : "on"); } if (changed.Random) { mpd_random = Mpd.GetRandom() ? 'z' : 0; - ShowMessage("Random mode is %s", !mpd_random ? "off" : "on"); + Statusbar::msg("Random mode is %s", !mpd_random ? "off" : "on"); } if (changed.Single) { mpd_single = Mpd.GetSingle() ? 's' : 0; - ShowMessage("Single mode is %s", !mpd_single ? "off" : "on"); + Statusbar::msg("Single mode is %s", !mpd_single ? "off" : "on"); } if (changed.Consume) { mpd_consume = Mpd.GetConsume() ? 'c' : 0; - ShowMessage("Consume mode is %s", !mpd_consume ? "off" : "on"); + Statusbar::msg("Consume mode is %s", !mpd_consume ? "off" : "on"); } if (changed.Crossfade) { int crossfade = Mpd.GetCrossfade(); mpd_crossfade = crossfade ? 'x' : 0; - ShowMessage("Crossfade set to %d seconds", crossfade); + Statusbar::msg("Crossfade set to %d seconds", crossfade); } if (changed.DBUpdating) { @@ -551,11 +448,11 @@ void NcmpcppStatusChanged(MPD::Connection *, MPD::StatusChanges changed, void *) // finished and nothing changed, so we need to switch it off for them. if (!Mpd.SupportsIdle() || Mpd.Version() > 15) mpd_db_updating = Mpd.GetDBIsUpdating() ? 'U' : 0; - ShowMessage(Mpd.GetDBIsUpdating() ? "Database update started!" : "Database update finished!"); + Statusbar::msg(Mpd.GetDBIsUpdating() ? "Database update started!" : "Database update finished!"); if (changed.Database && myScreen == mySelectedItemsAdder) { myScreen->SwitchTo(); // switch to previous screen - ShowMessage("Database has changed, you need to select your item(s) once again"); + Statusbar::msg("Database has changed, you need to select your item(s) once again"); } } if (changed.StatusFlags && (Config.header_visibility || Config.new_design)) @@ -667,62 +564,3 @@ void DrawHeader() } wHeader->refresh(); } - -NC::Window &Statusbar() -{ - *wFooter << NC::XY(0, Config.statusbar_visibility) << wclrtoeol; - return *wFooter; -} - -void DrawProgressbar(unsigned elapsed, unsigned time) -{ - unsigned pb_width = wFooter->getWidth(); - unsigned howlong = time ? pb_width*elapsed/time : 0; - if (Config.progressbar_boldness) - *wFooter << NC::fmtBold; - *wFooter << Config.progressbar_color; - if (Config.progressbar[2] != '\0') - { - wFooter->goToXY(0, 0); - for (unsigned i = 0; i < pb_width; ++i) - *wFooter << Config.progressbar[2]; - wFooter->goToXY(0, 0); - } - else - mvwhline(wFooter->raw(), 0, 0, 0, pb_width); - if (time) - { - *wFooter << Config.progressbar_elapsed_color; - pb_width = std::min(size_t(howlong), wFooter->getWidth()); - for (unsigned i = 0; i < pb_width; ++i) - *wFooter << Config.progressbar[0]; - if (howlong < wFooter->getWidth()) - *wFooter << Config.progressbar[1]; - *wFooter << NC::clEnd; - } - *wFooter << NC::clEnd; - if (Config.progressbar_boldness) - *wFooter << NC::fmtBoldEnd; -} - -void ShowMessage(const char *format, ...) -{ - if (Global::ShowMessages && allow_statusbar_unlock) - { - time_of_statusbar_lock = Global::Timer; - lock_statusbar_delay = Config.message_delay_time; - if (Config.statusbar_visibility) - block_statusbar_update = 1; - else - block_progressbar_update = 1; - wFooter->goToXY(0, Config.statusbar_visibility); - *wFooter << NC::fmtBoldEnd; - va_list list; - va_start(list, format); - wmove(wFooter->raw(), Config.statusbar_visibility, 0); - vw_printw(wFooter->raw(), format, list); - wclrtoeol(wFooter->raw()); - va_end(list); - wFooter->refresh(); - } -} diff --git a/src/status.h b/src/status.h index b91d8e5d..2ead6046 100644 --- a/src/status.h +++ b/src/status.h @@ -32,36 +32,10 @@ void DrawNowPlayingTitle(); -void LockProgressbar(); -void UnlockProgressbar(); - -void LockStatusbar(); -void UnlockStatusbar(); - void TraceMpdStatus(); void NcmpcppStatusChanged(MPD::Connection *, MPD::StatusChanges, void *); void NcmpcppErrorCallback(MPD::Connection *, int, const char *, void *); void DrawHeader(); -NC::Window &Statusbar(); -void DrawProgressbar(unsigned elapsed, unsigned time); -void ShowMessage(const char *, ...) GNUC_PRINTF(1, 2); - -void StatusbarMPDCallback(); -void StatusbargetStringHelper(const std::wstring &); - -struct StatusbarApplyFilterImmediately -{ - StatusbarApplyFilterImmediately(Filterable *f, const std::wstring &filter) - : m_f(f), m_ws(filter) { } - - void operator()(const std::wstring &ws); - -private: - Filterable *m_f; - std::wstring m_ws; -}; - #endif - diff --git a/src/statusbar.cpp b/src/statusbar.cpp new file mode 100644 index 00000000..e15545f4 --- /dev/null +++ b/src/statusbar.cpp @@ -0,0 +1,199 @@ +/*************************************************************************** + * 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. * + ***************************************************************************/ + +#include "global.h" +#include "settings.h" +#include "status.h" +#include "statusbar.h" + +using Global::wFooter; + +namespace {// + +timeval statusbarLockTime; +int statusbarLockDelay = -1; + +bool statusbarBlockUpdate = false; +bool progressbarBlockUpdate = false; +bool statusbarAllowUnlock = true; + +} + +void Progressbar::lock() +{ + progressbarBlockUpdate = true; +} + +void Progressbar::unlock() +{ + progressbarBlockUpdate = false; +} + +bool Progressbar::isUnlocked() +{ + return !progressbarBlockUpdate; +} + +void Progressbar::draw(unsigned int elapsed, unsigned int time) +{ + unsigned pb_width = wFooter->getWidth(); + unsigned howlong = time ? pb_width*elapsed/time : 0; + if (Config.progressbar_boldness) + *wFooter << NC::fmtBold; + *wFooter << Config.progressbar_color; + if (Config.progressbar[2] != '\0') + { + wFooter->goToXY(0, 0); + for (unsigned i = 0; i < pb_width; ++i) + *wFooter << Config.progressbar[2]; + wFooter->goToXY(0, 0); + } + else + mvwhline(wFooter->raw(), 0, 0, 0, pb_width); + if (time) + { + *wFooter << Config.progressbar_elapsed_color; + pb_width = std::min(size_t(howlong), wFooter->getWidth()); + for (unsigned i = 0; i < pb_width; ++i) + *wFooter << Config.progressbar[0]; + if (howlong < wFooter->getWidth()) + *wFooter << Config.progressbar[1]; + *wFooter << NC::clEnd; + } + *wFooter << NC::clEnd; + if (Config.progressbar_boldness) + *wFooter << NC::fmtBoldEnd; +} + +void Statusbar::lock() +{ + if (Config.statusbar_visibility) + statusbarBlockUpdate = true; + else + progressbarBlockUpdate = true; + statusbarAllowUnlock = false; +} + +void Statusbar::unlock() +{ + statusbarAllowUnlock = true; + if (statusbarLockDelay < 0) + { + if (Config.statusbar_visibility) + statusbarBlockUpdate = false; + else + progressbarBlockUpdate = false; + } + if (!Mpd.isPlaying()) + { + if (Config.new_design) + Progressbar::draw(Mpd.GetElapsedTime(), Mpd.GetTotalTime()); + else + put() << wclrtoeol; + wFooter->refresh(); + } +} + +bool Statusbar::isUnlocked() +{ + return !statusbarBlockUpdate; +} + +void Statusbar::tryRedraw() +{ + using Global::Timer; + if (statusbarLockDelay > 0 + && Timer.tv_sec >= statusbarLockTime.tv_sec+statusbarLockDelay) + { + statusbarLockDelay = -1; + + if (Config.statusbar_visibility) + statusbarBlockUpdate = !statusbarAllowUnlock; + else + progressbarBlockUpdate = !statusbarAllowUnlock; + + if (Mpd.GetState() != MPD::psPlay && !statusbarBlockUpdate && !progressbarBlockUpdate) + { + if (Config.new_design) + Progressbar::draw(Mpd.GetElapsedTime(), Mpd.GetTotalTime()); + else + put() << wclrtoeol; + wFooter->refresh(); + } + } +} + +NC::Window &Statusbar::put() +{ + *wFooter << NC::XY(0, Config.statusbar_visibility ? 1 : 0) << wclrtoeol; + return *wFooter; +} + +void Statusbar::msg(const char *format, ...) +{ + if (Global::ShowMessages && statusbarAllowUnlock) + { + statusbarLockTime = Global::Timer; + statusbarLockDelay = Config.message_delay_time; + if (Config.statusbar_visibility) + statusbarBlockUpdate = 1; + else + progressbarBlockUpdate = 1; + wFooter->goToXY(0, Config.statusbar_visibility); + *wFooter << NC::fmtBoldEnd; + va_list list; + va_start(list, format); + wmove(wFooter->raw(), Config.statusbar_visibility, 0); + vw_printw(wFooter->raw(), format, list); + wclrtoeol(wFooter->raw()); + va_end(list); + wFooter->refresh(); + } +} + +void Statusbar::Helpers::mpd() +{ + Mpd.OrderDataFetching(); +} + +void Statusbar::Helpers::getString(const std::wstring &) +{ + TraceMpdStatus(); +} + +void Statusbar::Helpers::ApplyFilterImmediately::operator()(const std::wstring &ws) +{ + using Global::myScreen; + // if input queue is not empty, we don't want to update filter since next + // character will be taken from queue immediately, trigering this function + // again and thus making it inefficient, so let's apply filter only if + // "real" user input arrived. however, we want to apply filter if ENTER + // is next in queue, so its effects will be seen. + if (wFooter->inputQueue().empty() || wFooter->inputQueue().front() == KEY_ENTER) + { + if (m_ws != ws) + { + m_ws = ws; + m_f->applyFilter(ToString(m_ws)); + myScreen->RefreshWindow(); + } + TraceMpdStatus(); + } +} diff --git a/src/statusbar.h b/src/statusbar.h new file mode 100644 index 00000000..77236387 --- /dev/null +++ b/src/statusbar.h @@ -0,0 +1,90 @@ +/*************************************************************************** + * 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 _STATUSBAR_H +#define _STATUSBAR_H + +#include "gcc.h" +#include "interfaces.h" +#include "window.h" + +namespace Progressbar {// + +/// locks progressbar (usually used for seeking) +void lock(); + +/// unlocks progressbar (usually right after seeking is done) +void unlock(); + +/// @return true if progressbar is unlocked +bool isUnlocked(); + +/// draws progressbar +void draw(unsigned elapsed, unsigned time); + +} + +namespace Statusbar{// + +/// locks statusbar (usually for prompting the user) +void lock(); + +/// unlocks statusbar (usually after prompting the user) +void unlock(); + +/// @return true if statusbar is unlocked +bool isUnlocked(); + +/// tries to clear current message put there using Statusbar::msg if there is any +void tryRedraw(); + +/// clears statusbar and move cursor to beginning of line +/// @return window object that represents statusbar +NC::Window &put(); + +/// displays message in statusbar for period of time set in configuration file +void msg(const char *format, ...) GNUC_PRINTF(1, 2); + +namespace Helpers {// + +/// called when statusbar window detects incoming idle notification +void mpd(); + +/// called each time user types another character while inside Window::getString +void getString(const std::wstring &); + +/// called each time user changes current filter (while being inside Window::getString) +struct ApplyFilterImmediately +{ + ApplyFilterImmediately(Filterable *f, const std::wstring &filter) + : m_f(f), m_ws(filter) { } + + void operator()(const std::wstring &ws); + +private: + Filterable *m_f; + std::wstring m_ws; +}; + +} + +} + +#endif // _STATUSBAR_H diff --git a/src/tag_editor.cpp b/src/tag_editor.cpp index 989210f3..7c394957 100644 --- a/src/tag_editor.cpp +++ b/src/tag_editor.cpp @@ -41,8 +41,9 @@ #include "display.h" #include "global.h" #include "helpers.h" -#include "song_info.h" #include "playlist.h" +#include "song_info.h" +#include "statusbar.h" #include "utility/comparators.h" using namespace std::placeholders; @@ -317,7 +318,7 @@ void TagEditor::EnterPressed() Dirs->reset(); } else - ShowMessage("No subdirectories found"); + Statusbar::msg("No subdirectories found"); } else if (w == FParserDialog) { @@ -384,10 +385,10 @@ void TagEditor::EnterPressed() if (pos == 0) // change pattern { - LockStatusbar(); - Statusbar() << "Pattern: "; + Statusbar::lock(); + Statusbar::put() << "Pattern: "; std::string new_pattern = wFooter->getString(Config.pattern); - UnlockStatusbar(); + Statusbar::unlock(); if (!new_pattern.empty()) { Config.pattern = new_pattern; @@ -398,7 +399,7 @@ void TagEditor::EnterPressed() else if (pos == 1 || pos == 4) // preview or proceed { bool success = 1; - ShowMessage("Parsing..."); + Statusbar::msg("Parsing..."); FParserPreview->clear(); for (auto it = EditedSongs.begin(); it != EditedSongs.end(); ++it) { @@ -421,7 +422,7 @@ void TagEditor::EnterPressed() std::string new_file = GenerateFilename(s, "{" + Config.pattern + "}"); if (new_file.empty() && !FParserUsePreview) { - ShowMessage("File \"%s\" would have an empty name", s.getName().c_str()); + Statusbar::msg("File \"%s\" would have an empty name", s.getName().c_str()); FParserUsePreview = 1; success = 0; } @@ -450,7 +451,7 @@ void TagEditor::EnterPressed() quit = 1; } if (pos != 4 || success) - ShowMessage("Operation finished"); + Statusbar::msg("Operation finished"); } else if (pos == 2) // show legend { @@ -507,10 +508,10 @@ void TagEditor::EnterPressed() else (*it)->setTrack(unsignedIntTo::apply(i)); } - ShowMessage("Tracks numbered"); + Statusbar::msg("Tracks numbered"); } else - ShowMessage("Aborted"); + Statusbar::msg("Aborted"); return; } @@ -520,19 +521,19 @@ void TagEditor::EnterPressed() MPD::MutableSong::SetFunction set = SongInfo::Tags[id].Set; if (id > 0 && w == TagTypes) { - LockStatusbar(); - Statusbar() << NC::fmtBold << TagTypes->current().value() << NC::fmtBoldEnd << ": "; + Statusbar::lock(); + Statusbar::put() << NC::fmtBold << TagTypes->current().value() << NC::fmtBoldEnd << ": "; std::string new_tag = wFooter->getString(Tags->current().value().getTags(get)); - UnlockStatusbar(); + Statusbar::unlock(); for (auto it = EditedSongs.begin(); it != EditedSongs.end(); ++it) (*it)->setTags(set, new_tag); } else if (w == Tags) { - LockStatusbar(); - Statusbar() << NC::fmtBold << TagTypes->current().value() << NC::fmtBoldEnd << ": "; + Statusbar::lock(); + Statusbar::put() << NC::fmtBold << TagTypes->current().value() << NC::fmtBoldEnd << ": "; std::string new_tag = wFooter->getString(Tags->current().value().getTags(get)); - UnlockStatusbar(); + Statusbar::unlock(); if (new_tag != Tags->current().value().getTags(get)) Tags->current().value().setTags(set, new_tag); Tags->scroll(NC::wDown); @@ -546,7 +547,7 @@ void TagEditor::EnterPressed() { if (size_t(COLS) < FParserDialogWidth || MainHeight < FParserDialogHeight) { - ShowMessage("Screen is too small to display additional windows"); + Statusbar::msg("Screen is too small to display additional windows"); return; } FParserDialog->reset(); @@ -559,10 +560,10 @@ void TagEditor::EnterPressed() size_t last_dot = old_name.rfind("."); std::string extension = old_name.substr(last_dot); old_name = old_name.substr(0, last_dot); - LockStatusbar(); - Statusbar() << NC::fmtBold << "New filename: " << NC::fmtBoldEnd; + Statusbar::lock(); + Statusbar::put() << NC::fmtBold << "New filename: " << NC::fmtBoldEnd; std::string new_name = wFooter->getString(old_name); - UnlockStatusbar(); + Statusbar::unlock(); if (!new_name.empty() && new_name != old_name) s.setNewURI(new_name + extension); Tags->scroll(NC::wDown); @@ -570,41 +571,41 @@ void TagEditor::EnterPressed() } else if (id == 16) // capitalize first letters { - ShowMessage("Processing..."); + Statusbar::msg("Processing..."); for (auto it = EditedSongs.begin(); it != EditedSongs.end(); ++it) CapitalizeFirstLetters(**it); - ShowMessage("Done"); + Statusbar::msg("Done"); } else if (id == 17) // lower all letters { - ShowMessage("Processing..."); + Statusbar::msg("Processing..."); for (auto it = EditedSongs.begin(); it != EditedSongs.end(); ++it) LowerAllLetters(**it); - ShowMessage("Done"); + Statusbar::msg("Done"); } else if (id == 19) // reset { Tags->clear(); - ShowMessage("Changes reset"); + Statusbar::msg("Changes reset"); } else if (id == 20) // save { bool success = 1; - ShowMessage("Writing changes..."); + Statusbar::msg("Writing changes..."); for (auto it = EditedSongs.begin(); it != EditedSongs.end(); ++it) { - ShowMessage("Writing tags in \"%s\"...", (*it)->getName().c_str()); + Statusbar::msg("Writing tags in \"%s\"...", (*it)->getName().c_str()); if (!WriteTags(**it)) { const char msg[] = "Error while writing tags in \"%ls\""; - ShowMessage(msg, wideShorten(ToWString((*it)->getURI()), COLS-const_strlen(msg)).c_str()); + Statusbar::msg(msg, wideShorten(ToWString((*it)->getURI()), COLS-const_strlen(msg)).c_str()); success = 0; break; } } if (success) { - ShowMessage("Tags updated"); + Statusbar::msg("Tags updated"); TagTypes->setHighlightColor(Config.main_highlight_color); TagTypes->reset(); w->refresh(); diff --git a/src/tiny_tag_editor.cpp b/src/tiny_tag_editor.cpp index 9c4174e7..8ebb5716 100644 --- a/src/tiny_tag_editor.cpp +++ b/src/tiny_tag_editor.cpp @@ -36,6 +36,7 @@ #include "song_info.h" #include "playlist.h" #include "search_engine.h" +#include "statusbar.h" #include "tag_editor.h" using Global::MainHeight; @@ -70,7 +71,7 @@ void TinyTagEditor::SwitchTo() if (itsEdited.isStream()) { - ShowMessage("Streams can't be edited"); + Statusbar::msg("Streams can't be edited"); } else if (getTags()) { @@ -92,7 +93,7 @@ void TinyTagEditor::SwitchTo() full_path += itsEdited.getURI(); const char msg[] = "Couldn't read file \"%ls\""; - ShowMessage(msg, wideShorten(ToWString(full_path), COLS-const_strlen(msg)).c_str()); + Statusbar::msg(msg, wideShorten(ToWString(full_path), COLS-const_strlen(msg)).c_str()); } } @@ -104,11 +105,11 @@ std::wstring TinyTagEditor::Title() void TinyTagEditor::EnterPressed() { size_t option = w->choice(); - LockStatusbar(); + Statusbar::lock(); if (option < 19) // separator after comment { size_t pos = option-8; - Statusbar() << NC::fmtBold << SongInfo::Tags[pos].Name << ": " << NC::fmtBoldEnd; + Statusbar::put() << NC::fmtBold << SongInfo::Tags[pos].Name << ": " << NC::fmtBoldEnd; itsEdited.setTags(SongInfo::Tags[pos].Set, Global::wFooter->getString(itsEdited.getTags(SongInfo::Tags[pos].Get))); w->at(option).value().clear(); w->at(option).value() << NC::fmtBold << SongInfo::Tags[pos].Name << ':' << NC::fmtBoldEnd << ' '; @@ -116,7 +117,7 @@ void TinyTagEditor::EnterPressed() } else if (option == 20) { - Statusbar() << NC::fmtBold << "Filename: " << NC::fmtBoldEnd; + Statusbar::put() << NC::fmtBold << "Filename: " << NC::fmtBoldEnd; std::string filename = itsEdited.getNewURI().empty() ? itsEdited.getName() : itsEdited.getNewURI(); size_t dot = filename.rfind("."); std::string extension = filename.substr(dot); @@ -126,14 +127,14 @@ void TinyTagEditor::EnterPressed() w->at(option).value().clear(); w->at(option).value() << NC::fmtBold << "Filename:" << NC::fmtBoldEnd << ' ' << (itsEdited.getNewURI().empty() ? itsEdited.getName() : itsEdited.getNewURI()); } - UnlockStatusbar(); + Statusbar::unlock(); if (option == 22) { - ShowMessage("Updating tags..."); + Statusbar::msg("Updating tags..."); if (TagEditor::WriteTags(itsEdited)) { - ShowMessage("Tags updated"); + Statusbar::msg("Tags updated"); if (itsEdited.isFromDatabase()) Mpd.UpdateDirectory(itsEdited.getDirectory()); else @@ -145,7 +146,7 @@ void TinyTagEditor::EnterPressed() } } else - ShowMessage("Error while writing tags"); + Statusbar::msg("Error while writing tags"); } if (option > 21) myOldScreen->SwitchTo(); diff --git a/src/visualizer.cpp b/src/visualizer.cpp index f9576bb0..0e33702a 100644 --- a/src/visualizer.cpp +++ b/src/visualizer.cpp @@ -34,6 +34,7 @@ #include "global.h" #include "settings.h" #include "status.h" +#include "statusbar.h" using Global::MainStartY; using Global::MainHeight; @@ -157,7 +158,7 @@ void Visualizer::SpacePressed() { # ifdef HAVE_FFTW3_H Config.visualizer_use_wave = !Config.visualizer_use_wave; - ShowMessage("Visualization type: %s", Config.visualizer_use_wave ? "Sound wave" : "Frequency spectrum"); + Statusbar::msg("Visualization type: %s", Config.visualizer_use_wave ? "Sound wave" : "Frequency spectrum"); # endif // HAVE_FFTW3_H } @@ -225,7 +226,7 @@ void Visualizer::DrawFrequencySpectrum(int16_t *buf, ssize_t samples, size_t y_o void Visualizer::SetFD() { if (itsFifo < 0 && (itsFifo = open(Config.visualizer_fifo_path.c_str(), O_RDONLY | O_NONBLOCK)) < 0) - ShowMessage("Couldn't open \"%s\" for reading PCM data: %s", Config.visualizer_fifo_path.c_str(), strerror(errno)); + Statusbar::msg("Couldn't open \"%s\" for reading PCM data: %s", Config.visualizer_fifo_path.c_str(), strerror(errno)); } void Visualizer::ResetFD() @@ -244,7 +245,7 @@ void Visualizer::FindOutputID() if (o->name() == Config.visualizer_output_name) itsOutputID = i; if (itsOutputID == -1) - ShowMessage("There is no output named \"%s\"", Config.visualizer_output_name.c_str()); + Statusbar::msg("There is no output named \"%s\"", Config.visualizer_output_name.c_str()); } }