From e6859c097be515f99ec9032d81c06877aac6528d Mon Sep 17 00:00:00 2001 From: Andrzej Rybczak Date: Fri, 31 Oct 2014 21:52:26 +0100 Subject: [PATCH] actions: rename askYesNoQuestion to confirmAction and make it throw on 'n' --- src/actions.cpp | 175 ++++++++++++++++++--------------------------- src/actions.h | 6 +- src/playlist.cpp | 1 - src/tag_editor.cpp | 34 +++------ src/tag_editor.h | 1 - 5 files changed, 85 insertions(+), 132 deletions(-) diff --git a/src/actions.cpp b/src/actions.cpp index bf64402c..b362f82d 100644 --- a/src/actions.cpp +++ b/src/actions.cpp @@ -252,15 +252,16 @@ void setWindowsDimensions() FooterHeight = Config.statusbar_visibility ? 2 : 1; } -bool askYesNoQuestion(const boost::format &fmt) +void confirmAction(const boost::format &description) { Statusbar::ScopedLock lock; - Statusbar::put() << fmt.str() + Statusbar::put() << description.str() << " [" << NC::Format::Bold << 'y' << NC::Format::NoBold << '/' << NC::Format::Bold << 'n' << NC::Format::NoBold << "] "; auto answer = Statusbar::Helpers::promptReturnOneOf({"y", "n"}); - return answer == "y"; + if (answer == "n") + throw NC::PromptAborted(std::move(answer)); } bool isMPDMusicDirSet() @@ -678,38 +679,37 @@ void DeleteBrowserItems::run() question = boost::format("Delete %1% \"%2%\"?") % itemTypeToString(item.type) % wideShorten(iname, COLS-question.size()-10); } - bool yes = askYesNoQuestion(question); - if (yes) + confirmAction(question); + bool success = true; + auto list = getSelectedOrCurrent( + myBrowser->main().begin(), + myBrowser->main().end(), + myBrowser->main().currentI() + ); + for (const auto &item : list) { - bool success = true; - auto list = getSelectedOrCurrent(myBrowser->main().begin(), myBrowser->main().end(), myBrowser->main().currentI()); - for (auto it = list.begin(); it != list.end(); ++it) + const MPD::Item &i = item->value(); + std::string iname = i.type == MPD::itSong ? i.song->getName() : i.name; + std::string errmsg; + if (myBrowser->deleteItem(i, errmsg)) { - const MPD::Item &i = (*it)->value(); - std::string iname = i.type == MPD::itSong ? i.song->getName() : i.name; - std::string errmsg; - if (myBrowser->deleteItem(i, errmsg)) - { - const char msg[] = "\"%1%\" deleted"; - Statusbar::printf(msg, wideShorten(iname, COLS-const_strlen(msg))); - } - else - { - Statusbar::print(errmsg); - success = false; - break; - } + const char msg[] = "\"%1%\" deleted"; + Statusbar::printf(msg, wideShorten(iname, COLS-const_strlen(msg))); } - if (success) + else { - if (myBrowser->isLocal()) - myBrowser->GetDirectory(myBrowser->CurrentDir()); - else - Mpd.UpdateDirectory(myBrowser->CurrentDir()); + Statusbar::print(errmsg); + success = false; + break; } } - else - Statusbar::print("Aborted"); + if (success) + { + if (myBrowser->isLocal()) + myBrowser->GetDirectory(myBrowser->CurrentDir()); + else + Mpd.UpdateDirectory(myBrowser->CurrentDir()); + } } bool DeleteStoredPlaylist::canBeRun() const @@ -727,20 +727,19 @@ void DeleteStoredPlaylist::run() else question = boost::format("Delete playlist \"%1%\"?") % wideShorten(myPlaylistEditor->Playlists.current().value(), COLS-question.size()-10); - bool yes = askYesNoQuestion(question); - if (yes) - { - auto list = getSelectedOrCurrent(myPlaylistEditor->Playlists.begin(), myPlaylistEditor->Playlists.end(), myPlaylistEditor->Playlists.currentI()); - for (auto it = list.begin(); it != list.end(); ++it) - Mpd.DeletePlaylist((*it)->value()); - Statusbar::printf("%1% deleted", list.size() == 1 ? "Playlist" : "Playlists"); - // force playlists update. this happens automatically, but only after call - // to Key::read, therefore when we call PlaylistEditor::Update, it won't - // yet see it, so let's point that it needs to update it. - myPlaylistEditor->requestPlaylistsUpdate(); - } - else - Statusbar::print("Aborted"); + confirmAction(question); + auto list = getSelectedOrCurrent( + myPlaylistEditor->Playlists.begin(), + myPlaylistEditor->Playlists.end(), + myPlaylistEditor->Playlists.currentI() + ); + for (const auto &item : list) + Mpd.DeletePlaylist(item->value()); + Statusbar::printf("%1% deleted", list.size() == 1 ? "Playlist" : "Playlists"); + // force playlists update. this happens automatically, but only after call + // to Key::read, therefore when we call PlaylistEditor::Update, it won't + // yet see it, so let's point that it needs to update it. + myPlaylistEditor->requestPlaylistsUpdate(); } void ReplaySong::run() @@ -774,16 +773,11 @@ void SavePlaylist::run() Statusbar::put() << "Save playlist as: "; playlist_name = wFooter->prompt(); } - if (playlist_name.find("/") != std::string::npos) - { - Statusbar::print("Playlist name must not contain slashes"); - return; - } if (myPlaylist->main().isFiltered()) { Mpd.StartCommandsList(); - for (size_t i = 0; i < myPlaylist->main().size(); ++i) - Mpd.AddToPlaylist(playlist_name, myPlaylist->main()[i].value()); + for (const auto &item : myPlaylist->main()) + Mpd.AddToPlaylist(playlist_name, item.value()); Mpd.CommitCommandsList(); Statusbar::printf("Filtered items added to playlist \"%1%\"", playlist_name); } @@ -798,19 +792,12 @@ void SavePlaylist::run() { if (e.code() == MPD_SERVER_ERROR_EXIST) { - bool yes = askYesNoQuestion( + confirmAction( boost::format("Playlist \"%1%\" already exists, overwrite?") % playlist_name ); - if (yes) - { - Mpd.DeletePlaylist(playlist_name); - Mpd.SavePlaylist(playlist_name); - Statusbar::print("Playlist overwritten"); - } - else - Statusbar::print("Aborted"); - if (myScreen == myPlaylist) - myPlaylist->EnableHighlighting(); + Mpd.DeletePlaylist(playlist_name); + Mpd.SavePlaylist(playlist_name); + Statusbar::print("Playlist overwritten"); } else throw e; @@ -1751,16 +1738,12 @@ void CropMainPlaylist::run() // cropping doesn't make sense in this case if (w.size() <= 1) return; - bool yes = true; if (Config.ask_before_clearing_playlists) - yes = askYesNoQuestion("Do you really want to crop main playlist?"); - if (yes) - { - Statusbar::print("Cropping playlist..."); - selectCurrentIfNoneSelected(w); - cropPlaylist(w, boost::bind(&MPD::Connection::Delete, _1, _2)); - Statusbar::print("Playlist cropped"); - } + confirmAction("Do you really want to crop main playlist?"); + Statusbar::print("Cropping playlist..."); + selectCurrentIfNoneSelected(w); + cropPlaylist(w, boost::bind(&MPD::Connection::Delete, _1, _2)); + Statusbar::print("Playlist cropped"); } bool CropPlaylist::canBeRun() const @@ -1776,34 +1759,24 @@ void CropPlaylist::run() return; assert(!myPlaylistEditor->Playlists.empty()); std::string playlist = myPlaylistEditor->Playlists.current().value(); - bool yes = true; if (Config.ask_before_clearing_playlists) - yes = askYesNoQuestion( - boost::format("Do you really want to crop playlist \"%1%\"?") % playlist - ); - if (yes) - { - selectCurrentIfNoneSelected(w); - Statusbar::printf("Cropping playlist \"%1%\"...", playlist); - cropPlaylist(w, boost::bind(&MPD::Connection::PlaylistDelete, _1, playlist, _2)); - Statusbar::printf("Playlist \"%1%\" cropped", playlist); - } + confirmAction(boost::format("Do you really want to crop playlist \"%1%\"?") % playlist); + selectCurrentIfNoneSelected(w); + Statusbar::printf("Cropping playlist \"%1%\"...", playlist); + cropPlaylist(w, boost::bind(&MPD::Connection::PlaylistDelete, _1, playlist, _2)); + Statusbar::printf("Playlist \"%1%\" cropped", playlist); } void ClearMainPlaylist::run() { - bool yes = true; if (Config.ask_before_clearing_playlists) - yes = askYesNoQuestion("Do you really want to clear main playlist?"); - if (yes) - { - auto delete_fun = boost::bind(&MPD::Connection::Delete, _1, _2); - auto clear_fun = boost::bind(&MPD::Connection::ClearMainPlaylist, _1); - Statusbar::printf("Deleting items..."); - clearPlaylist(myPlaylist->main(), delete_fun, clear_fun); - Statusbar::printf("Items deleted"); - myPlaylist->main().reset(); - } + confirmAction("Do you really want to clear main playlist?"); + auto delete_fun = boost::bind(&MPD::Connection::Delete, _1, _2); + auto clear_fun = boost::bind(&MPD::Connection::ClearMainPlaylist, _1); + Statusbar::printf("Deleting items..."); + clearPlaylist(myPlaylist->main(), delete_fun, clear_fun); + Statusbar::printf("Items deleted"); + myPlaylist->main().reset(); } bool ClearPlaylist::canBeRun() const @@ -1816,19 +1789,13 @@ void ClearPlaylist::run() if (myPlaylistEditor->Playlists.empty()) return; std::string playlist = myPlaylistEditor->Playlists.current().value(); - bool yes = true; if (Config.ask_before_clearing_playlists) - yes = askYesNoQuestion( - boost::format("Do you really want to clear playlist \"%1%\"?") % playlist - ); - if (yes) - { - auto delete_fun = boost::bind(&MPD::Connection::PlaylistDelete, _1, playlist, _2); - auto clear_fun = boost::bind(&MPD::Connection::ClearPlaylist, _1, playlist); - Statusbar::printf("Deleting items from \"%1%\"...", playlist); - clearPlaylist(myPlaylistEditor->Content, delete_fun, clear_fun); - Statusbar::printf("Items deleted from \"%1%\"", playlist); - } + confirmAction(boost::format("Do you really want to clear playlist \"%1%\"?") % playlist); + auto delete_fun = boost::bind(&MPD::Connection::PlaylistDelete, _1, playlist, _2); + auto clear_fun = boost::bind(&MPD::Connection::ClearPlaylist, _1, playlist); + Statusbar::printf("Deleting items from \"%1%\"...", playlist); + clearPlaylist(myPlaylistEditor->Content, delete_fun, clear_fun); + Statusbar::printf("Items deleted from \"%1%\"", playlist); } bool SortPlaylist::canBeRun() const diff --git a/src/actions.h b/src/actions.h index 32fcbd1b..e578a76f 100644 --- a/src/actions.h +++ b/src/actions.h @@ -67,10 +67,10 @@ void setResizeFlags(); void resizeScreen(bool reload_main_window); void setWindowsDimensions(); -bool askYesNoQuestion(const boost::format &question); -inline bool askYesNoQuestion(const std::string &question) +void confirmAction(const boost::format &description); +inline void confirmAction(const std::string &description) { - return askYesNoQuestion(boost::format(question)); + confirmAction(boost::format(description)); } bool isMPDMusicDirSet(); diff --git a/src/playlist.cpp b/src/playlist.cpp index 4a2d8c1f..f85b126e 100644 --- a/src/playlist.cpp +++ b/src/playlist.cpp @@ -72,7 +72,6 @@ void Playlist::switchTo() { SwitchTo::execute(this); m_scroll_begin = 0; - EnableHighlighting(); drawHeader(); } diff --git a/src/tag_editor.cpp b/src/tag_editor.cpp index be442659..62b1a6a0 100644 --- a/src/tag_editor.cpp +++ b/src/tag_editor.cpp @@ -468,21 +468,16 @@ void TagEditor::enterPressed() if (w == TagTypes && id == 5) { - bool yes = Actions::askYesNoQuestion("Number tracks?"); - if (yes) + Actions::confirmAction("Number tracks?"); + auto it = EditedSongs.begin(); + for (unsigned i = 1; i <= EditedSongs.size(); ++i, ++it) { - auto it = EditedSongs.begin(); - for (unsigned i = 1; i <= EditedSongs.size(); ++i, ++it) - { - if (Config.tag_editor_extended_numeration) - (*it)->setTrack(boost::lexical_cast(i) + "/" + boost::lexical_cast(EditedSongs.size())); - else - (*it)->setTrack(boost::lexical_cast(i)); - } - Statusbar::print("Tracks numbered"); + if (Config.tag_editor_extended_numeration) + (*it)->setTrack(boost::lexical_cast(i) + "/" + boost::lexical_cast(EditedSongs.size())); + else + (*it)->setTrack(boost::lexical_cast(i)); } - else - Statusbar::print("Aborted"); + Statusbar::print("Tracks numbered"); return; } @@ -879,8 +874,9 @@ bool TagEditor::previousColumnAvailable() } else if (w == TagTypes) { - if (!Dirs->reallyEmpty()) - result = ifAnyModifiedAskForDiscarding(); + if (!Dirs->reallyEmpty() && isAnyModified(*Tags)) + Actions::confirmAction("There are pending changes, are you sure?"); + result = true; } else if (w == FParserHelper) result = true; @@ -959,14 +955,6 @@ void TagEditor::nextColumn() /***********************************************************************/ -bool TagEditor::ifAnyModifiedAskForDiscarding() -{ - bool result = true; - if (isAnyModified(*Tags)) - result = Actions::askYesNoQuestion("There are pending changes, are you sure?"); - return result; -} - void TagEditor::LocateSong(const MPD::Song &s) { if (myScreen == this) diff --git a/src/tag_editor.h b/src/tag_editor.h index 3013d35e..0cefbf64 100644 --- a/src/tag_editor.h +++ b/src/tag_editor.h @@ -77,7 +77,6 @@ struct TagEditor: Screen, Filterable, HasColumns, HasSongs, Search virtual void nextColumn() OVERRIDE; // private members - bool ifAnyModifiedAskForDiscarding(); void LocateSong(const MPD::Song &s); const std::string &CurrentDir() { return itsBrowsedDir; }