directories view for tag editor

This commit is contained in:
unK
2008-09-11 10:31:04 +02:00
parent 25c2f3fb49
commit 51b913d611
6 changed files with 149 additions and 35 deletions

View File

@@ -761,6 +761,41 @@ void MPDConnection::GetDirectoryRecursive(const string &path, SongList &v) const
} }
} }
void MPDConnection::GetSongs(const string &path, SongList &v) const
{
if (isConnected)
{
mpd_InfoEntity *item = NULL;
mpd_sendLsInfoCommand(itsConnection, path.c_str());
while ((item = mpd_getNextInfoEntity(itsConnection)) != NULL)
{
if (item->type == MPD_INFO_ENTITY_TYPE_SONG)
{
Song *s = new Song(item->info.song);
v.push_back(s);
}
mpd_freeInfoEntity(item);
}
mpd_finishCommand(itsConnection);
}
}
void MPDConnection::GetDirectories(const string &path, TagList &v) const
{
if (isConnected)
{
mpd_InfoEntity *item = NULL;
mpd_sendLsInfoCommand(itsConnection, path.c_str());
while ((item = mpd_getNextInfoEntity(itsConnection)) != NULL)
{
if (item->type == MPD_INFO_ENTITY_TYPE_DIRECTORY)
v.push_back(item->info.directory->path);
mpd_freeInfoEntity(item);
}
mpd_finishCommand(itsConnection);
}
}
int MPDConnection::CheckForErrors() int MPDConnection::CheckForErrors()
{ {
itsErrorCode = 0; itsErrorCode = 0;

View File

@@ -164,6 +164,8 @@ class MPDConnection
void GetAlbums(string, TagList &) const; void GetAlbums(string, TagList &) const;
void GetDirectory(const string &, ItemList &) const; void GetDirectory(const string &, ItemList &) const;
void GetDirectoryRecursive(const string &, SongList &) const; void GetDirectoryRecursive(const string &, SongList &) const;
void GetSongs(const string &, SongList &) const;
void GetDirectories(const string &, TagList &) const;
private: private:
int CheckForErrors(); int CheckForErrors();

View File

@@ -84,7 +84,9 @@ Menu<Song> *mLibSongs;
#ifdef HAVE_TAGLIB_H #ifdef HAVE_TAGLIB_H
Menu<string> *mTagEditor; Menu<string> *mTagEditor;
Menu<StringPair> *mEditorLeftCol;
Menu<StringPair> *mEditorAlbums; Menu<StringPair> *mEditorAlbums;
Menu<StringPair> *mEditorDirs;
Menu<string> *mEditorTagTypes; Menu<string> *mEditorTagTypes;
Menu<Song> *mEditorTags; Menu<Song> *mEditorTags;
#endif // HAVE_TAGLIB_H #endif // HAVE_TAGLIB_H
@@ -111,6 +113,8 @@ int stats_scroll_begin = 0;
int lock_statusbar_delay = -1; int lock_statusbar_delay = -1;
string browsed_dir = "/"; string browsed_dir = "/";
string editor_browsed_dir = "/";
string editor_highlighted_dir;
NcmpcppScreen current_screen; NcmpcppScreen current_screen;
NcmpcppScreen prev_screen; NcmpcppScreen prev_screen;
@@ -218,6 +222,9 @@ int main(int argc, char *argv[])
mTagEditor = new Menu<string>(0, main_start_y, COLS, main_height, "", Config.main_color, brNone); mTagEditor = new Menu<string>(0, main_start_y, COLS, main_height, "", Config.main_color, brNone);
mEditorAlbums = new Menu<StringPair>(0, main_start_y, lib_artist_width, main_height, "Albums", Config.main_color, brNone); mEditorAlbums = new Menu<StringPair>(0, main_start_y, lib_artist_width, main_height, "Albums", Config.main_color, brNone);
mEditorAlbums->SetItemDisplayer(DisplayStringPair); mEditorAlbums->SetItemDisplayer(DisplayStringPair);
mEditorDirs = new Menu<StringPair>(0, main_start_y, lib_artist_width, main_height, "Directories", Config.main_color, brNone);
mEditorDirs->SetItemDisplayer(DisplayStringPair);
mEditorLeftCol = Config.albums_in_tag_editor ? mEditorAlbums : mEditorDirs;
mEditorTagTypes = new Menu<string>(lib_albums_start_x, main_start_y, lib_albums_width, main_height, "Tag types", Config.main_color, brNone); mEditorTagTypes = new Menu<string>(lib_albums_start_x, main_start_y, lib_albums_width, main_height, "Tag types", Config.main_color, brNone);
mEditorTags = new Menu<Song>(lib_songs_start_x, main_start_y, lib_songs_width, main_height, "Tags", Config.main_color, brNone); mEditorTags = new Menu<Song>(lib_songs_start_x, main_start_y, lib_songs_width, main_height, "Tags", Config.main_color, brNone);
mEditorTags->SetItemDisplayer(DisplayTag); mEditorTags->SetItemDisplayer(DisplayTag);
@@ -363,6 +370,7 @@ int main(int argc, char *argv[])
# ifdef HAVE_TAGLIB_H # ifdef HAVE_TAGLIB_H
mTagEditor->SetTimeout(ncmpcpp_window_timeout); mTagEditor->SetTimeout(ncmpcpp_window_timeout);
mEditorAlbums->SetTimeout(ncmpcpp_window_timeout); mEditorAlbums->SetTimeout(ncmpcpp_window_timeout);
mEditorDirs->SetTimeout(ncmpcpp_window_timeout);
mEditorTagTypes->SetTimeout(ncmpcpp_window_timeout); mEditorTagTypes->SetTimeout(ncmpcpp_window_timeout);
mEditorTags->SetTimeout(ncmpcpp_window_timeout); mEditorTags->SetTimeout(ncmpcpp_window_timeout);
# endif // HAVE_TAGLIB_H # endif // HAVE_TAGLIB_H
@@ -381,6 +389,7 @@ int main(int argc, char *argv[])
# ifdef HAVE_TAGLIB_H # ifdef HAVE_TAGLIB_H
mTagEditor->HighlightColor(Config.main_highlight_color); mTagEditor->HighlightColor(Config.main_highlight_color);
mEditorAlbums->HighlightColor(Config.main_highlight_color); mEditorAlbums->HighlightColor(Config.main_highlight_color);
mEditorDirs->HighlightColor(Config.main_highlight_color);
mEditorTagTypes->HighlightColor(Config.main_highlight_color); mEditorTagTypes->HighlightColor(Config.main_highlight_color);
mEditorTags->HighlightColor(Config.main_highlight_color); mEditorTags->HighlightColor(Config.main_highlight_color);
# endif // HAVE_TAGLIB_H # endif // HAVE_TAGLIB_H
@@ -436,6 +445,7 @@ int main(int argc, char *argv[])
title = "Browse: "; title = "Browse: ";
break; break;
case csTagEditor: case csTagEditor:
case csAlbumEditor:
title = "Tag editor"; title = "Tag editor";
break; break;
case csInfo: case csInfo:
@@ -453,9 +463,6 @@ int main(int argc, char *argv[])
case csPlaylistEditor: case csPlaylistEditor:
title = "Playlist editor"; title = "Playlist editor";
break; break;
case csAlbumEditor:
title = "Albums' tag editor";
break;
} }
if (title_allowed) if (title_allowed)
@@ -496,7 +503,7 @@ int main(int argc, char *argv[])
{ {
string screens = "[.b]1:[/b]Help [.b]2:[/b]Playlist [.b]3:[/b]Browse [.b]4:[/b]Search [.b]5:[/b]Library [.b]6:[/b]Playlist editor"; string screens = "[.b]1:[/b]Help [.b]2:[/b]Playlist [.b]3:[/b]Browse [.b]4:[/b]Search [.b]5:[/b]Library [.b]6:[/b]Playlist editor";
# ifdef HAVE_TAGLIB_H # ifdef HAVE_TAGLIB_H
screens += " [.b]7:[/b]Albums' tag editor"; screens += " [.b]7:[/b]Tag editor";
# endif // HAVE_TAGLIB_H # endif // HAVE_TAGLIB_H
wHeader->WriteXY(0, 0, max_allowed_title_length, screens, 1); wHeader->WriteXY(0, 0, max_allowed_title_length, screens, 1);
} }
@@ -669,29 +676,54 @@ int main(int argc, char *argv[])
# ifdef HAVE_TAGLIB_H # ifdef HAVE_TAGLIB_H
if (current_screen == csAlbumEditor) if (current_screen == csAlbumEditor)
{ {
if (mEditorAlbums->Empty()) if (mEditorLeftCol->Empty())
{ {
found_pos = 0; found_pos = 0;
vFoundPositions.clear(); vFoundPositions.clear();
mEditorAlbums->Window::Clear(); mEditorLeftCol->Window::Clear();
mEditorTags->Clear(); mEditorTags->Clear();
TagList list; TagList list;
std::map<string, string, CaseInsensitiveSorting> maplist; if (Config.albums_in_tag_editor)
mEditorAlbums->WriteXY(0, 0, "Fetching albums' list...");
Mpd->GetAlbums("", list);
for (TagList::const_iterator it = list.begin(); it != list.end(); it++)
{ {
bool written = 0; std::map<string, string, CaseInsensitiveSorting> maplist;
SongList l; mEditorAlbums->WriteXY(0, 0, "Fetching albums' list...");
Mpd->StartSearch(1); Mpd->GetAlbums("", list);
Mpd->AddSearch(MPD_TAG_ITEM_ALBUM, *it); for (TagList::const_iterator it = list.begin(); it != list.end(); it++)
Mpd->CommitSearch(l); {
maplist[DisplaySong(*l[0], &Config.tag_editor_album_format)] = *it; bool written = 0;
FreeSongList(l); SongList l;
Mpd->StartSearch(1);
Mpd->AddSearch(MPD_TAG_ITEM_ALBUM, *it);
Mpd->CommitSearch(l);
maplist[DisplaySong(*l[0], &Config.tag_editor_album_format)] = *it;
FreeSongList(l);
}
for (std::map<string, string>::const_iterator it = maplist.begin(); it != maplist.end(); it++)
mEditorAlbums->AddOption(StringPair(it->first, it->second));
} }
for (std::map<string, string>::const_iterator it = maplist.begin(); it != maplist.end(); it++) else
mEditorAlbums->AddOption(StringPair(it->first, it->second)); {
mEditorAlbums->Refresh(); int highlightme = -1;
Mpd->GetDirectories(editor_browsed_dir, list);
sort(list.begin(), list.end(), CaseInsensitiveSorting());
if (editor_browsed_dir != "/")
{
int slash = editor_browsed_dir.find_last_of("/");
string parent = slash != string::npos ? editor_browsed_dir.substr(0, slash) : "/";
mEditorDirs->AddOption(StringPair("[..]", parent));
}
for (TagList::const_iterator it = list.begin(); it != list.end(); it++)
{
int slash = it->find_last_of("/");
string to_display = slash != string::npos ? it->substr(slash+1) : *it;
mEditorDirs->AddOption(StringPair(to_display, *it));
if (*it == editor_highlighted_dir)
highlightme = mEditorDirs->Size()-1;
}
if (highlightme != -1)
mEditorDirs->Highlight(highlightme);
}
mEditorLeftCol->Display();
mEditorTagTypes->Refresh(); mEditorTagTypes->Refresh();
} }
@@ -699,12 +731,22 @@ int main(int argc, char *argv[])
{ {
mEditorTags->Reset(); mEditorTags->Reset();
SongList list; SongList list;
Mpd->StartSearch(1); if (Config.albums_in_tag_editor)
Mpd->AddSearch(MPD_TAG_ITEM_ALBUM, mEditorAlbums->Current().second); {
Mpd->CommitSearch(list); Mpd->StartSearch(1);
sort(list.begin(), list.end(), CaseInsensitiveSorting()); Mpd->AddSearch(MPD_TAG_ITEM_ALBUM, mEditorAlbums->Current().second);
for (SongList::iterator it = list.begin(); it != list.end(); it++) Mpd->CommitSearch(list);
mEditorTags->AddOption(**it); sort(list.begin(), list.end(), CaseInsensitiveSorting());
for (SongList::iterator it = list.begin(); it != list.end(); it++)
mEditorTags->AddOption(**it);
}
else
{
Mpd->GetSongs(mEditorDirs->Current().second, list);
sort(list.begin(), list.end(), CaseInsensitiveSorting());
for (SongList::const_iterator it = list.begin(); it != list.end(); it++)
mEditorTags->AddOption(**it);
}
FreeSongList(list); FreeSongList(list);
mEditorTags->Window::Clear(); mEditorTags->Window::Clear();
mEditorTags->Refresh(); mEditorTags->Refresh();
@@ -756,7 +798,7 @@ int main(int argc, char *argv[])
mPlaylistEditor->Clear(0); mPlaylistEditor->Clear(0);
} }
# ifdef HAVE_TAGLIB_H # ifdef HAVE_TAGLIB_H
else if (wCurrent == mEditorAlbums) else if (wCurrent == mEditorLeftCol)
{ {
mEditorTags->Clear(0); mEditorTags->Clear(0);
mEditorTagTypes->Refresh(); mEditorTagTypes->Refresh();
@@ -836,6 +878,7 @@ int main(int argc, char *argv[])
mTagEditor->Resize(COLS, main_height); mTagEditor->Resize(COLS, main_height);
mEditorAlbums->Resize(lib_artist_width, main_height); mEditorAlbums->Resize(lib_artist_width, main_height);
mEditorDirs->Resize(lib_artist_width, main_height);
mEditorTagTypes->Resize(lib_albums_width, main_height); mEditorTagTypes->Resize(lib_albums_width, main_height);
mEditorTags->Resize(lib_songs_width, main_height); mEditorTags->Resize(lib_songs_width, main_height);
mEditorTagTypes->MoveTo(lib_albums_start_x, main_start_y); mEditorTagTypes->MoveTo(lib_albums_start_x, main_start_y);
@@ -1328,6 +1371,22 @@ int main(int argc, char *argv[])
# ifdef HAVE_TAGLIB_H # ifdef HAVE_TAGLIB_H
case csAlbumEditor: case csAlbumEditor:
{ {
if (wCurrent == mEditorDirs)
{
TagList test;
Mpd->GetDirectories(mEditorLeftCol->Current().second, test);
if (!test.empty())
{
editor_highlighted_dir = editor_browsed_dir;
editor_browsed_dir = mEditorLeftCol->Current().second;
mEditorLeftCol->Clear(0);
mEditorLeftCol->Reset();
}
else
ShowMessage("No subdirs found");
break;
}
void (Song::*set)(const string &) = 0; void (Song::*set)(const string &) = 0;
int id = mEditorTagTypes->GetRealChoice(); int id = mEditorTagTypes->GetRealChoice();
switch (id) switch (id)
@@ -1401,8 +1460,8 @@ int main(int argc, char *argv[])
mEditorTagTypes->HighlightColor(Config.main_highlight_color); mEditorTagTypes->HighlightColor(Config.main_highlight_color);
mEditorTagTypes->Reset(); mEditorTagTypes->Reset();
wCurrent->Refresh(); wCurrent->Refresh();
wCurrent = mEditorAlbums; wCurrent = mEditorLeftCol;
mEditorAlbums->HighlightColor(Config.active_column_color); mEditorLeftCol->HighlightColor(Config.active_column_color);
Mpd->UpdateDirectory(FindSharedDir(mEditorTags)); Mpd->UpdateDirectory(FindSharedDir(mEditorTags));
} }
else else
@@ -1412,6 +1471,7 @@ int main(int argc, char *argv[])
default: default:
break; break;
} }
if (wCurrent == mEditorTagTypes && id != 0 && id != 4 && set != NULL) if (wCurrent == mEditorTagTypes && id != 0 && id != 4 && set != NULL)
{ {
LOCK_STATUSBAR; LOCK_STATUSBAR;
@@ -1520,6 +1580,18 @@ int main(int argc, char *argv[])
goto ENTER_LIBRARY_SCREEN; // sorry, but that's stupid to copy the same code here. goto ENTER_LIBRARY_SCREEN; // sorry, but that's stupid to copy the same code here.
else if (current_screen == csPlaylistEditor) else if (current_screen == csPlaylistEditor)
goto ENTER_PLAYLIST_EDITOR_SCREEN; // same what in library screen. goto ENTER_PLAYLIST_EDITOR_SCREEN; // same what in library screen.
# ifdef HAVE_TAGLIB_H
else if (wCurrent == mEditorLeftCol)
{
Config.albums_in_tag_editor = !Config.albums_in_tag_editor;
mEditorLeftCol = Config.albums_in_tag_editor ? mEditorAlbums : mEditorDirs;
wCurrent = mEditorLeftCol;
ShowMessage("Switched to " + string(Config.albums_in_tag_editor ? "albums" : "directories") + " view");
mEditorLeftCol->Display();
mEditorTags->Clear(0);
redraw_screen = 1;
}
# endif // HAVE_TAGLIB_H
} }
} }
else if (Keypressed(input, Key.VolumeUp)) else if (Keypressed(input, Key.VolumeUp))
@@ -1559,14 +1631,14 @@ int main(int argc, char *argv[])
{ {
found_pos = 0; found_pos = 0;
vFoundPositions.clear(); vFoundPositions.clear();
if (wCurrent == mEditorAlbums) if (wCurrent == mEditorLeftCol)
{ {
mEditorAlbums->HighlightColor(Config.main_highlight_color); mEditorLeftCol->HighlightColor(Config.main_highlight_color);
wCurrent->Refresh(); wCurrent->Refresh();
wCurrent = mEditorTagTypes; wCurrent = mEditorTagTypes;
mEditorTagTypes->HighlightColor(Config.active_column_color); mEditorTagTypes->HighlightColor(Config.active_column_color);
} }
else if (wCurrent == mEditorTagTypes && mEditorTagTypes->GetChoice() < 10) else if (wCurrent == mEditorTagTypes && mEditorTagTypes->GetChoice() < 10 && !mEditorTags->Empty())
{ {
mEditorTagTypes->HighlightColor(Config.main_highlight_color); mEditorTagTypes->HighlightColor(Config.main_highlight_color);
wCurrent->Refresh(); wCurrent->Refresh();
@@ -1626,8 +1698,8 @@ int main(int argc, char *argv[])
{ {
mEditorTagTypes->HighlightColor(Config.main_highlight_color); mEditorTagTypes->HighlightColor(Config.main_highlight_color);
wCurrent->Refresh(); wCurrent->Refresh();
wCurrent = mEditorAlbums; wCurrent = mEditorLeftCol;
mEditorAlbums->HighlightColor(Config.active_column_color); mEditorLeftCol->HighlightColor(Config.active_column_color);
} }
} }
# endif // HAVE_TAGLIB_H # endif // HAVE_TAGLIB_H
@@ -2863,6 +2935,7 @@ int main(int argc, char *argv[])
vFoundPositions.clear(); vFoundPositions.clear();
mEditorAlbums->HighlightColor(Config.active_column_color); mEditorAlbums->HighlightColor(Config.active_column_color);
mEditorDirs->HighlightColor(Config.active_column_color);
mEditorTagTypes->HighlightColor(Config.main_highlight_color); mEditorTagTypes->HighlightColor(Config.main_highlight_color);
mEditorTags->HighlightColor(Config.main_highlight_color); mEditorTags->HighlightColor(Config.main_highlight_color);
@@ -2888,7 +2961,7 @@ int main(int argc, char *argv[])
} }
wCurrent = mEditorAlbums; wCurrent = mEditorLeftCol;
current_screen = csAlbumEditor; current_screen = csAlbumEditor;
} }
} }

View File

@@ -176,6 +176,7 @@ void DefaultConfiguration(ncmpcpp_config &conf)
conf.repeat_one_mode = false; conf.repeat_one_mode = false;
conf.wrapped_search = true; conf.wrapped_search = true;
conf.space_selects = false; conf.space_selects = false;
conf.albums_in_tag_editor = true;
conf.set_window_title = true; conf.set_window_title = true;
conf.mpd_connection_timeout = 15; conf.mpd_connection_timeout = 15;
conf.crossfade_time = 5; conf.crossfade_time = 5;

View File

@@ -123,6 +123,7 @@ struct ncmpcpp_config
bool repeat_one_mode; bool repeat_one_mode;
bool wrapped_search; bool wrapped_search;
bool space_selects; bool space_selects;
bool albums_in_tag_editor;
int mpd_connection_timeout; int mpd_connection_timeout;
int crossfade_time; int crossfade_time;

View File

@@ -34,6 +34,7 @@ extern Menu<Song> *mPlaylistEditor;
#ifdef HAVE_TAGLIB_H #ifdef HAVE_TAGLIB_H
extern Menu<string> *mEditorAlbums; extern Menu<string> *mEditorAlbums;
extern Menu<string> *mEditorDirs;
#endif // HAVE_TAGLIB_H #endif // HAVE_TAGLIB_H
extern Window *wHeader; extern Window *wHeader;
@@ -235,6 +236,7 @@ void NcmpcppStatusChanged(MPDConnection *Mpd, MPDStatusChanges changed, void *da
GetDirectory(browsed_dir); GetDirectory(browsed_dir);
# ifdef HAVE_TAGLIB_H # ifdef HAVE_TAGLIB_H
mEditorAlbums->Clear(0); mEditorAlbums->Clear(0);
mEditorDirs->Clear(0);
# endif // HAVE_TAGLIB_H # endif // HAVE_TAGLIB_H
mLibArtists->Clear(0); mLibArtists->Clear(0);
mPlaylistEditor->Clear(0); mPlaylistEditor->Clear(0);