change namespace TagEditor into class

This commit is contained in:
Andrzej Rybczak
2009-02-14 19:44:55 +01:00
parent 7b1d07722b
commit d6a6bca3e6
8 changed files with 466 additions and 423 deletions

View File

@@ -278,7 +278,7 @@ namespace
mpd_Song *s = mpd_newSong(); mpd_Song *s = mpd_newSong();
s->file = str_pool_get(full_path.c_str()); s->file = str_pool_get(full_path.c_str());
# ifdef HAVE_TAGLIB_H # ifdef HAVE_TAGLIB_H
ReadTagsFromFile(s); TagEditor::ReadTags(s);
# endif // HAVE_TAGLIB_H # endif // HAVE_TAGLIB_H
new_item.song = new Song(s); new_item.song = new Song(s);
v.push_back(new_item); v.push_back(new_item);

View File

@@ -45,13 +45,13 @@ namespace Global
// extern Menu<MPD::Song> *myLibrary->Songs; // extern Menu<MPD::Song> *myLibrary->Songs;
# ifdef HAVE_TAGLIB_H # ifdef HAVE_TAGLIB_H
extern Window *wTagEditorActiveCol; // extern Window *wTagEditorActiveCol;
// extern Menu<Buffer> *mTagEditor; // extern Menu<Buffer> *mTagEditor;
extern Menu<string_pair> *mEditorAlbums; // extern Menu<string_pair> *mEditorAlbums;
extern Menu<string_pair> *mEditorDirs; // extern Menu<string_pair> *myTagEditor->Dirs;
extern Menu<string_pair> *mEditorLeftCol; // extern Menu<string_pair> *mEditorLeftCol;
extern Menu<std::string> *mEditorTagTypes; // extern Menu<std::string> *myTagEditor->TagTypes;
extern Menu<MPD::Song> *mEditorTags; // extern Menu<MPD::Song> *myTagEditor->Tags;
# endif // HAVE_TAGLIB_H # endif // HAVE_TAGLIB_H
// extern Window *wPlaylistEditorActiveCol; // extern Window *wPlaylistEditorActiveCol;

View File

@@ -90,7 +90,7 @@ void Info::GetSong()
# ifdef HAVE_TAGLIB_H # ifdef HAVE_TAGLIB_H
else if (current_screen == csTagEditor) else if (current_screen == csTagEditor)
{ {
TagEditor::Refresh(); myTagEditor->Refresh();
} }
# endif // HAVE_TAGLIB_H # endif // HAVE_TAGLIB_H
} }
@@ -101,7 +101,7 @@ void Info::GetSong()
|| (wCurrent == myLibrary->Songs && !myLibrary->Songs->Empty()) || (wCurrent == myLibrary->Songs && !myLibrary->Songs->Empty())
|| (wCurrent == myPlaylistEditor->Content && !myPlaylistEditor->Content->Empty()) || (wCurrent == myPlaylistEditor->Content && !myPlaylistEditor->Content->Empty())
# ifdef HAVE_TAGLIB_H # ifdef HAVE_TAGLIB_H
|| (wCurrent == mEditorTags && !mEditorTags->Empty()) || (wCurrent == myTagEditor->Tags && !myTagEditor->Tags->Empty())
# endif // HAVE_TAGLIB_H # endif // HAVE_TAGLIB_H
) )
{ {
@@ -126,7 +126,7 @@ void Info::GetSong()
break; break;
# ifdef HAVE_TAGLIB_H # ifdef HAVE_TAGLIB_H
case csTagEditor: case csTagEditor:
s = &mEditorTags->at(id); s = &myTagEditor->Tags->at(id);
break; break;
# endif // HAVE_TAGLIB_H # endif // HAVE_TAGLIB_H
default: default:
@@ -177,7 +177,7 @@ void Info::GetArtist()
# ifdef HAVE_TAGLIB_H # ifdef HAVE_TAGLIB_H
else if (current_screen == csTagEditor) else if (current_screen == csTagEditor)
{ {
TagEditor::Refresh(); myTagEditor->Refresh();
} }
# endif // HAVE_TAGLIB_H # endif // HAVE_TAGLIB_H
} }
@@ -189,7 +189,7 @@ void Info::GetArtist()
|| (wCurrent == myLibrary->Songs && !myLibrary->Songs->Empty()) || (wCurrent == myLibrary->Songs && !myLibrary->Songs->Empty())
|| (wCurrent == myPlaylistEditor->Content && !myPlaylistEditor->Content->Empty()) || (wCurrent == myPlaylistEditor->Content && !myPlaylistEditor->Content->Empty())
# ifdef HAVE_TAGLIB_H # ifdef HAVE_TAGLIB_H
|| (wCurrent == mEditorTags && !mEditorTags->Empty()) || (wCurrent == myTagEditor->Tags && !myTagEditor->Tags->Empty())
# endif // HAVE_TAGLIB_H # endif // HAVE_TAGLIB_H
) )
{ {
@@ -220,7 +220,7 @@ void Info::GetArtist()
break; break;
# ifdef HAVE_TAGLIB_H # ifdef HAVE_TAGLIB_H
case csTagEditor: case csTagEditor:
*artist = mEditorTags->at(id).GetArtist(); *artist = myTagEditor->Tags->at(id).GetArtist();
break; break;
# endif // HAVE_TAGLIB_H # endif // HAVE_TAGLIB_H
default: default:

View File

@@ -102,7 +102,7 @@ void Lyrics::Get()
# ifdef HAVE_TAGLIB_H # ifdef HAVE_TAGLIB_H
else if (current_screen == csTagEditor) else if (current_screen == csTagEditor)
{ {
TagEditor::Refresh(); myTagEditor->Refresh();
} }
# endif // HAVE_TAGLIB_H # endif // HAVE_TAGLIB_H
} }
@@ -114,7 +114,7 @@ void Lyrics::Get()
|| (wCurrent == myLibrary->Songs && !myLibrary->Songs->Empty()) || (wCurrent == myLibrary->Songs && !myLibrary->Songs->Empty())
|| (wCurrent == myPlaylistEditor->Content && !myPlaylistEditor->Content->Empty()) || (wCurrent == myPlaylistEditor->Content && !myPlaylistEditor->Content->Empty())
# ifdef HAVE_TAGLIB_H # ifdef HAVE_TAGLIB_H
|| (wCurrent == mEditorTags && !mEditorTags->Empty()) || (wCurrent == myTagEditor->Tags && !myTagEditor->Tags->Empty())
# endif // HAVE_TAGLIB_H # endif // HAVE_TAGLIB_H
) )
{ {
@@ -158,7 +158,7 @@ void Lyrics::Get()
break; break;
# ifdef HAVE_TAGLIB_H # ifdef HAVE_TAGLIB_H
case csTagEditor: case csTagEditor:
s = &mEditorTags->at(id); s = &myTagEditor->Tags->at(id);
break; break;
# endif // HAVE_TAGLIB_H # endif // HAVE_TAGLIB_H
default: default:

View File

@@ -155,7 +155,7 @@ int main(int argc, char *argv[])
# ifdef HAVE_TAGLIB_H # ifdef HAVE_TAGLIB_H
myTinyTagEditor->Init(); myTinyTagEditor->Init();
TagEditor::Init(); myTagEditor->Init();
# endif // HAVE_TAGLIB_H # endif // HAVE_TAGLIB_H
# ifdef ENABLE_CLOCK # ifdef ENABLE_CLOCK
@@ -246,7 +246,7 @@ int main(int argc, char *argv[])
# ifdef HAVE_TAGLIB_H # ifdef HAVE_TAGLIB_H
case csTinyTagEditor: case csTinyTagEditor:
case csTagEditor: case csTagEditor:
screen_title = "Tag editor"; screen_title = myTagEditor->Title();
break; break;
# endif // HAVE_TAGLIB_H # endif // HAVE_TAGLIB_H
case csInfo: case csInfo:
@@ -327,7 +327,7 @@ int main(int argc, char *argv[])
# ifdef HAVE_TAGLIB_H # ifdef HAVE_TAGLIB_H
if (current_screen == csTagEditor) if (current_screen == csTagEditor)
{ {
TagEditor::Update(); myTagEditor->Update();
} }
else else
# endif // HAVE_TAGLIB_H # endif // HAVE_TAGLIB_H
@@ -386,12 +386,12 @@ int main(int argc, char *argv[])
myPlaylistEditor->Content->Clear(0); myPlaylistEditor->Content->Clear(0);
} }
# ifdef HAVE_TAGLIB_H # ifdef HAVE_TAGLIB_H
else if (wCurrent == mEditorLeftCol) else if (wCurrent == myTagEditor->LeftColumn)
{ {
mEditorTags->Clear(0); myTagEditor->Tags->Clear(0);
mEditorTagTypes->Refresh(); myTagEditor->TagTypes->Refresh();
} }
// else if (wCurrent == mEditorTagTypes) // else if (wCurrent == myTagEditor->TagTypes)
// redraw_screen = 1; // redraw_screen = 1;
# endif // HAVE_TAGLIB_H # endif // HAVE_TAGLIB_H
} }
@@ -413,7 +413,7 @@ int main(int argc, char *argv[])
&& (wCurrent == myLibrary->Artists && (wCurrent == myLibrary->Artists
|| wCurrent == myPlaylistEditor->List || wCurrent == myPlaylistEditor->List
# ifdef HAVE_TAGLIB_H # ifdef HAVE_TAGLIB_H
|| wCurrent == mEditorLeftCol || wCurrent == myTagEditor->LeftColumn
# endif // HAVE_TAGLIB_H # endif // HAVE_TAGLIB_H
) )
) )
@@ -441,7 +441,7 @@ int main(int argc, char *argv[])
&& (wCurrent == myLibrary->Artists && (wCurrent == myLibrary->Artists
|| wCurrent == myPlaylistEditor->List || wCurrent == myPlaylistEditor->List
# ifdef HAVE_TAGLIB_H # ifdef HAVE_TAGLIB_H
|| wCurrent == mEditorLeftCol || wCurrent == myTagEditor->LeftColumn
# endif // HAVE_TAGLIB_H # endif // HAVE_TAGLIB_H
) )
) )
@@ -514,7 +514,7 @@ int main(int argc, char *argv[])
# ifdef HAVE_TAGLIB_H # ifdef HAVE_TAGLIB_H
myTinyTagEditor->Resize(); myTinyTagEditor->Resize();
TagEditor::Resize(); myTagEditor->Resize();
# endif // HAVE_TAGLIB_H # endif // HAVE_TAGLIB_H
# ifdef ENABLE_CLOCK # ifdef ENABLE_CLOCK
@@ -535,7 +535,7 @@ int main(int argc, char *argv[])
} }
else if (current_screen == csTagEditor) else if (current_screen == csTagEditor)
{ {
TagEditor::Refresh(); myTagEditor->Refresh();
} }
else else
# endif // HAVE_TAGLIB_H # endif // HAVE_TAGLIB_H
@@ -567,8 +567,7 @@ int main(int argc, char *argv[])
{ {
case csPlaylist: case csPlaylist:
{ {
if (!myPlaylist->Main()->Empty()) myPlaylist->EnterPressed();
Mpd->PlayID(myPlaylist->Main()->Current().GetID());
break; break;
} }
case csBrowser: case csBrowser:
@@ -601,7 +600,7 @@ int main(int argc, char *argv[])
# ifdef HAVE_TAGLIB_H # ifdef HAVE_TAGLIB_H
case csTagEditor: case csTagEditor:
{ {
TagEditor::EnterPressed(); myTagEditor->EnterPressed();
break; break;
} }
# endif // HAVE_TAGLIB_H # endif // HAVE_TAGLIB_H
@@ -614,13 +613,13 @@ int main(int argc, char *argv[])
if (Config.space_selects if (Config.space_selects
|| wCurrent == myPlaylist->Main() || wCurrent == myPlaylist->Main()
# ifdef HAVE_TAGLIB_H # ifdef HAVE_TAGLIB_H
|| wCurrent == mEditorTags || wCurrent == myTagEditor->Tags
# endif // HAVE_TAGLIB_H # endif // HAVE_TAGLIB_H
) )
{ {
if (wCurrent == myPlaylist->Main() if (wCurrent == myPlaylist->Main()
# ifdef HAVE_TAGLIB_H # ifdef HAVE_TAGLIB_H
|| wCurrent == mEditorTags || wCurrent == myTagEditor->Tags
# endif // HAVE_TAGLIB_H # endif // HAVE_TAGLIB_H
|| (wCurrent == myBrowser->Main() && ((Menu<Song> *)wCurrent)->Choice() >= (myBrowser->CurrentDir() != "/" ? 1 : 0)) || (wCurrent == mySearcher->Main() && !mySearcher->Main()->Current().first) || (wCurrent == myBrowser->Main() && ((Menu<Song> *)wCurrent)->Choice() >= (myBrowser->CurrentDir() != "/" ? 1 : 0)) || (wCurrent == mySearcher->Main() && !mySearcher->Main()->Current().first)
|| wCurrent == myLibrary->Songs || wCurrent == myLibrary->Songs
@@ -653,14 +652,9 @@ int main(int argc, char *argv[])
myPlaylistEditor->SpacePressed(); myPlaylistEditor->SpacePressed();
} }
# ifdef HAVE_TAGLIB_H # ifdef HAVE_TAGLIB_H
else if (wCurrent == mEditorLeftCol) else if (current_screen == csTagEditor)
{ {
Config.albums_in_tag_editor = !Config.albums_in_tag_editor; myTagEditor->SpacePressed();
wCurrent = wTagEditorActiveCol = mEditorLeftCol = Config.albums_in_tag_editor ? mEditorAlbums : mEditorDirs;
ShowMessage("Switched to %s view", Config.albums_in_tag_editor ? "albums" : "directories");
mEditorLeftCol->Display();
mEditorTags->Clear(0);
// redraw_screen = 1;
} }
# endif // HAVE_TAGLIB_H # endif // HAVE_TAGLIB_H
else if (current_screen == csLyrics) else if (current_screen == csLyrics)
@@ -683,21 +677,7 @@ int main(int argc, char *argv[])
# ifdef HAVE_TAGLIB_H # ifdef HAVE_TAGLIB_H
else if (current_screen == csTagEditor && input == Key.VolumeUp[0]) else if (current_screen == csTagEditor && input == Key.VolumeUp[0])
{ {
CLEAR_FIND_HISTORY; myTagEditor->NextColumn();
if (wCurrent == mEditorLeftCol)
{
mEditorLeftCol->HighlightColor(Config.main_highlight_color);
wCurrent->Refresh();
wCurrent = wTagEditorActiveCol = mEditorTagTypes;
mEditorTagTypes->HighlightColor(Config.active_column_color);
}
else if (wCurrent == mEditorTagTypes && mEditorTagTypes->Choice() < 12 && !mEditorTags->Empty())
{
mEditorTagTypes->HighlightColor(Config.main_highlight_color);
wCurrent->Refresh();
wCurrent = wTagEditorActiveCol = mEditorTags;
mEditorTags->HighlightColor(Config.active_column_color);
}
} }
# endif // HAVE_TAGLIB_H # endif // HAVE_TAGLIB_H
else else
@@ -716,21 +696,7 @@ int main(int argc, char *argv[])
# ifdef HAVE_TAGLIB_H # ifdef HAVE_TAGLIB_H
else if (current_screen == csTagEditor && input == Key.VolumeDown[0]) else if (current_screen == csTagEditor && input == Key.VolumeDown[0])
{ {
CLEAR_FIND_HISTORY; myTagEditor->PrevColumn();
if (wCurrent == mEditorTags)
{
mEditorTags->HighlightColor(Config.main_highlight_color);
wCurrent->Refresh();
wCurrent = wTagEditorActiveCol = mEditorTagTypes;
mEditorTagTypes->HighlightColor(Config.active_column_color);
}
else if (wCurrent == mEditorTagTypes)
{
mEditorTagTypes->HighlightColor(Config.main_highlight_color);
wCurrent->Refresh();
wCurrent = wTagEditorActiveCol = mEditorLeftCol;
mEditorLeftCol->HighlightColor(Config.active_column_color);
}
} }
# endif // HAVE_TAGLIB_H # endif // HAVE_TAGLIB_H
else else
@@ -1313,7 +1279,7 @@ int main(int argc, char *argv[])
((*it)->*set)(new_tag); ((*it)->*set)(new_tag);
ShowMessage("Updating tags in '%s'...", (*it)->GetName().c_str()); ShowMessage("Updating tags in '%s'...", (*it)->GetName().c_str());
string path = Config.mpd_music_dir + (*it)->GetFile(); string path = Config.mpd_music_dir + (*it)->GetFile();
if (!WriteTags(**it)) if (!TagEditor::WriteTags(**it))
{ {
ShowMessage("Error updating tags in '%s'!", (*it)->GetFile().c_str()); ShowMessage("Error updating tags in '%s'!", (*it)->GetFile().c_str());
success = 0; success = 0;
@@ -1371,13 +1337,13 @@ int main(int argc, char *argv[])
|| (wCurrent == mySearcher->Main() && !mySearcher->Main()->Current().first) || (wCurrent == mySearcher->Main() && !mySearcher->Main()->Current().first)
|| (wCurrent == myLibrary->Songs && !myLibrary->Songs->Empty()) || (wCurrent == myLibrary->Songs && !myLibrary->Songs->Empty())
|| (wCurrent == myPlaylistEditor->Content && !myPlaylistEditor->Content->Empty()) || (wCurrent == myPlaylistEditor->Content && !myPlaylistEditor->Content->Empty())
|| (wCurrent == mEditorTags && !mEditorTags->Empty())) || (wCurrent == myTagEditor->Tags && !myTagEditor->Tags->Empty()))
{ {
myTinyTagEditor->SwitchTo(); myTinyTagEditor->SwitchTo();
} }
else if (wCurrent == mEditorDirs) else if (wCurrent == myTagEditor->Dirs)
{ {
string old_dir = mEditorDirs->Current().first; string old_dir = myTagEditor->Dirs->Current().first;
LockStatusbar(); LockStatusbar();
Statusbar() << fmtBold << "Directory: " << fmtBoldEnd; Statusbar() << fmtBold << "Directory: " << fmtBoldEnd;
string new_dir = wFooter->GetString(old_dir); string new_dir = wFooter->GetString(old_dir);
@@ -1451,7 +1417,7 @@ int main(int argc, char *argv[])
|| (wCurrent == myLibrary->Songs && !myLibrary->Songs->Empty()) || (wCurrent == myLibrary->Songs && !myLibrary->Songs->Empty())
|| (wCurrent == myPlaylistEditor->Content && !myPlaylistEditor->Content->Empty()) || (wCurrent == myPlaylistEditor->Content && !myPlaylistEditor->Content->Empty())
# ifdef HAVE_TAGLIB_H # ifdef HAVE_TAGLIB_H
|| (wCurrent == mEditorTags && !mEditorTags->Empty()) || (wCurrent == myTagEditor->Tags && !myTagEditor->Tags->Empty())
# endif // HAVE_TAGLIB_H # endif // HAVE_TAGLIB_H
) )
{ {
@@ -1473,7 +1439,7 @@ int main(int argc, char *argv[])
break; break;
# ifdef HAVE_TAGLIB_H # ifdef HAVE_TAGLIB_H
case csTagEditor: case csTagEditor:
s = &mEditorTags->at(id); s = &myTagEditor->Tags->at(id);
break; break;
# endif // HAVE_TAGLIB_H # endif // HAVE_TAGLIB_H
default: default:
@@ -1535,7 +1501,7 @@ int main(int argc, char *argv[])
|| wCurrent == myLibrary->Songs || wCurrent == myLibrary->Songs
|| wCurrent == myPlaylistEditor->Content || wCurrent == myPlaylistEditor->Content
# ifdef HAVE_TAGLIB_H # ifdef HAVE_TAGLIB_H
|| wCurrent == mEditorTags || wCurrent == myTagEditor->Tags
# endif // HAVE_TAGLIB_H # endif // HAVE_TAGLIB_H
) )
{ {
@@ -1560,7 +1526,7 @@ int main(int argc, char *argv[])
|| wCurrent == myLibrary->Songs || wCurrent == myLibrary->Songs
|| wCurrent == myPlaylistEditor->Content || wCurrent == myPlaylistEditor->Content
# ifdef HAVE_TAGLIB_H # ifdef HAVE_TAGLIB_H
|| wCurrent == mEditorTags || wCurrent == myTagEditor->Tags
# endif // HAVE_TAGLIB_H # endif // HAVE_TAGLIB_H
) )
{ {
@@ -1809,7 +1775,7 @@ int main(int argc, char *argv[])
|| current_screen == csSearcher || current_screen == csSearcher
# ifdef HAVE_TAGLIB_H # ifdef HAVE_TAGLIB_H
|| current_screen == csTinyTagEditor || current_screen == csTinyTagEditor
|| wCurrent == mEditorTagTypes || wCurrent == myTagEditor->TagTypes
# endif // HAVE_TAGLIB_H # endif // HAVE_TAGLIB_H
) )
&& (current_screen != csSearcher && (current_screen != csSearcher
@@ -1873,12 +1839,12 @@ int main(int argc, char *argv[])
break; break;
# ifdef HAVE_TAGLIB_H # ifdef HAVE_TAGLIB_H
case csTagEditor: case csTagEditor:
if (wCurrent == mEditorLeftCol) if (wCurrent == myTagEditor->LeftColumn)
name = mEditorLeftCol->at(i).first; name = myTagEditor->LeftColumn->at(i).first;
else else
{ {
const Song &s = mEditorTags->at(i); const Song &s = myTagEditor->Tags->at(i);
switch (mEditorTagTypes->Choice()) switch (myTagEditor->TagTypes->Choice())
{ {
case 0: case 0:
name = s.GetTitle(); name = s.GetTitle();
@@ -2087,7 +2053,7 @@ int main(int argc, char *argv[])
else if (Keypressed(input, Key.TagEditor)) else if (Keypressed(input, Key.TagEditor))
{ {
CHECK_MPD_MUSIC_DIR; CHECK_MPD_MUSIC_DIR;
TagEditor::SwitchTo(); myTagEditor->SwitchTo();
} }
# endif // HAVE_TAGLIB_H # endif // HAVE_TAGLIB_H
# ifdef ENABLE_CLOCK # ifdef ENABLE_CLOCK

View File

@@ -31,6 +31,7 @@
#include "search_engine.h" #include "search_engine.h"
#include "settings.h" #include "settings.h"
#include "status_checker.h" #include "status_checker.h"
#include "tag_editor.h"
using namespace Global; using namespace Global;
using namespace MPD; using namespace MPD;
@@ -246,8 +247,8 @@ void NcmpcppStatusChanged(Connection *Mpd, StatusChanges changed, void *)
{ {
myBrowser->GetDirectory(myBrowser->CurrentDir()); myBrowser->GetDirectory(myBrowser->CurrentDir());
# ifdef HAVE_TAGLIB_H # ifdef HAVE_TAGLIB_H
mEditorAlbums->Clear(0); myTagEditor->Albums->Clear(0);
mEditorDirs->Clear(0); myTagEditor->Dirs->Clear(0);
# endif // HAVE_TAGLIB_H # endif // HAVE_TAGLIB_H
myLibrary->Artists->Clear(0); myLibrary->Artists->Clear(0);
myPlaylistEditor->Content->Clear(0); myPlaylistEditor->Content->Clear(0);

View File

@@ -80,7 +80,7 @@ void TinyTagEditor::SwitchTo()
itsEdited = myPlaylistEditor->Content->at(id); itsEdited = myPlaylistEditor->Content->at(id);
break; break;
case csTagEditor: case csTagEditor:
itsEdited = mEditorTags->at(id); itsEdited = myTagEditor->Tags->at(id);
break; break;
default: default:
break; break;
@@ -110,7 +110,7 @@ void TinyTagEditor::SwitchTo()
std::string TinyTagEditor::Title() std::string TinyTagEditor::Title()
{ {
return "Tag editor"; return "Tiny tag editor";
} }
void TinyTagEditor::EnterPressed() void TinyTagEditor::EnterPressed()
@@ -210,7 +210,7 @@ void TinyTagEditor::EnterPressed()
case 14: case 14:
{ {
ShowMessage("Updating tags..."); ShowMessage("Updating tags...");
if (WriteTags(s)) if (TagEditor::WriteTags(s))
{ {
ShowMessage("Tags updated!"); ShowMessage("Tags updated!");
if (s.IsFromDB()) if (s.IsFromDB())
@@ -246,7 +246,7 @@ void TinyTagEditor::EnterPressed()
} }
else if (current_screen == csTagEditor) else if (current_screen == csTagEditor)
{ {
TagEditor::Refresh(); myTagEditor->Refresh();
} }
break; break;
} }
@@ -316,79 +316,74 @@ bool TinyTagEditor::GetTags()
return true; return true;
} }
Window *Global::wTagEditorActiveCol; //Window *Global::wTagEditorActiveCol;
Menu<string_pair> *Global::mEditorAlbums; /*Menu<string_pair> *Global::Albums;
Menu<string_pair> *Global::mEditorDirs; Menu<string_pair> *Global::Dirs;
Menu<string_pair> *Global::mEditorLeftCol; Menu<string_pair> *Global::LeftColumn;
Menu<string> *Global::mEditorTagTypes; Menu<string> *Global::TagTypes;
Menu<Song> *Global::mEditorTags; Menu<Song> *Global::Tags;*/
namespace TagEditor TagEditor *myTagEditor = new TagEditor;
{
const size_t middle_col_width = 26; const size_t TagEditor::MiddleColumnWidth = 26;
size_t left_col_width; size_t TagEditor::LeftColumnWidth;
size_t middle_col_startx; size_t TagEditor::MiddleColumnStartX;
size_t right_col_width; size_t TagEditor::RightColumnWidth;
size_t right_col_startx; size_t TagEditor::RightColumnStartX;
}
void TagEditor::Init() void TagEditor::Init()
{ {
left_col_width = COLS/2-middle_col_width/2; LeftColumnWidth = COLS/2-MiddleColumnWidth/2;
middle_col_startx = left_col_width+1; MiddleColumnStartX = LeftColumnWidth+1;
right_col_width = COLS-left_col_width-middle_col_width-2; RightColumnWidth = COLS-LeftColumnWidth-MiddleColumnWidth-2;
right_col_startx = left_col_width+middle_col_width+2; RightColumnStartX = LeftColumnWidth+MiddleColumnWidth+2;
mEditorAlbums = new Menu<string_pair>(0, main_start_y, left_col_width, main_height, "Albums", Config.main_color, brNone); Albums = new Menu<string_pair>(0, main_start_y, LeftColumnWidth, main_height, "Albums", Config.main_color, brNone);
mEditorAlbums->HighlightColor(Config.active_column_color); Albums->HighlightColor(Config.active_column_color);
mEditorAlbums->SetTimeout(ncmpcpp_window_timeout); Albums->SetTimeout(ncmpcpp_window_timeout);
mEditorAlbums->SetItemDisplayer(Display::StringPairs); Albums->SetItemDisplayer(Display::StringPairs);
mEditorDirs = new Menu<string_pair>(0, main_start_y, left_col_width, main_height, "Directories", Config.main_color, brNone); Dirs = new Menu<string_pair>(0, main_start_y, LeftColumnWidth, main_height, "Directories", Config.main_color, brNone);
mEditorDirs->HighlightColor(Config.active_column_color); Dirs->HighlightColor(Config.active_column_color);
mEditorDirs->SetTimeout(ncmpcpp_window_timeout); Dirs->SetTimeout(ncmpcpp_window_timeout);
mEditorDirs->SetItemDisplayer(Display::StringPairs); Dirs->SetItemDisplayer(Display::StringPairs);
mEditorLeftCol = Config.albums_in_tag_editor ? mEditorAlbums : mEditorDirs; LeftColumn = Config.albums_in_tag_editor ? Albums : Dirs;
mEditorTagTypes = new Menu<string>(middle_col_startx, main_start_y, middle_col_width, main_height, "Tag types", Config.main_color, brNone); TagTypes = new Menu<string>(MiddleColumnStartX, main_start_y, MiddleColumnWidth, main_height, "Tag types", Config.main_color, brNone);
mEditorTagTypes->HighlightColor(Config.main_highlight_color); TagTypes->HighlightColor(Config.main_highlight_color);
mEditorTagTypes->SetTimeout(ncmpcpp_window_timeout); TagTypes->SetTimeout(ncmpcpp_window_timeout);
mEditorTagTypes->SetItemDisplayer(Display::Generic); TagTypes->SetItemDisplayer(Display::Generic);
mEditorTags = new Menu<Song>(right_col_startx, main_start_y, right_col_width, main_height, "Tags", Config.main_color, brNone); Tags = new Menu<Song>(RightColumnStartX, main_start_y, RightColumnWidth, main_height, "Tags", Config.main_color, brNone);
mEditorTags->HighlightColor(Config.main_highlight_color); Tags->HighlightColor(Config.main_highlight_color);
mEditorTags->SetTimeout(ncmpcpp_window_timeout); Tags->SetTimeout(ncmpcpp_window_timeout);
mEditorTags->SetSelectPrefix(&Config.selected_item_prefix); Tags->SetSelectPrefix(&Config.selected_item_prefix);
mEditorTags->SetSelectSuffix(&Config.selected_item_suffix); Tags->SetSelectSuffix(&Config.selected_item_suffix);
mEditorTags->SetItemDisplayer(Display::Tags); Tags->SetItemDisplayer(Display::Tags);
mEditorTags->SetItemDisplayerUserData(mEditorTagTypes); Tags->SetItemDisplayerUserData(TagTypes);
wTagEditorActiveCol = mEditorLeftCol; w = LeftColumn;
} }
void TagEditor::Resize() void TagEditor::Resize()
{ {
left_col_width = COLS/2-middle_col_width/2; LeftColumnWidth = COLS/2-MiddleColumnWidth/2;
middle_col_startx = left_col_width+1; MiddleColumnStartX = LeftColumnWidth+1;
right_col_width = COLS-left_col_width-middle_col_width-2; RightColumnWidth = COLS-LeftColumnWidth-MiddleColumnWidth-2;
right_col_startx = left_col_width+middle_col_width+2; RightColumnStartX = LeftColumnWidth+MiddleColumnWidth+2;
mEditorAlbums->Resize(left_col_width, main_height); Albums->Resize(LeftColumnWidth, main_height);
mEditorDirs->Resize(left_col_width, main_height); Dirs->Resize(LeftColumnWidth, main_height);
mEditorTagTypes->Resize(middle_col_width, main_height); TagTypes->Resize(MiddleColumnWidth, main_height);
mEditorTags->Resize(right_col_width, main_height); Tags->Resize(RightColumnWidth, main_height);
mEditorTagTypes->MoveTo(middle_col_startx, main_start_y); TagTypes->MoveTo(MiddleColumnStartX, main_start_y);
mEditorTags->MoveTo(right_col_startx, main_start_y); Tags->MoveTo(RightColumnStartX, main_start_y);
} }
void TagEditor::Refresh() std::string TagEditor::Title()
{ {
mEditorLeftCol->Display(); return "Tag editor";
mvvline(main_start_y, middle_col_startx-1, 0, main_height);
mEditorTagTypes->Display();
mvvline(main_start_y, right_col_startx-1, 0, main_height);
mEditorTags->Display();
} }
void TagEditor::SwitchTo() void TagEditor::SwitchTo()
@@ -403,47 +398,56 @@ void TagEditor::SwitchTo()
redraw_header = 1; redraw_header = 1;
TagEditor::Refresh(); TagEditor::Refresh();
if (mEditorTagTypes->Empty()) if (TagTypes->Empty())
{ {
mEditorTagTypes->AddOption("Title"); TagTypes->AddOption("Title");
mEditorTagTypes->AddOption("Artist"); TagTypes->AddOption("Artist");
mEditorTagTypes->AddOption("Album"); TagTypes->AddOption("Album");
mEditorTagTypes->AddOption("Year"); TagTypes->AddOption("Year");
mEditorTagTypes->AddOption("Track"); TagTypes->AddOption("Track");
mEditorTagTypes->AddOption("Genre"); TagTypes->AddOption("Genre");
mEditorTagTypes->AddOption("Composer"); TagTypes->AddOption("Composer");
mEditorTagTypes->AddOption("Performer"); TagTypes->AddOption("Performer");
mEditorTagTypes->AddOption("Disc"); TagTypes->AddOption("Disc");
mEditorTagTypes->AddOption("Comment"); TagTypes->AddOption("Comment");
mEditorTagTypes->AddSeparator(); TagTypes->AddSeparator();
mEditorTagTypes->AddOption("Filename"); TagTypes->AddOption("Filename");
mEditorTagTypes->AddSeparator(); TagTypes->AddSeparator();
mEditorTagTypes->AddOption("Options", 1, 1, 0); TagTypes->AddOption("Options", 1, 1, 0);
mEditorTagTypes->AddSeparator(); TagTypes->AddSeparator();
mEditorTagTypes->AddOption("Reset"); TagTypes->AddOption("Reset");
mEditorTagTypes->AddOption("Save"); TagTypes->AddOption("Save");
mEditorTagTypes->AddSeparator(); TagTypes->AddSeparator();
mEditorTagTypes->AddOption("Capitalize First Letters"); TagTypes->AddOption("Capitalize First Letters");
mEditorTagTypes->AddOption("lower all letters"); TagTypes->AddOption("lower all letters");
} }
wCurrent = wTagEditorActiveCol; wCurrent = w;
current_screen = csTagEditor; current_screen = csTagEditor;
} }
} }
void TagEditor::Refresh()
{
LeftColumn->Display();
mvvline(main_start_y, MiddleColumnStartX-1, 0, main_height);
TagTypes->Display();
mvvline(main_start_y, RightColumnStartX-1, 0, main_height);
Tags->Display();
}
void TagEditor::Update() void TagEditor::Update()
{ {
if (mEditorLeftCol->Empty()) if (LeftColumn->Empty())
{ {
CLEAR_FIND_HISTORY; CLEAR_FIND_HISTORY;
mEditorLeftCol->Window::Clear(); LeftColumn->Window::Clear();
mEditorTags->Clear(); Tags->Clear();
TagList list; TagList list;
if (Config.albums_in_tag_editor) if (Config.albums_in_tag_editor)
{ {
std::map<string, string, CaseInsensitiveSorting> maplist; std::map<string, string, CaseInsensitiveSorting> maplist;
mEditorAlbums->WriteXY(0, 0, 0, "Fetching albums' list..."); Albums->WriteXY(0, 0, 0, "Fetching albums' list...");
Mpd->GetAlbums("", list); Mpd->GetAlbums("", list);
for (TagList::const_iterator it = list.begin(); it != list.end(); it++) for (TagList::const_iterator it = list.begin(); it != list.end(); it++)
{ {
@@ -459,7 +463,7 @@ void TagEditor::Update()
FreeSongList(l); FreeSongList(l);
} }
for (std::map<string, string>::const_iterator it = maplist.begin(); it != maplist.end(); it++) for (std::map<string, string>::const_iterator it = maplist.begin(); it != maplist.end(); it++)
mEditorAlbums->AddOption(make_pair(it->first, it->second)); Albums->AddOption(make_pair(it->first, it->second));
} }
else else
{ {
@@ -470,106 +474,106 @@ void TagEditor::Update()
{ {
size_t slash = editor_browsed_dir.rfind("/"); size_t slash = editor_browsed_dir.rfind("/");
string parent = slash != string::npos ? editor_browsed_dir.substr(0, slash) : "/"; string parent = slash != string::npos ? editor_browsed_dir.substr(0, slash) : "/";
mEditorDirs->AddOption(make_pair("[..]", parent)); Dirs->AddOption(make_pair("[..]", parent));
} }
else else
{ {
mEditorDirs->AddOption(make_pair(".", "/")); Dirs->AddOption(make_pair(".", "/"));
} }
for (TagList::const_iterator it = list.begin(); it != list.end(); it++) for (TagList::const_iterator it = list.begin(); it != list.end(); it++)
{ {
size_t slash = it->rfind("/"); size_t slash = it->rfind("/");
string to_display = slash != string::npos ? it->substr(slash+1) : *it; string to_display = slash != string::npos ? it->substr(slash+1) : *it;
utf_to_locale(to_display); utf_to_locale(to_display);
mEditorDirs->AddOption(make_pair(to_display, *it)); Dirs->AddOption(make_pair(to_display, *it));
if (*it == editor_highlighted_dir) if (*it == editor_highlighted_dir)
highlightme = mEditorDirs->Size()-1; highlightme = Dirs->Size()-1;
} }
if (highlightme != -1) if (highlightme != -1)
mEditorDirs->Highlight(highlightme); Dirs->Highlight(highlightme);
} }
mEditorLeftCol->Display(); LeftColumn->Display();
mEditorTagTypes->Refresh(); TagTypes->Refresh();
} }
if (mEditorTags->Empty()) if (Tags->Empty())
{ {
mEditorTags->Reset(); Tags->Reset();
SongList list; SongList list;
if (Config.albums_in_tag_editor) if (Config.albums_in_tag_editor)
{ {
Mpd->StartSearch(1); Mpd->StartSearch(1);
Mpd->AddSearch(MPD_TAG_ITEM_ALBUM, mEditorAlbums->Current().second); Mpd->AddSearch(MPD_TAG_ITEM_ALBUM, Albums->Current().second);
Mpd->CommitSearch(list); Mpd->CommitSearch(list);
sort(list.begin(), list.end(), CaseInsensitiveSorting()); sort(list.begin(), list.end(), CaseInsensitiveSorting());
for (SongList::iterator it = list.begin(); it != list.end(); it++) for (SongList::iterator it = list.begin(); it != list.end(); it++)
{ {
(*it)->Localize(); (*it)->Localize();
mEditorTags->AddOption(**it); Tags->AddOption(**it);
} }
} }
else else
{ {
Mpd->GetSongs(mEditorDirs->Current().second, list); Mpd->GetSongs(Dirs->Current().second, list);
sort(list.begin(), list.end(), CaseInsensitiveSorting()); sort(list.begin(), list.end(), CaseInsensitiveSorting());
for (SongList::const_iterator it = list.begin(); it != list.end(); it++) for (SongList::const_iterator it = list.begin(); it != list.end(); it++)
{ {
(*it)->Localize(); (*it)->Localize();
mEditorTags->AddOption(**it); Tags->AddOption(**it);
} }
} }
FreeSongList(list); FreeSongList(list);
mEditorTags->Window::Clear(); Tags->Window::Clear();
mEditorTags->Refresh(); Tags->Refresh();
} }
if (/*redraw_screen && */wCurrent == mEditorTagTypes && mEditorTagTypes->Choice() < 13) if (/*redraw_screen && */wCurrent == TagTypes && TagTypes->Choice() < 13)
{ {
mEditorTags->Refresh(); Tags->Refresh();
// redraw_screen = 0; // redraw_screen = 0;
} }
else if (mEditorTagTypes->Choice() >= 13) else if (TagTypes->Choice() >= 13)
mEditorTags->Window::Clear(); Tags->Window::Clear();
} }
void TagEditor::EnterPressed() void TagEditor::EnterPressed()
{ {
if (wCurrent == mEditorDirs) if (wCurrent == Dirs)
{ {
TagList test; TagList test;
Mpd->GetDirectories(mEditorLeftCol->Current().second, test); Mpd->GetDirectories(LeftColumn->Current().second, test);
if (!test.empty()) if (!test.empty())
{ {
editor_highlighted_dir = editor_browsed_dir; editor_highlighted_dir = editor_browsed_dir;
editor_browsed_dir = mEditorLeftCol->Current().second; editor_browsed_dir = LeftColumn->Current().second;
mEditorLeftCol->Clear(0); LeftColumn->Clear(0);
mEditorLeftCol->Reset(); LeftColumn->Reset();
} }
else else
ShowMessage("No subdirs found"); ShowMessage("No subdirs found");
return; return;
} }
if (mEditorTags->Empty()) // we need songs to deal with, don't we? if (Tags->Empty()) // we need songs to deal with, don't we?
return; return;
// if there are selected songs, perform operations only on them // if there are selected songs, perform operations only on them
SongList list; SongList list;
if (mEditorTags->hasSelected()) if (Tags->hasSelected())
{ {
vector<size_t> selected; vector<size_t> selected;
mEditorTags->GetSelected(selected); Tags->GetSelected(selected);
for (vector<size_t>::const_iterator it = selected.begin(); it != selected.end(); it++) for (vector<size_t>::const_iterator it = selected.begin(); it != selected.end(); it++)
list.push_back(&mEditorTags->at(*it)); list.push_back(&Tags->at(*it));
} }
else else
for (size_t i = 0; i < mEditorTags->Size(); i++) for (size_t i = 0; i < Tags->Size(); i++)
list.push_back(&mEditorTags->at(i)); list.push_back(&Tags->at(i));
SongGetFunction get = 0; SongGetFunction get = 0;
SongSetFunction set = 0; SongSetFunction set = 0;
size_t id = mEditorTagTypes->RealChoice(); size_t id = TagTypes->RealChoice();
switch (id) switch (id)
{ {
case 0: case 0:
@@ -591,7 +595,7 @@ void TagEditor::EnterPressed()
case 4: case 4:
get = &Song::GetTrack; get = &Song::GetTrack;
set = &Song::SetTrack; set = &Song::SetTrack;
if (wCurrent == mEditorTagTypes) if (wCurrent == TagTypes)
{ {
LockStatusbar(); LockStatusbar();
Statusbar() << "Number tracks? [y/n] "; Statusbar() << "Number tracks? [y/n] ";
@@ -638,16 +642,16 @@ void TagEditor::EnterPressed()
break; break;
case 10: case 10:
{ {
if (wCurrent == mEditorTagTypes) if (wCurrent == TagTypes)
{ {
current_screen = csOther; current_screen = csOther;
__deal_with_filenames(list); DealWithFilenames(list);
current_screen = csTagEditor; current_screen = csTagEditor;
TagEditor::Refresh(); TagEditor::Refresh();
} }
else if (wCurrent == mEditorTags) else if (wCurrent == Tags)
{ {
Song &s = mEditorTags->Current(); Song &s = Tags->Current();
string old_name = s.GetNewName().empty() ? s.GetName() : s.GetNewName(); string old_name = s.GetNewName().empty() ? s.GetName() : s.GetNewName();
size_t last_dot = old_name.rfind("."); size_t last_dot = old_name.rfind(".");
string extension = old_name.substr(last_dot); string extension = old_name.substr(last_dot);
@@ -658,13 +662,13 @@ void TagEditor::EnterPressed()
UnlockStatusbar(); UnlockStatusbar();
if (!new_name.empty() && new_name != old_name) if (!new_name.empty() && new_name != old_name)
s.SetNewName(new_name + extension); s.SetNewName(new_name + extension);
mEditorTags->Scroll(wDown); Tags->Scroll(wDown);
} }
return; return;
} }
case 11: // reset case 11: // reset
{ {
mEditorTags->Clear(0); Tags->Clear(0);
ShowMessage("Changes reset"); ShowMessage("Changes reset");
return; return;
} }
@@ -685,15 +689,15 @@ void TagEditor::EnterPressed()
if (success) if (success)
{ {
ShowMessage("Tags updated!"); ShowMessage("Tags updated!");
mEditorTagTypes->HighlightColor(Config.main_highlight_color); TagTypes->HighlightColor(Config.main_highlight_color);
mEditorTagTypes->Reset(); TagTypes->Reset();
wCurrent->Refresh(); wCurrent->Refresh();
wCurrent = mEditorLeftCol; wCurrent = LeftColumn;
mEditorLeftCol->HighlightColor(Config.active_column_color); LeftColumn->HighlightColor(Config.active_column_color);
Mpd->UpdateDirectory(FindSharedDir(mEditorTags)); Mpd->UpdateDirectory(FindSharedDir(Tags));
} }
else else
mEditorTags->Clear(0); Tags->Clear(0);
return; return;
} }
case 13: // capitalize first letters case 13: // capitalize first letters
@@ -716,27 +720,256 @@ void TagEditor::EnterPressed()
break; break;
} }
if (wCurrent == mEditorTagTypes && id != 0 && id != 4 && set != NULL) if (wCurrent == TagTypes && id != 0 && id != 4 && set != NULL)
{ {
LockStatusbar(); LockStatusbar();
Statusbar() << fmtBold << mEditorTagTypes->Current() << fmtBoldEnd << ": "; Statusbar() << fmtBold << TagTypes->Current() << fmtBoldEnd << ": ";
string new_tag = wFooter->GetString((mEditorTags->Current().*get)()); string new_tag = wFooter->GetString((Tags->Current().*get)());
UnlockStatusbar(); UnlockStatusbar();
for (SongList::iterator it = list.begin(); it != list.end(); it++) for (SongList::iterator it = list.begin(); it != list.end(); it++)
(**it.*set)(new_tag); (**it.*set)(new_tag);
} }
else if (wCurrent == mEditorTags && set != NULL) else if (wCurrent == Tags && set != NULL)
{ {
LockStatusbar(); LockStatusbar();
Statusbar() << fmtBold << mEditorTagTypes->Current() << fmtBoldEnd << ": "; Statusbar() << fmtBold << TagTypes->Current() << fmtBoldEnd << ": ";
string new_tag = wFooter->GetString((mEditorTags->Current().*get)()); string new_tag = wFooter->GetString((Tags->Current().*get)());
UnlockStatusbar(); UnlockStatusbar();
if (new_tag != (mEditorTags->Current().*get)()) if (new_tag != (Tags->Current().*get)())
(mEditorTags->Current().*set)(new_tag); (Tags->Current().*set)(new_tag);
mEditorTags->Scroll(wDown); Tags->Scroll(wDown);
} }
} }
void TagEditor::SpacePressed()
{
if (wCurrent != LeftColumn)
return;
Config.albums_in_tag_editor = !Config.albums_in_tag_editor;
wCurrent = w = LeftColumn = Config.albums_in_tag_editor ? Albums : Dirs;
ShowMessage("Switched to %s view", Config.albums_in_tag_editor ? "albums" : "directories");
LeftColumn->Display();
Tags->Clear(0);
}
void TagEditor::NextColumn()
{
CLEAR_FIND_HISTORY;
if (wCurrent == LeftColumn)
{
LeftColumn->HighlightColor(Config.main_highlight_color);
w->Refresh();
wCurrent = w = TagTypes;
TagTypes->HighlightColor(Config.active_column_color);
}
else if (wCurrent == TagTypes && TagTypes->Choice() < 12 && !Tags->Empty())
{
TagTypes->HighlightColor(Config.main_highlight_color);
w->Refresh();
wCurrent = w = myTagEditor->Tags;
Tags->HighlightColor(Config.active_column_color);
}
}
void TagEditor::PrevColumn()
{
CLEAR_FIND_HISTORY;
if (wCurrent == Tags)
{
Tags->HighlightColor(Config.main_highlight_color);
w->Refresh();
wCurrent = w = TagTypes;
TagTypes->HighlightColor(Config.active_column_color);
}
else if (wCurrent == TagTypes)
{
TagTypes->HighlightColor(Config.main_highlight_color);
w->Refresh();
wCurrent = w = LeftColumn;
LeftColumn->HighlightColor(Config.active_column_color);
}
}
void TagEditor::ReadTags(mpd_Song *s)
{
TagLib::FileRef f(s->file);
if (f.isNull())
return;
TagLib::MPEG::File *mpegf = dynamic_cast<TagLib::MPEG::File *>(f.file());
s->artist = !f.tag()->artist().isEmpty() ? str_pool_get(f.tag()->artist().toCString(1)) : 0;
s->title = !f.tag()->title().isEmpty() ? str_pool_get(f.tag()->title().toCString(1)) : 0;
s->album = !f.tag()->album().isEmpty() ? str_pool_get(f.tag()->album().toCString(1)) : 0;
s->track = f.tag()->track() ? str_pool_get(IntoStr(f.tag()->track()).c_str()) : 0;
s->date = f.tag()->year() ? str_pool_get(IntoStr(f.tag()->year()).c_str()) : 0;
s->genre = !f.tag()->genre().isEmpty() ? str_pool_get(f.tag()->genre().toCString(1)) : 0;
if (mpegf)
{
s->composer = !mpegf->ID3v2Tag()->frameListMap()["TCOM"].isEmpty()
? (!mpegf->ID3v2Tag()->frameListMap()["TCOM"].front()->toString().isEmpty()
? str_pool_get(mpegf->ID3v2Tag()->frameListMap()["TCOM"].front()->toString().toCString(1))
: 0)
: 0;
s->performer = !mpegf->ID3v2Tag()->frameListMap()["TOPE"].isEmpty()
? (!mpegf->ID3v2Tag()->frameListMap()["TOPE"].front()->toString().isEmpty()
? str_pool_get(mpegf->ID3v2Tag()->frameListMap()["TOPE"].front()->toString().toCString(1))
: 0)
: 0;
s->disc = !mpegf->ID3v2Tag()->frameListMap()["TPOS"].isEmpty()
? (!mpegf->ID3v2Tag()->frameListMap()["TPOS"].front()->toString().isEmpty()
? str_pool_get(mpegf->ID3v2Tag()->frameListMap()["TPOS"].front()->toString().toCString(1))
: 0)
: 0;
}
s->comment = !f.tag()->comment().isEmpty() ? str_pool_get(f.tag()->comment().toCString(1)) : 0;
s->time = f.audioProperties()->length();
}
bool TagEditor::WriteTags(Song &s)
{
using namespace TagLib;
string path_to_file;
bool file_is_from_db = s.IsFromDB();
if (file_is_from_db)
path_to_file += Config.mpd_music_dir;
path_to_file += s.GetFile();
locale_to_utf(path_to_file);
FileRef f(path_to_file.c_str());
if (!f.isNull())
{
f.tag()->setTitle(ToWString(s.GetTitle()));
f.tag()->setArtist(ToWString(s.GetArtist()));
f.tag()->setAlbum(ToWString(s.GetAlbum()));
f.tag()->setYear(StrToInt(s.GetYear()));
f.tag()->setTrack(StrToInt(s.GetTrack()));
f.tag()->setGenre(ToWString(s.GetGenre()));
f.tag()->setComment(ToWString(s.GetComment()));
if (!f.save())
return false;
string ext = s.GetFile();
ext = ext.substr(ext.rfind(".")+1);
ToLower(ext);
if (ext == "mp3")
{
MPEG::File file(path_to_file.c_str());
ID3v2::Tag *tag = file.ID3v2Tag();
String::Type encoding = String::UTF8;
ByteVector Composer("TCOM");
ByteVector Performer("TOPE");
ByteVector Disc("TPOS");
ID3v2::Frame *ComposerFrame = new ID3v2::TextIdentificationFrame(Composer, encoding);
ID3v2::Frame *PerformerFrame = new ID3v2::TextIdentificationFrame(Performer, encoding);
ID3v2::Frame *DiscFrame = new ID3v2::TextIdentificationFrame(Disc, encoding);
ComposerFrame->setText(ToWString(s.GetComposer()));
PerformerFrame->setText(ToWString(s.GetPerformer()));
DiscFrame->setText(ToWString(s.GetDisc()));
tag->removeFrames(Composer);
tag->addFrame(ComposerFrame);
tag->removeFrames(Performer);
tag->addFrame(PerformerFrame);
tag->removeFrames(Disc);
tag->addFrame(DiscFrame);
if (!file.save())
return false;
}
if (!s.GetNewName().empty())
{
string new_name;
if (file_is_from_db)
new_name += Config.mpd_music_dir;
new_name += s.GetDirectory() + "/" + s.GetNewName();
locale_to_utf(new_name);
if (rename(path_to_file.c_str(), new_name.c_str()) == 0 && !file_is_from_db)
{
if (wPrev == myPlaylist->Main())
{
// if we rename local file, it won't get updated
// so just remove it from playlist and add again
size_t pos = myPlaylist->Main()->Choice();
Mpd->QueueDeleteSong(pos);
Mpd->CommitQueue();
int id = Mpd->AddSong("file://" + new_name);
if (id >= 0)
{
s = myPlaylist->Main()->Back();
Mpd->Move(s.GetPosition(), pos);
}
}
else // only myBrowser->Main()
s.SetFile(new_name);
}
}
return true;
}
else
return false;
}
std::string TagEditor::CapitalizeFirstLetters(const string &s)
{
if (s.empty())
return "";
string result = s;
if (isalpha(result[0]))
result[0] = toupper(result[0]);
for (string::iterator it = result.begin()+1; it != result.end(); it++)
{
if (isalpha(*it) && !isalpha(*(it-1)))
*it = toupper(*it);
}
return result;
}
void TagEditor::CapitalizeFirstLetters(Song &s)
{
s.SetTitle(CapitalizeFirstLetters(s.GetTitle()));
s.SetArtist(CapitalizeFirstLetters(s.GetArtist()));
s.SetAlbum(CapitalizeFirstLetters(s.GetAlbum()));
s.SetGenre(CapitalizeFirstLetters(s.GetGenre()));
s.SetComposer(CapitalizeFirstLetters(s.GetComposer()));
s.SetPerformer(CapitalizeFirstLetters(s.GetPerformer()));
s.SetDisc(CapitalizeFirstLetters(s.GetDisc()));
s.SetComment(CapitalizeFirstLetters(s.GetComment()));
}
void TagEditor::LowerAllLetters(Song &s)
{
string conv = s.GetTitle();
ToLower(conv);
s.SetTitle(conv);
conv = s.GetArtist();
ToLower(conv);
s.SetArtist(conv);
conv = s.GetAlbum();
ToLower(conv);
s.SetAlbum(conv);
conv = s.GetGenre();
ToLower(conv);
s.SetGenre(conv);
conv = s.GetComposer();
ToLower(conv);
s.SetComposer(conv);
conv = s.GetPerformer();
ToLower(conv);
s.SetPerformer(conv);
conv = s.GetDisc();
ToLower(conv);
s.SetDisc(conv);
conv = s.GetComment();
ToLower(conv);
s.SetComment(conv);
}
namespace namespace
{ {
const string patterns_list_file = config_dir + "patterns.list"; const string patterns_list_file = config_dir + "patterns.list";
@@ -856,21 +1089,6 @@ namespace
} }
return result.str(); return result.str();
} }
string tag_capitalize_first_letters(const string &s)
{
if (s.empty())
return "";
string result = s;
if (isalpha(result[0]))
result[0] = toupper(result[0]);
for (string::iterator it = result.begin()+1; it != result.end(); it++)
{
if (isalpha(*it) && !isalpha(*(it-1)))
*it = toupper(*it);
}
return result;
}
} }
SongSetFunction IntoSetFunction(mpd_TagItems tag) SongSetFunction IntoSetFunction(mpd_TagItems tag)
@@ -931,124 +1149,7 @@ string FindSharedDir(const SongList &v)
return result; return result;
} }
void ReadTagsFromFile(mpd_Song *s) void DealWithFilenames(SongList &v)
{
TagLib::FileRef f(s->file);
if (f.isNull())
return;
TagLib::MPEG::File *mpegf = dynamic_cast<TagLib::MPEG::File *>(f.file());
s->artist = !f.tag()->artist().isEmpty() ? str_pool_get(f.tag()->artist().toCString(1)) : 0;
s->title = !f.tag()->title().isEmpty() ? str_pool_get(f.tag()->title().toCString(1)) : 0;
s->album = !f.tag()->album().isEmpty() ? str_pool_get(f.tag()->album().toCString(1)) : 0;
s->track = f.tag()->track() ? str_pool_get(IntoStr(f.tag()->track()).c_str()) : 0;
s->date = f.tag()->year() ? str_pool_get(IntoStr(f.tag()->year()).c_str()) : 0;
s->genre = !f.tag()->genre().isEmpty() ? str_pool_get(f.tag()->genre().toCString(1)) : 0;
if (mpegf)
{
s->composer = !mpegf->ID3v2Tag()->frameListMap()["TCOM"].isEmpty()
? (!mpegf->ID3v2Tag()->frameListMap()["TCOM"].front()->toString().isEmpty()
? str_pool_get(mpegf->ID3v2Tag()->frameListMap()["TCOM"].front()->toString().toCString(1))
: 0)
: 0;
s->performer = !mpegf->ID3v2Tag()->frameListMap()["TOPE"].isEmpty()
? (!mpegf->ID3v2Tag()->frameListMap()["TOPE"].front()->toString().isEmpty()
? str_pool_get(mpegf->ID3v2Tag()->frameListMap()["TOPE"].front()->toString().toCString(1))
: 0)
: 0;
s->disc = !mpegf->ID3v2Tag()->frameListMap()["TPOS"].isEmpty()
? (!mpegf->ID3v2Tag()->frameListMap()["TPOS"].front()->toString().isEmpty()
? str_pool_get(mpegf->ID3v2Tag()->frameListMap()["TPOS"].front()->toString().toCString(1))
: 0)
: 0;
}
s->comment = !f.tag()->comment().isEmpty() ? str_pool_get(f.tag()->comment().toCString(1)) : 0;
s->time = f.audioProperties()->length();
}
bool WriteTags(Song &s)
{
using namespace TagLib;
string path_to_file;
bool file_is_from_db = s.IsFromDB();
if (file_is_from_db)
path_to_file += Config.mpd_music_dir;
path_to_file += s.GetFile();
locale_to_utf(path_to_file);
FileRef f(path_to_file.c_str());
if (!f.isNull())
{
f.tag()->setTitle(ToWString(s.GetTitle()));
f.tag()->setArtist(ToWString(s.GetArtist()));
f.tag()->setAlbum(ToWString(s.GetAlbum()));
f.tag()->setYear(StrToInt(s.GetYear()));
f.tag()->setTrack(StrToInt(s.GetTrack()));
f.tag()->setGenre(ToWString(s.GetGenre()));
f.tag()->setComment(ToWString(s.GetComment()));
if (!f.save())
return false;
string ext = s.GetFile();
ext = ext.substr(ext.rfind(".")+1);
ToLower(ext);
if (ext == "mp3")
{
MPEG::File file(path_to_file.c_str());
ID3v2::Tag *tag = file.ID3v2Tag();
String::Type encoding = String::UTF8;
ByteVector Composer("TCOM");
ByteVector Performer("TOPE");
ByteVector Disc("TPOS");
ID3v2::Frame *ComposerFrame = new ID3v2::TextIdentificationFrame(Composer, encoding);
ID3v2::Frame *PerformerFrame = new ID3v2::TextIdentificationFrame(Performer, encoding);
ID3v2::Frame *DiscFrame = new ID3v2::TextIdentificationFrame(Disc, encoding);
ComposerFrame->setText(ToWString(s.GetComposer()));
PerformerFrame->setText(ToWString(s.GetPerformer()));
DiscFrame->setText(ToWString(s.GetDisc()));
tag->removeFrames(Composer);
tag->addFrame(ComposerFrame);
tag->removeFrames(Performer);
tag->addFrame(PerformerFrame);
tag->removeFrames(Disc);
tag->addFrame(DiscFrame);
if (!file.save())
return false;
}
if (!s.GetNewName().empty())
{
string new_name;
if (file_is_from_db)
new_name += Config.mpd_music_dir;
new_name += s.GetDirectory() + "/" + s.GetNewName();
locale_to_utf(new_name);
if (rename(path_to_file.c_str(), new_name.c_str()) == 0 && !file_is_from_db)
{
if (wPrev == myPlaylist->Main())
{
// if we rename local file, it won't get updated
// so just remove it from playlist and add again
size_t pos = myPlaylist->Main()->Choice();
Mpd->QueueDeleteSong(pos);
Mpd->CommitQueue();
int id = Mpd->AddSong("file://" + new_name);
if (id >= 0)
{
s = myPlaylist->Main()->Back();
Mpd->Move(s.GetPosition(), pos);
}
}
else // only myBrowser->Main()
s.SetFile(new_name);
}
}
return true;
}
else
return false;
}
void __deal_with_filenames(SongList &v)
{ {
int width = 30; int width = 30;
int height = 6; int height = 6;
@@ -1290,52 +1391,5 @@ void __deal_with_filenames(SongList &v)
delete Preview; delete Preview;
} }
void CapitalizeFirstLetters(Song &s)
{
s.SetTitle(tag_capitalize_first_letters(s.GetTitle()));
s.SetArtist(tag_capitalize_first_letters(s.GetArtist()));
s.SetAlbum(tag_capitalize_first_letters(s.GetAlbum()));
s.SetGenre(tag_capitalize_first_letters(s.GetGenre()));
s.SetComposer(tag_capitalize_first_letters(s.GetComposer()));
s.SetPerformer(tag_capitalize_first_letters(s.GetPerformer()));
s.SetDisc(tag_capitalize_first_letters(s.GetDisc()));
s.SetComment(tag_capitalize_first_letters(s.GetComment()));
}
void LowerAllLetters(Song &s)
{
string conv = s.GetTitle();
ToLower(conv);
s.SetTitle(conv);
conv = s.GetArtist();
ToLower(conv);
s.SetArtist(conv);
conv = s.GetAlbum();
ToLower(conv);
s.SetAlbum(conv);
conv = s.GetGenre();
ToLower(conv);
s.SetGenre(conv);
conv = s.GetComposer();
ToLower(conv);
s.SetComposer(conv);
conv = s.GetPerformer();
ToLower(conv);
s.SetPerformer(conv);
conv = s.GetDisc();
ToLower(conv);
s.SetDisc(conv);
conv = s.GetComment();
ToLower(conv);
s.SetComment(conv);
}
#endif #endif

View File

@@ -42,7 +42,7 @@ class TinyTagEditor : public Screen< Menu<Buffer> >
virtual std::string Title(); virtual std::string Title();
void EnterPressed(); virtual void EnterPressed();
protected: protected:
bool GetTags(); bool GetTags();
@@ -51,17 +51,46 @@ class TinyTagEditor : public Screen< Menu<Buffer> >
extern TinyTagEditor *myTinyTagEditor; extern TinyTagEditor *myTinyTagEditor;
namespace TagEditor class TagEditor : public Screen<Window>
{ {
void Init(); public:
void Resize(); virtual void Init();
void Refresh(); virtual void Resize();
void SwitchTo(); virtual void SwitchTo();
void Update(); virtual std::string Title();
void EnterPressed(); virtual void Refresh();
} virtual void Update();
virtual void EnterPressed();
virtual void SpacePressed();
void NextColumn();
void PrevColumn();
Menu<string_pair> *LeftColumn;
Menu<string_pair> *Albums;
Menu<string_pair> *Dirs;
Menu<std::string> *TagTypes;
Menu<MPD::Song> *Tags;
static void ReadTags(mpd_Song *);
static bool WriteTags(MPD::Song &);
protected:
static std::string CapitalizeFirstLetters(const std::string &);
static void CapitalizeFirstLetters(MPD::Song &);
static void LowerAllLetters(MPD::Song &);
static const size_t MiddleColumnWidth;
static size_t LeftColumnWidth;
static size_t MiddleColumnStartX;
static size_t RightColumnWidth;
static size_t RightColumnStartX;
};
extern TagEditor *myTagEditor;
typedef void (MPD::Song::*SongSetFunction)(const std::string &); typedef void (MPD::Song::*SongSetFunction)(const std::string &);
typedef std::string (MPD::Song::*SongGetFunction)() const; typedef std::string (MPD::Song::*SongGetFunction)() const;
@@ -71,14 +100,7 @@ std::string FindSharedDir(const MPD::SongList &);
SongSetFunction IntoSetFunction(mpd_TagItems); SongSetFunction IntoSetFunction(mpd_TagItems);
void ReadTagsFromFile(mpd_Song *); void DealWithFilenames(MPD::SongList &);
//bool GetSongTags(MPD::Song &);
bool WriteTags(MPD::Song &);
void __deal_with_filenames(MPD::SongList &);
void CapitalizeFirstLetters(MPD::Song &);
void LowerAllLetters(MPD::Song &);
#endif #endif