actions: split Delete into Delete{PlaylistItems,BrowserItems,StoredPlaylists}

master
Andrzej Rybczak 14 years ago
parent b57428db90
commit 552bc77318
  1. 5
      doc/bindings
  2. 171
      src/actions.cpp
  3. 25
      src/actions.h
  4. 10
      src/bindings.cpp
  5. 8
      src/browser.cpp
  6. 6
      src/help.cpp

@ -144,7 +144,10 @@
# press_enter
#
#def_key "delete"
# delete
# delete_playlist_items
#
#def_key "delete"
# delete_stored_playlist
#
#def_key "right"
# next_column

@ -781,101 +781,116 @@ void VolumeDown::Run()
Mpd.SetVolume(Mpd.GetVolume()-1);
}
void Delete::Run()
bool DeletePlaylistItems::canBeRun() const
{
if (myScreen == myPlaylist && !myPlaylist->main().empty())
return (myScreen == myPlaylist && !myPlaylist->main().empty())
|| (myScreen->isActiveWindow(myPlaylistEditor->Content) && !myPlaylistEditor->Content.empty());
}
void DeletePlaylistItems::Run()
{
if (myScreen == myPlaylist)
{
Statusbar::msg("Deleting items...");
auto delete_fun = std::bind(&MPD::Connection::Delete, _1, _2);
if (deleteSelectedSongs(myPlaylist->main(), delete_fun))
Statusbar::msg("Item(s) deleted");
}
# ifndef WIN32
else if (myScreen == myBrowser && !myBrowser->main().empty())
else if (myScreen->isActiveWindow(myPlaylistEditor->Content))
{
if (!myBrowser->isLocal() && !isMPDMusicDirSet())
return;
std::string question;
if (hasSelected(myBrowser->main().begin(), myBrowser->main().end()))
question = "Delete selected items?";
else
{
MPD::Item &item = myBrowser->main().current().value();
std::string name = item.type == MPD::itSong ? item.song->getName() : item.name;
question = "Delete ";
question += itemTypeToString(item.type);
question += " \"";
question += ToString(wideShorten(ToWString(name), COLS-question.size()-10));
question += "\"?";
}
bool yes = AskYesNoQuestion(question, Status::trace);
if (yes)
{
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 = (*it)->value();
std::string name = i.type == MPD::itSong ? i.song->getName() : i.name;
if (myBrowser->deleteItem(i))
{
const char msg[] = "\"%ls\" deleted";
Statusbar::msg(msg, wideShorten(ToWString(name), COLS-const_strlen(msg)).c_str());
}
else
{
const char msg[] = "Couldn't delete \"%ls\": %s";
Statusbar::msg(msg, wideShorten(ToWString(name), COLS-const_strlen(msg)-25).c_str(), strerror(errno));
success = false;
break;
}
}
if (success)
{
if (!myBrowser->isLocal())
Mpd.UpdateDirectory(myBrowser->CurrentDir());
}
}
else
Statusbar::msg("Aborted");
std::string playlist = myPlaylistEditor->Playlists.current().value();
auto delete_fun = std::bind(&MPD::Connection::PlaylistDelete, _1, playlist, _2);
Statusbar::msg("Deleting items...");
if (deleteSelectedSongs(myPlaylistEditor->Content, delete_fun))
Statusbar::msg("Item(s) deleted");
}
# endif // !WIN32
else if (myScreen == myPlaylistEditor && !myPlaylistEditor->Content.empty())
}
bool DeleteBrowserItems::canBeRun() const
{
return myScreen == myBrowser
&& !myBrowser->main().empty()
&& isMPDMusicDirSet();
}
void DeleteBrowserItems::Run()
{
std::string question;
if (hasSelected(myBrowser->main().begin(), myBrowser->main().end()))
question = "Delete selected items?";
else
{
if (myScreen->isActiveWindow(myPlaylistEditor->Playlists))
MPD::Item &item = myBrowser->main().current().value();
std::string name = item.type == MPD::itSong ? item.song->getName() : item.name;
question = "Delete ";
question += itemTypeToString(item.type);
question += " \"";
question += ToString(wideShorten(ToWString(name), COLS-question.size()-10));
question += "\"?";
}
bool yes = AskYesNoQuestion(question, Status::trace);
if (yes)
{
bool success = true;
auto list = getSelectedOrCurrent(myBrowser->main().begin(), myBrowser->main().end(), myBrowser->main().currentI());
for (auto it = list.begin(); it != list.end(); ++it)
{
std::string question;
if (hasSelected(myPlaylistEditor->Playlists.begin(), myPlaylistEditor->Playlists.end()))
question = "Delete selected playlists?";
else
const MPD::Item &i = (*it)->value();
std::string name = i.type == MPD::itSong ? i.song->getName() : i.name;
if (myBrowser->deleteItem(i))
{
question = "Delete playlist \"";
question += ToString(wideShorten(ToWString(myPlaylistEditor->Playlists.current().value()), COLS-question.size()-10));
question += "\"?";
const char msg[] = "\"%ls\" deleted";
Statusbar::msg(msg, wideShorten(ToWString(name), COLS-const_strlen(msg)).c_str());
}
bool yes = AskYesNoQuestion(question, Status::trace);
if (yes)
else
{
auto list = getSelectedOrCurrent(myPlaylistEditor->Playlists.begin(), myPlaylistEditor->Playlists.end(), myPlaylistEditor->Playlists.currentI());
Mpd.StartCommandsList();
for (auto it = list.begin(); it != list.end(); ++it)
Mpd.DeletePlaylist((*it)->value());
if (Mpd.CommitCommandsList())
Statusbar::msg("Playlist%s deleted", list.size() == 1 ? "" : "s");
const char msg[] = "Couldn't delete \"%ls\": %s";
Statusbar::msg(msg, wideShorten(ToWString(name), COLS-const_strlen(msg)-25).c_str(), strerror(errno));
success = false;
break;
}
else
Statusbar::msg("Aborted");
}
else if (myScreen->isActiveWindow(myPlaylistEditor->Content))
if (success)
{
std::string playlist = myPlaylistEditor->Playlists.current().value();
auto delete_fun = std::bind(&MPD::Connection::PlaylistDelete, _1, playlist, _2);
Statusbar::msg("Deleting items...");
if (deleteSelectedSongs(myPlaylistEditor->Content, delete_fun))
Statusbar::msg("Item(s) deleted");
if (myBrowser->isLocal())
myBrowser->GetDirectory(myBrowser->CurrentDir());
else
Mpd.UpdateDirectory(myBrowser->CurrentDir());
}
}
else
Statusbar::msg("Aborted");
}
bool DeleteStoredPlaylist::canBeRun() const
{
return myScreen->isActiveWindow(myPlaylistEditor->Playlists)
&& myPlaylistEditor->Playlists.empty();
}
void DeleteStoredPlaylist::Run()
{
std::string question;
if (hasSelected(myPlaylistEditor->Playlists.begin(), myPlaylistEditor->Playlists.end()))
question = "Delete selected playlists?";
else
{
question = "Delete playlist \"";
question += ToString(wideShorten(ToWString(myPlaylistEditor->Playlists.current().value()), COLS-question.size()-10));
question += "\"?";
}
bool yes = AskYesNoQuestion(question, Status::trace);
if (yes)
{
auto list = getSelectedOrCurrent(myPlaylistEditor->Playlists.begin(), myPlaylistEditor->Playlists.end(), myPlaylistEditor->Playlists.currentI());
Mpd.StartCommandsList();
for (auto it = list.begin(); it != list.end(); ++it)
Mpd.DeletePlaylist((*it)->value());
if (Mpd.CommitCommandsList())
Statusbar::msg("Playlist%s deleted", list.size() == 1 ? "" : "s");
}
else
Statusbar::msg("Aborted");
}
void ReplaySong::Run()
@ -2552,7 +2567,9 @@ void populateActions()
insertAction(new SlaveScreen());
insertAction(new VolumeUp());
insertAction(new VolumeDown());
insertAction(new Delete());
insertAction(new DeletePlaylistItems());
insertAction(new DeleteStoredPlaylist());
insertAction(new DeleteBrowserItems());
insertAction(new ReplaySong());
insertAction(new PreviousSong());
insertAction(new NextSong());

@ -31,7 +31,7 @@ enum ActionType
aDummy, aMouseEvent, aScrollUp, aScrollDown, aScrollUpArtist, aScrollUpAlbum, aScrollDownArtist,
aScrollDownAlbum, aPageUp, aPageDown, aMoveHome, aMoveEnd, aToggleInterface, aJumpToParentDirectory,
aPressEnter, aPressSpace, aPreviousColumn, aNextColumn, aMasterScreen, aSlaveScreen, aVolumeUp,
aVolumeDown, aDelete, aReplaySong, aPrevious, aNext, aPause, aStop, aSavePlaylist,
aVolumeDown, aDeletePlaylistItems, aDeleteStoredPlaylist, aDeleteBrowserItems, aReplaySong, aPrevious, aNext, aPause, aStop, aSavePlaylist,
aMoveSortOrderUp, aMoveSortOrderDown, aMoveSelectedItemsUp, aMoveSelectedItemsDown,
aMoveSelectedItemsTo, aAdd, aSeekForward, aSeekBackward, aToggleDisplayMode, aToggleSeparatorsBetweenAlbums,
aToggleLyricsFetcher, aToggleFetchingLyricsInBackground, aTogglePlayingSongCentering, aUpdateDatabase,
@ -294,11 +294,30 @@ protected:
virtual void Run();
};
struct Delete : public Action
struct DeletePlaylistItems : public Action
{
Delete() : Action(aDelete, "delete") { }
DeletePlaylistItems() : Action(aDeletePlaylistItems, "delete_playlist_items") { }
protected:
virtual bool canBeRun() const;
virtual void Run();
};
struct DeleteStoredPlaylist : public Action
{
DeleteStoredPlaylist() : Action(aDeleteStoredPlaylist, "delete_stored_playlist") { }
protected:
virtual bool canBeRun() const;
virtual void Run();
};
struct DeleteBrowserItems : public Action
{
DeleteBrowserItems() : Action(aDeleteBrowserItems, "delete_browser_items") { }
protected:
virtual bool canBeRun() const;
virtual void Run();
};

@ -256,6 +256,11 @@ bool BindingsConfiguration::read(const std::string &file)
break;
}
}
else
{
error() << "invalid line: '" << line << "'\n";
break;
}
}
if (key_def_in_progress)
bind_key_def();
@ -293,7 +298,10 @@ void BindingsConfiguration::generateDefaults()
if (notBound(k = stringToKey("enter")))
bind(k, aPressEnter);
if (notBound(k = stringToKey("delete")))
bind(k, aDelete);
{
bind(k, aDeletePlaylistItems);
bind(k, aDeleteStoredPlaylist);
}
if (notBound(k = stringToKey("right")))
{
bind(k, aNextColumn);

@ -27,6 +27,7 @@
#include "browser.h"
#include "charset.h"
#include "display.h"
#include "error.h"
#include "global.h"
#include "helpers.h"
#include "playlist.h"
@ -555,9 +556,8 @@ void Browser::ChangeBrowseMode()
bool Browser::deleteItem(const MPD::Item &item)
{
// parent dir
if (item.type == itDirectory && item.name == "..")
return false;
if (isParentDirectory((item)))
FatalError("Parent directory passed to Browser::deleteItem");
// playlist created by mpd
if (!isLocal() && item.type == itPlaylist && CurrentDir() == "/")
@ -571,7 +571,7 @@ bool Browser::deleteItem(const MPD::Item &item)
if (item.type == itDirectory)
ClearDirectory(path);
return remove(path.c_str()) == 0;
return std::remove(path.c_str()) == 0;
}
#endif // !WIN32

@ -268,7 +268,7 @@ void Help::GetKeybindings()
KeysSection("Playlist");
KeyDesc(aPressEnter, "Play selected item");
KeyDesc(aDelete, "Delete selected item(s) from playlist");
KeyDesc(aDeletePlaylistItems, "Delete selected item(s) from playlist");
KeyDesc(aClearMainPlaylist, "Clear playlist");
KeyDesc(aCropMainPlaylist, "Clear playlist except selected item(s)");
KeyDesc(aSetSelectedItemsPriority, "Set priority of selected items");
@ -298,7 +298,7 @@ void Help::GetKeybindings()
KeyDesc(aToggleBrowserSortMode, "Toggle sort mode");
KeyDesc(aJumpToPlayingSong, "Locate playing song");
KeyDesc(aJumpToParentDirectory, "Jump to parent directory");
KeyDesc(aDelete, "Delete item");
KeyDesc(aDeleteBrowserItems, "Delete selected items from disk");
KeyDesc(aJumpToPlaylistEditor, "Jump to playlist editor (playlists only)");
KeysSection("Search engine");
@ -333,6 +333,8 @@ void Help::GetKeybindings()
KeyDesc(aEditPlaylistName, "Edit playlist name");
KeyDesc(aMoveSelectedItemsUp, "Move selected item(s) up");
KeyDesc(aMoveSelectedItemsDown, "Move selected item(s) down");
KeyDesc(aDeleteStoredPlaylist, "Delete selected playlists (left column)");
KeyDesc(aDeletePlaylistItems, "Delete selected item(s) from playlist (right column)");
KeyDesc(aClearPlaylist, "Clear playlist");
KeyDesc(aCropPlaylist, "Clear playlist except selected items");

Loading…
Cancel
Save