update Menu class and related stuff

This commit is contained in:
Andrzej Rybczak
2008-12-10 17:34:55 +01:00
parent c03bcbe44b
commit 284dd6a5be
21 changed files with 1309 additions and 1118 deletions

View File

@@ -282,6 +282,158 @@ void Song::SetPosition(int pos)
itsSong->pos = pos;
}
string Song::toString(const std::string &format) const
{
string result;
string::const_iterator goto_pos, prev_pos;
for (string::const_iterator it = format.begin(); it != format.end(); it++)
{
CHECK_LINKED_TAGS:;
if (*it == '{')
{
prev_pos = it;
string (Song::*get)() const = 0;
for (; *it != '}'; it++)
{
if (*it == '%')
{
switch (*++it)
{
case 'l':
get = &Song::GetLength;
break;
case 'F':
get = &Song::GetFile;
break;
case 'f':
get = &Song::GetName;
break;
case 'a':
get = &Song::GetArtist;
break;
case 'b':
get = &Song::GetAlbum;
break;
case 'y':
get = &Song::GetYear;
break;
case 'n':
get = &Song::GetTrack;
break;
case 'g':
get = &Song::GetGenre;
break;
case 'c':
get = &Song::GetComposer;
break;
case 'p':
get = &Song::GetPerformer;
break;
case 'd':
get = &Song::GetDisc;
break;
case 'C':
get = &Song::GetComment;
break;
case 't':
get = &Song::GetTitle;
break;
default:
break;
}
if (get && (this->*get)() == EMPTY_TAG)
break;
}
}
if (*it == '}')
{
while (1)
{
if (*it == '}' && *(it+1) != '|')
break;
it++;
}
goto_pos = ++it;
it = ++prev_pos;
}
else
{
for (; *it != '}'; it++) { }
it++;
if (*it == '{' || *it == '|')
{
if (*it == '|')
it++;
goto CHECK_LINKED_TAGS;
}
}
}
if (*it == '}')
{
if (goto_pos == format.end())
break;
it = goto_pos;
if (*it == '{')
goto CHECK_LINKED_TAGS;
}
if (*it != '%')
{
result += *it;
}
else if (*it == '%')
{
switch (*++it)
{
case 'l':
result += GetLength();
break;
case 'F':
result += GetFile();
break;
case 'f':
result += GetName();
break;
case 'a':
result += GetArtist();
break;
case 'b':
result += GetAlbum();
break;
case 'y':
result += GetYear();
break;
case 'n':
result += GetTrack();
break;
case 'g':
result += GetGenre();
break;
case 'c':
result += GetComposer();
break;
case 'p':
result += GetPerformer();
break;
case 'd':
result += GetDisc();
break;
case 'C':
result += GetComment();
break;
case 't':
result += GetTitle();
break;
default:
break;
}
}
}
return result;
}
Song & Song::operator=(const Song &s)
{
if (this == &s)