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)
{ {
case 0: ShowTag(*menu, s.GetTags(Info::Tags[i].Get));
ShowTag(*menu, s.GetTags(&MPD::Song::GetTitle)); }
return; else if (i == 12)
case 1: {
ShowTag(*menu, s.GetTags(&MPD::Song::GetArtist)); if (s.GetNewName().empty())
return; *menu << s.GetName();
case 2: else
ShowTag(*menu, s.GetTags(&MPD::Song::GetAlbumArtist)); *menu << s.GetName() << Config.color2 << " -> " << clEnd << s.GetNewName();
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())
*menu << s.GetName();
else
*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,85 +505,65 @@ 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: LockStatusbar();
get = &MPD::Song::GetTitle; Statusbar() << "Number tracks? [" << fmtBold << 'y' << fmtBoldEnd << '/' << fmtBold << 'n' << fmtBoldEnd << "] ";
set = &MPD::Song::SetTitle; wFooter->Refresh();
break; int in = 0;
case 1: do
get = &MPD::Song::GetArtist; {
set = &MPD::Song::SetArtist; TraceMpdStatus();
break; wFooter->ReadKey(in);
case 2: }
get = &MPD::Song::GetAlbumArtist; while (in != 'y' && in != 'n');
set = &MPD::Song::SetAlbumArtist; UnlockStatusbar();
break; if (in == 'y')
case 3: {
get = &MPD::Song::GetAlbum; MPD::SongList::iterator it = EditedSongs.begin();
set = &MPD::Song::SetAlbum; for (unsigned i = 1; i <= EditedSongs.size(); ++i, ++it)
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(); if (Config.tag_editor_extended_numeration)
Statusbar() << "Number tracks? [" << fmtBold << 'y' << fmtBoldEnd << '/' << fmtBold << 'n' << fmtBoldEnd << "] "; (*it)->SetTrack(IntoStr(i) + "/" + IntoStr(EditedSongs.size()));
wFooter->Refresh();
int in = 0;
do
{
TraceMpdStatus();
wFooter->ReadKey(in);
}
while (in != 'y' && in != 'n');
UnlockStatusbar();
if (in == 'y')
{
MPD::SongList::iterator it = EditedSongs.begin();
for (unsigned i = 1; i <= EditedSongs.size(); ++i, ++it)
{
if (Config.tag_editor_extended_numeration)
(*it)->SetTrack(IntoStr(i) + "/" + IntoStr(EditedSongs.size()));
else
(*it)->SetTrack(i);
}
ShowMessage("Tracks numbered!");
}
else else
ShowMessage("Aborted!"); (*it)->SetTrack(i);
} }
break; ShowMessage("Tracks numbered!");
case 6: }
get = &MPD::Song::GetGenre; else
set = &MPD::Song::SetGenre; ShowMessage("Aborted!");
break; return;
case 7: }
get = &MPD::Song::GetComposer;
set = &MPD::Song::SetComposer; if (id < 11)
break; {
case 8: MPD::Song::GetFunction get = Info::Tags[id].Get;
get = &MPD::Song::GetPerformer; MPD::Song::SetFunction set = Info::Tags[id].Set;
set = &MPD::Song::SetPerformer; if (id > 0 && w == TagTypes)
break; {
case 9: LockStatusbar();
get = &MPD::Song::GetDisc; Statusbar() << fmtBold << TagTypes->Current() << fmtBoldEnd << ": ";
set = &MPD::Song::SetDisc; std::string new_tag = wFooter->GetString(Tags->Current().GetTags(get));
break; UnlockStatusbar();
case 10: for (MPD::SongList::iterator it = EditedSongs.begin(); it != EditedSongs.end(); ++it)
get = &MPD::Song::GetComment; (*it)->SetTags(set, new_tag);
set = &MPD::Song::SetComment; }
break; else if (w == Tags)
case 11: {
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);
}
}
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; result = s.GetNewName().empty() ? s.GetName() : s.GetName() + " -> " + s.GetNewName();
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();
break;
default:
break;
}
return result.empty() ? Config.empty_tag : result; return result.empty() ? Config.empty_tag : result;
} }