menu: move a few methods to Item class
This commit is contained in:
106
src/actions.cpp
106
src/actions.cpp
@@ -761,11 +761,11 @@ void Delete::Run()
|
||||
myPlaylist->Items->GetSelected(list);
|
||||
Mpd.StartCommandsList();
|
||||
for (std::vector<size_t>::reverse_iterator it = list.rbegin(); it != list.rend(); ++it)
|
||||
Mpd.DeleteID((*myPlaylist->Items)[*it].getID());
|
||||
Mpd.DeleteID((*myPlaylist->Items)[*it].value().getID());
|
||||
if (Mpd.CommitCommandsList())
|
||||
{
|
||||
for (size_t i = 0; i < myPlaylist->Items->Size(); ++i)
|
||||
myPlaylist->Items->Select(i, 0);
|
||||
for (auto it = myPlaylist->Items->Begin(); it != myPlaylist->Items->End(); ++it)
|
||||
it->setSelected(false);
|
||||
ShowMessage("Selected items deleted");
|
||||
}
|
||||
}
|
||||
@@ -773,15 +773,15 @@ void Delete::Run()
|
||||
Mpd.DeleteID(myPlaylist->CurrentSong()->getID());
|
||||
}
|
||||
else if (
|
||||
(myScreen == myBrowser && !myBrowser->Main()->Empty() && myBrowser->CurrentDir() == "/" && myBrowser->Main()->Current().type == itPlaylist)
|
||||
(myScreen == myBrowser && !myBrowser->Main()->Empty() && myBrowser->CurrentDir() == "/" && myBrowser->Main()->Current().value().type == itPlaylist)
|
||||
|| (myScreen->ActiveWindow() == myPlaylistEditor->Playlists)
|
||||
)
|
||||
{
|
||||
std::string name;
|
||||
if (myScreen == myBrowser)
|
||||
name = myBrowser->Main()->Current().name;
|
||||
name = myBrowser->Main()->Current().value().name;
|
||||
else
|
||||
name = myPlaylistEditor->Playlists->Current();
|
||||
name = myPlaylistEditor->Playlists->Current().value();
|
||||
bool yes = AskYesNoQuestion("Delete playlist \"" + Shorten(TO_WSTRING(name), COLS-28) + "\"?", TraceMpdStatus);
|
||||
if (yes)
|
||||
{
|
||||
@@ -804,7 +804,7 @@ void Delete::Run()
|
||||
if (!myBrowser->isLocal() && !isMPDMusicDirSet())
|
||||
return;
|
||||
|
||||
MPD::Item &item = myBrowser->Main()->Current();
|
||||
MPD::Item &item = myBrowser->Main()->Current().value();
|
||||
|
||||
if (item.type == itSong && !Config.allow_physical_files_deletion)
|
||||
{
|
||||
@@ -841,7 +841,7 @@ void Delete::Run()
|
||||
bool success = 1;
|
||||
for (size_t i = 0; i < list.size(); ++i)
|
||||
{
|
||||
const MPD::Item &it = (*myBrowser->Main())[list[i]];
|
||||
const MPD::Item &it = (*myBrowser->Main())[list[i]].value();
|
||||
name = it.type == itSong ? it.song->getName() : it.name;
|
||||
if (myBrowser->DeleteItem(it))
|
||||
{
|
||||
@@ -875,7 +875,7 @@ void Delete::Run()
|
||||
{
|
||||
std::vector<size_t> list;
|
||||
myPlaylistEditor->Content->GetSelected(list);
|
||||
std::string playlist = locale_to_utf_cpy(myPlaylistEditor->Playlists->Current());
|
||||
std::string playlist = locale_to_utf_cpy(myPlaylistEditor->Playlists->Current().value());
|
||||
ShowMessage("Deleting selected items...");
|
||||
Mpd.StartCommandsList();
|
||||
for (std::vector<size_t>::reverse_iterator it = list.rbegin(); it != list.rend(); ++it)
|
||||
@@ -884,11 +884,11 @@ void Delete::Run()
|
||||
myPlaylistEditor->Content->DeleteItem(*it);
|
||||
}
|
||||
Mpd.CommitCommandsList();
|
||||
ShowMessage("Selected items deleted from playlist \"%s\"", myPlaylistEditor->Playlists->Current().c_str());
|
||||
ShowMessage("Selected items deleted from playlist \"%s\"", myPlaylistEditor->Playlists->Current().value().c_str());
|
||||
}
|
||||
else
|
||||
{
|
||||
if (Mpd.Delete(myPlaylistEditor->Playlists->Current(), myPlaylistEditor->Content->Choice()))
|
||||
if (Mpd.Delete(myPlaylistEditor->Playlists->Current().value(), myPlaylistEditor->Content->Choice()))
|
||||
myPlaylistEditor->Content->DeleteItem(myPlaylistEditor->Content->Choice());
|
||||
}
|
||||
}
|
||||
@@ -935,7 +935,7 @@ void SavePlaylist::Run()
|
||||
{
|
||||
Mpd.StartCommandsList();
|
||||
for (size_t i = 0; i < myPlaylist->Items->Size(); ++i)
|
||||
Mpd.AddToPlaylist(real_playlist_name, (*myPlaylist->Items)[i]);
|
||||
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());
|
||||
@@ -1061,8 +1061,8 @@ void MoveSelectedItemsTo::Run()
|
||||
i = list.size()-1;
|
||||
for (it = list.rbegin(); it != list.rend(); ++it, --i)
|
||||
{
|
||||
myPlaylist->Items->Select(*it, false);
|
||||
myPlaylist->Items->Select(pos+i, true);
|
||||
myPlaylist->Items->at(*it).setSelected(false);
|
||||
myPlaylist->Items->at(pos+i).setSelected(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1077,8 +1077,8 @@ void MoveSelectedItemsTo::Run()
|
||||
i = 0;
|
||||
for (it = list.begin(); it != list.end(); ++it, ++i)
|
||||
{
|
||||
myPlaylist->Items->Select(*it, false);
|
||||
myPlaylist->Items->Select(pos+i, true);
|
||||
myPlaylist->Items->at(*it).setSelected(false);
|
||||
myPlaylist->Items->at(pos+i).setSelected(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1105,7 +1105,7 @@ void Add::Run()
|
||||
wFooter->Refresh();
|
||||
if (myScreen == myPlaylistEditor)
|
||||
{
|
||||
Mpd.AddToPlaylist(myPlaylistEditor->Playlists->Current(), path);
|
||||
Mpd.AddToPlaylist(myPlaylistEditor->Playlists->Current().value(), path);
|
||||
myPlaylistEditor->Content->Clear(); // make it refetch content of playlist
|
||||
}
|
||||
else
|
||||
@@ -1316,7 +1316,7 @@ bool StartSearching::canBeRun() const
|
||||
|
||||
void StartSearching::Run()
|
||||
{
|
||||
if (mySearcher->Main()->isStatic(0))
|
||||
if (mySearcher->Main()->at(0).isInactive())
|
||||
return;
|
||||
mySearcher->Main()->Highlight(SearchEngine::SearchButton);
|
||||
mySearcher->Main()->Highlighting(0);
|
||||
@@ -1422,13 +1422,13 @@ void EditLibraryTag::Run()
|
||||
return;
|
||||
LockStatusbar();
|
||||
Statusbar() << fmtBold << tagTypeToString(Config.media_lib_primary_tag) << fmtBoldEnd << ": ";
|
||||
std::string new_tag = wFooter->GetString(myLibrary->Artists->Current());
|
||||
std::string new_tag = wFooter->GetString(myLibrary->Artists->Current().value());
|
||||
UnlockStatusbar();
|
||||
if (!new_tag.empty() && new_tag != myLibrary->Artists->Current())
|
||||
if (!new_tag.empty() && new_tag != myLibrary->Artists->Current().value())
|
||||
{
|
||||
ShowMessage("Updating tags...");
|
||||
Mpd.StartSearch(1);
|
||||
Mpd.AddSearch(Config.media_lib_primary_tag, locale_to_utf_cpy(myLibrary->Artists->Current()));
|
||||
Mpd.AddSearch(Config.media_lib_primary_tag, locale_to_utf_cpy(myLibrary->Artists->Current().value()));
|
||||
MPD::MutableSong::SetFunction set = tagTypeToSetFunction(Config.media_lib_primary_tag);
|
||||
assert(set);
|
||||
bool success = true;
|
||||
@@ -1479,21 +1479,21 @@ void EditLibraryAlbum::Run()
|
||||
return;
|
||||
LockStatusbar();
|
||||
Statusbar() << fmtBold << "Album: " << fmtBoldEnd;
|
||||
std::string new_album = wFooter->GetString(myLibrary->Albums->Current().Album);
|
||||
std::string new_album = wFooter->GetString(myLibrary->Albums->Current().value().Album);
|
||||
UnlockStatusbar();
|
||||
if (!new_album.empty() && new_album != myLibrary->Albums->Current().Album)
|
||||
if (!new_album.empty() && new_album != myLibrary->Albums->Current().value().Album)
|
||||
{
|
||||
bool success = 1;
|
||||
ShowMessage("Updating tags...");
|
||||
for (size_t i = 0; i < myLibrary->Songs->Size(); ++i)
|
||||
{
|
||||
ShowMessage("Updating tags in \"%s\"...", (*myLibrary->Songs)[i].getName().c_str());
|
||||
std::string path = Config.mpd_music_dir + (*myLibrary->Songs)[i].getURI();
|
||||
ShowMessage("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 \"%s\"";
|
||||
ShowMessage(msg, Shorten(TO_WSTRING((*myLibrary->Songs)[i].getURI()), COLS-const_strlen(msg)).c_str());
|
||||
ShowMessage(msg, Shorten(TO_WSTRING((*myLibrary->Songs)[i].value().getURI()), COLS-const_strlen(msg)).c_str());
|
||||
success = 0;
|
||||
break;
|
||||
}
|
||||
@@ -1501,7 +1501,7 @@ void EditLibraryAlbum::Run()
|
||||
if (!f.save())
|
||||
{
|
||||
const char msg[] = "Error while writing tags in \"%s\"";
|
||||
ShowMessage(msg, Shorten(TO_WSTRING((*myLibrary->Songs)[i].getURI()), COLS-const_strlen(msg)).c_str());
|
||||
ShowMessage(msg, Shorten(TO_WSTRING((*myLibrary->Songs)[i].value().getURI()), COLS-const_strlen(msg)).c_str());
|
||||
success = 0;
|
||||
break;
|
||||
}
|
||||
@@ -1519,7 +1519,7 @@ bool EditDirectoryName::canBeRun() const
|
||||
{
|
||||
return (myScreen == myBrowser
|
||||
&& !myBrowser->Main()->Empty()
|
||||
&& myBrowser->Main()->Current().type == MPD::itDirectory)
|
||||
&& myBrowser->Main()->Current().value().type == MPD::itDirectory)
|
||||
# ifdef HAVE_TAGLIB_H
|
||||
|| (myScreen->ActiveWindow() == myTagEditor->Dirs
|
||||
&& !myTagEditor->Dirs->Empty()
|
||||
@@ -1536,7 +1536,7 @@ void EditDirectoryName::Run()
|
||||
return;
|
||||
if (myScreen == myBrowser)
|
||||
{
|
||||
std::string old_dir = myBrowser->Main()->Current().name;
|
||||
std::string old_dir = myBrowser->Main()->Current().value().name;
|
||||
LockStatusbar();
|
||||
Statusbar() << fmtBold << "Directory: " << fmtBoldEnd;
|
||||
std::string new_dir = wFooter->GetString(old_dir);
|
||||
@@ -1570,7 +1570,7 @@ void EditDirectoryName::Run()
|
||||
# ifdef HAVE_TAGLIB_H
|
||||
else if (myScreen->ActiveWindow() == myTagEditor->Dirs)
|
||||
{
|
||||
std::string old_dir = myTagEditor->Dirs->Current().first;
|
||||
std::string old_dir = myTagEditor->Dirs->Current().value().first;
|
||||
LockStatusbar();
|
||||
Statusbar() << fmtBold << "Directory: " << fmtBoldEnd;
|
||||
std::string new_dir = wFooter->GetString(old_dir);
|
||||
@@ -1601,7 +1601,7 @@ bool EditPlaylistName::canBeRun() const
|
||||
&& !myPlaylistEditor->Playlists->Empty())
|
||||
|| (myScreen == myBrowser
|
||||
&& !myBrowser->Main()->Empty()
|
||||
&& myBrowser->Main()->Current().type == MPD::itPlaylist);
|
||||
&& myBrowser->Main()->Current().value().type == MPD::itPlaylist);
|
||||
}
|
||||
|
||||
void EditPlaylistName::Run()
|
||||
@@ -1610,9 +1610,9 @@ void EditPlaylistName::Run()
|
||||
|
||||
std::string old_name;
|
||||
if (myScreen->ActiveWindow() == myPlaylistEditor->Playlists)
|
||||
old_name = myPlaylistEditor->Playlists->Current();
|
||||
old_name = myPlaylistEditor->Playlists->Current().value();
|
||||
else
|
||||
old_name = myBrowser->Main()->Current().name;
|
||||
old_name = myBrowser->Main()->Current().value().name;
|
||||
LockStatusbar();
|
||||
Statusbar() << fmtBold << "Playlist: " << fmtBoldEnd;
|
||||
std::string new_name = wFooter->GetString(old_name);
|
||||
@@ -1668,12 +1668,12 @@ void JumpToMediaLibrary::Run()
|
||||
bool JumpToPlaylistEditor::canBeRun() const
|
||||
{
|
||||
return myScreen == myBrowser
|
||||
&& myBrowser->Main()->Current().type == MPD::itPlaylist;
|
||||
&& myBrowser->Main()->Current().value().type == MPD::itPlaylist;
|
||||
}
|
||||
|
||||
void JumpToPlaylistEditor::Run()
|
||||
{
|
||||
myPlaylistEditor->Locate(myBrowser->Main()->Current().name);
|
||||
myPlaylistEditor->Locate(myBrowser->Main()->Current().value().name);
|
||||
}
|
||||
|
||||
void ToggleScreenLock::Run()
|
||||
@@ -1804,12 +1804,13 @@ bool DeselectItems::canBeRun() const
|
||||
|
||||
void DeselectItems::Run()
|
||||
{
|
||||
List *mList = myScreen->GetList();
|
||||
// FIXME
|
||||
/*List *mList = myScreen->GetList();
|
||||
if (!mList->hasSelected())
|
||||
return;
|
||||
for (size_t i = 0; i < mList->Size(); ++i)
|
||||
mList->Select(i, 0);
|
||||
ShowMessage("Items deselected");
|
||||
ShowMessage("Items deselected");*/
|
||||
}
|
||||
|
||||
bool SelectAlbum::canBeRun() const
|
||||
@@ -1820,7 +1821,8 @@ bool SelectAlbum::canBeRun() const
|
||||
|
||||
void SelectAlbum::Run()
|
||||
{
|
||||
List *mList = myScreen->GetList();
|
||||
// FIXME
|
||||
/*List *mList = myScreen->GetList();
|
||||
assert(mList);
|
||||
size_t pos = mList->Choice();
|
||||
if (MPD::Song *s = myScreen->GetSong(pos))
|
||||
@@ -1850,6 +1852,7 @@ void SelectAlbum::Run()
|
||||
}
|
||||
ShowMessage("Album around cursor position selected");
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
void AddSelectedItems::Run()
|
||||
@@ -1872,14 +1875,14 @@ void CropMainPlaylist::Run()
|
||||
for (int i = myPlaylist->Items->Size()-1; i >= 0; --i)
|
||||
{
|
||||
bool delete_i = (delete_all_but_current && i != current)
|
||||
|| (!delete_all_but_current && !myPlaylist->Items->isSelected(i));
|
||||
|| (!delete_all_but_current && !myPlaylist->Items->at(i).isSelected());
|
||||
if (delete_i && i != myPlaylist->NowPlaying)
|
||||
Mpd.Delete(i);
|
||||
}
|
||||
// if mpd deletes now playing song deletion will be sluggishly slow
|
||||
// then so we have to assure it will be deleted at the very end.
|
||||
bool delete_np = (delete_all_but_current && current != myPlaylist->NowPlaying)
|
||||
|| (!delete_all_but_current && !myPlaylist->Items->isSelected(myPlaylist->NowPlaying));
|
||||
|| (!delete_all_but_current && !myPlaylist->Items->at(myPlaylist->NowPlaying).isSelected());
|
||||
if (myPlaylist->isPlaying() && delete_np)
|
||||
Mpd.DeleteID(myPlaylist->NowPlayingSong()->getID());
|
||||
ShowMessage("Cropping playlist...");
|
||||
@@ -1899,24 +1902,24 @@ void CropPlaylist::Run()
|
||||
return;
|
||||
bool yes = true;
|
||||
if (Config.ask_before_clearing_main_playlist)
|
||||
yes = AskYesNoQuestion("Do you really want to crop playlist \"" + myPlaylistEditor->Playlists->Current() + "\"?", TraceMpdStatus);
|
||||
yes = AskYesNoQuestion("Do you really want to crop playlist \"" + myPlaylistEditor->Playlists->Current().value() + "\"?", TraceMpdStatus);
|
||||
if (yes)
|
||||
{
|
||||
bool delete_all_but_current = !myPlaylistEditor->Content->hasSelected();
|
||||
Mpd.StartCommandsList();
|
||||
int current = myPlaylistEditor->Content->Choice();
|
||||
std::string playlist = locale_to_utf_cpy(myPlaylistEditor->Playlists->Current());
|
||||
std::string playlist = locale_to_utf_cpy(myPlaylistEditor->Playlists->Current().value());
|
||||
for (int i = myPlaylistEditor->Content->Size()-1; i >= 0; --i)
|
||||
{
|
||||
bool delete_i = (delete_all_but_current && i != current)
|
||||
|| (!delete_all_but_current && !myPlaylistEditor->Content->isSelected(i));
|
||||
|| (!delete_all_but_current && !myPlaylistEditor->Content->at(i).isSelected());
|
||||
if (delete_i)
|
||||
Mpd.Delete(playlist, i);
|
||||
}
|
||||
ShowMessage("Cropping playlist \"%s\"...", myPlaylistEditor->Playlists->Current().c_str());
|
||||
ShowMessage("Cropping playlist \"%s\"...", myPlaylistEditor->Playlists->Current().value().c_str());
|
||||
if (Mpd.CommitCommandsList())
|
||||
{
|
||||
ShowMessage("Playlist \"%s\" cropped", myPlaylistEditor->Playlists->Current().c_str());
|
||||
ShowMessage("Playlist \"%s\" cropped", myPlaylistEditor->Playlists->Current().value().c_str());
|
||||
// enforce content update
|
||||
myPlaylistEditor->Content->Clear();
|
||||
}
|
||||
@@ -1935,7 +1938,7 @@ void ClearMainPlaylist::Run()
|
||||
ShowMessage("Deleting filtered items...");
|
||||
Mpd.StartCommandsList();
|
||||
for (int i = myPlaylist->Items->Size()-1; i >= 0; --i)
|
||||
Mpd.Delete((*myPlaylist->Items)[i].getPosition());
|
||||
Mpd.Delete((*myPlaylist->Items)[i].value().getPosition());
|
||||
if (Mpd.CommitCommandsList())
|
||||
ShowMessage("Filtered items deleted");
|
||||
}
|
||||
@@ -1959,13 +1962,12 @@ void ClearPlaylist::Run()
|
||||
return;
|
||||
bool yes = true;
|
||||
if (Config.ask_before_clearing_main_playlist)
|
||||
yes = AskYesNoQuestion("Do you really want to clear playlist \"" + myPlaylistEditor->Playlists->Current() + "\"?", TraceMpdStatus);
|
||||
yes = AskYesNoQuestion("Do you really want to clear playlist \"" + myPlaylistEditor->Playlists->Current().value() + "\"?", TraceMpdStatus);
|
||||
if (yes)
|
||||
{
|
||||
|
||||
ShowMessage("Clearing playlist \"%s\"...", myPlaylistEditor->Playlists->Current().c_str());
|
||||
if (Mpd.ClearPlaylist(locale_to_utf_cpy(myPlaylistEditor->Playlists->Current())))
|
||||
ShowMessage("Playlist \"%s\" cleared", myPlaylistEditor->Playlists->Current().c_str());
|
||||
ShowMessage("Clearing playlist \"%s\"...", myPlaylistEditor->Playlists->Current().value().c_str());
|
||||
if (Mpd.ClearPlaylist(locale_to_utf_cpy(myPlaylistEditor->Playlists->Current().value())))
|
||||
ShowMessage("Playlist \"%s\" cleared", myPlaylistEditor->Playlists->Current().value().c_str());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2345,7 +2347,7 @@ void ShowArtistInfo::Run()
|
||||
if (s)
|
||||
artist = s->getArtist();
|
||||
else if (myScreen == myLibrary && myLibrary->Main() == myLibrary->Artists && !myLibrary->Artists->Empty())
|
||||
artist = myLibrary->Artists->Current();
|
||||
artist = myLibrary->Artists->Current().value();
|
||||
|
||||
if (!artist.empty() && myLastfm->SetArtistInfoArgs(artist, Config.lastfm_preferred_language))
|
||||
myLastfm->SwitchTo();
|
||||
|
||||
@@ -121,7 +121,7 @@ void Browser::EnterPressed()
|
||||
if (w->Empty())
|
||||
return;
|
||||
|
||||
const MPD::Item &item = w->Current();
|
||||
const MPD::Item &item = w->Current().value();
|
||||
switch (item.type)
|
||||
{
|
||||
case itDirectory:
|
||||
@@ -141,8 +141,9 @@ void Browser::EnterPressed()
|
||||
}
|
||||
case itSong:
|
||||
{
|
||||
bool res = myPlaylist->Add(*item.song, w->isBold(), 1);
|
||||
w->Bold(w->Choice(), res);
|
||||
size_t i = w->Choice();
|
||||
bool res = myPlaylist->Add(*item.song, w->at(i).isBold(), 1);
|
||||
w->at(i).setBold(res);
|
||||
break;
|
||||
}
|
||||
case itPlaylist:
|
||||
@@ -161,9 +162,11 @@ void Browser::SpacePressed()
|
||||
if (w->Empty())
|
||||
return;
|
||||
|
||||
if (Config.space_selects && w->Choice() >= (itsBrowsedDir != "/" ? 1 : 0))
|
||||
size_t i = itsBrowsedDir != "/" ? 1 : 0;
|
||||
if (Config.space_selects && w->Choice() >= i)
|
||||
{
|
||||
w->Select(w->Choice(), !w->isSelected());
|
||||
i = w->Choice();
|
||||
w->at(i).setSelected(!w->at(i).isSelected());
|
||||
w->Scroll(wDown);
|
||||
return;
|
||||
}
|
||||
@@ -171,7 +174,7 @@ void Browser::SpacePressed()
|
||||
if (isParentDir(w->Choice()))
|
||||
return;
|
||||
|
||||
const MPD::Item &item = w->Current();
|
||||
const MPD::Item &item = w->Current().value();
|
||||
switch (item.type)
|
||||
{
|
||||
case itDirectory:
|
||||
@@ -198,8 +201,9 @@ void Browser::SpacePressed()
|
||||
}
|
||||
case itSong:
|
||||
{
|
||||
bool res = myPlaylist->Add(*item.song, w->isBold(), 0);
|
||||
w->Bold(w->Choice(), res);
|
||||
i = w->Choice();
|
||||
bool res = myPlaylist->Add(*item.song, w->at(i).isBold(), 0);
|
||||
w->at(i).setBold(res);
|
||||
break;
|
||||
}
|
||||
case itPlaylist:
|
||||
@@ -219,12 +223,12 @@ void Browser::MouseButtonPressed(MEVENT me)
|
||||
if (me.bstate & (BUTTON1_PRESSED | BUTTON3_PRESSED))
|
||||
{
|
||||
w->Goto(me.y);
|
||||
switch (w->Current().type)
|
||||
switch (w->Current().value().type)
|
||||
{
|
||||
case itDirectory:
|
||||
if (me.bstate & BUTTON1_PRESSED)
|
||||
{
|
||||
GetDirectory(w->Current().name);
|
||||
GetDirectory(w->Current().value().name);
|
||||
RedrawHeader = true;
|
||||
}
|
||||
else
|
||||
@@ -255,7 +259,11 @@ void Browser::MouseButtonPressed(MEVENT me)
|
||||
|
||||
MPD::Song *Browser::CurrentSong()
|
||||
{
|
||||
return !w->Empty() && w->Current().type == itSong ? w->Current().song.get() : 0;
|
||||
const MPD::Item &item = w->Current().value();
|
||||
if (!w->Empty() && item.type == itSong)
|
||||
return item.song.get();
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
void Browser::ReverseSelection()
|
||||
@@ -273,7 +281,7 @@ void Browser::GetSelectedSongs(MPD::SongList &v)
|
||||
selected.push_back(w->Choice());
|
||||
for (auto it = selected.begin(); it != selected.end(); ++it)
|
||||
{
|
||||
const MPD::Item &item = w->at(*it);
|
||||
const MPD::Item &item = w->at(*it).value();
|
||||
switch (item.type)
|
||||
{
|
||||
case itDirectory:
|
||||
@@ -341,7 +349,7 @@ void Browser::LocateSong(const MPD::Song &s)
|
||||
GetDirectory(s.getDirectory());
|
||||
for (size_t i = 0; i < w->Size(); ++i)
|
||||
{
|
||||
if ((*w)[i].type == itSong && s.getHash() == (*w)[i].song->getHash())
|
||||
if ((*w)[i].value().type == itSong && s.getHash() == (*w)[i].value().song->getHash())
|
||||
{
|
||||
w->Highlight(i);
|
||||
break;
|
||||
@@ -413,7 +421,7 @@ void Browser::GetDirectory(std::string dir, std::string subdir)
|
||||
bool bold = 0;
|
||||
for (size_t i = 0; i < myPlaylist->Items->Size(); ++i)
|
||||
{
|
||||
if (myPlaylist->Items->at(i).getHash() == it->song->getHash())
|
||||
if (myPlaylist->Items->at(i).value().getHash() == it->song->getHash())
|
||||
{
|
||||
bold = 1;
|
||||
break;
|
||||
@@ -568,8 +576,8 @@ bool Browser::DeleteItem(const MPD::Item &item)
|
||||
void Browser::UpdateItemList()
|
||||
{
|
||||
for (size_t i = 0; i < w->Size(); ++i)
|
||||
if ((*w)[i].type == itSong)
|
||||
w->Bold(i, myPlaylist->checkForSong(*(*w)[i].song));
|
||||
if ((*w)[i].value().type == itSong)
|
||||
w->at(i).setBold(myPlaylist->checkForSong(*(*w)[i].value().song));
|
||||
w->Refresh();
|
||||
}
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ class Browser : public Screen< Menu<MPD::Item> >
|
||||
virtual bool isTabbable() { return true; }
|
||||
|
||||
virtual MPD::Song *CurrentSong();
|
||||
virtual MPD::Song *GetSong(size_t pos) { return w->at(pos).type == MPD::itSong ? (*w)[pos].song.get() : 0; }
|
||||
virtual MPD::Song *GetSong(size_t pos) { return w->at(pos).value().type == MPD::itSong ? (*w)[pos].value().song.get() : 0; }
|
||||
|
||||
virtual bool allowsSelection() { return true; }
|
||||
virtual void ReverseSelection();
|
||||
|
||||
@@ -157,7 +157,7 @@ void Display::SongsInColumns(Menu<MPD::Song> &menu, const MPD::Song &s, BasicScr
|
||||
|
||||
int song_pos = menu.isFiltered() ? s.getPosition() : menu.CurrentlyDrawedPosition();
|
||||
bool is_now_playing = &menu == myPlaylist->Items && song_pos == myPlaylist->NowPlaying;
|
||||
bool is_selected = menu.isSelected(menu.CurrentlyDrawedPosition());
|
||||
bool is_selected = menu[menu.CurrentlyDrawedPosition()].isSelected();
|
||||
bool discard_colors = Config.discard_colors_if_item_is_selected && is_selected;
|
||||
|
||||
if (is_now_playing)
|
||||
@@ -287,7 +287,8 @@ void Display::Songs(Menu<MPD::Song> &menu, const MPD::Song &s, BasicScreen &scre
|
||||
mvwhline(menu.Raw(), menu.Y(), 0, ' ', menu.GetWidth());
|
||||
}
|
||||
|
||||
bool discard_colors = Config.discard_colors_if_item_is_selected && menu.isSelected(menu.CurrentlyDrawedPosition());
|
||||
bool discard_colors = Config.discard_colors_if_item_is_selected
|
||||
&& menu[menu.CurrentlyDrawedPosition()].isSelected();
|
||||
|
||||
std::string line = s.toString(format, "$");
|
||||
for (std::string::const_iterator it = line.begin(); it != line.end(); ++it)
|
||||
@@ -313,7 +314,7 @@ void Display::Songs(Menu<MPD::Song> &menu, const MPD::Song &s, BasicScreen &scre
|
||||
buf.RemoveFormatting();
|
||||
if (is_now_playing)
|
||||
buf << Config.now_playing_suffix;
|
||||
menu << XY(menu.GetWidth()-buf.Str().length()-(menu.isSelected(menu.CurrentlyDrawedPosition()) ? Config.selected_item_suffix_length : 0), menu.Y()) << buf;
|
||||
menu << XY(menu.GetWidth()-buf.Str().length()-(menu[menu.CurrentlyDrawedPosition()].isSelected() ? Config.selected_item_suffix_length : 0), menu.Y()) << buf;
|
||||
if (separate_albums)
|
||||
menu << fmtUnderlineEnd;
|
||||
return;
|
||||
|
||||
@@ -294,13 +294,13 @@ void UpdateSongList(Menu<MPD::Song> *menu)
|
||||
{
|
||||
for (size_t j = 0; j < myPlaylist->Items->Size(); ++j)
|
||||
{
|
||||
if (myPlaylist->Items->at(j).getHash() == menu->at(i).getHash())
|
||||
if (myPlaylist->Items->at(j).value().getHash() == menu->at(i).value().getHash())
|
||||
{
|
||||
bold = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
menu->Bold(i, bold);
|
||||
(*menu)[i].setBold(bold);
|
||||
bold = 0;
|
||||
}
|
||||
menu->Refresh();
|
||||
|
||||
@@ -177,10 +177,10 @@ template <typename T> std::string getSharedDirectory(Menu<T> *menu)
|
||||
{
|
||||
assert(!menu->Empty());
|
||||
std::string dir;
|
||||
dir = (*menu)[0].getDirectory();
|
||||
// dir = (*menu)[0].value().getDirectory();
|
||||
for (size_t i = 1; i < menu->Size(); ++i)
|
||||
{
|
||||
dir = getSharedDirectory(dir, (*menu)[i].getDirectory());
|
||||
dir = getSharedDirectory(dir, (*menu)[i].value().getDirectory());
|
||||
if (dir == "/")
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -221,9 +221,9 @@ void MediaLibrary::Update()
|
||||
Mpd.BlockIdle(1);
|
||||
Albums->Reset();
|
||||
MPD::TagList list;
|
||||
locale_to_utf(Artists->Current());
|
||||
locale_to_utf(Artists->Current().value());
|
||||
Mpd.StartFieldSearch(MPD_TAG_ALBUM);
|
||||
Mpd.AddSearch(Config.media_lib_primary_tag, Artists->Current());
|
||||
Mpd.AddSearch(Config.media_lib_primary_tag, Artists->Current().value());
|
||||
Mpd.CommitSearchTags([&list](std::string &&album) {
|
||||
list.push_back(album);
|
||||
});
|
||||
@@ -232,7 +232,7 @@ void MediaLibrary::Update()
|
||||
if (Config.media_library_display_date)
|
||||
{
|
||||
Mpd.StartFieldSearch(MPD_TAG_DATE);
|
||||
Mpd.AddSearch(Config.media_lib_primary_tag, Artists->Current());
|
||||
Mpd.AddSearch(Config.media_lib_primary_tag, Artists->Current().value());
|
||||
Mpd.AddSearch(MPD_TAG_ALBUM, *album);
|
||||
utf_to_locale(*album);
|
||||
Mpd.CommitSearchTags([this, &album](std::string &&date) {
|
||||
@@ -246,7 +246,7 @@ void MediaLibrary::Update()
|
||||
Albums->AddItem(SearchConstraints(*album, ""));
|
||||
}
|
||||
}
|
||||
utf_to_locale(Artists->Current());
|
||||
utf_to_locale(Artists->Current().value());
|
||||
if (!Albums->Empty())
|
||||
std::sort(Albums->Begin(), Albums->End(), SearchConstraintsSorting());
|
||||
if (Albums->Size() > 1)
|
||||
@@ -322,18 +322,18 @@ void MediaLibrary::Update()
|
||||
Songs->Reset();
|
||||
|
||||
Mpd.StartSearch(1);
|
||||
Mpd.AddSearch(Config.media_lib_primary_tag, locale_to_utf_cpy(hasTwoColumns ? Albums->Current().PrimaryTag : Artists->Current()));
|
||||
if (Albums->Current().Date != AllTracksMarker)
|
||||
Mpd.AddSearch(Config.media_lib_primary_tag, locale_to_utf_cpy(hasTwoColumns ? Albums->Current().value().PrimaryTag : Artists->Current().value()));
|
||||
if (Albums->Current().value().Date != AllTracksMarker)
|
||||
{
|
||||
Mpd.AddSearch(MPD_TAG_ALBUM, locale_to_utf_cpy(Albums->Current().Album));
|
||||
Mpd.AddSearch(MPD_TAG_ALBUM, locale_to_utf_cpy(Albums->Current().value().Album));
|
||||
if (Config.media_library_display_date)
|
||||
Mpd.AddSearch(MPD_TAG_DATE, locale_to_utf_cpy(Albums->Current().Date));
|
||||
Mpd.AddSearch(MPD_TAG_DATE, locale_to_utf_cpy(Albums->Current().value().Date));
|
||||
}
|
||||
Mpd.CommitSearchSongs([this](MPD::Song &&s) {
|
||||
Songs->AddItem(s, myPlaylist->checkForSong(s));
|
||||
});
|
||||
|
||||
if (Albums->Current().Date == AllTracksMarker)
|
||||
if (Albums->Current().value().Date == AllTracksMarker)
|
||||
std::sort(Songs->Begin(), Songs->End(), SortAllTracks);
|
||||
else
|
||||
std::sort(Songs->Begin(), Songs->End(), SortSongsByTrack);
|
||||
@@ -349,20 +349,25 @@ void MediaLibrary::SpacePressed()
|
||||
{
|
||||
if (w == Artists)
|
||||
{
|
||||
Artists->Select(Artists->Choice(), !Artists->isSelected());
|
||||
size_t i = Artists->Choice();
|
||||
Artists->at(i).setSelected(!Artists->at(i).isSelected());
|
||||
Albums->Clear();
|
||||
Songs->Clear();
|
||||
}
|
||||
else if (w == Albums)
|
||||
{
|
||||
if (Albums->Current().Date != AllTracksMarker)
|
||||
if (Albums->Current().value().Date != AllTracksMarker)
|
||||
{
|
||||
Albums->Select(Albums->Choice(), !Albums->isSelected());
|
||||
size_t i = Albums->Choice();
|
||||
Albums->at(i).setSelected(!Albums->at(i).isSelected());
|
||||
Songs->Clear();
|
||||
}
|
||||
}
|
||||
else if (w == Songs)
|
||||
Songs->Select(Songs->Choice(), !Songs->isSelected());
|
||||
{
|
||||
size_t i = Songs->Choice();
|
||||
Songs->at(i).setSelected(!Songs->at(i).isSelected());
|
||||
}
|
||||
w->Scroll(wDown);
|
||||
}
|
||||
else
|
||||
@@ -440,7 +445,7 @@ void MediaLibrary::MouseButtonPressed(MEVENT me)
|
||||
|
||||
MPD::Song *MediaLibrary::CurrentSong()
|
||||
{
|
||||
return w == Songs && !Songs->Empty() ? &Songs->Current() : 0;
|
||||
return w == Songs && !Songs->Empty() ? &Songs->Current().value() : 0;
|
||||
}
|
||||
|
||||
List *MediaLibrary::GetList()
|
||||
@@ -477,7 +482,7 @@ void MediaLibrary::GetSelectedSongs(MPD::SongList &v)
|
||||
{
|
||||
MPD::SongList list;
|
||||
Mpd.StartSearch(1);
|
||||
Mpd.AddSearch(Config.media_lib_primary_tag, locale_to_utf_cpy(Artists->at(*it)));
|
||||
Mpd.AddSearch(Config.media_lib_primary_tag, locale_to_utf_cpy(Artists->at(*it).value()));
|
||||
Mpd.CommitSearchSongs([&list](MPD::Song &&s) {
|
||||
list.push_back(s);
|
||||
});
|
||||
@@ -494,7 +499,7 @@ void MediaLibrary::GetSelectedSongs(MPD::SongList &v)
|
||||
if (v.empty())
|
||||
v.reserve(Songs->Size());
|
||||
for (size_t i = 0; i < Songs->Size(); ++i)
|
||||
v.push_back((*Songs)[i]);
|
||||
v.push_back((*Songs)[i].value());
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -502,10 +507,10 @@ void MediaLibrary::GetSelectedSongs(MPD::SongList &v)
|
||||
{
|
||||
Mpd.StartSearch(1);
|
||||
Mpd.AddSearch(Config.media_lib_primary_tag, hasTwoColumns
|
||||
? Albums->at(*it).PrimaryTag
|
||||
: locale_to_utf_cpy(Artists->Current()));
|
||||
Mpd.AddSearch(MPD_TAG_ALBUM, Albums->at(*it).Album);
|
||||
Mpd.AddSearch(MPD_TAG_DATE, Albums->at(*it).Date);
|
||||
? Albums->at(*it).value().PrimaryTag
|
||||
: locale_to_utf_cpy(Artists->Current().value()));
|
||||
Mpd.AddSearch(MPD_TAG_ALBUM, Albums->at(*it).value().Album);
|
||||
Mpd.AddSearch(MPD_TAG_DATE, Albums->at(*it).value().Date);
|
||||
Mpd.CommitSearchSongs([&v](MPD::Song &&s) {
|
||||
v.push_back(s);
|
||||
});
|
||||
@@ -518,7 +523,7 @@ void MediaLibrary::GetSelectedSongs(MPD::SongList &v)
|
||||
if (selected.empty())
|
||||
selected.push_back(Songs->Choice());
|
||||
for (auto it = selected.begin(); it != selected.end(); ++it)
|
||||
v.push_back(Songs->at(*it));
|
||||
v.push_back(Songs->at(*it).value());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -645,11 +650,11 @@ void MediaLibrary::LocateSong(const MPD::Song &s)
|
||||
Artists->ApplyFilter("");
|
||||
if (Artists->Empty())
|
||||
Update();
|
||||
if (primary_tag != Artists->Current())
|
||||
if (primary_tag != Artists->Current().value())
|
||||
{
|
||||
for (size_t i = 0; i < Artists->Size(); ++i)
|
||||
{
|
||||
if (primary_tag == (*Artists)[i])
|
||||
if (primary_tag == (*Artists)[i].value())
|
||||
{
|
||||
Artists->Highlight(i);
|
||||
Albums->Clear();
|
||||
@@ -666,15 +671,15 @@ void MediaLibrary::LocateSong(const MPD::Song &s)
|
||||
|
||||
std::string album = s.getAlbum();
|
||||
std::string date = s.getDate();
|
||||
if ((hasTwoColumns && Albums->Current().PrimaryTag != primary_tag)
|
||||
|| album != Albums->Current().Album
|
||||
|| date != Albums->Current().Date)
|
||||
if ((hasTwoColumns && Albums->Current().value().PrimaryTag != primary_tag)
|
||||
|| album != Albums->Current().value().Album
|
||||
|| date != Albums->Current().value().Date)
|
||||
{
|
||||
for (size_t i = 0; i < Albums->Size(); ++i)
|
||||
{
|
||||
if ((!hasTwoColumns || (*Albums)[i].PrimaryTag == primary_tag)
|
||||
&& album == (*Albums)[i].Album
|
||||
&& date == (*Albums)[i].Date)
|
||||
if ((!hasTwoColumns || (*Albums)[i].value().PrimaryTag == primary_tag)
|
||||
&& album == (*Albums)[i].value().Album
|
||||
&& date == (*Albums)[i].value().Date)
|
||||
{
|
||||
Albums->Highlight(i);
|
||||
Songs->Clear();
|
||||
@@ -687,11 +692,11 @@ void MediaLibrary::LocateSong(const MPD::Song &s)
|
||||
if (Songs->Empty())
|
||||
Update();
|
||||
|
||||
if (s.getHash() != Songs->Current().getHash())
|
||||
if (s.getHash() != Songs->Current().value().getHash())
|
||||
{
|
||||
for (size_t i = 0; i < Songs->Size(); ++i)
|
||||
{
|
||||
if (s.getHash() == (*Songs)[i].getHash())
|
||||
if (s.getHash() == (*Songs)[i].value().getHash())
|
||||
{
|
||||
Songs->Highlight(i);
|
||||
break;
|
||||
@@ -709,7 +714,10 @@ void MediaLibrary::LocateSong(const MPD::Song &s)
|
||||
void MediaLibrary::AddToPlaylist(bool add_n_play)
|
||||
{
|
||||
if (w == Songs && !Songs->Empty())
|
||||
Songs->Bold(Songs->Choice(), myPlaylist->Add(Songs->Current(), Songs->isBold(), add_n_play));
|
||||
{
|
||||
bool res = myPlaylist->Add(Songs->Current().value(), Songs->Current().isBold(), add_n_play);
|
||||
Songs->Current().setBold(res);
|
||||
}
|
||||
else
|
||||
{
|
||||
MPD::SongList list;
|
||||
@@ -718,14 +726,14 @@ void MediaLibrary::AddToPlaylist(bool add_n_play)
|
||||
if (myPlaylist->Add(list, add_n_play))
|
||||
{
|
||||
if ((!Artists->Empty() && w == Artists)
|
||||
|| (w == Albums && Albums->Current().Date == AllTracksMarker))
|
||||
|| (w == Albums && Albums->Current().value().Date == AllTracksMarker))
|
||||
{
|
||||
std::string tag_type = tagTypeToString(Config.media_lib_primary_tag);
|
||||
lowercase(tag_type);
|
||||
ShowMessage("Songs with %s = \"%s\" added", tag_type.c_str(), Artists->Current().c_str());
|
||||
ShowMessage("Songs with %s = \"%s\" added", tag_type.c_str(), Artists->Current().value().c_str());
|
||||
}
|
||||
else if (w == Albums)
|
||||
ShowMessage("Songs from album \"%s\" added", Albums->Current().Album.c_str());
|
||||
ShowMessage("Songs from album \"%s\" added", Albums->Current().value().Album.c_str());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -28,6 +28,7 @@ class MediaLibrary : public Screen<Window>
|
||||
{
|
||||
struct SearchConstraints
|
||||
{
|
||||
SearchConstraints() { }
|
||||
SearchConstraints(const std::string &tag, const std::string &album, const std::string &date) : PrimaryTag(tag), Album(album), Date(date) { }
|
||||
SearchConstraints(const std::string &album, const std::string &date) : Album(album), Date(date) { }
|
||||
|
||||
@@ -56,7 +57,7 @@ class MediaLibrary : public Screen<Window>
|
||||
virtual bool isTabbable() { return true; }
|
||||
|
||||
virtual MPD::Song *CurrentSong();
|
||||
virtual MPD::Song *GetSong(size_t pos) { return w == Songs ? &Songs->at(pos) : 0; }
|
||||
virtual MPD::Song *GetSong(size_t pos) { return w == Songs ? &Songs->at(pos).value() : 0; }
|
||||
|
||||
virtual bool allowsSelection() { return true; }
|
||||
virtual void ReverseSelection();
|
||||
|
||||
227
src/menu.h
227
src/menu.h
@@ -21,6 +21,7 @@
|
||||
#ifndef _MENU_H
|
||||
#define _MENU_H
|
||||
|
||||
#include <cassert>
|
||||
#include <regex.h>
|
||||
#include <functional>
|
||||
#include <iterator>
|
||||
@@ -36,14 +37,6 @@ namespace NCurses {
|
||||
///
|
||||
struct List
|
||||
{
|
||||
/// @see Menu::Select()
|
||||
///
|
||||
virtual void Select(int pos, bool state) = 0;
|
||||
|
||||
/// @see Menu::isSelected()
|
||||
///
|
||||
virtual bool isSelected(int pos = -1) const = 0;
|
||||
|
||||
/// @see Menu::hasSelected()
|
||||
///
|
||||
virtual bool hasSelected() const = 0;
|
||||
@@ -120,9 +113,12 @@ template <typename T> struct Menu : public Window, public List
|
||||
///
|
||||
struct Item
|
||||
{
|
||||
Item() : m_is_bold(false), m_is_selected(false), m_is_inactive(false) { }
|
||||
friend class Menu<T>;
|
||||
|
||||
Item()
|
||||
: m_is_bold(false), m_is_selected(false), m_is_inactive(false), m_is_separator(false) { }
|
||||
Item(const T &value_, bool is_bold, bool is_inactive)
|
||||
: m_value(value_), m_is_bold(is_bold), m_is_selected(false), m_is_inactive(is_inactive) { }
|
||||
: m_value(value_), m_is_bold(is_bold), m_is_selected(false), m_is_inactive(is_inactive), m_is_separator(false) { }
|
||||
|
||||
T &value() { return m_value; }
|
||||
const T &value() const { return m_value; }
|
||||
@@ -130,16 +126,26 @@ template <typename T> struct Menu : public Window, public List
|
||||
void setBold(bool is_bold) { m_is_bold = is_bold; }
|
||||
void setSelected(bool is_selected) { m_is_selected = is_selected; }
|
||||
void setInactive(bool is_inactive) { m_is_inactive = is_inactive; }
|
||||
void setSeparator(bool is_separator) { m_is_separator = is_separator; }
|
||||
|
||||
bool isBold() const { return m_is_bold; }
|
||||
bool isSelected() const { return m_is_selected; }
|
||||
bool isInactive() const { return m_is_inactive; }
|
||||
bool isSeparator() const { return m_is_separator; }
|
||||
|
||||
private:
|
||||
static Item *mkSeparator()
|
||||
{
|
||||
Item *i = new Item;
|
||||
i->m_is_separator = true;
|
||||
return i;
|
||||
}
|
||||
|
||||
T m_value;
|
||||
bool m_is_bold;
|
||||
bool m_is_selected;
|
||||
bool m_is_inactive;
|
||||
bool m_is_separator;
|
||||
};
|
||||
|
||||
template <typename ValueT, typename BaseIterator> class ItemIterator
|
||||
@@ -289,11 +295,6 @@ template <typename T> struct Menu : public Window, public List
|
||||
///
|
||||
void DeleteItem(size_t pos);
|
||||
|
||||
/// Converts the option into separator
|
||||
/// @param pos position of item to be converted
|
||||
///
|
||||
void IntoSeparator(size_t pos);
|
||||
|
||||
/// Swaps the content of two items
|
||||
/// @param one position of first item
|
||||
/// @param two position of second item
|
||||
@@ -312,49 +313,6 @@ template <typename T> struct Menu : public Window, public List
|
||||
///
|
||||
bool Goto(size_t y);
|
||||
|
||||
/// Checks if the given position has bold attribute set.
|
||||
/// @param pos position to be checked. -1 = currently highlighted position
|
||||
/// @return true if the bold is set, false otherwise
|
||||
///
|
||||
bool isBold(int pos = -1);
|
||||
|
||||
/// Sets bols attribute for given position
|
||||
/// @param pos position of item to be bolded/unbolded
|
||||
/// @param state state of bold attribute
|
||||
///
|
||||
void Bold(int pos, bool state);
|
||||
|
||||
/// Makes given position static/active.
|
||||
/// Static positions cannot be highlighted.
|
||||
/// @param pos position in list
|
||||
/// @param state state of activity
|
||||
///
|
||||
void Static(int pos, bool state);
|
||||
|
||||
/// Checks whether given position is static or active
|
||||
/// @param pos position to be checked, -1 checks currently highlighted position
|
||||
/// @return true if position is static, false otherwise
|
||||
///
|
||||
bool isStatic(int pos = -1) const;
|
||||
|
||||
/// Checks whether given position is separator
|
||||
/// @param pos position to be checked, -1 checks currently highlighted position
|
||||
/// @return true if position is separator, false otherwise
|
||||
///
|
||||
bool isSeparator(int pos = -1) const;
|
||||
|
||||
/// Selects/deselects given position
|
||||
/// @param pos position in list
|
||||
/// @param state state of selection
|
||||
///
|
||||
virtual void Select(int pos, bool state);
|
||||
|
||||
/// Checks if given position is selected
|
||||
/// @param pos position to be checked, -1 checks currently highlighted position
|
||||
/// @return true if position is selected, false otherwise
|
||||
///
|
||||
virtual bool isSelected(int pos = -1) const;
|
||||
|
||||
/// Checks whether list contains selected positions
|
||||
/// @return true if it contains them, false otherwise
|
||||
///
|
||||
@@ -524,48 +482,48 @@ template <typename T> struct Menu : public Window, public List
|
||||
/// @return reference to last item on the list
|
||||
/// @throw List::InvalidItem if requested item is separator
|
||||
///
|
||||
T &Back();
|
||||
Menu<T>::Item &Back();
|
||||
|
||||
/// @return const reference to last item on the list
|
||||
/// @throw List::InvalidItem if requested item is separator
|
||||
///
|
||||
const T &Back() const;
|
||||
const Menu<T>::Item &Back() const;
|
||||
|
||||
/// @return reference to curently highlighted object
|
||||
/// @throw List::InvalidItem if requested item is separator
|
||||
///
|
||||
T &Current();
|
||||
Menu<T>::Item &Current();
|
||||
|
||||
/// @return const reference to curently highlighted object
|
||||
/// @throw List::InvalidItem if requested item is separator
|
||||
///
|
||||
const T &Current() const;
|
||||
const Menu<T>::Item &Current() const;
|
||||
|
||||
/// @param pos requested position
|
||||
/// @return reference to item at given position
|
||||
/// @throw std::out_of_range if given position is out of range
|
||||
/// @throw List::InvalidItem if requested item is separator
|
||||
///
|
||||
T &at(size_t pos);
|
||||
Menu<T>::Item &at(size_t pos);
|
||||
|
||||
/// @param pos requested position
|
||||
/// @return const reference to item at given position
|
||||
/// @throw std::out_of_range if given position is out of range
|
||||
/// @throw List::InvalidItem if requested item is separator
|
||||
///
|
||||
const T &at(size_t pos) const;
|
||||
const Menu<T>::Item &at(size_t pos) const;
|
||||
|
||||
/// @param pos requested position
|
||||
/// @return const reference to item at given position
|
||||
/// @throw List::InvalidItem if requested item is separator
|
||||
///
|
||||
const T &operator[](size_t pos) const;
|
||||
const Menu<T>::Item &operator[](size_t pos) const;
|
||||
|
||||
/// @param pos requested position
|
||||
/// @return const reference to item at given position
|
||||
/// @throw List::InvalidItem if requested item is separator
|
||||
///
|
||||
T &operator[](size_t pos);
|
||||
Menu<T>::Item &operator[](size_t pos);
|
||||
|
||||
Iterator Begin() { return Iterator(m_options_ptr->begin()); }
|
||||
ConstIterator Begin() const { return ConstIterator(m_options_ptr->begin()); }
|
||||
@@ -691,7 +649,7 @@ template <typename T> void Menu<T>::AddItem(const T &item, bool is_bold, bool is
|
||||
|
||||
template <typename T> void Menu<T>::AddSeparator()
|
||||
{
|
||||
m_options.push_back(static_cast<Item *>(0));
|
||||
m_options.push_back(Item::mkSeparator());
|
||||
}
|
||||
|
||||
template <typename T> void Menu<T>::InsertItem(size_t pos, const T &item, bool is_bold, bool is_static)
|
||||
@@ -701,13 +659,12 @@ template <typename T> void Menu<T>::InsertItem(size_t pos, const T &item, bool i
|
||||
|
||||
template <typename T> void Menu<T>::InsertSeparator(size_t pos)
|
||||
{
|
||||
m_options.insert(m_options.begin()+pos, 0);
|
||||
m_options.insert(m_options.begin()+pos, Item::mkSeparator());
|
||||
}
|
||||
|
||||
template <typename T> void Menu<T>::DeleteItem(size_t pos)
|
||||
{
|
||||
if (m_options_ptr->empty())
|
||||
return;
|
||||
assert(pos < m_options_ptr->size());
|
||||
if (m_options_ptr == &m_filtered_options)
|
||||
{
|
||||
delete m_options.at(m_filtered_positions[pos]);
|
||||
@@ -727,19 +684,6 @@ template <typename T> void Menu<T>::DeleteItem(size_t pos)
|
||||
Window::Clear();
|
||||
}
|
||||
|
||||
template <typename T> void Menu<T>::IntoSeparator(size_t pos)
|
||||
{
|
||||
delete m_options_ptr->at(pos);
|
||||
(*m_options_ptr)[pos] = 0;
|
||||
}
|
||||
|
||||
template <typename T> void Menu<T>::Bold(int pos, bool state)
|
||||
{
|
||||
if (!m_options_ptr->at(pos))
|
||||
return;
|
||||
(*m_options_ptr)[pos]->setBold(state);
|
||||
}
|
||||
|
||||
template <typename T> void Menu<T>::Swap(size_t one, size_t two)
|
||||
{
|
||||
std::swap(m_options.at(one), m_options.at(two));
|
||||
@@ -788,10 +732,10 @@ template <typename T> void Menu<T>::Refresh()
|
||||
if (!m_options_ptr->empty() && itsHighlight > int(m_options_ptr->size())-1)
|
||||
itsHighlight = m_options_ptr->size()-1;
|
||||
|
||||
if (!(*m_options_ptr)[itsHighlight] || (*m_options_ptr)[itsHighlight]->isInactive()) // it shouldn't be here
|
||||
if ((*m_options_ptr)[itsHighlight]->isSeparator() || (*m_options_ptr)[itsHighlight]->isInactive()) // it shouldn't be here
|
||||
{
|
||||
Scroll(wUp);
|
||||
if (!(*m_options_ptr)[itsHighlight] || (*m_options_ptr)[itsHighlight]->isInactive())
|
||||
if ((*m_options_ptr)[itsHighlight]->isSeparator() || (*m_options_ptr)[itsHighlight]->isInactive())
|
||||
Scroll(wDown);
|
||||
}
|
||||
|
||||
@@ -805,7 +749,7 @@ template <typename T> void Menu<T>::Refresh()
|
||||
mvwhline(itsWindow, line, 0, 32, itsWidth);
|
||||
break;
|
||||
}
|
||||
if (!(*m_options_ptr)[i]) // separator
|
||||
if ((*m_options_ptr)[i]->isSeparator())
|
||||
{
|
||||
mvwhline(itsWindow, line++, 0, 0, itsWidth);
|
||||
continue;
|
||||
@@ -861,7 +805,7 @@ template <typename T> void Menu<T>::Scroll(Where where)
|
||||
{
|
||||
itsHighlight--;
|
||||
}
|
||||
if (!(*m_options_ptr)[itsHighlight] || (*m_options_ptr)[itsHighlight]->isInactive())
|
||||
if ((*m_options_ptr)[itsHighlight]->isSeparator() || (*m_options_ptr)[itsHighlight]->isInactive())
|
||||
{
|
||||
Scroll(itsHighlight == 0 && !m_cyclic_scroll_enabled ? wDown : wUp);
|
||||
}
|
||||
@@ -883,7 +827,7 @@ template <typename T> void Menu<T>::Scroll(Where where)
|
||||
{
|
||||
itsHighlight++;
|
||||
}
|
||||
if (!(*m_options_ptr)[itsHighlight] || (*m_options_ptr)[itsHighlight]->isInactive())
|
||||
if ((*m_options_ptr)[itsHighlight]->isSeparator() || (*m_options_ptr)[itsHighlight]->isInactive())
|
||||
{
|
||||
Scroll(itsHighlight == MaxHighlight && !m_cyclic_scroll_enabled ? wUp : wDown);
|
||||
}
|
||||
@@ -901,7 +845,7 @@ template <typename T> void Menu<T>::Scroll(Where where)
|
||||
if (itsHighlight < 0)
|
||||
itsHighlight = 0;
|
||||
}
|
||||
if (!(*m_options_ptr)[itsHighlight] || (*m_options_ptr)[itsHighlight]->isInactive())
|
||||
if ((*m_options_ptr)[itsHighlight]->isSeparator() || (*m_options_ptr)[itsHighlight]->isInactive())
|
||||
{
|
||||
Scroll(itsHighlight == 0 && !m_cyclic_scroll_enabled ? wDown : wUp);
|
||||
}
|
||||
@@ -919,7 +863,7 @@ template <typename T> void Menu<T>::Scroll(Where where)
|
||||
if (itsHighlight > MaxHighlight)
|
||||
itsHighlight = MaxHighlight;
|
||||
}
|
||||
if (!(*m_options_ptr)[itsHighlight] || (*m_options_ptr)[itsHighlight]->isInactive())
|
||||
if ((*m_options_ptr)[itsHighlight]->isSeparator() || (*m_options_ptr)[itsHighlight]->isInactive())
|
||||
{
|
||||
Scroll(itsHighlight == MaxHighlight && !m_cyclic_scroll_enabled ? wUp : wDown);
|
||||
}
|
||||
@@ -929,7 +873,7 @@ template <typename T> void Menu<T>::Scroll(Where where)
|
||||
{
|
||||
itsHighlight = 0;
|
||||
itsBeginning = 0;
|
||||
if (!(*m_options_ptr)[itsHighlight] || (*m_options_ptr)[itsHighlight]->isInactive())
|
||||
if ((*m_options_ptr)[itsHighlight]->isSeparator() || (*m_options_ptr)[itsHighlight]->isInactive())
|
||||
{
|
||||
Scroll(itsHighlight == 0 ? wDown : wUp);
|
||||
}
|
||||
@@ -939,7 +883,7 @@ template <typename T> void Menu<T>::Scroll(Where where)
|
||||
{
|
||||
itsHighlight = MaxHighlight;
|
||||
itsBeginning = MaxBeginning;
|
||||
if (!(*m_options_ptr)[itsHighlight] || (*m_options_ptr)[itsHighlight]->isInactive())
|
||||
if ((*m_options_ptr)[itsHighlight]->isSeparator() || (*m_options_ptr)[itsHighlight]->isInactive())
|
||||
{
|
||||
Scroll(itsHighlight == MaxHighlight ? wUp : wDown);
|
||||
}
|
||||
@@ -975,54 +919,10 @@ template <typename T> void Menu<T>::Clear()
|
||||
Window::Clear();
|
||||
}
|
||||
|
||||
template <typename T> bool Menu<T>::isBold(int pos)
|
||||
{
|
||||
pos = pos == -1 ? itsHighlight : pos;
|
||||
if (!m_options_ptr->at(pos))
|
||||
return 0;
|
||||
return (*m_options_ptr)[pos]->isBold();
|
||||
}
|
||||
|
||||
template <typename T> void Menu<T>::Select(int pos, bool state)
|
||||
{
|
||||
if (!m_options_ptr->at(pos))
|
||||
return;
|
||||
(*m_options_ptr)[pos]->setSelected(state);
|
||||
}
|
||||
|
||||
template <typename T> void Menu<T>::Static(int pos, bool state)
|
||||
{
|
||||
if (!m_options_ptr->at(pos))
|
||||
return;
|
||||
(*m_options_ptr)[pos]->setInactive(state);
|
||||
}
|
||||
|
||||
template <typename T> bool Menu<T>::isSelected(int pos) const
|
||||
{
|
||||
pos = pos == -1 ? itsHighlight : pos;
|
||||
if (!m_options_ptr->at(pos))
|
||||
return 0;
|
||||
return (*m_options_ptr)[pos]->isSelected();
|
||||
}
|
||||
|
||||
template <typename T> bool Menu<T>::isStatic(int pos) const
|
||||
{
|
||||
pos = pos == -1 ? itsHighlight : pos;
|
||||
if (!m_options_ptr->at(pos))
|
||||
return 1;
|
||||
return (*m_options_ptr)[pos]->isInactive();
|
||||
}
|
||||
|
||||
template <typename T> bool Menu<T>::isSeparator(int pos) const
|
||||
{
|
||||
pos = pos == -1 ? itsHighlight : pos;
|
||||
return !m_options_ptr->at(pos);
|
||||
}
|
||||
|
||||
template <typename T> bool Menu<T>::hasSelected() const
|
||||
{
|
||||
for (auto it = m_options_ptr->begin(); it != m_options_ptr->end(); ++it)
|
||||
if (*it && (*it)->isSelected())
|
||||
if ((*it)->isSelected())
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
@@ -1030,7 +930,7 @@ template <typename T> bool Menu<T>::hasSelected() const
|
||||
template <typename T> void Menu<T>::GetSelected(std::vector<size_t> &v) const
|
||||
{
|
||||
for (size_t i = 0; i < m_options_ptr->size(); ++i)
|
||||
if ((*m_options_ptr)[i] && (*m_options_ptr)[i]->isSelected())
|
||||
if ((*m_options_ptr)[i]->isSelected())
|
||||
v.push_back(i);
|
||||
}
|
||||
|
||||
@@ -1054,7 +954,7 @@ template <typename T> size_t Menu<T>::RealChoice() const
|
||||
{
|
||||
size_t result = 0;
|
||||
for (auto it = m_options_ptr->begin(); it != m_options_ptr->begin()+itsHighlight; ++it)
|
||||
if (*it && !(*it)->isInactive())
|
||||
if (!(*it)->isInactive())
|
||||
result++;
|
||||
return result;
|
||||
}
|
||||
@@ -1063,7 +963,6 @@ template <typename T> void Menu<T>::ReverseSelection(size_t beginning)
|
||||
{
|
||||
auto it = m_options_ptr->begin()+beginning;
|
||||
for (size_t i = beginning; i < Size(); ++i, ++it)
|
||||
if (*it)
|
||||
(*it)->setSelected(!(*it)->isSelected() && !(*it)->isInactive());
|
||||
}
|
||||
|
||||
@@ -1152,60 +1051,44 @@ template <typename T> std::string Menu<T>::GetItem(size_t pos)
|
||||
return "";
|
||||
}
|
||||
|
||||
template <typename T> T &Menu<T>::Back()
|
||||
template <typename T> typename Menu<T>::Item &Menu<T>::Back()
|
||||
{
|
||||
if (!m_options_ptr->back())
|
||||
FatalError("Menu::Back() has requested separator!");
|
||||
return m_options_ptr->back()->value();
|
||||
return *m_options_ptr->back();
|
||||
}
|
||||
|
||||
template <typename T> const T &Menu<T>::Back() const
|
||||
template <typename T> const typename Menu<T>::Item &Menu<T>::Back() const
|
||||
{
|
||||
if (!m_options_ptr->back())
|
||||
FatalError("Menu::Back() has requested separator!");
|
||||
return m_options_ptr->back()->value();
|
||||
return *m_options_ptr->back();
|
||||
}
|
||||
|
||||
template <typename T> T &Menu<T>::Current()
|
||||
template <typename T> typename Menu<T>::Item &Menu<T>::Current()
|
||||
{
|
||||
if (!m_options_ptr->at(itsHighlight))
|
||||
FatalError("Menu::Current() has requested separator!");
|
||||
return (*m_options_ptr)[itsHighlight]->value();
|
||||
return *(*m_options_ptr)[itsHighlight];
|
||||
}
|
||||
|
||||
template <typename T> const T &Menu<T>::Current() const
|
||||
template <typename T> const typename Menu<T>::Item &Menu<T>::Current() const
|
||||
{
|
||||
if (!m_options_ptr->at(itsHighlight))
|
||||
FatalError("Menu::Current() const has requested separator!");
|
||||
return (*m_options_ptr)[itsHighlight]->value();
|
||||
return *(*m_options_ptr)[itsHighlight];
|
||||
}
|
||||
|
||||
template <typename T> T &Menu<T>::at(size_t pos)
|
||||
template <typename T> typename Menu<T>::Item &Menu<T>::at(size_t pos)
|
||||
{
|
||||
if (!m_options_ptr->at(pos))
|
||||
FatalError("Menu::at() has requested separator!");
|
||||
return (*m_options_ptr)[pos]->value();
|
||||
return *m_options_ptr->at(pos);
|
||||
}
|
||||
|
||||
template <typename T> const T &Menu<T>::at(size_t pos) const
|
||||
template <typename T> const typename Menu<T>::Item &Menu<T>::at(size_t pos) const
|
||||
{
|
||||
if (!m_options->at(pos))
|
||||
FatalError("Menu::at() const has requested separator!");
|
||||
return (*m_options_ptr)[pos]->value();
|
||||
return *m_options_ptr->at(pos);
|
||||
}
|
||||
|
||||
template <typename T> const T &Menu<T>::operator[](size_t pos) const
|
||||
template <typename T> const typename Menu<T>::Item &Menu<T>::operator[](size_t pos) const
|
||||
{
|
||||
if (!(*m_options_ptr)[pos])
|
||||
FatalError("Menu::operator[] const has requested separator!");
|
||||
return (*m_options_ptr)[pos]->value();
|
||||
return *(*m_options_ptr)[pos];
|
||||
}
|
||||
|
||||
template <typename T> T &Menu<T>::operator[](size_t pos)
|
||||
template <typename T> typename Menu<T>::Item &Menu<T>::operator[](size_t pos)
|
||||
{
|
||||
if (!(*m_options_ptr)[pos])
|
||||
FatalError("Menu::operator[] has requested separator!");
|
||||
return (*m_options_ptr)[pos]->value();
|
||||
return *(*m_options_ptr)[pos];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -83,15 +83,15 @@ std::basic_string<my_char_t> Outputs::Title()
|
||||
|
||||
void Outputs::EnterPressed()
|
||||
{
|
||||
if (w->Current().isEnabled())
|
||||
if (w->Current().value().isEnabled())
|
||||
{
|
||||
if (Mpd.DisableOutput(w->Choice()))
|
||||
ShowMessage("Output \"%s\" disabled", w->Current().name().c_str());
|
||||
ShowMessage("Output \"%s\" disabled", w->Current().value().name().c_str());
|
||||
}
|
||||
else
|
||||
{
|
||||
if (Mpd.EnableOutput(w->Choice()))
|
||||
ShowMessage("Output \"%s\" enabled", w->Current().name().c_str());
|
||||
ShowMessage("Output \"%s\" enabled", w->Current().value().name().c_str());
|
||||
}
|
||||
if (!Mpd.SupportsIdle())
|
||||
FetchList();
|
||||
|
||||
@@ -157,7 +157,7 @@ void Playlist::EnterPressed()
|
||||
if (w == Items)
|
||||
{
|
||||
if (!Items->Empty())
|
||||
Mpd.PlayID(Items->Current().getID());
|
||||
Mpd.PlayID(Items->Current().value().getID());
|
||||
}
|
||||
else if (w == SortDialog)
|
||||
{
|
||||
@@ -190,13 +190,13 @@ void Playlist::EnterPressed()
|
||||
MPD::SongList playlist;
|
||||
playlist.reserve(end-beginning);
|
||||
for (size_t i = beginning; i < end; ++i)
|
||||
playlist.push_back((*Items)[i]);
|
||||
playlist.push_back((*Items)[i].value());
|
||||
|
||||
std::function<void(MPD::SongList::iterator, MPD::SongList::iterator)> iter_swap, quick_sort;
|
||||
auto song_cmp = [](const MPD::Song &a, const MPD::Song &b) {
|
||||
CaseInsensitiveStringComparison cmp;
|
||||
for (size_t i = 0; i < SortOptions; ++i)
|
||||
if (int ret = cmp(a.getTags((*SortDialog)[i].second), b.getTags((*SortDialog)[i].second)))
|
||||
if (int ret = cmp(a.getTags((*SortDialog)[i].value().second), b.getTags((*SortDialog)[i].value().second)))
|
||||
return ret < 0;
|
||||
return a.getPosition() < b.getPosition();
|
||||
};
|
||||
@@ -235,7 +235,7 @@ void Playlist::SpacePressed()
|
||||
{
|
||||
if (w == Items && !Items->Empty())
|
||||
{
|
||||
Items->Select(Items->Choice(), !Items->isSelected());
|
||||
Items->Current().setSelected(!Items->Current().isSelected());
|
||||
Items->Scroll(wDown);
|
||||
}
|
||||
}
|
||||
@@ -268,7 +268,7 @@ void Playlist::MouseButtonPressed(MEVENT me)
|
||||
|
||||
MPD::Song *Playlist::CurrentSong()
|
||||
{
|
||||
return w == Items && !Items->Empty() ? &Items->Current() : 0;
|
||||
return w == Items && !Items->Empty() ? &Items->Current().value() : 0;
|
||||
}
|
||||
|
||||
void Playlist::GetSelectedSongs(MPD::SongList &v)
|
||||
@@ -280,7 +280,7 @@ void Playlist::GetSelectedSongs(MPD::SongList &v)
|
||||
if (selected.empty())
|
||||
selected.push_back(Items->Choice());
|
||||
for (auto it = selected.begin(); it != selected.end(); ++it)
|
||||
v.push_back(Items->at(*it));
|
||||
v.push_back(Items->at(*it).value());
|
||||
}
|
||||
|
||||
void Playlist::ApplyFilter(const std::string &s)
|
||||
@@ -312,7 +312,7 @@ void Playlist::MoveSelectedItems(Movement where)
|
||||
{
|
||||
case mUp:
|
||||
{
|
||||
if (myPlaylist->Items->hasSelected())
|
||||
if (Items->hasSelected())
|
||||
{
|
||||
std::vector<size_t> list;
|
||||
myPlaylist->Items->GetSelected(list);
|
||||
@@ -324,9 +324,9 @@ void Playlist::MoveSelectedItems(Movement where)
|
||||
Mpd.Move(*it-1, *it);
|
||||
if (Mpd.CommitCommandsList())
|
||||
{
|
||||
myPlaylist->Items->Select(list.back(), false);
|
||||
myPlaylist->Items->Select(list.front()-1, true);
|
||||
myPlaylist->Items->Highlight(list[(list.size()-1)/2]-1);
|
||||
Items->at(list.back()).setSelected(false);
|
||||
Items->at(list.front()-1).setSelected(true);
|
||||
Items->Highlight(list[(list.size()-1)/2]-1);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -336,7 +336,7 @@ void Playlist::MoveSelectedItems(Movement where)
|
||||
if (pos > 0)
|
||||
{
|
||||
if (Mpd.Move(pos-1, pos))
|
||||
myPlaylist->Items->Scroll(wUp);
|
||||
Items->Scroll(wUp);
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -356,8 +356,8 @@ void Playlist::MoveSelectedItems(Movement where)
|
||||
Mpd.Move(*it, *it+1);
|
||||
if (Mpd.CommitCommandsList())
|
||||
{
|
||||
Items->Select(list.front(), false);
|
||||
Items->Select(list.back()+1, true);
|
||||
Items->at(list.front()).setSelected(false);
|
||||
Items->at(list.back()+1).setSelected(true);
|
||||
Items->Highlight(list[(list.size()-1)/2]+1);
|
||||
}
|
||||
}
|
||||
@@ -397,7 +397,7 @@ void Playlist::Reverse()
|
||||
size_t beginning = -1, end = -1;
|
||||
for (size_t i = 0; i < Items->Size(); ++i)
|
||||
{
|
||||
if (Items->isSelected(i))
|
||||
if (Items->at(i).isSelected())
|
||||
{
|
||||
if (beginning == size_t(-1))
|
||||
beginning = i;
|
||||
@@ -457,14 +457,14 @@ std::string Playlist::TotalLength()
|
||||
{
|
||||
itsTotalLength = 0;
|
||||
for (size_t i = 0; i < Items->Size(); ++i)
|
||||
itsTotalLength += (*Items)[i].getDuration();
|
||||
itsTotalLength += (*Items)[i].value().getDuration();
|
||||
ReloadTotalLength = 0;
|
||||
}
|
||||
if (Config.playlist_show_remaining_time && ReloadRemaining && !Items->isFiltered())
|
||||
{
|
||||
itsRemainingTime = 0;
|
||||
for (size_t i = NowPlaying; i < Items->Size(); ++i)
|
||||
itsRemainingTime += (*Items)[i].getDuration();
|
||||
itsRemainingTime += (*Items)[i].value().getDuration();
|
||||
ReloadRemaining = false;
|
||||
}
|
||||
|
||||
@@ -497,7 +497,7 @@ const MPD::Song *Playlist::NowPlayingSong()
|
||||
{
|
||||
bool was_filtered = Items->isFiltered();
|
||||
Items->ShowAll();
|
||||
const MPD::Song *s = isPlaying() ? &Items->at(NowPlaying) : 0;
|
||||
const MPD::Song *s = isPlaying() ? &Items->at(NowPlaying).value() : 0;
|
||||
if (was_filtered)
|
||||
Items->ShowFiltered();
|
||||
return s;
|
||||
@@ -522,7 +522,7 @@ bool Playlist::Add(const MPD::Song &s, bool in_playlist, bool play, int position
|
||||
{
|
||||
for (size_t i = 0; i < Items->Size(); ++i)
|
||||
{
|
||||
if (Items->at(i).getHash() == hash)
|
||||
if (Items->at(i).value().getHash() == hash)
|
||||
{
|
||||
Mpd.Play(i);
|
||||
break;
|
||||
@@ -535,7 +535,7 @@ bool Playlist::Add(const MPD::Song &s, bool in_playlist, bool play, int position
|
||||
Mpd.StartCommandsList();
|
||||
for (size_t i = 0; i < Items->Size(); ++i)
|
||||
{
|
||||
if ((*Items)[i].getHash() == hash)
|
||||
if ((*Items)[i].value().getHash() == hash)
|
||||
{
|
||||
Mpd.Delete(i);
|
||||
Items->DeleteItem(i);
|
||||
@@ -606,7 +606,7 @@ void Playlist::SetSelectedItemsPriority(int prio)
|
||||
list.push_back(Items->Choice());
|
||||
Mpd.StartCommandsList();
|
||||
for (std::vector<size_t>::const_iterator it = list.begin(); it != list.end(); ++it)
|
||||
Mpd.SetPriority((*Items)[*it], prio);
|
||||
Mpd.SetPriority((*Items)[*it].value(), prio);
|
||||
if (Mpd.CommitCommandsList())
|
||||
ShowMessage("Priority set");
|
||||
}
|
||||
@@ -614,7 +614,7 @@ void Playlist::SetSelectedItemsPriority(int prio)
|
||||
bool Playlist::checkForSong (const MPD::Song &s)
|
||||
{
|
||||
for (size_t i = 0; i < Items->Size(); ++i)
|
||||
if (s.getHash() == (*Items)[i].getHash())
|
||||
if (s.getHash() == (*Items)[i].value().getHash())
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -46,7 +46,7 @@ class Playlist : public Screen<Window>
|
||||
virtual bool isTabbable() { return true; }
|
||||
|
||||
virtual MPD::Song *CurrentSong();
|
||||
virtual MPD::Song *GetSong(size_t pos) { return w == Items ? &Items->at(pos) : 0; }
|
||||
virtual MPD::Song *GetSong(size_t pos) { return w == Items ? &Items->at(pos).value() : 0; }
|
||||
|
||||
virtual bool allowsSelection() { return w == Items; }
|
||||
virtual void ReverseSelection() { Items->ReverseSelection(); }
|
||||
|
||||
@@ -152,7 +152,7 @@ void PlaylistEditor::Update()
|
||||
{
|
||||
Content->Reset();
|
||||
size_t plsize = 0;
|
||||
Mpd.GetPlaylistContent(locale_to_utf_cpy(Playlists->Current()), [this, &plsize](MPD::Song &&s) {
|
||||
Mpd.GetPlaylistContent(locale_to_utf_cpy(Playlists->Current().value()), [this, &plsize](MPD::Song &&s) {
|
||||
Content->AddItem(s, myPlaylist->checkForSong(s));
|
||||
++plsize;
|
||||
});
|
||||
@@ -206,7 +206,7 @@ void PlaylistEditor::MoveSelectedItems(Playlist::Movement where)
|
||||
Mpd.StartCommandsList();
|
||||
std::vector<size_t>::const_iterator it = list.begin();
|
||||
for (; it != list.end(); ++it)
|
||||
Mpd.Move(Playlists->Current(), *it-1, *it);
|
||||
Mpd.Move(Playlists->Current().value(), *it-1, *it);
|
||||
if (Mpd.CommitCommandsList())
|
||||
{
|
||||
for (it = list.begin(); it != list.end(); ++it)
|
||||
@@ -220,7 +220,7 @@ void PlaylistEditor::MoveSelectedItems(Playlist::Movement where)
|
||||
size_t pos = Content->Choice();
|
||||
if (pos > 0)
|
||||
{
|
||||
if (Mpd.Move(Playlists->Current(), pos-1, pos))
|
||||
if (Mpd.Move(Playlists->Current().value(), pos-1, pos))
|
||||
{
|
||||
Content->Scroll(wUp);
|
||||
Content->Swap(pos-1, pos);
|
||||
@@ -241,7 +241,7 @@ void PlaylistEditor::MoveSelectedItems(Playlist::Movement where)
|
||||
Mpd.StartCommandsList();
|
||||
std::vector<size_t>::const_reverse_iterator it = list.rbegin();
|
||||
for (; it != list.rend(); ++it)
|
||||
Mpd.Move(Playlists->Current(), *it, *it+1);
|
||||
Mpd.Move(Playlists->Current().value(), *it, *it+1);
|
||||
if (Mpd.CommitCommandsList())
|
||||
{
|
||||
Content->Highlight(list[(list.size()-1)/2]+1);
|
||||
@@ -255,7 +255,7 @@ void PlaylistEditor::MoveSelectedItems(Playlist::Movement where)
|
||||
size_t pos = Content->Choice();
|
||||
if (pos < Content->Size()-1)
|
||||
{
|
||||
if (Mpd.Move(Playlists->Current(), pos, pos+1))
|
||||
if (Mpd.Move(Playlists->Current().value(), pos, pos+1))
|
||||
{
|
||||
Content->Scroll(wDown);
|
||||
Content->Swap(pos, pos+1);
|
||||
@@ -330,15 +330,18 @@ void PlaylistEditor::AddToPlaylist(bool add_n_play)
|
||||
|
||||
if (w == Playlists && !Playlists->Empty())
|
||||
{
|
||||
if (Mpd.LoadPlaylist(utf_to_locale_cpy(Playlists->Current())))
|
||||
if (Mpd.LoadPlaylist(utf_to_locale_cpy(Playlists->Current().value())))
|
||||
{
|
||||
ShowMessage("Playlist \"%s\" loaded", Playlists->Current().c_str());
|
||||
ShowMessage("Playlist \"%s\" loaded", Playlists->Current().value().c_str());
|
||||
if (add_n_play)
|
||||
myPlaylist->PlayNewlyAddedSongs();
|
||||
}
|
||||
}
|
||||
else if (w == Content && !Content->Empty())
|
||||
Content->Bold(Content->Choice(), myPlaylist->Add(Content->Current(), Content->isBold(), add_n_play));
|
||||
{
|
||||
bool res = myPlaylist->Add(Content->Current().value(), Content->Current().isBold(), add_n_play);
|
||||
Content->Current().setBold(res);
|
||||
}
|
||||
|
||||
if (!add_n_play)
|
||||
w->Scroll(wDown);
|
||||
@@ -348,7 +351,7 @@ void PlaylistEditor::SpacePressed()
|
||||
{
|
||||
if (Config.space_selects && w == Content)
|
||||
{
|
||||
Content->Select(Content->Choice(), !Content->isSelected());
|
||||
Content->Current().setSelected(!Content->Current().isSelected());
|
||||
w->Scroll(wDown);
|
||||
}
|
||||
else
|
||||
@@ -400,7 +403,7 @@ void PlaylistEditor::MouseButtonPressed(MEVENT me)
|
||||
|
||||
MPD::Song *PlaylistEditor::CurrentSong()
|
||||
{
|
||||
return w == Content && !Content->Empty() ? &Content->Current() : 0;
|
||||
return w == Content && !Content->Empty() ? &Content->Current().value() : 0;
|
||||
}
|
||||
|
||||
void PlaylistEditor::GetSelectedSongs(MPD::SongList &v)
|
||||
@@ -410,7 +413,7 @@ void PlaylistEditor::GetSelectedSongs(MPD::SongList &v)
|
||||
if (selected.empty())
|
||||
selected.push_back(Content->Choice());
|
||||
for (auto it = selected.begin(); it != selected.end(); ++it)
|
||||
v.push_back(Content->at(*it));
|
||||
v.push_back(Content->at(*it).value());
|
||||
}
|
||||
|
||||
void PlaylistEditor::ApplyFilter(const std::string &s)
|
||||
@@ -425,7 +428,7 @@ void PlaylistEditor::Locate(const std::string &name)
|
||||
Update();
|
||||
for (size_t i = 0; i < Playlists->Size(); ++i)
|
||||
{
|
||||
if (name == (*Playlists)[i])
|
||||
if (name == (*Playlists)[i].value())
|
||||
{
|
||||
Playlists->Highlight(i);
|
||||
Content->Clear();
|
||||
|
||||
@@ -41,7 +41,7 @@ class PlaylistEditor : public Screen<Window>
|
||||
virtual bool isTabbable() { return true; }
|
||||
|
||||
virtual MPD::Song *CurrentSong();
|
||||
virtual MPD::Song *GetSong(size_t pos) { return w == Content ? &Content->at(pos) : 0; }
|
||||
virtual MPD::Song *GetSong(size_t pos) { return w == Content ? &Content->at(pos).value() : 0; }
|
||||
|
||||
virtual bool allowsSelection() { return w == Content; }
|
||||
virtual void ReverseSelection() { Content->ReverseSelection(); }
|
||||
|
||||
@@ -113,7 +113,7 @@ void SearchEngine::SwitchTo()
|
||||
myScreen = this;
|
||||
Global::RedrawHeader = true;
|
||||
|
||||
if (!w->Back().isSong())
|
||||
if (!w->Back().value().isSong())
|
||||
{
|
||||
*w << XY(0, 0) << "Updating list...";
|
||||
UpdateFoundList();
|
||||
@@ -129,7 +129,7 @@ void SearchEngine::EnterPressed()
|
||||
{
|
||||
size_t option = w->Choice();
|
||||
if (option > ConstraintsNumber && option < SearchButton)
|
||||
w->Current().buffer().Clear();
|
||||
w->Current().value().buffer().Clear();
|
||||
if (option < SearchButton)
|
||||
LockStatusbar();
|
||||
|
||||
@@ -138,21 +138,21 @@ void SearchEngine::EnterPressed()
|
||||
std::string constraint = ConstraintsNames[option];
|
||||
Statusbar() << fmtBold << constraint << fmtBoldEnd << ": ";
|
||||
itsConstraints[option] = Global::wFooter->GetString(itsConstraints[option]);
|
||||
w->Current().buffer().Clear();
|
||||
w->Current().value().buffer().Clear();
|
||||
constraint.resize(13, ' ');
|
||||
w->Current().buffer() << fmtBold << constraint << fmtBoldEnd << ": ";
|
||||
ShowTag(w->Current().buffer(), itsConstraints[option]);
|
||||
w->Current().value().buffer() << fmtBold << constraint << fmtBoldEnd << ": ";
|
||||
ShowTag(w->Current().value().buffer(), itsConstraints[option]);
|
||||
}
|
||||
else if (option == ConstraintsNumber+1)
|
||||
{
|
||||
Config.search_in_db = !Config.search_in_db;
|
||||
w->Current().buffer() << fmtBold << "Search in:" << fmtBoldEnd << ' ' << (Config.search_in_db ? "Database" : "Current playlist");
|
||||
w->Current().value().buffer() << fmtBold << "Search in:" << fmtBoldEnd << ' ' << (Config.search_in_db ? "Database" : "Current playlist");
|
||||
}
|
||||
else if (option == ConstraintsNumber+2)
|
||||
{
|
||||
if (!*++SearchMode)
|
||||
SearchMode = &SearchModes[0];
|
||||
w->Current().buffer() << fmtBold << "Search mode:" << fmtBoldEnd << ' ' << *SearchMode;
|
||||
w->Current().value().buffer() << fmtBold << "Search mode:" << fmtBoldEnd << ' ' << *SearchMode;
|
||||
}
|
||||
else if (option == SearchButton)
|
||||
{
|
||||
@@ -160,7 +160,7 @@ void SearchEngine::EnterPressed()
|
||||
if (w->Size() > StaticOptions)
|
||||
Prepare();
|
||||
Search();
|
||||
if (w->Back().isSong())
|
||||
if (w->Back().value().isSong())
|
||||
{
|
||||
if (Config.columns_in_search_engine)
|
||||
w->SetTitle(Config.titles_visibility ? Display::Columns(w->GetWidth()) : "");
|
||||
@@ -168,13 +168,13 @@ void SearchEngine::EnterPressed()
|
||||
found += 3; // don't count options inserted below
|
||||
w->InsertSeparator(ResetButton+1);
|
||||
w->InsertItem(ResetButton+2, SEItem(), 1, 1);
|
||||
w->at(ResetButton+2).mkBuffer() << Config.color1 << "Search results: " << Config.color2 << "Found " << found << (found > 1 ? " songs" : " song") << clDefault;
|
||||
w->at(ResetButton+2).value().mkBuffer() << Config.color1 << "Search results: " << Config.color2 << "Found " << found << (found > 1 ? " songs" : " song") << clDefault;
|
||||
w->InsertSeparator(ResetButton+3);
|
||||
UpdateFoundList();
|
||||
ShowMessage("Searching finished");
|
||||
if (Config.block_search_constraints_change)
|
||||
for (size_t i = 0; i < StaticOptions-4; ++i)
|
||||
w->Static(i, 1);
|
||||
w->at(i).setInactive(true);
|
||||
w->Scroll(wDown);
|
||||
w->Scroll(wDown);
|
||||
}
|
||||
@@ -187,8 +187,8 @@ void SearchEngine::EnterPressed()
|
||||
}
|
||||
else
|
||||
{
|
||||
bool res = myPlaylist->Add(w->Current().song(), w->isBold(), 1);
|
||||
w->Bold(w->Choice(), res);
|
||||
bool res = myPlaylist->Add(w->Current().value().song(), w->Current().isBold(), 1);
|
||||
w->Current().setBold(res);
|
||||
}
|
||||
|
||||
if (option < SearchButton)
|
||||
@@ -197,18 +197,18 @@ void SearchEngine::EnterPressed()
|
||||
|
||||
void SearchEngine::SpacePressed()
|
||||
{
|
||||
if (!w->Current().isSong())
|
||||
if (!w->Current().value().isSong())
|
||||
return;
|
||||
|
||||
if (Config.space_selects)
|
||||
{
|
||||
w->Select(w->Choice(), !w->isSelected());
|
||||
w->Current().setSelected(!w->Current().isSelected());
|
||||
w->Scroll(wDown);
|
||||
return;
|
||||
}
|
||||
|
||||
bool res = myPlaylist->Add(w->Current().song(), w->isBold(), 0);
|
||||
w->Bold(w->Choice(), res);
|
||||
bool res = myPlaylist->Add(w->Current().value().song(), w->Current().isBold(), 0);
|
||||
w->Current().setBold(res);
|
||||
w->Scroll(wDown);
|
||||
}
|
||||
|
||||
@@ -242,7 +242,7 @@ void SearchEngine::MouseButtonPressed(MEVENT me)
|
||||
|
||||
MPD::Song *SearchEngine::CurrentSong()
|
||||
{
|
||||
return !w->Empty() && w->Current().isSong() ? &w->Current().song() : 0;
|
||||
return !w->Empty() && w->Current().value().isSong() ? &w->Current().value().song() : 0;
|
||||
}
|
||||
|
||||
void SearchEngine::GetSelectedSongs(MPD::SongList &v)
|
||||
@@ -255,8 +255,8 @@ void SearchEngine::GetSelectedSongs(MPD::SongList &v)
|
||||
selected.push_back(w->Choice());
|
||||
for (auto it = selected.begin(); it != selected.end(); ++it)
|
||||
{
|
||||
assert(w->at(*it).isSong());
|
||||
v.push_back(w->at(*it).song());
|
||||
assert(w->at(*it).value().isSong());
|
||||
v.push_back(w->at(*it).value().song());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -272,69 +272,39 @@ void SearchEngine::UpdateFoundList()
|
||||
{
|
||||
for (size_t j = 0; j < myPlaylist->Items->Size(); ++j)
|
||||
{
|
||||
if (myPlaylist->Items->at(j).getHash() == w->at(i).song().getHash())
|
||||
if (myPlaylist->Items->at(j).value().getHash() == w->at(i).value().song().getHash())
|
||||
{
|
||||
bold = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
w->Bold(i, bold);
|
||||
w->at(i).setBold(bold);
|
||||
bold = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void SearchEngine::SelectAlbum()
|
||||
{
|
||||
size_t pos = w->Choice();
|
||||
if (pos < StaticOptions)
|
||||
return; // not on a song
|
||||
|
||||
std::string album = w->at(pos).song().getAlbum();
|
||||
|
||||
// select song under cursor
|
||||
w->Select(pos, 1);
|
||||
|
||||
// go up
|
||||
while (pos > StaticOptions)
|
||||
{
|
||||
if (w->at(--pos).song().getAlbum() != album)
|
||||
break;
|
||||
else
|
||||
w->Select(pos, 1);
|
||||
}
|
||||
|
||||
// go down
|
||||
while (pos < w->Size() - 1)
|
||||
{
|
||||
if (w->at(++pos).song().getAlbum() != album)
|
||||
break;
|
||||
else
|
||||
w->Select(pos, 1);
|
||||
}
|
||||
}
|
||||
|
||||
void SearchEngine::Prepare()
|
||||
{
|
||||
w->SetTitle("");
|
||||
w->Clear();
|
||||
w->ResizeList(StaticOptions-3);
|
||||
|
||||
w->IntoSeparator(ConstraintsNumber);
|
||||
w->IntoSeparator(SearchButton-1);
|
||||
w->at(ConstraintsNumber).setSeparator(true);
|
||||
w->at(SearchButton-1).setSeparator(true);
|
||||
|
||||
for (size_t i = 0; i < ConstraintsNumber; ++i)
|
||||
{
|
||||
std::string constraint = ConstraintsNames[i];
|
||||
constraint.resize(13, ' ');
|
||||
(*w)[i].mkBuffer() << fmtBold << constraint << fmtBoldEnd << ": ";
|
||||
ShowTag((*w)[i].buffer(), itsConstraints[i]);
|
||||
(*w)[i].value().mkBuffer() << fmtBold << constraint << fmtBoldEnd << ": ";
|
||||
ShowTag((*w)[i].value().buffer(), itsConstraints[i]);
|
||||
}
|
||||
|
||||
w->at(ConstraintsNumber+1).mkBuffer() << fmtBold << "Search in:" << fmtBoldEnd << ' ' << (Config.search_in_db ? "Database" : "Current playlist");
|
||||
w->at(ConstraintsNumber+2).mkBuffer() << fmtBold << "Search mode:" << fmtBoldEnd << ' ' << *SearchMode;
|
||||
w->at(ConstraintsNumber+1).value().mkBuffer() << fmtBold << "Search in:" << fmtBoldEnd << ' ' << (Config.search_in_db ? "Database" : "Current playlist");
|
||||
w->at(ConstraintsNumber+2).value().mkBuffer() << fmtBold << "Search mode:" << fmtBoldEnd << ' ' << *SearchMode;
|
||||
|
||||
w->at(SearchButton).mkBuffer() << "Search";
|
||||
w->at(ResetButton).mkBuffer() << "Reset";
|
||||
w->at(SearchButton).value().mkBuffer() << "Search";
|
||||
w->at(ResetButton).value().mkBuffer() << "Reset";
|
||||
}
|
||||
|
||||
void SearchEngine::Reset()
|
||||
@@ -402,7 +372,7 @@ void SearchEngine::Search()
|
||||
{
|
||||
list.reserve(myPlaylist->Items->Size());
|
||||
for (size_t i = 0; i < myPlaylist->Items->Size(); ++i)
|
||||
list.push_back((*myPlaylist->Items)[i]);
|
||||
list.push_back((*myPlaylist->Items)[i].value());
|
||||
}
|
||||
|
||||
bool any_found = 1;
|
||||
|
||||
@@ -86,7 +86,7 @@ class SearchEngine : public Screen< Menu<SEItem> >
|
||||
virtual bool isTabbable() { return true; }
|
||||
|
||||
virtual MPD::Song *CurrentSong();
|
||||
virtual MPD::Song *GetSong(size_t pos) { return !w->isSeparator(pos) && w->at(pos).isSong() ? &w->at(pos).song() : 0; }
|
||||
virtual MPD::Song *GetSong(size_t pos) { return !(*w)[pos].isSeparator() && w->at(pos).value().isSong() ? &w->at(pos).value().song() : 0; }
|
||||
|
||||
virtual bool allowsSelection() { return w->Choice() >= StaticOptions; }
|
||||
virtual void ReverseSelection() { w->ReverseSelection(StaticOptions); }
|
||||
@@ -99,7 +99,6 @@ class SearchEngine : public Screen< Menu<SEItem> >
|
||||
virtual bool isMergable() { return true; }
|
||||
|
||||
void UpdateFoundList();
|
||||
void SelectAlbum();
|
||||
|
||||
static size_t StaticOptions;
|
||||
static size_t SearchButton;
|
||||
|
||||
@@ -189,12 +189,12 @@ void SelectedItemsAdder::EnterPressed()
|
||||
}
|
||||
else if (pos > 1 && pos < w->Size()-1) // add items to existing playlist
|
||||
{
|
||||
std::string playlist = locale_to_utf_cpy(w->Current());
|
||||
std::string playlist = locale_to_utf_cpy(w->Current().value());
|
||||
Mpd.StartCommandsList();
|
||||
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().c_str());
|
||||
ShowMessage("Selected item(s) added to playlist \"%s\"", w->Current().value().c_str());
|
||||
}
|
||||
if (pos != w->Size()-1)
|
||||
{
|
||||
@@ -232,7 +232,7 @@ void SelectedItemsAdder::EnterPressed()
|
||||
std::string album = myPlaylist->NowPlayingSong()->getAlbum();
|
||||
int i;
|
||||
for (i = Mpd.GetCurrentlyPlayingSongPos()+1; i < int(myPlaylist->Items->Size()); ++i)
|
||||
if ((*myPlaylist->Items)[i].getAlbum() != album)
|
||||
if ((*myPlaylist->Items)[i].value().getAlbum() != album)
|
||||
break;
|
||||
successful_operation = myPlaylist->Add(list, 0, i);
|
||||
}
|
||||
|
||||
@@ -238,7 +238,7 @@ void NcmpcppStatusChanged(MPD::Connection *, MPD::StatusChanges changed, void *)
|
||||
if (pos < int(myPlaylist->Items->Size()))
|
||||
{
|
||||
// if song's already in playlist, replace it with a new one
|
||||
myPlaylist->Items->at(pos) = s;
|
||||
myPlaylist->Items->at(pos).value() = s;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -297,7 +297,7 @@ void TagEditor::Update()
|
||||
if (!Albums->Empty())
|
||||
{
|
||||
Mpd.StartSearch(1);
|
||||
Mpd.AddSearch(MPD_TAG_ALBUM, Albums->Current().second);
|
||||
Mpd.AddSearch(MPD_TAG_ALBUM, Albums->Current().value().second);
|
||||
Mpd.CommitSearchSongs([&list](MPD::Song &&s) {
|
||||
list.push_back(s);
|
||||
});
|
||||
@@ -308,7 +308,7 @@ void TagEditor::Update()
|
||||
}
|
||||
else
|
||||
{
|
||||
Mpd.GetSongs(Dirs->Current().second, list);
|
||||
Mpd.GetSongs(Dirs->Current().value().second, list);
|
||||
std::sort(list.begin(), list.end(), CaseInsensitiveSorting());
|
||||
for (auto it = list.begin(); it != list.end(); ++it)
|
||||
Tags->AddItem(*it);
|
||||
@@ -335,11 +335,11 @@ void TagEditor::EnterPressed()
|
||||
if (w == Dirs)
|
||||
{
|
||||
MPD::TagList test;
|
||||
Mpd.GetDirectories(LeftColumn->Current().second, test);
|
||||
Mpd.GetDirectories(LeftColumn->Current().value().second, test);
|
||||
if (!test.empty())
|
||||
{
|
||||
itsHighlightedDir = itsBrowsedDir;
|
||||
itsBrowsedDir = LeftColumn->Current().second;
|
||||
itsBrowsedDir = LeftColumn->Current().value().second;
|
||||
LeftColumn->Clear();
|
||||
LeftColumn->Reset();
|
||||
}
|
||||
@@ -418,8 +418,8 @@ void TagEditor::EnterPressed()
|
||||
if (!new_pattern.empty())
|
||||
{
|
||||
Config.pattern = new_pattern;
|
||||
FParser->at(0) = "Pattern: ";
|
||||
FParser->at(0) += Config.pattern;
|
||||
FParser->at(0).value() = "Pattern: ";
|
||||
FParser->at(0).value() += Config.pattern;
|
||||
}
|
||||
}
|
||||
else if (pos == 1 || pos == 3) // preview or proceed
|
||||
@@ -490,8 +490,8 @@ void TagEditor::EnterPressed()
|
||||
}
|
||||
else // list of patterns
|
||||
{
|
||||
Config.pattern = FParser->Current();
|
||||
FParser->at(0) = "Pattern: " + Config.pattern;
|
||||
Config.pattern = FParser->Current().value();
|
||||
FParser->at(0).value() = "Pattern: " + Config.pattern;
|
||||
}
|
||||
|
||||
if (quit)
|
||||
@@ -512,11 +512,11 @@ void TagEditor::EnterPressed()
|
||||
std::vector<size_t> selected;
|
||||
Tags->GetSelected(selected);
|
||||
for (auto it = selected.begin(); it != selected.end(); ++it)
|
||||
EditedSongs.push_back(&(*Tags)[*it]);
|
||||
EditedSongs.push_back(&(*Tags)[*it].value());
|
||||
}
|
||||
else
|
||||
for (size_t i = 0; i < Tags->Size(); ++i)
|
||||
EditedSongs.push_back(&(*Tags)[i]);
|
||||
EditedSongs.push_back(&(*Tags)[i].value());
|
||||
|
||||
size_t id = TagTypes->RealChoice();
|
||||
|
||||
@@ -547,8 +547,8 @@ void TagEditor::EnterPressed()
|
||||
if (id > 0 && w == TagTypes)
|
||||
{
|
||||
LockStatusbar();
|
||||
Statusbar() << fmtBold << TagTypes->Current() << fmtBoldEnd << ": ";
|
||||
std::string new_tag = wFooter->GetString(Tags->Current().getTags(get));
|
||||
Statusbar() << fmtBold << TagTypes->Current().value() << fmtBoldEnd << ": ";
|
||||
std::string new_tag = wFooter->GetString(Tags->Current().value().getTags(get));
|
||||
UnlockStatusbar();
|
||||
for (auto it = EditedSongs.begin(); it != EditedSongs.end(); ++it)
|
||||
(*it)->setTag(set, new_tag);
|
||||
@@ -556,11 +556,11 @@ void TagEditor::EnterPressed()
|
||||
else if (w == Tags)
|
||||
{
|
||||
LockStatusbar();
|
||||
Statusbar() << fmtBold << TagTypes->Current() << fmtBoldEnd << ": ";
|
||||
std::string new_tag = wFooter->GetString(Tags->Current().getTags(get));
|
||||
Statusbar() << fmtBold << TagTypes->Current().value() << fmtBoldEnd << ": ";
|
||||
std::string new_tag = wFooter->GetString(Tags->Current().value().getTags(get));
|
||||
UnlockStatusbar();
|
||||
if (new_tag != Tags->Current().getTags(get))
|
||||
Tags->Current().setTag(set, new_tag);
|
||||
if (new_tag != Tags->Current().value().getTags(get))
|
||||
Tags->Current().value().setTag(set, new_tag);
|
||||
Tags->Scroll(wDown);
|
||||
}
|
||||
}
|
||||
@@ -580,7 +580,7 @@ void TagEditor::EnterPressed()
|
||||
}
|
||||
else if (w == Tags)
|
||||
{
|
||||
MPD::MutableSong &s = Tags->Current();
|
||||
MPD::MutableSong &s = Tags->Current().value();
|
||||
std::string old_name = s.getNewURI().empty() ? s.getName() : s.getNewURI();
|
||||
size_t last_dot = old_name.rfind(".");
|
||||
std::string extension = old_name.substr(last_dot);
|
||||
@@ -648,7 +648,7 @@ void TagEditor::SpacePressed()
|
||||
{
|
||||
if (w == Tags && !Tags->Empty())
|
||||
{
|
||||
Tags->Select(Tags->Choice(), !Tags->isSelected());
|
||||
Tags->Current().setSelected(!Tags->Current().isSelected());
|
||||
w->Scroll(wDown);
|
||||
return;
|
||||
}
|
||||
@@ -756,7 +756,7 @@ void TagEditor::MouseButtonPressed(MEVENT me)
|
||||
|
||||
MPD::Song *TagEditor::CurrentSong()
|
||||
{
|
||||
return w == Tags && !Tags->Empty() ? &Tags->Current() : 0;
|
||||
return w == Tags && !Tags->Empty() ? &Tags->Current().value() : 0;
|
||||
}
|
||||
|
||||
void TagEditor::GetSelectedSongs(MPD::SongList &v)
|
||||
@@ -768,7 +768,7 @@ void TagEditor::GetSelectedSongs(MPD::SongList &v)
|
||||
if (selected.empty())
|
||||
selected.push_back(Tags->Choice());
|
||||
for (auto it = selected.begin(); it != selected.end(); ++it)
|
||||
v.push_back(static_cast<MPD::Song>((*Tags)[*it]));
|
||||
v.push_back(static_cast<MPD::Song>((*Tags)[*it].value()));
|
||||
}
|
||||
|
||||
void TagEditor::ApplyFilter(const std::string &s)
|
||||
@@ -929,7 +929,7 @@ void TagEditor::LocateSong(const MPD::Song &s)
|
||||
std::string dir = getBasename(s.getDirectory());
|
||||
for (size_t i = 0; i < Dirs->Size(); ++i)
|
||||
{
|
||||
if ((*Dirs)[i].first == dir)
|
||||
if ((*Dirs)[i].value().first == dir)
|
||||
{
|
||||
Dirs->Highlight(i);
|
||||
break;
|
||||
@@ -945,7 +945,7 @@ void TagEditor::LocateSong(const MPD::Song &s)
|
||||
// highlight our file
|
||||
for (size_t i = 0; i < Tags->Size(); ++i)
|
||||
{
|
||||
if ((*Tags)[i].getHash() == s.getHash())
|
||||
if ((*Tags)[i].value().getHash() == s.getHash())
|
||||
{
|
||||
Tags->Highlight(i);
|
||||
break;
|
||||
@@ -1084,7 +1084,7 @@ bool TagEditor::WriteTags(MPD::MutableSong &s)
|
||||
int id = Mpd.AddSong("file://" + new_name);
|
||||
if (id >= 0)
|
||||
{
|
||||
s = myPlaylist->Items->Back();
|
||||
s = myPlaylist->Items->Back().value();
|
||||
Mpd.Move(s.getPosition(), pos);
|
||||
}
|
||||
Mpd.CommitCommandsList();
|
||||
|
||||
@@ -55,7 +55,7 @@ class TagEditor : public Screen<Window>
|
||||
virtual bool isTabbable() { return true; }
|
||||
|
||||
virtual MPD::Song *CurrentSong();
|
||||
virtual MPD::Song *GetSong(size_t pos) { return w == Tags ? &Tags->at(pos) : 0; }
|
||||
virtual MPD::Song *GetSong(size_t pos) { return w == Tags ? &Tags->at(pos).value() : 0; }
|
||||
|
||||
virtual bool allowsSelection() { return w == Tags; }
|
||||
virtual void ReverseSelection() { Tags->ReverseSelection(); }
|
||||
|
||||
@@ -110,9 +110,9 @@ void TinyTagEditor::EnterPressed()
|
||||
size_t pos = option-8;
|
||||
Statusbar() << fmtBold << SongInfo::Tags[pos].Name << ": " << fmtBoldEnd;
|
||||
itsEdited.setTag(SongInfo::Tags[pos].Set, Global::wFooter->GetString(itsEdited.getTags(SongInfo::Tags[pos].Get)));
|
||||
w->at(option).Clear();
|
||||
w->at(option) << fmtBold << SongInfo::Tags[pos].Name << ':' << fmtBoldEnd << ' ';
|
||||
ShowTag(w->at(option), itsEdited.getTags(SongInfo::Tags[pos].Get));
|
||||
w->at(option).value().Clear();
|
||||
w->at(option).value() << fmtBold << SongInfo::Tags[pos].Name << ':' << fmtBoldEnd << ' ';
|
||||
ShowTag(w->at(option).value(), itsEdited.getTags(SongInfo::Tags[pos].Get));
|
||||
}
|
||||
else if (option == 20)
|
||||
{
|
||||
@@ -123,8 +123,8 @@ void TinyTagEditor::EnterPressed()
|
||||
filename = filename.substr(0, dot);
|
||||
std::string new_name = Global::wFooter->GetString(filename);
|
||||
itsEdited.setNewURI(new_name + extension);
|
||||
w->at(option).Clear();
|
||||
w->at(option) << fmtBold << "Filename:" << fmtBoldEnd << ' ' << (itsEdited.getNewURI().empty() ? itsEdited.getName() : itsEdited.getNewURI());
|
||||
w->at(option).value().Clear();
|
||||
w->at(option).value() << fmtBold << "Filename:" << fmtBoldEnd << ' ' << (itsEdited.getNewURI().empty() ? itsEdited.getName() : itsEdited.getNewURI());
|
||||
}
|
||||
UnlockStatusbar();
|
||||
|
||||
@@ -139,7 +139,7 @@ void TinyTagEditor::EnterPressed()
|
||||
else
|
||||
{
|
||||
if (myOldScreen == myPlaylist)
|
||||
myPlaylist->Items->Current() = itsEdited;
|
||||
myPlaylist->Items->Current().value() = itsEdited;
|
||||
else if (myOldScreen == myBrowser)
|
||||
myBrowser->GetDirectory(myBrowser->CurrentDir());
|
||||
}
|
||||
@@ -199,41 +199,41 @@ bool TinyTagEditor::getTags()
|
||||
w->ResizeList(24);
|
||||
|
||||
for (size_t i = 0; i < 7; ++i)
|
||||
w->Static(i, 1);
|
||||
w->at(i).setInactive(true);
|
||||
|
||||
w->IntoSeparator(7);
|
||||
w->IntoSeparator(19);
|
||||
w->IntoSeparator(21);
|
||||
w->at(7).setSeparator(true);
|
||||
w->at(19).setSeparator(true);
|
||||
w->at(21).setSeparator(true);
|
||||
|
||||
if (!extendedTagsSupported(f.file()))
|
||||
{
|
||||
w->Static(10, 1);
|
||||
w->at(10).setInactive(true);
|
||||
for (size_t i = 15; i <= 17; ++i)
|
||||
w->Static(i, 1);
|
||||
w->at(i).setInactive(true);
|
||||
}
|
||||
|
||||
w->Highlight(8);
|
||||
|
||||
w->at(0) << fmtBold << Config.color1 << "Song name: " << fmtBoldEnd << Config.color2 << itsEdited.getName() << clEnd;
|
||||
w->at(1) << fmtBold << Config.color1 << "Location in DB: " << fmtBoldEnd << Config.color2;
|
||||
ShowTag(w->at(1), itsEdited.getDirectory());
|
||||
w->at(1) << clEnd;
|
||||
w->at(3) << fmtBold << Config.color1 << "Length: " << fmtBoldEnd << Config.color2 << itsEdited.getLength() << clEnd;
|
||||
w->at(4) << fmtBold << Config.color1 << "Bitrate: " << fmtBoldEnd << Config.color2 << f.audioProperties()->bitrate() << " kbps" << clEnd;
|
||||
w->at(5) << fmtBold << Config.color1 << "Sample rate: " << fmtBoldEnd << Config.color2 << f.audioProperties()->sampleRate() << " Hz" << clEnd;
|
||||
w->at(6) << fmtBold << Config.color1 << "Channels: " << fmtBoldEnd << Config.color2 << (f.audioProperties()->channels() == 1 ? "Mono" : "Stereo") << clDefault;
|
||||
w->at(0).value() << fmtBold << Config.color1 << "Song name: " << fmtBoldEnd << Config.color2 << itsEdited.getName() << clEnd;
|
||||
w->at(1).value() << fmtBold << Config.color1 << "Location in DB: " << fmtBoldEnd << Config.color2;
|
||||
ShowTag(w->at(1).value(), itsEdited.getDirectory());
|
||||
w->at(1).value() << clEnd;
|
||||
w->at(3).value() << fmtBold << Config.color1 << "Length: " << fmtBoldEnd << Config.color2 << itsEdited.getLength() << clEnd;
|
||||
w->at(4).value() << fmtBold << Config.color1 << "Bitrate: " << fmtBoldEnd << Config.color2 << f.audioProperties()->bitrate() << " kbps" << clEnd;
|
||||
w->at(5).value() << fmtBold << Config.color1 << "Sample rate: " << fmtBoldEnd << Config.color2 << f.audioProperties()->sampleRate() << " Hz" << clEnd;
|
||||
w->at(6).value() << fmtBold << Config.color1 << "Channels: " << fmtBoldEnd << Config.color2 << (f.audioProperties()->channels() == 1 ? "Mono" : "Stereo") << clDefault;
|
||||
|
||||
unsigned pos = 8;
|
||||
for (const SongInfo::Metadata *m = SongInfo::Tags; m->Name; ++m, ++pos)
|
||||
{
|
||||
w->at(pos) << fmtBold << m->Name << ":" << fmtBoldEnd << ' ';
|
||||
ShowTag(w->at(pos), itsEdited.getTags(m->Get));
|
||||
w->at(pos).value() << fmtBold << m->Name << ":" << fmtBoldEnd << ' ';
|
||||
ShowTag(w->at(pos).value(), itsEdited.getTags(m->Get));
|
||||
}
|
||||
|
||||
w->at(20) << fmtBold << "Filename:" << fmtBoldEnd << ' ' << itsEdited.getName();
|
||||
w->at(20).value() << fmtBold << "Filename:" << fmtBoldEnd << ' ' << itsEdited.getName();
|
||||
|
||||
w->at(22) << "Save";
|
||||
w->at(23) << "Cancel";
|
||||
w->at(22).value() << "Save";
|
||||
w->at(23).value() << "Cancel";
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user