use Info::Tags in tag editor

This commit is contained in:
Andrzej Rybczak
2010-01-23 20:57:54 +01:00
parent 4ed9493abd
commit abc63f9d4c
2 changed files with 92 additions and 243 deletions

View File

@@ -20,6 +20,7 @@
#include "display.h" #include "display.h"
#include "helpers.h" #include "helpers.h"
#include "info.h"
#include "playlist.h" #include "playlist.h"
std::string Display::Columns() std::string Display::Columns()
@@ -283,49 +284,17 @@ void Display::Songs(const MPD::Song &s, void *data, Menu<MPD::Song> *menu)
void Display::Tags(const MPD::Song &s, void *data, Menu<MPD::Song> *menu) void Display::Tags(const MPD::Song &s, void *data, Menu<MPD::Song> *menu)
{ {
switch (static_cast<Menu<std::string> *>(data)->Choice()) size_t i = static_cast<Menu<std::string> *>(data)->Choice();
if (i < 11)
{
ShowTag(*menu, s.GetTags(Info::Tags[i].Get));
}
else if (i == 12)
{ {
case 0:
ShowTag(*menu, s.GetTags(&MPD::Song::GetTitle));
return;
case 1:
ShowTag(*menu, s.GetTags(&MPD::Song::GetArtist));
return;
case 2:
ShowTag(*menu, s.GetTags(&MPD::Song::GetAlbumArtist));
return;
case 3:
ShowTag(*menu, s.GetTags(&MPD::Song::GetAlbum));
return;
case 4:
ShowTag(*menu, s.GetTags(&MPD::Song::GetDate));
return;
case 5:
ShowTag(*menu, s.GetTags(&MPD::Song::GetTrack));
return;
case 6:
ShowTag(*menu, s.GetTags(&MPD::Song::GetGenre));
return;
case 7:
ShowTag(*menu, s.GetTags(&MPD::Song::GetComposer));
return;
case 8:
ShowTag(*menu, s.GetTags(&MPD::Song::GetPerformer));
return;
case 9:
ShowTag(*menu, s.GetTags(&MPD::Song::GetDisc));
return;
case 10:
ShowTag(*menu, s.GetTags(&MPD::Song::GetComment));
return;
case 12:
if (s.GetNewName().empty()) if (s.GetNewName().empty())
*menu << s.GetName(); *menu << s.GetName();
else else
*menu << s.GetName() << Config.color2 << " -> " << clEnd << s.GetNewName(); *menu << s.GetName() << Config.color2 << " -> " << clEnd << s.GetNewName();
return;
default:
return;
} }
} }

View File

@@ -36,6 +36,7 @@
#include "charset.h" #include "charset.h"
#include "display.h" #include "display.h"
#include "global.h" #include "global.h"
#include "info.h"
#include "playlist.h" #include "playlist.h"
using Global::MainHeight; using Global::MainHeight;
@@ -82,17 +83,8 @@ void TagEditor::Init()
TagTypes->CyclicScrolling(Config.use_cyclic_scrolling); TagTypes->CyclicScrolling(Config.use_cyclic_scrolling);
TagTypes->SetItemDisplayer(Display::Generic); TagTypes->SetItemDisplayer(Display::Generic);
TagTypes->AddOption("Title"); for (const Info::Metadata *m = Info::Tags; m->Name; ++m)
TagTypes->AddOption("Artist"); TagTypes->AddOption(m->Name);
TagTypes->AddOption("Album Artist");
TagTypes->AddOption("Album");
TagTypes->AddOption("Year");
TagTypes->AddOption("Track");
TagTypes->AddOption("Genre");
TagTypes->AddOption("Composer");
TagTypes->AddOption("Performer");
TagTypes->AddOption("Disc");
TagTypes->AddOption("Comment");
TagTypes->AddSeparator(); TagTypes->AddSeparator();
TagTypes->AddOption("Filename"); TagTypes->AddOption("Filename");
TagTypes->AddSeparator(); TagTypes->AddSeparator();
@@ -513,36 +505,9 @@ void TagEditor::EnterPressed()
for (size_t i = 0; i < Tags->Size(); ++i) for (size_t i = 0; i < Tags->Size(); ++i)
EditedSongs.push_back(&(*Tags)[i]); EditedSongs.push_back(&(*Tags)[i]);
MPD::Song::GetFunction get = 0;
MPD::Song::SetFunction set = 0;
size_t id = TagTypes->RealChoice(); size_t id = TagTypes->RealChoice();
switch (id)
{ if (w == TagTypes && id == 5)
case 0:
get = &MPD::Song::GetTitle;
set = &MPD::Song::SetTitle;
break;
case 1:
get = &MPD::Song::GetArtist;
set = &MPD::Song::SetArtist;
break;
case 2:
get = &MPD::Song::GetAlbumArtist;
set = &MPD::Song::SetAlbumArtist;
break;
case 3:
get = &MPD::Song::GetAlbum;
set = &MPD::Song::SetAlbum;
break;
case 4:
get = &MPD::Song::GetDate;
set = &MPD::Song::SetDate;
break;
case 5:
get = &MPD::Song::GetTrack;
set = &MPD::Song::SetTrack;
if (w == TagTypes)
{ {
LockStatusbar(); LockStatusbar();
Statusbar() << "Number tracks? [" << fmtBold << 'y' << fmtBoldEnd << '/' << fmtBold << 'n' << fmtBoldEnd << "] "; Statusbar() << "Number tracks? [" << fmtBold << 'y' << fmtBoldEnd << '/' << fmtBold << 'n' << fmtBoldEnd << "] ";
@@ -569,29 +534,36 @@ void TagEditor::EnterPressed()
} }
else else
ShowMessage("Aborted!"); ShowMessage("Aborted!");
return;
} }
break;
case 6: if (id < 11)
get = &MPD::Song::GetGenre; {
set = &MPD::Song::SetGenre; MPD::Song::GetFunction get = Info::Tags[id].Get;
break; MPD::Song::SetFunction set = Info::Tags[id].Set;
case 7: if (id > 0 && w == TagTypes)
get = &MPD::Song::GetComposer; {
set = &MPD::Song::SetComposer; LockStatusbar();
break; Statusbar() << fmtBold << TagTypes->Current() << fmtBoldEnd << ": ";
case 8: std::string new_tag = wFooter->GetString(Tags->Current().GetTags(get));
get = &MPD::Song::GetPerformer; UnlockStatusbar();
set = &MPD::Song::SetPerformer; for (MPD::SongList::iterator it = EditedSongs.begin(); it != EditedSongs.end(); ++it)
break; (*it)->SetTags(set, new_tag);
case 9: }
get = &MPD::Song::GetDisc; else if (w == Tags)
set = &MPD::Song::SetDisc; {
break; LockStatusbar();
case 10: Statusbar() << fmtBold << TagTypes->Current() << fmtBoldEnd << ": ";
get = &MPD::Song::GetComment; std::string new_tag = wFooter->GetString(Tags->Current().GetTags(get));
set = &MPD::Song::SetComment; UnlockStatusbar();
break; if (new_tag != Tags->Current().GetTags(get))
case 11: Tags->Current().SetTags(set, new_tag);
Tags->Scroll(wDown);
}
}
else
{
if (id == 11) // filename related options
{ {
if (w == TagTypes) if (w == TagTypes)
{ {
@@ -618,15 +590,13 @@ void TagEditor::EnterPressed()
s.SetNewName(new_name + extension); s.SetNewName(new_name + extension);
Tags->Scroll(wDown); Tags->Scroll(wDown);
} }
return;
} }
case 12: // reset else if (id == 12) // reset
{ {
Tags->Clear(); Tags->Clear();
ShowMessage("Changes reset"); ShowMessage("Changes reset");
return;
} }
case 13: // save else if (id == 13) // save
{ {
bool success = 1; bool success = 1;
ShowMessage("Writing changes..."); ShowMessage("Writing changes...");
@@ -653,46 +623,21 @@ void TagEditor::EnterPressed()
} }
else else
Tags->Clear(); Tags->Clear();
return;
} }
case 14: // capitalize first letters else if (id == 14) // capitalize first letters
{ {
ShowMessage("Processing..."); ShowMessage("Processing...");
for (MPD::SongList::iterator it = EditedSongs.begin(); it != EditedSongs.end(); ++it) for (MPD::SongList::iterator it = EditedSongs.begin(); it != EditedSongs.end(); ++it)
CapitalizeFirstLetters(**it); CapitalizeFirstLetters(**it);
ShowMessage("Done!"); ShowMessage("Done!");
break;
} }
case 15: // lower all letters else if (id == 15) // lower all letters
{ {
ShowMessage("Processing..."); ShowMessage("Processing...");
for (MPD::SongList::iterator it = EditedSongs.begin(); it != EditedSongs.end(); ++it) for (MPD::SongList::iterator it = EditedSongs.begin(); it != EditedSongs.end(); ++it)
LowerAllLetters(**it); LowerAllLetters(**it);
ShowMessage("Done!"); ShowMessage("Done!");
break;
} }
default:
break;
}
if (w == TagTypes && id != 0 && id != 5 && set)
{
LockStatusbar();
Statusbar() << fmtBold << TagTypes->Current() << fmtBoldEnd << ": ";
std::string new_tag = wFooter->GetString(Tags->Current().GetTags(get));
UnlockStatusbar();
for (MPD::SongList::iterator it = EditedSongs.begin(); it != EditedSongs.end(); ++it)
(*it)->SetTags(set, new_tag);
}
else if (w == Tags && set)
{
LockStatusbar();
Statusbar() << fmtBold << TagTypes->Current() << fmtBoldEnd << ": ";
std::string new_tag = wFooter->GetString(Tags->Current().GetTags(get));
UnlockStatusbar();
if (new_tag != Tags->Current().GetTags(get))
Tags->Current().SetTags(set, new_tag);
Tags->Scroll(wDown);
} }
} }
@@ -1056,54 +1001,25 @@ std::string TagEditor::CapitalizeFirstLetters(const std::string &s)
void TagEditor::CapitalizeFirstLetters(MPD::Song &s) void TagEditor::CapitalizeFirstLetters(MPD::Song &s)
{ {
s.SetTitle(CapitalizeFirstLetters(s.GetTitle())); for (const Info::Metadata *m = Info::Tags; m->Name; ++m)
s.SetArtist(CapitalizeFirstLetters(s.GetArtist())); {
s.SetAlbum(CapitalizeFirstLetters(s.GetAlbum())); unsigned i = 0;
s.SetAlbumArtist(CapitalizeFirstLetters(s.GetAlbumArtist())); for (std::string tag; !(tag = (s.*m->Get)(i)).empty(); ++i)
s.SetGenre(CapitalizeFirstLetters(s.GetGenre())); (s.*m->Set)(CapitalizeFirstLetters(tag), i);
s.SetComposer(CapitalizeFirstLetters(s.GetComposer())); }
s.SetPerformer(CapitalizeFirstLetters(s.GetPerformer()));
s.SetDisc(CapitalizeFirstLetters(s.GetDisc()));
s.SetComment(CapitalizeFirstLetters(s.GetComment()));
} }
void TagEditor::LowerAllLetters(MPD::Song &s) void TagEditor::LowerAllLetters(MPD::Song &s)
{ {
std::string conv = s.GetTitle(); for (const Info::Metadata *m = Info::Tags; m->Name; ++m)
ToLower(conv); {
s.SetTitle(conv); unsigned i = 0;
for (std::string tag; !(tag = (s.*m->Get)(i)).empty(); ++i)
conv = s.GetArtist(); {
ToLower(conv); ToLower(tag);
s.SetArtist(conv); (s.*m->Set)(tag, i);
}
conv = s.GetAlbum(); }
ToLower(conv);
s.SetAlbum(conv);
conv = s.GetAlbumArtist();
ToLower(conv);
s.SetAlbumArtist(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);
} }
void TagEditor::GetTagList(TagLib::StringList &list, const MPD::Song &s, MPD::Song::GetFunction f) void TagEditor::GetTagList(TagLib::StringList &list, const MPD::Song &s, MPD::Song::GetFunction f)
@@ -1117,47 +1033,11 @@ void TagEditor::GetTagList(TagLib::StringList &list, const MPD::Song &s, MPD::So
std::string TagEditor::TagToString(const MPD::Song &s, void *data) std::string TagEditor::TagToString(const MPD::Song &s, void *data)
{ {
std::string result; std::string result;
switch (static_cast<Menu<std::string> *>(data)->Choice()) size_t i = static_cast<Menu<std::string> *>(data)->Choice();
{ if (i < 11)
case 0: result = (s.*Info::Tags[i].Get)(0);
result = s.GetTitle(); else if (i == 12)
break;
case 1:
result = s.GetArtist();
break;
case 2:
result = s.GetAlbumArtist();
break;
case 3:
result = s.GetAlbum();
break;
case 4:
result = s.GetDate();
break;
case 5:
result = s.GetTrack();
break;
case 6:
result = s.GetGenre();
break;
case 7:
result = s.GetComposer();
break;
case 8:
result = s.GetPerformer();
break;
case 9:
result = s.GetDisc();
break;
case 10:
result = s.GetComment();
break;
case 12:
result = s.GetNewName().empty() ? s.GetName() : s.GetName() + " -> " + s.GetNewName(); result = s.GetNewName().empty() ? s.GetName() : s.GetName() + " -> " + s.GetNewName();
break;
default:
break;
}
return result.empty() ? Config.empty_tag : result; return result.empty() ? Config.empty_tag : result;
} }