diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.am | 10 | ||||
-rw-r--r-- | src/browser.cpp | 32 | ||||
-rw-r--r-- | src/browser.h | 2 | ||||
-rw-r--r-- | src/clock.cpp | 3 | ||||
-rw-r--r-- | src/clock.h | 2 | ||||
-rw-r--r-- | src/display.cpp | 548 | ||||
-rw-r--r-- | src/display.h | 55 | ||||
-rw-r--r-- | src/helpers.cpp | 501 | ||||
-rw-r--r-- | src/helpers.h | 23 | ||||
-rw-r--r-- | src/lyrics.cpp | 4 | ||||
-rw-r--r-- | src/misc.cpp | 126 | ||||
-rw-r--r-- | src/misc.h | 16 | ||||
-rw-r--r-- | src/ncmpcpp.cpp | 61 | ||||
-rw-r--r-- | src/ncmpcpp.h | 2 | ||||
-rw-r--r-- | src/search_engine.cpp | 17 | ||||
-rw-r--r-- | src/search_engine.h | 3 | ||||
-rw-r--r-- | src/settings.cpp | 92 | ||||
-rw-r--r-- | src/settings.h | 5 | ||||
-rw-r--r-- | src/song.cpp | 1 | ||||
-rw-r--r-- | src/song.h | 153 | ||||
-rw-r--r-- | src/tag_editor.cpp | 50 | ||||
-rw-r--r-- | src/tag_editor.h | 15 |
22 files changed, 896 insertions, 825 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 66ac02b8..008292ac 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,6 +1,6 @@ bin_PROGRAMS = ncmpcpp -ncmpcpp_SOURCES = browser.cpp charset.cpp clock.cpp help.cpp helpers.cpp \ - libmpdclient.c lyrics.cpp misc.cpp mpdpp.cpp ncmpcpp.cpp scrollpad.cpp \ +ncmpcpp_SOURCES = browser.cpp charset.cpp clock.cpp display.cpp help.cpp \ + helpers.cpp libmpdclient.c lyrics.cpp misc.cpp mpdpp.cpp ncmpcpp.cpp scrollpad.cpp \ search_engine.cpp settings.cpp song.cpp status_checker.cpp str_pool.c tag_editor.cpp \ window.cpp @@ -9,6 +9,6 @@ INCLUDES= $(all_includes) # the library search path. ncmpcpp_LDFLAGS = $(all_libraries) -noinst_HEADERS = browser.h charset.h clock.h help.h helpers.h lyrics.h menu.h \ - mpdpp.h scrollpad.h search_engine.h settings.h song.h status_checker.h \ - tag_editor.h window.h +noinst_HEADERS = browser.h charset.h clock.h display.h help.h helpers.h \ + lyrics.h menu.h mpdpp.h scrollpad.h search_engine.h settings.h song.h \ + status_checker.h tag_editor.h window.h diff --git a/src/browser.cpp b/src/browser.cpp index 444a8d07..605a8cdf 100644 --- a/src/browser.cpp +++ b/src/browser.cpp @@ -24,6 +24,7 @@ #include "browser.h" #include "charset.h" +#include "display.h" #include "helpers.h" #include "settings.h" #ifdef HAVE_TAGLIB_H @@ -128,37 +129,6 @@ void UpdateItemList(Menu<Item> *menu) menu->Refresh(); } -void DisplayItem(const Item &item, void *, Menu<Item> *menu) -{ - switch (item.type) - { - case itDirectory: - { - if (item.song) - { - *menu << "[..]"; - return; - } - size_t slash = item.name.rfind("/"); - *menu << "[" << (slash != string::npos ? item.name.substr(slash+1) : item.name) << "]"; - return; - } - case itSong: - !Config.columns_in_browser - ? - DisplaySong(*item.song, &Config.song_list_format, reinterpret_cast<Menu<Song> *>(menu)) - : - DisplaySongInColumns(*item.song, &Config.song_columns_list_format, reinterpret_cast<Menu<Song> *>(menu)) - ; - return; - case itPlaylist: - *menu << Config.browser_playlist_prefix << item.name; - return; - default: - return; - } -} - void GetDirectory(string dir, string subdir) { if (dir.empty()) diff --git a/src/browser.h b/src/browser.h index 89fedb43..dd3e9142 100644 --- a/src/browser.h +++ b/src/browser.h @@ -26,8 +26,6 @@ void UpdateItemList(Menu<MPD::Item> *); -void DisplayItem(const MPD::Item &, void *, Menu<MPD::Item> *); - void GetDirectory(std::string, std::string = "/"); #endif diff --git a/src/clock.cpp b/src/clock.cpp index 2dce2372..b20876fe 100644 --- a/src/clock.cpp +++ b/src/clock.cpp @@ -21,6 +21,7 @@ /// NOTICE: Major part of this code is ported from ncmpc's clock screen #include "clock.h" +#include "display.h" #ifdef ENABLE_CLOCK @@ -56,7 +57,7 @@ void InitClock() older[i] = newer[i] = next[i] = 0; } -void DisplayClock(Window &w, const tm *time) +void Display::Clock(Window &w, const tm *time) { mask = 0; set(time->tm_sec % 10, 0); diff --git a/src/clock.h b/src/clock.h index 532e3ebd..f62d80a8 100644 --- a/src/clock.h +++ b/src/clock.h @@ -33,8 +33,6 @@ void InitClock(); -void DisplayClock(Window &, const tm *); - #endif // ENABLE_CLOCK #endif diff --git a/src/display.cpp b/src/display.cpp new file mode 100644 index 00000000..46f5fbc3 --- /dev/null +++ b/src/display.cpp @@ -0,0 +1,548 @@ +/*************************************************************************** + * Copyright (C) 2008-2009 by Andrzej Rybczak * + * electricityispower@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#include "display.h" +#include "helpers.h" + +using MPD::Song; +using std::string; + +string Display::Columns(string st) +{ + string result; + size_t where = 0; + + for (int width = StrToInt(GetLineValue(st, '(', ')', 1)); width; width = StrToInt(GetLineValue(st, '(', ')', 1))) + { + width *= COLS/100.0; + char type = GetLineValue(st, '{', '}', 1)[0]; + + switch (type) + { + case 'l': + result += "Time"; + break; + case 'f': + result += "Filename"; + break; + case 'F': + result += "Full filename"; + break; + case 'a': + result += "Artist"; + break; + case 't': + result += "Title"; + break; + case 'b': + result += "Album"; + break; + case 'y': + result += "Year"; + break; + case 'n': + result += "Track"; + break; + case 'g': + result += "Genre"; + break; + case 'c': + result += "Composer"; + break; + case 'p': + result += "Performer"; + break; + case 'd': + result += "Disc"; + break; + case 'C': + result += "Comment"; + break; + default: + break; + } + where += width; + + if (result.length() > where) + result = result.substr(0, where); + else + for (size_t i = result.length(); i <= where && i < size_t(COLS); i++, result += ' ') { } + } + return result; +} + +void Display::TotalPlaylistLength(Window &w) +{ + extern Menu<MPD::Song> *mPlaylist; + + const int MINUTE = 60; + const int HOUR = 60*MINUTE; + const int DAY = 24*HOUR; + const int YEAR = 365*DAY; + int length = 0; + + for (size_t i = 0; i < mPlaylist->Size(); i++) + length += mPlaylist->at(i).GetTotalLength(); + + w << '(' << mPlaylist->Size() << (mPlaylist->Size() == 1 ? " item" : " items"); + + if (length) + { + w << ", length: "; + int years = length/YEAR; + if (years) + { + w << years << (years == 1 ? " year" : " years"); + length -= years*YEAR; + if (length) + w << ", "; + } + int days = length/DAY; + if (days) + { + w << days << (days == 1 ? " day" : " days"); + length -= days*DAY; + if (length) + w << ", "; + } + int hours = length/HOUR; + if (hours) + { + w << hours << (hours == 1 ? " hour" : " hours"); + length -= hours*HOUR; + if (length) + w << ", "; + } + int minutes = length/MINUTE; + if (minutes) + { + w << minutes << (minutes == 1 ? " minute" : " minutes"); + length -= minutes*MINUTE; + if (length) + w << ", "; + } + if (length) + w << length << (length == 1 ? " second" : " seconds"); + } + w << ')'; + w.Refresh(); +} + +void Display::StringPairs(const string_pair &pair, void *, Menu<string_pair> *menu) +{ + *menu << pair.first; +} + +void Display::SongsInColumns(const MPD::Song &s, void *s_template, Menu<MPD::Song> *menu) +{ + string st = s_template ? *static_cast<string *>(s_template) : ""; + size_t where = 0; + Color color; + + for (int width = StrToInt(GetLineValue(st, '(', ')', 1)); width; width = StrToInt(GetLineValue(st, '(', ')', 1))) + { + if (where) + { + menu->GotoXY(where, menu->Y()); + *menu << ' '; + if (color != clDefault) + *menu << clEnd; + } + + width *= COLS/100.0; + color = IntoColor(GetLineValue(st, '[', ']', 1)); + char type = GetLineValue(st, '{', '}', 1)[0]; + + string (Song::*get)() const = 0; + + switch (type) + { + 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': + if (!s.GetTitle().empty()) + get = &Song::GetTitle; + else + get = &Song::GetName; + break; + default: + break; + } + if (color != clDefault) + *menu << color; + whline(menu->Raw(), 32, menu->GetWidth()-where); + string tag = (s.*get)(); + if (!tag.empty()) + *menu << tag; + else + *menu << Config.empty_tag; + where += width; + } + if (color != clDefault) + *menu << clEnd; +} + +void Display::Songs(const MPD::Song &s, void *data, Menu<MPD::Song> *menu) +{ + if (!s.Localized()) + const_cast<MPD::Song *>(&s)->Localize(); + + const string &song_template = data ? *static_cast<string *>(data) : ""; + basic_buffer<my_char_t> buf; + bool right = 0; + + string::const_iterator goto_pos, prev_pos; + + for (string::const_iterator it = song_template.begin(); it != song_template.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 == &Song::GetLength) + { + if (!s.GetTotalLength()) + break; + } + else if (get) + { + if ((s.*get)().empty()) + break; + } + } + } + if (*it == '}') + { + while (1) + { + if (*it == '}' && *(it+1) != '|') + break; + it++; + } + goto_pos = ++it; + it = ++prev_pos; + } + else + { + for (; *it != '}'; it++) { } + it++; + if (it == song_template.end()) + break; + if (*it == '{' || *it == '|') + { + if (*it == '|') + it++; + goto CHECK_LINKED_TAGS; + } + } + } + + if (*it == '}') + { + if (goto_pos == song_template.end()) + break; + it = goto_pos; + if (*it == '{') + goto CHECK_LINKED_TAGS; + } + + if (*it != '%' && *it != '$') + { + if (!right) + *menu << *it; + else + buf << *it; + } + else if (*it == '%') + { + switch (*++it) + { + case 'l': + if (!right) + *menu << s.GetLength(); + else + buf << TO_WSTRING(s.GetLength()); + break; + case 'F': + if (!right) + *menu << s.GetFile(); + else + buf << TO_WSTRING(s.GetFile()); + break; + case 'f': + if (!right) + *menu << s.GetName(); + else + buf << TO_WSTRING(s.GetName()); + break; + case 'a': + if (!right) + *menu << s.GetArtist(); + else + buf << TO_WSTRING(s.GetArtist()); + break; + case 'b': + if (!right) + *menu << s.GetAlbum(); + else + buf << TO_WSTRING(s.GetAlbum()); + break; + case 'y': + if (!right) + *menu << s.GetYear(); + else + buf << TO_WSTRING(s.GetYear()); + break; + case 'n': + if (!right) + *menu << s.GetTrack(); + else + buf << TO_WSTRING(s.GetTrack()); + break; + case 'g': + if (!right) + *menu << s.GetGenre(); + else + buf << TO_WSTRING(s.GetGenre()); + break; + case 'c': + if (!right) + *menu << s.GetComposer(); + else + buf << TO_WSTRING(s.GetComposer()); + break; + case 'p': + if (!right) + *menu << s.GetPerformer(); + else + buf << TO_WSTRING(s.GetPerformer()); + break; + case 'd': + if (!right) + *menu << s.GetDisc(); + else + buf << TO_WSTRING(s.GetDisc()); + break; + case 'C': + if (!right) + *menu << s.GetComment(); + else + buf << TO_WSTRING(s.GetComment()); + break; + case 't': + if (!right) + *menu << s.GetTitle(); + else + buf << TO_WSTRING(s.GetTitle()); + break; + case 'r': + right = 1; + break; + default: + break; + } + } + else + { + it++; + if (!right) + *menu << Color(*it-'0'); + else + buf << Color(*it-'0'); + } + } + if (right) + { + menu->GotoXY(menu->GetWidth()-buf.Str().length(), menu->Y()); + *menu << buf; + } +} + +void Display::Tags(const MPD::Song &s, void *data, Menu<MPD::Song> *menu) +{ + switch (static_cast<Menu<string> *>(data)->Choice()) + { + case 0: + *menu << ShowTag(s.GetTitle()); + return; + case 1: + *menu << ShowTag(s.GetArtist()); + return; + case 2: + *menu << ShowTag(s.GetAlbum()); + return; + case 3: + *menu << ShowTag(s.GetYear()); + return; + case 4: + *menu << ShowTag(s.GetTrack()); + return; + case 5: + *menu << ShowTag(s.GetGenre()); + return; + case 6: + *menu << ShowTag(s.GetComposer()); + return; + case 7: + *menu << ShowTag(s.GetPerformer()); + return; + case 8: + *menu << ShowTag(s.GetDisc()); + return; + case 9: + *menu << ShowTag(s.GetComment()); + return; + case 11: + if (s.GetNewName().empty()) + *menu << s.GetName(); + else + *menu << s.GetName() << Config.color2 << " -> " << clEnd << s.GetNewName(); + return; + default: + return; + } +} + +void Display::Items(const MPD::Item &item, void *, Menu<MPD::Item> *menu) +{ + switch (item.type) + { + case MPD::itDirectory: + { + if (item.song) + { + *menu << "[..]"; + return; + } + size_t slash = item.name.rfind("/"); + *menu << "[" << (slash != string::npos ? item.name.substr(slash+1) : item.name) << "]"; + return; + } + case MPD::itSong: + if (!Config.columns_in_browser) + Display::Songs(*item.song, &Config.song_list_format, reinterpret_cast<Menu<MPD::Song> *>(menu)); + else + Display::SongsInColumns(*item.song, &Config.song_columns_list_format, reinterpret_cast<Menu<MPD::Song> *>(menu)); + return; + case MPD::itPlaylist: + *menu << Config.browser_playlist_prefix << item.name; + return; + default: + return; + } +} + +void Display::SearchEngine(const std::pair<Buffer *, Song *> &pair, void *, Menu< std::pair<Buffer *, Song *> > *menu) +{ + if (pair.second) + { + if (!Config.columns_in_search_engine) + Display::Songs(*pair.second, &Config.song_list_format, reinterpret_cast<Menu<Song> *>(menu)); + else + Display::SongsInColumns(*pair.second, &Config.song_columns_list_format, reinterpret_cast<Menu<Song> *>(menu)); + } + + else + *menu << *pair.first; +} + diff --git a/src/display.h b/src/display.h new file mode 100644 index 00000000..06c2227f --- /dev/null +++ b/src/display.h @@ -0,0 +1,55 @@ +/*************************************************************************** + * Copyright (C) 2008-2009 by Andrzej Rybczak * + * electricityispower@gmail.com * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ + +#ifndef _DISPLAY_H +#define _DISPLAY_H + +#include "ncmpcpp.h" +#include "menu.h" +#include "mpdpp.h" + +namespace Display +{ + std::string Columns(std::string); + + template <class T> void Generic(const T &t, void *, Menu<T> *menu) + { + *menu << t; + } + + void TotalPlaylistLength(Window &); + + void StringPairs(const string_pair &, void *, Menu<string_pair> *); + + void SongsInColumns(const MPD::Song &, void *, Menu<MPD::Song> *); + + void Songs(const MPD::Song &, void *, Menu<MPD::Song> *); + + void Tags(const MPD::Song &, void *, Menu<MPD::Song> *); + + void SearchEngine(const std::pair<Buffer *, MPD::Song *> &, void *, Menu< std::pair<Buffer *, MPD::Song *> > *); + + void Items(const MPD::Item &, void *, Menu<MPD::Item> *); + + void Clock(Window &, const tm *); +} + +#endif + diff --git a/src/helpers.cpp b/src/helpers.cpp index 4197d0d7..31486ec5 100644 --- a/src/helpers.cpp +++ b/src/helpers.cpp @@ -266,22 +266,6 @@ void WindowTitle(const string &status) std::cout << "\033]0;" << status << "\7"; } -void EscapeUnallowedChars(string &s) -{ - const string unallowed_chars = "\"*/:<>?\\|"; - for (string::const_iterator it = unallowed_chars.begin(); it != unallowed_chars.end(); it++) - { - for (size_t i = 0; i < s.length(); i++) - { - if (s[i] == *it) - { - s.erase(s.begin()+i); - i--; - } - } - } -} - Window &operator<<(Window &w, mpd_TagItems tag) { switch (tag) @@ -325,37 +309,6 @@ Window &operator<<(Window &w, mpd_TagItems tag) return w; } -string IntoStr(mpd_TagItems tag) // this is only for left column's title in media library -{ - switch (tag) - { - case MPD_TAG_ITEM_ARTIST: - return "Artist"; - case MPD_TAG_ITEM_ALBUM: - return "Album"; - case MPD_TAG_ITEM_TITLE: - return "Title"; - case MPD_TAG_ITEM_TRACK: - return "Track"; - case MPD_TAG_ITEM_GENRE: - return "Genre"; - case MPD_TAG_ITEM_DATE: - return "Year"; - case MPD_TAG_ITEM_COMPOSER: - return "Composer"; - case MPD_TAG_ITEM_PERFORMER: - return "Performer"; - case MPD_TAG_ITEM_COMMENT: - return "Comment"; - case MPD_TAG_ITEM_DISC: - return "Disc"; - case MPD_TAG_ITEM_FILENAME: - return "Filename"; - default: - return ""; - } -} - string FindSharedDir(const string &one, const string &two) { if (one == two) @@ -369,438 +322,6 @@ string FindSharedDir(const string &one, const string &two) return i != string::npos ? result.substr(0, i) : "/"; } -void DisplayTotalPlaylistLength(Window &w) -{ - const int MINUTE = 60; - const int HOUR = 60*MINUTE; - const int DAY = 24*HOUR; - const int YEAR = 365*DAY; - int length = 0; - - for (size_t i = 0; i < mPlaylist->Size(); i++) - length += mPlaylist->at(i).GetTotalLength(); - - w << '(' << mPlaylist->Size() << (mPlaylist->Size() == 1 ? " item" : " items"); - - if (length) - { - w << ", length: "; - int years = length/YEAR; - if (years) - { - w << years << (years == 1 ? " year" : " years"); - length -= years*YEAR; - if (length) - w << ", "; - } - int days = length/DAY; - if (days) - { - w << days << (days == 1 ? " day" : " days"); - length -= days*DAY; - if (length) - w << ", "; - } - int hours = length/HOUR; - if (hours) - { - w << hours << (hours == 1 ? " hour" : " hours"); - length -= hours*HOUR; - if (length) - w << ", "; - } - int minutes = length/MINUTE; - if (minutes) - { - w << minutes << (minutes == 1 ? " minute" : " minutes"); - length -= minutes*MINUTE; - if (length) - w << ", "; - } - if (length) - w << length << (length == 1 ? " second" : " seconds"); - } - w << ')'; - w.Refresh(); -} - -void DisplayStringPair(const StringPair &pair, void *, Menu<StringPair> *menu) -{ - *menu << pair.first; -} - -string DisplayColumns(string st) -{ - string result; - size_t where = 0; - - for (int width = StrToInt(GetLineValue(st, '(', ')', 1)); width; width = StrToInt(GetLineValue(st, '(', ')', 1))) - { - width *= COLS/100.0; - char type = GetLineValue(st, '{', '}', 1)[0]; - - switch (type) - { - case 'l': - result += "Time"; - break; - case 'f': - result += "Filename"; - break; - case 'F': - result += "Full filename"; - break; - case 'a': - result += "Artist"; - break; - case 't': - result += "Title"; - break; - case 'b': - result += "Album"; - break; - case 'y': - result += "Year"; - break; - case 'n': - result += "Track"; - break; - case 'g': - result += "Genre"; - break; - case 'c': - result += "Composer"; - break; - case 'p': - result += "Performer"; - break; - case 'd': - result += "Disc"; - break; - case 'C': - result += "Comment"; - break; - default: - break; - } - where += width; - - if (result.length() > where) - result = result.substr(0, where); - else - for (size_t i = result.length(); i <= where && i < size_t(COLS); i++, result += ' ') { } - } - return result; -} - -void DisplaySongInColumns(const Song &s, void *s_template, Menu<Song> *menu) -{ - string st = s_template ? *static_cast<string *>(s_template) : ""; - size_t where = 0; - Color color; - - for (int width = StrToInt(GetLineValue(st, '(', ')', 1)); width; width = StrToInt(GetLineValue(st, '(', ')', 1))) - { - if (where) - { - menu->GotoXY(where, menu->Y()); - *menu << ' '; - if (color != clDefault) - *menu << clEnd; - } - - width *= COLS/100.0; - color = IntoColor(GetLineValue(st, '[', ']', 1)); - char type = GetLineValue(st, '{', '}', 1)[0]; - - string (Song::*get)() const = 0; - - switch (type) - { - 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': - if (!s.GetTitle().empty()) - get = &Song::GetTitle; - else - get = &Song::GetName; - break; - default: - break; - } - if (color != clDefault) - *menu << color; - whline(menu->Raw(), 32, menu->GetWidth()-where); - string tag = (s.*get)(); - if (!tag.empty()) - *menu << tag; - else - *menu << Config.empty_tag; - where += width; - } - if (color != clDefault) - *menu << clEnd; -} - -void DisplaySong(const Song &s, void *data, Menu<Song> *menu) -{ - if (!s.Localized()) - const_cast<Song *>(&s)->Localize(); - - const string &song_template = data ? *static_cast<string *>(data) : ""; - basic_buffer<my_char_t> buf; - bool right = 0; - - string::const_iterator goto_pos, prev_pos; - - for (string::const_iterator it = song_template.begin(); it != song_template.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 == &Song::GetLength) - { - if (!s.GetTotalLength()) - break; - } - else if (get) - { - if ((s.*get)().empty()) - break; - } - } - } - if (*it == '}') - { - while (1) - { - if (*it == '}' && *(it+1) != '|') - break; - it++; - } - goto_pos = ++it; - it = ++prev_pos; - } - else - { - for (; *it != '}'; it++) { } - it++; - if (it == song_template.end()) - break; - if (*it == '{' || *it == '|') - { - if (*it == '|') - it++; - goto CHECK_LINKED_TAGS; - } - } - } - - if (*it == '}') - { - if (goto_pos == song_template.end()) - break; - it = goto_pos; - if (*it == '{') - goto CHECK_LINKED_TAGS; - } - - if (*it != '%' && *it != '$') - { - if (!right) - *menu << *it; - else - buf << *it; - } - else if (*it == '%') - { - switch (*++it) - { - case 'l': - if (!right) - *menu << s.GetLength(); - else - buf << TO_WSTRING(s.GetLength()); - break; - case 'F': - if (!right) - *menu << s.GetFile(); - else - buf << TO_WSTRING(s.GetFile()); - break; - case 'f': - if (!right) - *menu << s.GetName(); - else - buf << TO_WSTRING(s.GetName()); - break; - case 'a': - if (!right) - *menu << s.GetArtist(); - else - buf << TO_WSTRING(s.GetArtist()); - break; - case 'b': - if (!right) - *menu << s.GetAlbum(); - else - buf << TO_WSTRING(s.GetAlbum()); - break; - case 'y': - if (!right) - *menu << s.GetYear(); - else - buf << TO_WSTRING(s.GetYear()); - break; - case 'n': - if (!right) - *menu << s.GetTrack(); - else - buf << TO_WSTRING(s.GetTrack()); - break; - case 'g': - if (!right) - *menu << s.GetGenre(); - else - buf << TO_WSTRING(s.GetGenre()); - break; - case 'c': - if (!right) - *menu << s.GetComposer(); - else - buf << TO_WSTRING(s.GetComposer()); - break; - case 'p': - if (!right) - *menu << s.GetPerformer(); - else - buf << TO_WSTRING(s.GetPerformer()); - break; - case 'd': - if (!right) - *menu << s.GetDisc(); - else - buf << TO_WSTRING(s.GetDisc()); - break; - case 'C': - if (!right) - *menu << s.GetComment(); - else - buf << TO_WSTRING(s.GetComment()); - break; - case 't': - if (!right) - *menu << s.GetTitle(); - else - buf << TO_WSTRING(s.GetTitle()); - break; - case 'r': - right = 1; - break; - default: - break; - } - } - else - { - it++; - if (!right) - *menu << Color(*it-'0'); - else - buf << Color(*it-'0'); - } - } - if (right) - { - menu->GotoXY(menu->GetWidth()-buf.Str().length(), menu->Y()); - *menu << buf; - } -} - void GetInfo(Song &s, Scrollpad &info) { # ifdef HAVE_TAGLIB_H @@ -838,6 +359,28 @@ void GetInfo(Song &s, Scrollpad &info) info << fmtBold << "\nComment: " << fmtBoldEnd << ShowTagInInfoScreen(s.GetComment()); } +string GetLineValue(string &line, char a, char b, bool once) +{ + int i = 0; + int begin = -1, end = -1; + for (string::iterator it = line.begin(); it != line.end() && (begin == -1 || end == -1); i++, it++) + { + if (*it == a || *it == b) + { + if (once) + *it = 0; + if (begin < 0) + begin = i+1; + else + end = i; + } + } + if (begin >= 0 && end >= 0) + return line.substr(begin, end-begin); + else + return ""; +} + Window &Statusbar() { wFooter->GotoXY(0, Config.statusbar_visibility); diff --git a/src/helpers.h b/src/helpers.h index 38f00aaa..6483e35d 100644 --- a/src/helpers.h +++ b/src/helpers.h @@ -32,34 +32,25 @@ class CaseInsensitiveSorting { public: bool operator()(std::string, std::string); - bool operator()(Song *, Song *); + bool operator()(MPD::Song *, MPD::Song *); bool operator()(const MPD::Item &, const MPD::Item &); }; -template <class T> void GenericDisplayer(const T &t, void *, Menu<T> *menu) -{ - *menu << t; -} - -bool SortSongsByTrack(Song *, Song *); +bool SortSongsByTrack(MPD::Song *, MPD::Song *); -void UpdateSongList(Menu<Song> *); +void UpdateSongList(Menu<MPD::Song> *); bool Keypressed(int, const int *); void WindowTitle(const std::string &); -void EscapeUnallowedChars(std::string &); Window &operator<<(Window &, mpd_TagItems); -std::string IntoStr(mpd_TagItems); std::string FindSharedDir(const std::string &, const std::string &); -void DisplayTotalPlaylistLength(Window &); -void DisplayStringPair(const StringPair &, void *, Menu<StringPair> *); -std::string DisplayColumns(std::string); -void DisplaySongInColumns(const Song &, void *, Menu<Song> *); -void DisplaySong(const Song &, void * = &Config.song_list_format, Menu<Song> * = NULL); -void GetInfo(Song &, Scrollpad &); + +void GetInfo(MPD::Song &, Scrollpad &); + +std::string GetLineValue(std::string &, char = '"', char = '"', bool = 0); Window &Statusbar(); diff --git a/src/lyrics.cpp b/src/lyrics.cpp index f496fc36..5641ec18 100644 --- a/src/lyrics.cpp +++ b/src/lyrics.cpp @@ -318,8 +318,8 @@ const char *GetLyricsPluginName(int offset) void *GetLyrics(void *song) { - string artist = static_cast<Song *>(song)->GetArtist(); - string title = static_cast<Song *>(song)->GetTitle(); + string artist = static_cast<MPD::Song *>(song)->GetArtist(); + string title = static_cast<MPD::Song *>(song)->GetTitle(); locale_to_utf(artist); locale_to_utf(title); diff --git a/src/misc.cpp b/src/misc.cpp index 19ab8b18..cecca44a 100644 --- a/src/misc.cpp +++ b/src/misc.cpp @@ -23,17 +23,17 @@ #include "misc.h" -/*int Abs(int num) +namespace { - return (num < 0 ? -num : num); -}*/ + const std::string unallowed_chars = "\"*/:<>?\\|"; +} void ToLower(std::string &s) { transform(s.begin(), s.end(), s.begin(), tolower); } -int StrToInt(std::string str) +int StrToInt(const std::string &str) { return atoi(str.c_str()); } @@ -45,10 +45,118 @@ std::string IntoStr(int l) return ss.str(); } -/*string IntoStr(double l, int precision) +std::string IntoStr(mpd_TagItems tag) // this is only for left column's title in media library { - std::stringstream ss; - ss << std::fixed << std::setprecision(precision) << l; - return ss.str(); -}*/ + switch (tag) + { + case MPD_TAG_ITEM_ARTIST: + return "Artist"; + case MPD_TAG_ITEM_ALBUM: + return "Album"; + case MPD_TAG_ITEM_TITLE: + return "Title"; + case MPD_TAG_ITEM_TRACK: + return "Track"; + case MPD_TAG_ITEM_GENRE: + return "Genre"; + case MPD_TAG_ITEM_DATE: + return "Year"; + case MPD_TAG_ITEM_COMPOSER: + return "Composer"; + case MPD_TAG_ITEM_PERFORMER: + return "Performer"; + case MPD_TAG_ITEM_COMMENT: + return "Comment"; + case MPD_TAG_ITEM_DISC: + return "Disc"; + case MPD_TAG_ITEM_FILENAME: + return "Filename"; + default: + return ""; + } +} + +std::string IntoStr(Color color) +{ + std::string result; + + if (color == clDefault) + result = "default"; + else if (color == clBlack) + result = "black"; + else if (color == clRed) + result = "red"; + else if (color == clGreen) + result = "green"; + else if (color == clYellow) + result = "yellow"; + else if (color == clBlue) + result = "blue"; + else if (color == clMagenta) + result = "magenta"; + else if (color == clCyan) + result = "cyan"; + else if (color == clWhite) + result = "white"; + + return result; +} + +Color IntoColor(const std::string &color) +{ + Color result = clDefault; + + if (color == "black") + result = clBlack; + else if (color == "red") + result = clRed; + else if (color == "green") + result = clGreen; + else if (color == "yellow") + result = clYellow; + else if (color == "blue") + result = clBlue; + else if (color == "magenta") + result = clMagenta; + else if (color == "cyan") + result = clCyan; + else if (color == "white") + result = clWhite; + + return result; +} + +mpd_TagItems IntoTagItem(char c) +{ + switch (c) + { + case 'a': + return MPD_TAG_ITEM_ARTIST; + case 'y': + return MPD_TAG_ITEM_DATE; + case 'g': + return MPD_TAG_ITEM_GENRE; + case 'c': + return MPD_TAG_ITEM_COMPOSER; + case 'p': + return MPD_TAG_ITEM_PERFORMER; + default: + return MPD_TAG_ITEM_ARTIST; + } +} + +void EscapeUnallowedChars(std::string &s) +{ + for (std::string::const_iterator it = unallowed_chars.begin(); it != unallowed_chars.end(); it++) + { + for (size_t i = 0; i < s.length(); i++) + { + if (s[i] == *it) + { + s.erase(s.begin()+i); + i--; + } + } + } +} @@ -23,14 +23,24 @@ #include <string> -//int Abs(int); +#include "window.h" +#include "libmpdclient.h" void ToLower(std::string &); -int StrToInt(std::string); +int StrToInt(const std::string &); std::string IntoStr(int); -//string IntoStr(double, int); + +std::string IntoStr(mpd_TagItems); + +std::string IntoStr(Color); + +Color IntoColor(const std::string &); + +mpd_TagItems IntoTagItem(char); + +void EscapeUnallowedChars(std::string &); #endif diff --git a/src/ncmpcpp.cpp b/src/ncmpcpp.cpp index 89e35e75..7c18736e 100644 --- a/src/ncmpcpp.cpp +++ b/src/ncmpcpp.cpp @@ -33,6 +33,7 @@ #include "browser.h" #include "charset.h" #include "clock.h" +#include "display.h" #include "help.h" #include "helpers.h" #include "lyrics.h" @@ -105,17 +106,17 @@ Menu< std::pair<Buffer *, Song *> > *mSearcher; Window *wLibActiveCol; Menu<string> *mLibArtists; -Menu<StringPair> *mLibAlbums; +Menu<string_pair> *mLibAlbums; Menu<Song> *mLibSongs; #ifdef HAVE_TAGLIB_H Window *wTagEditorActiveCol; Menu<Buffer> *mTagEditor; -Menu<StringPair> *mEditorAlbums; -Menu<StringPair> *mEditorDirs; +Menu<string_pair> *mEditorAlbums; +Menu<string_pair> *mEditorDirs; #endif // HAVE_TAGLIB_H // blah, I use below in conditionals. -Menu<StringPair> *mEditorLeftCol; +Menu<string_pair> *mEditorLeftCol; Menu<string> *mEditorTagTypes; Menu<Song> *mEditorTags; @@ -226,12 +227,12 @@ int main(int argc, char *argv[]) if (!Config.statusbar_visibility) main_height++; - mPlaylist = new Menu<Song>(0, main_start_y, COLS, main_height, Config.columns_in_playlist ? DisplayColumns(Config.song_columns_list_format) : "", Config.main_color, brNone); + mPlaylist = new Menu<Song>(0, main_start_y, COLS, main_height, Config.columns_in_playlist ? Display::Columns(Config.song_columns_list_format) : "", Config.main_color, brNone); mPlaylist->SetTimeout(ncmpcpp_window_timeout); mPlaylist->HighlightColor(Config.main_highlight_color); mPlaylist->SetSelectPrefix(&Config.selected_item_prefix); mPlaylist->SetSelectSuffix(&Config.selected_item_suffix); - mPlaylist->SetItemDisplayer(Config.columns_in_playlist ? DisplaySongInColumns : DisplaySong); + mPlaylist->SetItemDisplayer(Config.columns_in_playlist ? Display::SongsInColumns : Display::Songs); mPlaylist->SetItemDisplayerUserData(Config.columns_in_playlist ? &Config.song_columns_list_format : &Config.song_list_format); mBrowser = new Menu<Item>(0, main_start_y, COLS, main_height, "", Config.main_color, brNone); @@ -239,12 +240,12 @@ int main(int argc, char *argv[]) mBrowser->SetTimeout(ncmpcpp_window_timeout); mBrowser->SetSelectPrefix(&Config.selected_item_prefix); mBrowser->SetSelectSuffix(&Config.selected_item_suffix); - mBrowser->SetItemDisplayer(DisplayItem); + mBrowser->SetItemDisplayer(Display::Items); mSearcher = new Menu< std::pair<Buffer *, Song *> >(0, main_start_y, COLS, main_height, "", Config.main_color, brNone); mSearcher->HighlightColor(Config.main_highlight_color); mSearcher->SetTimeout(ncmpcpp_window_timeout); - mSearcher->SetItemDisplayer(SearchEngineDisplayer); + mSearcher->SetItemDisplayer(Display::SearchEngine); mSearcher->SetSelectPrefix(&Config.selected_item_prefix); mSearcher->SetSelectSuffix(&Config.selected_item_suffix); @@ -257,26 +258,26 @@ int main(int argc, char *argv[]) mLibArtists = new Menu<string>(0, main_start_y, left_col_width, main_height, IntoStr(Config.media_lib_primary_tag) + "s", Config.main_color, brNone); mLibArtists->HighlightColor(Config.active_column_color); mLibArtists->SetTimeout(ncmpcpp_window_timeout); - mLibArtists->SetItemDisplayer(GenericDisplayer); + mLibArtists->SetItemDisplayer(Display::Generic); - mLibAlbums = new Menu<StringPair>(middle_col_startx, main_start_y, middle_col_width, main_height, "Albums", Config.main_color, brNone); + mLibAlbums = new Menu<string_pair>(middle_col_startx, main_start_y, middle_col_width, main_height, "Albums", Config.main_color, brNone); mLibAlbums->HighlightColor(Config.main_highlight_color); mLibAlbums->SetTimeout(ncmpcpp_window_timeout); - mLibAlbums->SetItemDisplayer(DisplayStringPair); + mLibAlbums->SetItemDisplayer(Display::StringPairs); mLibSongs = new Menu<Song>(right_col_startx, main_start_y, right_col_width, main_height, "Songs", Config.main_color, brNone); mLibSongs->HighlightColor(Config.main_highlight_color); mLibSongs->SetTimeout(ncmpcpp_window_timeout); mLibSongs->SetSelectPrefix(&Config.selected_item_prefix); mLibSongs->SetSelectSuffix(&Config.selected_item_suffix); - mLibSongs->SetItemDisplayer(DisplaySong); + mLibSongs->SetItemDisplayer(Display::Songs); mLibSongs->SetItemDisplayerUserData(&Config.song_library_format); # ifdef HAVE_TAGLIB_H mTagEditor = new Menu<Buffer>(0, main_start_y, COLS, main_height, "", Config.main_color, brNone); mTagEditor->HighlightColor(Config.main_highlight_color); mTagEditor->SetTimeout(ncmpcpp_window_timeout); - mTagEditor->SetItemDisplayer(GenericDisplayer); + mTagEditor->SetItemDisplayer(Display::Generic); size_t tagedit_middle_col_width = 26; size_t tagedit_left_col_width = COLS/2-tagedit_middle_col_width/2; @@ -284,42 +285,42 @@ int main(int argc, char *argv[]) size_t tagedit_right_col_width = COLS-tagedit_left_col_width-tagedit_middle_col_width-2; size_t tagedit_right_col_startx = tagedit_left_col_width+tagedit_middle_col_width+2; - mEditorAlbums = new Menu<StringPair>(0, main_start_y, tagedit_left_col_width, main_height, "Albums", Config.main_color, brNone); + mEditorAlbums = new Menu<string_pair>(0, main_start_y, tagedit_left_col_width, main_height, "Albums", Config.main_color, brNone); mEditorAlbums->HighlightColor(Config.active_column_color); mEditorAlbums->SetTimeout(ncmpcpp_window_timeout); - mEditorAlbums->SetItemDisplayer(DisplayStringPair); + mEditorAlbums->SetItemDisplayer(Display::StringPairs); - mEditorDirs = new Menu<StringPair>(0, main_start_y, tagedit_left_col_width, main_height, "Directories", Config.main_color, brNone); + mEditorDirs = new Menu<string_pair>(0, main_start_y, tagedit_left_col_width, main_height, "Directories", Config.main_color, brNone); mEditorDirs->HighlightColor(Config.active_column_color); mEditorDirs->SetTimeout(ncmpcpp_window_timeout); - mEditorDirs->SetItemDisplayer(DisplayStringPair); + mEditorDirs->SetItemDisplayer(Display::StringPairs); mEditorLeftCol = Config.albums_in_tag_editor ? mEditorAlbums : mEditorDirs; mEditorTagTypes = new Menu<string>(tagedit_middle_col_startx, main_start_y, tagedit_middle_col_width, main_height, "Tag types", Config.main_color, brNone); mEditorTagTypes->HighlightColor(Config.main_highlight_color); mEditorTagTypes->SetTimeout(ncmpcpp_window_timeout); - mEditorTagTypes->SetItemDisplayer(GenericDisplayer); + mEditorTagTypes->SetItemDisplayer(Display::Generic); mEditorTags = new Menu<Song>(tagedit_right_col_startx, main_start_y, tagedit_right_col_width, main_height, "Tags", Config.main_color, brNone); mEditorTags->HighlightColor(Config.main_highlight_color); mEditorTags->SetTimeout(ncmpcpp_window_timeout); mEditorTags->SetSelectPrefix(&Config.selected_item_prefix); mEditorTags->SetSelectSuffix(&Config.selected_item_suffix); - mEditorTags->SetItemDisplayer(DisplayTag); + mEditorTags->SetItemDisplayer(Display::Tags); mEditorTags->SetItemDisplayerUserData(mEditorTagTypes); # endif // HAVE_TAGLIB_H mPlaylistList = new Menu<string>(0, main_start_y, left_col_width, main_height, "Playlists", Config.main_color, brNone); mPlaylistList->HighlightColor(Config.active_column_color); mPlaylistList->SetTimeout(ncmpcpp_window_timeout); - mPlaylistList->SetItemDisplayer(GenericDisplayer); + mPlaylistList->SetItemDisplayer(Display::Generic); mPlaylistEditor = new Menu<Song>(middle_col_startx, main_start_y, middle_col_width+right_col_width+1, main_height, "Playlist's content", Config.main_color, brNone); mPlaylistEditor->HighlightColor(Config.main_highlight_color); mPlaylistEditor->SetTimeout(ncmpcpp_window_timeout); mPlaylistEditor->SetSelectPrefix(&Config.selected_item_prefix); mPlaylistEditor->SetSelectSuffix(&Config.selected_item_suffix); - mPlaylistEditor->SetItemDisplayer(DisplaySong); + mPlaylistEditor->SetItemDisplayer(Display::Songs); mPlaylistEditor->SetItemDisplayerUserData(&Config.song_list_format); // set default active columns @@ -466,7 +467,7 @@ int main(int argc, char *argv[]) if (current_screen == csPlaylist) { - DisplayTotalPlaylistLength(*wHeader); + Display::TotalPlaylistLength(*wHeader); } else if (current_screen == csBrowser) { @@ -805,7 +806,7 @@ int main(int argc, char *argv[]) time_t rawtime; time(&rawtime); tm *t = localtime(&rawtime); - DisplayClock(*wClock, t); + Display::Clock(*wClock, t); } else { @@ -964,7 +965,7 @@ int main(int argc, char *argv[]) sHelp->Resize(COLS, main_height); mPlaylist->Resize(COLS, main_height); - mPlaylist->SetTitle(Config.columns_in_playlist ? DisplayColumns(Config.song_columns_list_format) : ""); + mPlaylist->SetTitle(Config.columns_in_playlist ? Display::Columns(Config.song_columns_list_format) : ""); mBrowser->Resize(COLS, main_height); mSearcher->Resize(COLS, main_height); sInfo->Resize(COLS, main_height); @@ -1383,7 +1384,7 @@ int main(int argc, char *argv[]) if (!mSearcher->Back().first) { if (Config.columns_in_search_engine) - mSearcher->SetTitle(DisplayColumns(Config.song_columns_list_format)); + mSearcher->SetTitle(Display::Columns(Config.song_columns_list_format)); size_t found = mSearcher->Size()-search_engine_static_options; found += 3; // don't count options inserted below mSearcher->InsertSeparator(search_engine_reset_button+1); @@ -2565,22 +2566,22 @@ int main(int argc, char *argv[]) { Config.columns_in_playlist = !Config.columns_in_playlist; ShowMessage("Playlist display mode: %s", Config.columns_in_playlist ? "Columns" : "Classic"); - mPlaylist->SetItemDisplayer(Config.columns_in_playlist ? DisplaySongInColumns : DisplaySong); + mPlaylist->SetItemDisplayer(Config.columns_in_playlist ? Display::SongsInColumns : Display::Songs); mPlaylist->SetItemDisplayerUserData(Config.columns_in_playlist ? &Config.song_columns_list_format : &Config.song_list_format); - mPlaylist->SetTitle(Config.columns_in_playlist ? DisplayColumns(Config.song_columns_list_format) : ""); + mPlaylist->SetTitle(Config.columns_in_playlist ? Display::Columns(Config.song_columns_list_format) : ""); } else if (wCurrent == mBrowser) { Config.columns_in_browser = !Config.columns_in_browser; ShowMessage("Browser display mode: %s", Config.columns_in_browser ? "Columns" : "Classic"); - mBrowser->SetTitle(Config.columns_in_browser ? DisplayColumns(Config.song_columns_list_format) : ""); + mBrowser->SetTitle(Config.columns_in_browser ? Display::Columns(Config.song_columns_list_format) : ""); } else if (wCurrent == mSearcher) { Config.columns_in_search_engine = !Config.columns_in_search_engine; ShowMessage("Search engine display mode: %s", Config.columns_in_search_engine ? "Columns" : "Classic"); if (mSearcher->Size() > search_engine_static_options) - mSearcher->SetTitle(Config.columns_in_search_engine ? DisplayColumns(Config.song_columns_list_format) : ""); + mSearcher->SetTitle(Config.columns_in_search_engine ? Display::Columns(Config.song_columns_list_format) : ""); } // redraw_screen = 1; } @@ -3041,7 +3042,7 @@ int main(int argc, char *argv[]) size_t dialog_height = LINES*0.6; Menu<string> *mDialog = new Menu<string>((COLS-dialog_width)/2, (LINES-dialog_height)/2, dialog_width, dialog_height, "Add selected items to...", Config.main_color, Config.window_border); mDialog->SetTimeout(ncmpcpp_window_timeout); - mDialog->SetItemDisplayer(GenericDisplayer); + mDialog->SetItemDisplayer(Display::Generic); bool playlists_not_active = current_screen == csBrowser && Config.local_browser; diff --git a/src/ncmpcpp.h b/src/ncmpcpp.h index b9b3f019..e65b3e80 100644 --- a/src/ncmpcpp.h +++ b/src/ncmpcpp.h @@ -26,7 +26,7 @@ #include "scrollpad.h" #include "misc.h" -typedef std::pair<std::string, std::string> StringPair; +typedef std::pair<std::string, std::string> string_pair; enum NcmpcppScreen { diff --git a/src/search_engine.cpp b/src/search_engine.cpp index 721f3697..6d9a5b5f 100644 --- a/src/search_engine.cpp +++ b/src/search_engine.cpp @@ -18,6 +18,7 @@ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ +#include "display.h" #include "helpers.h" #include "search_engine.h" #include "settings.h" @@ -35,22 +36,6 @@ bool search_case_sensitive = 0; const char *search_mode_normal = "Match if tag contains searched phrase"; const char *search_mode_strict = "Match only if both values are the same"; -void SearchEngineDisplayer(const std::pair<Buffer *, Song *> &pair, void *, Menu< std::pair<Buffer *, Song *> > *menu) -{ - if (pair.second) - { - !Config.columns_in_search_engine - ? - DisplaySong(*pair.second, &Config.song_list_format, reinterpret_cast<Menu<Song> *>(menu)) - : - DisplaySongInColumns(*pair.second, &Config.song_columns_list_format, reinterpret_cast<Menu<Song> *>(menu)) - ; - } - - else - *menu << *pair.first; -} - void UpdateFoundList() { bool bold = 0; diff --git a/src/search_engine.h b/src/search_engine.h index 441c6c37..0c03d4ca 100644 --- a/src/search_engine.h +++ b/src/search_engine.h @@ -24,7 +24,7 @@ #include "mpdpp.h" #include "ncmpcpp.h" -class SearchPattern : public Song +class SearchPattern : public MPD::Song { public: const std::string &Any() { return itsAnyField; } @@ -41,7 +41,6 @@ const size_t search_engine_static_options = 20; const size_t search_engine_search_button = 15; const size_t search_engine_reset_button = 16; -void SearchEngineDisplayer(const std::pair<Buffer *, Song *> &, void *, Menu< std::pair<Buffer *, Song *> > *); void UpdateFoundList(); void PrepareSearchEngine(SearchPattern &s); void Search(SearchPattern); diff --git a/src/settings.cpp b/src/settings.cpp index e1407313..d78d8ecb 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -21,6 +21,7 @@ #include <sys/stat.h> #include <fstream> +#include "helpers.h" #include "settings.h" using std::ifstream; @@ -71,30 +72,6 @@ namespace } } -Color IntoColor(const string &color) -{ - Color result = clDefault; - - if (color == "black") - result = clBlack; - else if (color == "red") - result = clRed; - else if (color == "green") - result = clGreen; - else if (color == "yellow") - result = clYellow; - else if (color == "blue") - result = clBlue; - else if (color == "magenta") - result = clMagenta; - else if (color == "cyan") - result = clCyan; - else if (color == "white") - result = clWhite; - - return result; -} - void CreateConfigDir() { mkdir(config_dir.c_str(), 0755); @@ -291,73 +268,6 @@ void DefaultConfiguration(ncmpcpp_config &conf) conf.lyrics_db = 0; } -string GetLineValue(string &line, char a, char b, bool once) -{ - int i = 0; - int begin = -1, end = -1; - for (string::iterator it = line.begin(); it != line.end() && (begin == -1 || end == -1); i++, it++) - { - if (*it == a || *it == b) - { - if (once) - *it = 0; - if (begin < 0) - begin = i+1; - else - end = i; - } - } - if (begin >= 0 && end >= 0) - return line.substr(begin, end-begin); - else - return ""; -} - -string IntoStr(Color color) -{ - string result; - - if (color == clDefault) - result = "default"; - else if (color == clBlack) - result = "black"; - else if (color == clRed) - result = "red"; - else if (color == clGreen) - result = "green"; - else if (color == clYellow) - result = "yellow"; - else if (color == clBlue) - result = "blue"; - else if (color == clMagenta) - result = "magenta"; - else if (color == clCyan) - result = "cyan"; - else if (color == clWhite) - result = "white"; - - return result; -} - -mpd_TagItems IntoTagItem(char c) -{ - switch (c) - { - case 'a': - return MPD_TAG_ITEM_ARTIST; - case 'y': - return MPD_TAG_ITEM_DATE; - case 'g': - return MPD_TAG_ITEM_GENRE; - case 'c': - return MPD_TAG_ITEM_COMPOSER; - case 'p': - return MPD_TAG_ITEM_PERFORMER; - default: - return MPD_TAG_ITEM_ARTIST; - } -} - void ReadKeys(ncmpcpp_keys &keys) { ifstream f(keys_config_file.c_str()); diff --git a/src/settings.h b/src/settings.h index 393f8094..a73c62b1 100644 --- a/src/settings.h +++ b/src/settings.h @@ -170,10 +170,5 @@ void DefaultConfiguration(ncmpcpp_config &); void ReadKeys(ncmpcpp_keys &); void ReadConfiguration(ncmpcpp_config &); -Color IntoColor(const std::string &); -std::string IntoStr(Color); -mpd_TagItems IntoTagItem(char); -std::string GetLineValue(std::string &, char = '"', char = '"', bool = 0); - #endif diff --git a/src/song.cpp b/src/song.cpp index 1cfea3e1..447a3fd3 100644 --- a/src/song.cpp +++ b/src/song.cpp @@ -29,6 +29,7 @@ #include "charset.h" #include "song.h" +using MPD::Song; using std::string; Song::Song(mpd_Song *s, bool copy_ptr) : itsSong(s ? s : mpd_newSong()), @@ -26,83 +26,86 @@ #include "misc.h" #include "libmpdclient.h" -class Song +namespace MPD { - public: - Song() : itsSlash(std::string::npos), itsHash(0), copyPtr(0), isStream(0), isLocalised(0) { itsSong = mpd_newSong(); } - Song(mpd_Song *, bool = 0); - Song(const Song &); - ~Song(); - - std::string GetFile() const; - std::string GetName() const; - std::string GetDirectory() const; - std::string GetArtist() const; - std::string GetTitle() const; - std::string GetAlbum() const; - std::string GetTrack() const; - std::string GetYear() const; - std::string GetGenre() const; - std::string GetComposer() const; - std::string GetPerformer() const; - std::string GetDisc() const; - std::string GetComment() const; - std::string GetLength() const; - const long long &GetHash() const { return itsHash; } - int GetTotalLength() const { return itsSong->time < 0 ? 0 : itsSong->time; } - int GetPosition() const { return itsSong->pos; } - int GetID() const { return itsSong->id; } - - void SetFile(const std::string &); - void SetArtist(const std::string &); - void SetTitle(const std::string &); - void SetAlbum(const std::string &); - void SetTrack(const std::string &); - void SetTrack(int); - void SetYear(const std::string &); - void SetYear(int); - void SetGenre(const std::string &); - void SetComposer(const std::string &); - void SetPerformer(const std::string &); - void SetDisc(const std::string &); - void SetComment(const std::string &); - void SetPosition(int); - - void SetNewName(const std::string &name) { itsNewName = name == GetName() ? "" : name; } - std::string GetNewName() const { return itsNewName; } - - std::string toString(const std::string &) const; - - void NullMe() { itsSong = 0; } - void CopyPtr(bool copy) { copyPtr = copy; } - - //void GetEmptyFields(bool get) { itsGetEmptyFields = get; } - void Localize(); - //void Delocalize(); - void Clear(); - bool Empty() const; - bool IsFromDB() const; - bool IsStream() const { return isStream; } - bool Localized() const { return isLocalised; } - - Song & operator=(const Song &); - bool operator==(const Song &) const; - bool operator!=(const Song &) const; - bool operator<(const Song &rhs) const; - - static std::string ShowTime(int); - private: - void __Count_Last_Slash_Position(); - - mpd_Song *itsSong; - std::string itsNewName; - size_t itsSlash; - long long itsHash; - bool copyPtr; - bool isStream; - bool isLocalised; + class Song + { + public: + Song() : itsSlash(std::string::npos), itsHash(0), copyPtr(0), isStream(0), isLocalised(0) { itsSong = mpd_newSong(); } + Song(mpd_Song *, bool = 0); + Song(const Song &); + ~Song(); + + std::string GetFile() const; + std::string GetName() const; + std::string GetDirectory() const; + std::string GetArtist() const; + std::string GetTitle() const; + std::string GetAlbum() const; + std::string GetTrack() const; + std::string GetYear() const; + std::string GetGenre() const; + std::string GetComposer() const; + std::string GetPerformer() const; + std::string GetDisc() const; + std::string GetComment() const; + std::string GetLength() const; + const long long &GetHash() const { return itsHash; } + int GetTotalLength() const { return itsSong->time < 0 ? 0 : itsSong->time; } + int GetPosition() const { return itsSong->pos; } + int GetID() const { return itsSong->id; } + + void SetFile(const std::string &); + void SetArtist(const std::string &); + void SetTitle(const std::string &); + void SetAlbum(const std::string &); + void SetTrack(const std::string &); + void SetTrack(int); + void SetYear(const std::string &); + void SetYear(int); + void SetGenre(const std::string &); + void SetComposer(const std::string &); + void SetPerformer(const std::string &); + void SetDisc(const std::string &); + void SetComment(const std::string &); + void SetPosition(int); + + void SetNewName(const std::string &name) { itsNewName = name == GetName() ? "" : name; } + std::string GetNewName() const { return itsNewName; } + + std::string toString(const std::string &) const; + + void NullMe() { itsSong = 0; } + void CopyPtr(bool copy) { copyPtr = copy; } + + //void GetEmptyFields(bool get) { itsGetEmptyFields = get; } + void Localize(); + //void Delocalize(); + void Clear(); + bool Empty() const; + bool IsFromDB() const; + bool IsStream() const { return isStream; } + bool Localized() const { return isLocalised; } + + Song & operator=(const Song &); + bool operator==(const Song &) const; + bool operator!=(const Song &) const; + bool operator<(const Song &rhs) const; + + static std::string ShowTime(int); + private: + void __Count_Last_Slash_Position(); + + mpd_Song *itsSong; + std::string itsNewName; + size_t itsSlash; + long long itsHash; + bool copyPtr; + bool isStream; + bool isLocalised; //bool itsGetEmptyFields; -}; + }; +} #endif diff --git a/src/tag_editor.cpp b/src/tag_editor.cpp index 9e6915d3..56535414 100644 --- a/src/tag_editor.cpp +++ b/src/tag_editor.cpp @@ -30,6 +30,7 @@ #include "mpegfile.h" #include "charset.h" +#include "display.h" #include "helpers.h" #include "status_checker.h" @@ -238,51 +239,6 @@ string FindSharedDir(const SongList &v) return result; } -void DisplayTag(const Song &s, void *data, Menu<Song> *menu) -{ - switch (static_cast<Menu<string> *>(data)->Choice()) - { - case 0: - *menu << ShowTag(s.GetTitle()); - return; - case 1: - *menu << ShowTag(s.GetArtist()); - return; - case 2: - *menu << ShowTag(s.GetAlbum()); - return; - case 3: - *menu << ShowTag(s.GetYear()); - return; - case 4: - *menu << ShowTag(s.GetTrack()); - return; - case 5: - *menu << ShowTag(s.GetGenre()); - return; - case 6: - *menu << ShowTag(s.GetComposer()); - return; - case 7: - *menu << ShowTag(s.GetPerformer()); - return; - case 8: - *menu << ShowTag(s.GetDisc()); - return; - case 9: - *menu << ShowTag(s.GetComment()); - return; - case 11: - if (s.GetNewName().empty()) - *menu << s.GetName(); - else - *menu << s.GetName() << Config.color2 << " -> " << clEnd << s.GetNewName(); - return; - default: - return; - } -} - void ReadTagsFromFile(mpd_Song *s) { TagLib::FileRef f(s->file); @@ -469,7 +425,7 @@ void __deal_with_filenames(SongList &v) Menu<string> *Main = new Menu<string>((COLS-width)/2, (LINES-height)/2, width, height, "", Config.main_color, Config.window_border); Main->SetTimeout(ncmpcpp_window_timeout); - Main->SetItemDisplayer(GenericDisplayer); + Main->SetItemDisplayer(Display::Generic); Main->AddOption("Get tags from filename"); Main->AddOption("Rename files"); Main->AddSeparator(); @@ -529,7 +485,7 @@ void __deal_with_filenames(SongList &v) Main = new Menu<string>((COLS-width)/2, (LINES-height)/2, one_width, height, "", Config.main_color, Config.active_window_border); Main->SetTimeout(ncmpcpp_window_timeout); - Main->SetItemDisplayer(GenericDisplayer); + Main->SetItemDisplayer(Display::Generic); if (!patterns_list.empty()) Config.pattern = patterns_list.front(); diff --git a/src/tag_editor.h b/src/tag_editor.h index bd885f59..10675e98 100644 --- a/src/tag_editor.h +++ b/src/tag_editor.h @@ -32,23 +32,22 @@ #include "mpdpp.h" #include "settings.h" -typedef void (Song::*SongSetFunction)(const std::string &); -typedef std::string (Song::*SongGetFunction)() const; +typedef void (MPD::Song::*SongSetFunction)(const std::string &); +typedef std::string (MPD::Song::*SongGetFunction)() const; -std::string FindSharedDir(Menu<Song> *); +std::string FindSharedDir(Menu<MPD::Song> *); std::string FindSharedDir(const MPD::SongList &); -void DisplayTag(const Song &, void *, Menu<Song> *); SongSetFunction IntoSetFunction(mpd_TagItems); void ReadTagsFromFile(mpd_Song *); -bool GetSongTags(Song &); -bool WriteTags(Song &); +bool GetSongTags(MPD::Song &); +bool WriteTags(MPD::Song &); void __deal_with_filenames(MPD::SongList &); -void CapitalizeFirstLetters(Song &); -void LowerAllLetters(Song &); +void CapitalizeFirstLetters(MPD::Song &); +void LowerAllLetters(MPD::Song &); #endif |