group various functions more logically
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
bin_PROGRAMS = ncmpcpp
|
bin_PROGRAMS = ncmpcpp
|
||||||
ncmpcpp_SOURCES = browser.cpp charset.cpp clock.cpp help.cpp helpers.cpp \
|
ncmpcpp_SOURCES = browser.cpp charset.cpp clock.cpp display.cpp help.cpp \
|
||||||
libmpdclient.c lyrics.cpp misc.cpp mpdpp.cpp ncmpcpp.cpp scrollpad.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 \
|
search_engine.cpp settings.cpp song.cpp status_checker.cpp str_pool.c tag_editor.cpp \
|
||||||
window.cpp
|
window.cpp
|
||||||
|
|
||||||
@@ -9,6 +9,6 @@ INCLUDES= $(all_includes)
|
|||||||
|
|
||||||
# the library search path.
|
# the library search path.
|
||||||
ncmpcpp_LDFLAGS = $(all_libraries)
|
ncmpcpp_LDFLAGS = $(all_libraries)
|
||||||
noinst_HEADERS = browser.h charset.h clock.h help.h helpers.h lyrics.h menu.h \
|
noinst_HEADERS = browser.h charset.h clock.h display.h help.h helpers.h \
|
||||||
mpdpp.h scrollpad.h search_engine.h settings.h song.h status_checker.h \
|
lyrics.h menu.h mpdpp.h scrollpad.h search_engine.h settings.h song.h \
|
||||||
tag_editor.h window.h
|
status_checker.h tag_editor.h window.h
|
||||||
|
|||||||
@@ -24,6 +24,7 @@
|
|||||||
|
|
||||||
#include "browser.h"
|
#include "browser.h"
|
||||||
#include "charset.h"
|
#include "charset.h"
|
||||||
|
#include "display.h"
|
||||||
#include "helpers.h"
|
#include "helpers.h"
|
||||||
#include "settings.h"
|
#include "settings.h"
|
||||||
#ifdef HAVE_TAGLIB_H
|
#ifdef HAVE_TAGLIB_H
|
||||||
@@ -128,37 +129,6 @@ void UpdateItemList(Menu<Item> *menu)
|
|||||||
menu->Refresh();
|
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)
|
void GetDirectory(string dir, string subdir)
|
||||||
{
|
{
|
||||||
if (dir.empty())
|
if (dir.empty())
|
||||||
|
|||||||
@@ -26,8 +26,6 @@
|
|||||||
|
|
||||||
void UpdateItemList(Menu<MPD::Item> *);
|
void UpdateItemList(Menu<MPD::Item> *);
|
||||||
|
|
||||||
void DisplayItem(const MPD::Item &, void *, Menu<MPD::Item> *);
|
|
||||||
|
|
||||||
void GetDirectory(std::string, std::string = "/");
|
void GetDirectory(std::string, std::string = "/");
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -21,6 +21,7 @@
|
|||||||
/// NOTICE: Major part of this code is ported from ncmpc's clock screen
|
/// NOTICE: Major part of this code is ported from ncmpc's clock screen
|
||||||
|
|
||||||
#include "clock.h"
|
#include "clock.h"
|
||||||
|
#include "display.h"
|
||||||
|
|
||||||
#ifdef ENABLE_CLOCK
|
#ifdef ENABLE_CLOCK
|
||||||
|
|
||||||
@@ -56,7 +57,7 @@ void InitClock()
|
|||||||
older[i] = newer[i] = next[i] = 0;
|
older[i] = newer[i] = next[i] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DisplayClock(Window &w, const tm *time)
|
void Display::Clock(Window &w, const tm *time)
|
||||||
{
|
{
|
||||||
mask = 0;
|
mask = 0;
|
||||||
set(time->tm_sec % 10, 0);
|
set(time->tm_sec % 10, 0);
|
||||||
|
|||||||
@@ -33,8 +33,6 @@
|
|||||||
|
|
||||||
void InitClock();
|
void InitClock();
|
||||||
|
|
||||||
void DisplayClock(Window &, const tm *);
|
|
||||||
|
|
||||||
#endif // ENABLE_CLOCK
|
#endif // ENABLE_CLOCK
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
548
src/display.cpp
Normal file
548
src/display.cpp
Normal file
@@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
55
src/display.h
Normal file
55
src/display.h
Normal file
@@ -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
|
||||||
|
|
||||||
501
src/helpers.cpp
501
src/helpers.cpp
@@ -266,22 +266,6 @@ void WindowTitle(const string &status)
|
|||||||
std::cout << "\033]0;" << status << "\7";
|
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)
|
Window &operator<<(Window &w, mpd_TagItems tag)
|
||||||
{
|
{
|
||||||
switch (tag)
|
switch (tag)
|
||||||
@@ -325,37 +309,6 @@ Window &operator<<(Window &w, mpd_TagItems tag)
|
|||||||
return w;
|
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)
|
string FindSharedDir(const string &one, const string &two)
|
||||||
{
|
{
|
||||||
if (one == two)
|
if (one == two)
|
||||||
@@ -369,438 +322,6 @@ string FindSharedDir(const string &one, const string &two)
|
|||||||
return i != string::npos ? result.substr(0, i) : "/";
|
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)
|
void GetInfo(Song &s, Scrollpad &info)
|
||||||
{
|
{
|
||||||
# ifdef HAVE_TAGLIB_H
|
# ifdef HAVE_TAGLIB_H
|
||||||
@@ -838,6 +359,28 @@ void GetInfo(Song &s, Scrollpad &info)
|
|||||||
info << fmtBold << "\nComment: " << fmtBoldEnd << ShowTagInInfoScreen(s.GetComment());
|
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()
|
Window &Statusbar()
|
||||||
{
|
{
|
||||||
wFooter->GotoXY(0, Config.statusbar_visibility);
|
wFooter->GotoXY(0, Config.statusbar_visibility);
|
||||||
|
|||||||
@@ -32,34 +32,25 @@ class CaseInsensitiveSorting
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
bool operator()(std::string, std::string);
|
bool operator()(std::string, std::string);
|
||||||
bool operator()(Song *, Song *);
|
bool operator()(MPD::Song *, MPD::Song *);
|
||||||
bool operator()(const MPD::Item &, const MPD::Item &);
|
bool operator()(const MPD::Item &, const MPD::Item &);
|
||||||
};
|
};
|
||||||
|
|
||||||
template <class T> void GenericDisplayer(const T &t, void *, Menu<T> *menu)
|
bool SortSongsByTrack(MPD::Song *, MPD::Song *);
|
||||||
{
|
|
||||||
*menu << t;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool SortSongsByTrack(Song *, Song *);
|
void UpdateSongList(Menu<MPD::Song> *);
|
||||||
|
|
||||||
void UpdateSongList(Menu<Song> *);
|
|
||||||
|
|
||||||
bool Keypressed(int, const int *);
|
bool Keypressed(int, const int *);
|
||||||
|
|
||||||
void WindowTitle(const std::string &);
|
void WindowTitle(const std::string &);
|
||||||
void EscapeUnallowedChars(std::string &);
|
|
||||||
|
|
||||||
Window &operator<<(Window &, mpd_TagItems);
|
Window &operator<<(Window &, mpd_TagItems);
|
||||||
|
|
||||||
std::string IntoStr(mpd_TagItems);
|
|
||||||
std::string FindSharedDir(const std::string &, const std::string &);
|
std::string FindSharedDir(const std::string &, const std::string &);
|
||||||
void DisplayTotalPlaylistLength(Window &);
|
|
||||||
void DisplayStringPair(const StringPair &, void *, Menu<StringPair> *);
|
void GetInfo(MPD::Song &, Scrollpad &);
|
||||||
std::string DisplayColumns(std::string);
|
|
||||||
void DisplaySongInColumns(const Song &, void *, Menu<Song> *);
|
std::string GetLineValue(std::string &, char = '"', char = '"', bool = 0);
|
||||||
void DisplaySong(const Song &, void * = &Config.song_list_format, Menu<Song> * = NULL);
|
|
||||||
void GetInfo(Song &, Scrollpad &);
|
|
||||||
|
|
||||||
Window &Statusbar();
|
Window &Statusbar();
|
||||||
|
|
||||||
|
|||||||
@@ -318,8 +318,8 @@ const char *GetLyricsPluginName(int offset)
|
|||||||
|
|
||||||
void *GetLyrics(void *song)
|
void *GetLyrics(void *song)
|
||||||
{
|
{
|
||||||
string artist = static_cast<Song *>(song)->GetArtist();
|
string artist = static_cast<MPD::Song *>(song)->GetArtist();
|
||||||
string title = static_cast<Song *>(song)->GetTitle();
|
string title = static_cast<MPD::Song *>(song)->GetTitle();
|
||||||
|
|
||||||
locale_to_utf(artist);
|
locale_to_utf(artist);
|
||||||
locale_to_utf(title);
|
locale_to_utf(title);
|
||||||
|
|||||||
126
src/misc.cpp
126
src/misc.cpp
@@ -23,17 +23,17 @@
|
|||||||
|
|
||||||
#include "misc.h"
|
#include "misc.h"
|
||||||
|
|
||||||
/*int Abs(int num)
|
namespace
|
||||||
{
|
{
|
||||||
return (num < 0 ? -num : num);
|
const std::string unallowed_chars = "\"*/:<>?\\|";
|
||||||
}*/
|
}
|
||||||
|
|
||||||
void ToLower(std::string &s)
|
void ToLower(std::string &s)
|
||||||
{
|
{
|
||||||
transform(s.begin(), s.end(), s.begin(), tolower);
|
transform(s.begin(), s.end(), s.begin(), tolower);
|
||||||
}
|
}
|
||||||
|
|
||||||
int StrToInt(std::string str)
|
int StrToInt(const std::string &str)
|
||||||
{
|
{
|
||||||
return atoi(str.c_str());
|
return atoi(str.c_str());
|
||||||
}
|
}
|
||||||
@@ -45,10 +45,118 @@ std::string IntoStr(int l)
|
|||||||
return ss.str();
|
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;
|
switch (tag)
|
||||||
ss << std::fixed << std::setprecision(precision) << l;
|
{
|
||||||
return ss.str();
|
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--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
16
src/misc.h
16
src/misc.h
@@ -23,14 +23,24 @@
|
|||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
//int Abs(int);
|
#include "window.h"
|
||||||
|
#include "libmpdclient.h"
|
||||||
|
|
||||||
void ToLower(std::string &);
|
void ToLower(std::string &);
|
||||||
|
|
||||||
int StrToInt(std::string);
|
int StrToInt(const std::string &);
|
||||||
|
|
||||||
std::string IntoStr(int);
|
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
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -33,6 +33,7 @@
|
|||||||
#include "browser.h"
|
#include "browser.h"
|
||||||
#include "charset.h"
|
#include "charset.h"
|
||||||
#include "clock.h"
|
#include "clock.h"
|
||||||
|
#include "display.h"
|
||||||
#include "help.h"
|
#include "help.h"
|
||||||
#include "helpers.h"
|
#include "helpers.h"
|
||||||
#include "lyrics.h"
|
#include "lyrics.h"
|
||||||
@@ -105,17 +106,17 @@ Menu< std::pair<Buffer *, Song *> > *mSearcher;
|
|||||||
|
|
||||||
Window *wLibActiveCol;
|
Window *wLibActiveCol;
|
||||||
Menu<string> *mLibArtists;
|
Menu<string> *mLibArtists;
|
||||||
Menu<StringPair> *mLibAlbums;
|
Menu<string_pair> *mLibAlbums;
|
||||||
Menu<Song> *mLibSongs;
|
Menu<Song> *mLibSongs;
|
||||||
|
|
||||||
#ifdef HAVE_TAGLIB_H
|
#ifdef HAVE_TAGLIB_H
|
||||||
Window *wTagEditorActiveCol;
|
Window *wTagEditorActiveCol;
|
||||||
Menu<Buffer> *mTagEditor;
|
Menu<Buffer> *mTagEditor;
|
||||||
Menu<StringPair> *mEditorAlbums;
|
Menu<string_pair> *mEditorAlbums;
|
||||||
Menu<StringPair> *mEditorDirs;
|
Menu<string_pair> *mEditorDirs;
|
||||||
#endif // HAVE_TAGLIB_H
|
#endif // HAVE_TAGLIB_H
|
||||||
// blah, I use below in conditionals.
|
// blah, I use below in conditionals.
|
||||||
Menu<StringPair> *mEditorLeftCol;
|
Menu<string_pair> *mEditorLeftCol;
|
||||||
Menu<string> *mEditorTagTypes;
|
Menu<string> *mEditorTagTypes;
|
||||||
Menu<Song> *mEditorTags;
|
Menu<Song> *mEditorTags;
|
||||||
|
|
||||||
@@ -226,12 +227,12 @@ int main(int argc, char *argv[])
|
|||||||
if (!Config.statusbar_visibility)
|
if (!Config.statusbar_visibility)
|
||||||
main_height++;
|
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->SetTimeout(ncmpcpp_window_timeout);
|
||||||
mPlaylist->HighlightColor(Config.main_highlight_color);
|
mPlaylist->HighlightColor(Config.main_highlight_color);
|
||||||
mPlaylist->SetSelectPrefix(&Config.selected_item_prefix);
|
mPlaylist->SetSelectPrefix(&Config.selected_item_prefix);
|
||||||
mPlaylist->SetSelectSuffix(&Config.selected_item_suffix);
|
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);
|
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);
|
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->SetTimeout(ncmpcpp_window_timeout);
|
||||||
mBrowser->SetSelectPrefix(&Config.selected_item_prefix);
|
mBrowser->SetSelectPrefix(&Config.selected_item_prefix);
|
||||||
mBrowser->SetSelectSuffix(&Config.selected_item_suffix);
|
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 = new Menu< std::pair<Buffer *, Song *> >(0, main_start_y, COLS, main_height, "", Config.main_color, brNone);
|
||||||
mSearcher->HighlightColor(Config.main_highlight_color);
|
mSearcher->HighlightColor(Config.main_highlight_color);
|
||||||
mSearcher->SetTimeout(ncmpcpp_window_timeout);
|
mSearcher->SetTimeout(ncmpcpp_window_timeout);
|
||||||
mSearcher->SetItemDisplayer(SearchEngineDisplayer);
|
mSearcher->SetItemDisplayer(Display::SearchEngine);
|
||||||
mSearcher->SetSelectPrefix(&Config.selected_item_prefix);
|
mSearcher->SetSelectPrefix(&Config.selected_item_prefix);
|
||||||
mSearcher->SetSelectSuffix(&Config.selected_item_suffix);
|
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 = 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->HighlightColor(Config.active_column_color);
|
||||||
mLibArtists->SetTimeout(ncmpcpp_window_timeout);
|
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->HighlightColor(Config.main_highlight_color);
|
||||||
mLibAlbums->SetTimeout(ncmpcpp_window_timeout);
|
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 = 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->HighlightColor(Config.main_highlight_color);
|
||||||
mLibSongs->SetTimeout(ncmpcpp_window_timeout);
|
mLibSongs->SetTimeout(ncmpcpp_window_timeout);
|
||||||
mLibSongs->SetSelectPrefix(&Config.selected_item_prefix);
|
mLibSongs->SetSelectPrefix(&Config.selected_item_prefix);
|
||||||
mLibSongs->SetSelectSuffix(&Config.selected_item_suffix);
|
mLibSongs->SetSelectSuffix(&Config.selected_item_suffix);
|
||||||
mLibSongs->SetItemDisplayer(DisplaySong);
|
mLibSongs->SetItemDisplayer(Display::Songs);
|
||||||
mLibSongs->SetItemDisplayerUserData(&Config.song_library_format);
|
mLibSongs->SetItemDisplayerUserData(&Config.song_library_format);
|
||||||
|
|
||||||
# ifdef HAVE_TAGLIB_H
|
# ifdef HAVE_TAGLIB_H
|
||||||
mTagEditor = new Menu<Buffer>(0, main_start_y, COLS, main_height, "", Config.main_color, brNone);
|
mTagEditor = new Menu<Buffer>(0, main_start_y, COLS, main_height, "", Config.main_color, brNone);
|
||||||
mTagEditor->HighlightColor(Config.main_highlight_color);
|
mTagEditor->HighlightColor(Config.main_highlight_color);
|
||||||
mTagEditor->SetTimeout(ncmpcpp_window_timeout);
|
mTagEditor->SetTimeout(ncmpcpp_window_timeout);
|
||||||
mTagEditor->SetItemDisplayer(GenericDisplayer);
|
mTagEditor->SetItemDisplayer(Display::Generic);
|
||||||
|
|
||||||
size_t tagedit_middle_col_width = 26;
|
size_t tagedit_middle_col_width = 26;
|
||||||
size_t tagedit_left_col_width = COLS/2-tagedit_middle_col_width/2;
|
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_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;
|
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->HighlightColor(Config.active_column_color);
|
||||||
mEditorAlbums->SetTimeout(ncmpcpp_window_timeout);
|
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->HighlightColor(Config.active_column_color);
|
||||||
mEditorDirs->SetTimeout(ncmpcpp_window_timeout);
|
mEditorDirs->SetTimeout(ncmpcpp_window_timeout);
|
||||||
mEditorDirs->SetItemDisplayer(DisplayStringPair);
|
mEditorDirs->SetItemDisplayer(Display::StringPairs);
|
||||||
mEditorLeftCol = Config.albums_in_tag_editor ? mEditorAlbums : mEditorDirs;
|
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 = 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->HighlightColor(Config.main_highlight_color);
|
||||||
mEditorTagTypes->SetTimeout(ncmpcpp_window_timeout);
|
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 = 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->HighlightColor(Config.main_highlight_color);
|
||||||
mEditorTags->SetTimeout(ncmpcpp_window_timeout);
|
mEditorTags->SetTimeout(ncmpcpp_window_timeout);
|
||||||
mEditorTags->SetSelectPrefix(&Config.selected_item_prefix);
|
mEditorTags->SetSelectPrefix(&Config.selected_item_prefix);
|
||||||
mEditorTags->SetSelectSuffix(&Config.selected_item_suffix);
|
mEditorTags->SetSelectSuffix(&Config.selected_item_suffix);
|
||||||
mEditorTags->SetItemDisplayer(DisplayTag);
|
mEditorTags->SetItemDisplayer(Display::Tags);
|
||||||
mEditorTags->SetItemDisplayerUserData(mEditorTagTypes);
|
mEditorTags->SetItemDisplayerUserData(mEditorTagTypes);
|
||||||
# endif // HAVE_TAGLIB_H
|
# endif // HAVE_TAGLIB_H
|
||||||
|
|
||||||
mPlaylistList = new Menu<string>(0, main_start_y, left_col_width, main_height, "Playlists", Config.main_color, brNone);
|
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->HighlightColor(Config.active_column_color);
|
||||||
mPlaylistList->SetTimeout(ncmpcpp_window_timeout);
|
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 = 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->HighlightColor(Config.main_highlight_color);
|
||||||
mPlaylistEditor->SetTimeout(ncmpcpp_window_timeout);
|
mPlaylistEditor->SetTimeout(ncmpcpp_window_timeout);
|
||||||
mPlaylistEditor->SetSelectPrefix(&Config.selected_item_prefix);
|
mPlaylistEditor->SetSelectPrefix(&Config.selected_item_prefix);
|
||||||
mPlaylistEditor->SetSelectSuffix(&Config.selected_item_suffix);
|
mPlaylistEditor->SetSelectSuffix(&Config.selected_item_suffix);
|
||||||
mPlaylistEditor->SetItemDisplayer(DisplaySong);
|
mPlaylistEditor->SetItemDisplayer(Display::Songs);
|
||||||
mPlaylistEditor->SetItemDisplayerUserData(&Config.song_list_format);
|
mPlaylistEditor->SetItemDisplayerUserData(&Config.song_list_format);
|
||||||
|
|
||||||
// set default active columns
|
// set default active columns
|
||||||
@@ -466,7 +467,7 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
if (current_screen == csPlaylist)
|
if (current_screen == csPlaylist)
|
||||||
{
|
{
|
||||||
DisplayTotalPlaylistLength(*wHeader);
|
Display::TotalPlaylistLength(*wHeader);
|
||||||
}
|
}
|
||||||
else if (current_screen == csBrowser)
|
else if (current_screen == csBrowser)
|
||||||
{
|
{
|
||||||
@@ -805,7 +806,7 @@ int main(int argc, char *argv[])
|
|||||||
time_t rawtime;
|
time_t rawtime;
|
||||||
time(&rawtime);
|
time(&rawtime);
|
||||||
tm *t = localtime(&rawtime);
|
tm *t = localtime(&rawtime);
|
||||||
DisplayClock(*wClock, t);
|
Display::Clock(*wClock, t);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -964,7 +965,7 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
sHelp->Resize(COLS, main_height);
|
sHelp->Resize(COLS, main_height);
|
||||||
mPlaylist->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);
|
mBrowser->Resize(COLS, main_height);
|
||||||
mSearcher->Resize(COLS, main_height);
|
mSearcher->Resize(COLS, main_height);
|
||||||
sInfo->Resize(COLS, main_height);
|
sInfo->Resize(COLS, main_height);
|
||||||
@@ -1383,7 +1384,7 @@ int main(int argc, char *argv[])
|
|||||||
if (!mSearcher->Back().first)
|
if (!mSearcher->Back().first)
|
||||||
{
|
{
|
||||||
if (Config.columns_in_search_engine)
|
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;
|
size_t found = mSearcher->Size()-search_engine_static_options;
|
||||||
found += 3; // don't count options inserted below
|
found += 3; // don't count options inserted below
|
||||||
mSearcher->InsertSeparator(search_engine_reset_button+1);
|
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;
|
Config.columns_in_playlist = !Config.columns_in_playlist;
|
||||||
ShowMessage("Playlist display mode: %s", Config.columns_in_playlist ? "Columns" : "Classic");
|
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->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)
|
else if (wCurrent == mBrowser)
|
||||||
{
|
{
|
||||||
Config.columns_in_browser = !Config.columns_in_browser;
|
Config.columns_in_browser = !Config.columns_in_browser;
|
||||||
ShowMessage("Browser display mode: %s", Config.columns_in_browser ? "Columns" : "Classic");
|
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)
|
else if (wCurrent == mSearcher)
|
||||||
{
|
{
|
||||||
Config.columns_in_search_engine = !Config.columns_in_search_engine;
|
Config.columns_in_search_engine = !Config.columns_in_search_engine;
|
||||||
ShowMessage("Search engine display mode: %s", Config.columns_in_search_engine ? "Columns" : "Classic");
|
ShowMessage("Search engine display mode: %s", Config.columns_in_search_engine ? "Columns" : "Classic");
|
||||||
if (mSearcher->Size() > search_engine_static_options)
|
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;
|
// redraw_screen = 1;
|
||||||
}
|
}
|
||||||
@@ -3041,7 +3042,7 @@ int main(int argc, char *argv[])
|
|||||||
size_t dialog_height = LINES*0.6;
|
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);
|
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->SetTimeout(ncmpcpp_window_timeout);
|
||||||
mDialog->SetItemDisplayer(GenericDisplayer);
|
mDialog->SetItemDisplayer(Display::Generic);
|
||||||
|
|
||||||
bool playlists_not_active = current_screen == csBrowser && Config.local_browser;
|
bool playlists_not_active = current_screen == csBrowser && Config.local_browser;
|
||||||
|
|
||||||
|
|||||||
@@ -26,7 +26,7 @@
|
|||||||
#include "scrollpad.h"
|
#include "scrollpad.h"
|
||||||
#include "misc.h"
|
#include "misc.h"
|
||||||
|
|
||||||
typedef std::pair<std::string, std::string> StringPair;
|
typedef std::pair<std::string, std::string> string_pair;
|
||||||
|
|
||||||
enum NcmpcppScreen
|
enum NcmpcppScreen
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -18,6 +18,7 @@
|
|||||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. *
|
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. *
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
|
#include "display.h"
|
||||||
#include "helpers.h"
|
#include "helpers.h"
|
||||||
#include "search_engine.h"
|
#include "search_engine.h"
|
||||||
#include "settings.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_normal = "Match if tag contains searched phrase";
|
||||||
const char *search_mode_strict = "Match only if both values are the same";
|
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()
|
void UpdateFoundList()
|
||||||
{
|
{
|
||||||
bool bold = 0;
|
bool bold = 0;
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
#include "mpdpp.h"
|
#include "mpdpp.h"
|
||||||
#include "ncmpcpp.h"
|
#include "ncmpcpp.h"
|
||||||
|
|
||||||
class SearchPattern : public Song
|
class SearchPattern : public MPD::Song
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
const std::string &Any() { return itsAnyField; }
|
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_search_button = 15;
|
||||||
const size_t search_engine_reset_button = 16;
|
const size_t search_engine_reset_button = 16;
|
||||||
|
|
||||||
void SearchEngineDisplayer(const std::pair<Buffer *, Song *> &, void *, Menu< std::pair<Buffer *, Song *> > *);
|
|
||||||
void UpdateFoundList();
|
void UpdateFoundList();
|
||||||
void PrepareSearchEngine(SearchPattern &s);
|
void PrepareSearchEngine(SearchPattern &s);
|
||||||
void Search(SearchPattern);
|
void Search(SearchPattern);
|
||||||
|
|||||||
@@ -21,6 +21,7 @@
|
|||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
|
||||||
|
#include "helpers.h"
|
||||||
#include "settings.h"
|
#include "settings.h"
|
||||||
|
|
||||||
using std::ifstream;
|
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()
|
void CreateConfigDir()
|
||||||
{
|
{
|
||||||
mkdir(config_dir.c_str(), 0755);
|
mkdir(config_dir.c_str(), 0755);
|
||||||
@@ -291,73 +268,6 @@ void DefaultConfiguration(ncmpcpp_config &conf)
|
|||||||
conf.lyrics_db = 0;
|
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)
|
void ReadKeys(ncmpcpp_keys &keys)
|
||||||
{
|
{
|
||||||
ifstream f(keys_config_file.c_str());
|
ifstream f(keys_config_file.c_str());
|
||||||
|
|||||||
@@ -170,10 +170,5 @@ void DefaultConfiguration(ncmpcpp_config &);
|
|||||||
void ReadKeys(ncmpcpp_keys &);
|
void ReadKeys(ncmpcpp_keys &);
|
||||||
void ReadConfiguration(ncmpcpp_config &);
|
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
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -29,6 +29,7 @@
|
|||||||
#include "charset.h"
|
#include "charset.h"
|
||||||
#include "song.h"
|
#include "song.h"
|
||||||
|
|
||||||
|
using MPD::Song;
|
||||||
using std::string;
|
using std::string;
|
||||||
|
|
||||||
Song::Song(mpd_Song *s, bool copy_ptr) : itsSong(s ? s : mpd_newSong()),
|
Song::Song(mpd_Song *s, bool copy_ptr) : itsSong(s ? s : mpd_newSong()),
|
||||||
|
|||||||
153
src/song.h
153
src/song.h
@@ -26,83 +26,86 @@
|
|||||||
#include "misc.h"
|
#include "misc.h"
|
||||||
#include "libmpdclient.h"
|
#include "libmpdclient.h"
|
||||||
|
|
||||||
class Song
|
namespace MPD
|
||||||
{
|
{
|
||||||
public:
|
class Song
|
||||||
Song() : itsSlash(std::string::npos), itsHash(0), copyPtr(0), isStream(0), isLocalised(0) { itsSong = mpd_newSong(); }
|
{
|
||||||
Song(mpd_Song *, bool = 0);
|
public:
|
||||||
Song(const Song &);
|
Song() : itsSlash(std::string::npos), itsHash(0), copyPtr(0), isStream(0), isLocalised(0) { itsSong = mpd_newSong(); }
|
||||||
~Song();
|
Song(mpd_Song *, bool = 0);
|
||||||
|
Song(const Song &);
|
||||||
std::string GetFile() const;
|
~Song();
|
||||||
std::string GetName() const;
|
|
||||||
std::string GetDirectory() const;
|
std::string GetFile() const;
|
||||||
std::string GetArtist() const;
|
std::string GetName() const;
|
||||||
std::string GetTitle() const;
|
std::string GetDirectory() const;
|
||||||
std::string GetAlbum() const;
|
std::string GetArtist() const;
|
||||||
std::string GetTrack() const;
|
std::string GetTitle() const;
|
||||||
std::string GetYear() const;
|
std::string GetAlbum() const;
|
||||||
std::string GetGenre() const;
|
std::string GetTrack() const;
|
||||||
std::string GetComposer() const;
|
std::string GetYear() const;
|
||||||
std::string GetPerformer() const;
|
std::string GetGenre() const;
|
||||||
std::string GetDisc() const;
|
std::string GetComposer() const;
|
||||||
std::string GetComment() const;
|
std::string GetPerformer() const;
|
||||||
std::string GetLength() const;
|
std::string GetDisc() const;
|
||||||
const long long &GetHash() const { return itsHash; }
|
std::string GetComment() const;
|
||||||
int GetTotalLength() const { return itsSong->time < 0 ? 0 : itsSong->time; }
|
std::string GetLength() const;
|
||||||
int GetPosition() const { return itsSong->pos; }
|
const long long &GetHash() const { return itsHash; }
|
||||||
int GetID() const { return itsSong->id; }
|
int GetTotalLength() const { return itsSong->time < 0 ? 0 : itsSong->time; }
|
||||||
|
int GetPosition() const { return itsSong->pos; }
|
||||||
void SetFile(const std::string &);
|
int GetID() const { return itsSong->id; }
|
||||||
void SetArtist(const std::string &);
|
|
||||||
void SetTitle(const std::string &);
|
void SetFile(const std::string &);
|
||||||
void SetAlbum(const std::string &);
|
void SetArtist(const std::string &);
|
||||||
void SetTrack(const std::string &);
|
void SetTitle(const std::string &);
|
||||||
void SetTrack(int);
|
void SetAlbum(const std::string &);
|
||||||
void SetYear(const std::string &);
|
void SetTrack(const std::string &);
|
||||||
void SetYear(int);
|
void SetTrack(int);
|
||||||
void SetGenre(const std::string &);
|
void SetYear(const std::string &);
|
||||||
void SetComposer(const std::string &);
|
void SetYear(int);
|
||||||
void SetPerformer(const std::string &);
|
void SetGenre(const std::string &);
|
||||||
void SetDisc(const std::string &);
|
void SetComposer(const std::string &);
|
||||||
void SetComment(const std::string &);
|
void SetPerformer(const std::string &);
|
||||||
void SetPosition(int);
|
void SetDisc(const std::string &);
|
||||||
|
void SetComment(const std::string &);
|
||||||
void SetNewName(const std::string &name) { itsNewName = name == GetName() ? "" : name; }
|
void SetPosition(int);
|
||||||
std::string GetNewName() const { return itsNewName; }
|
|
||||||
|
void SetNewName(const std::string &name) { itsNewName = name == GetName() ? "" : name; }
|
||||||
std::string toString(const std::string &) const;
|
std::string GetNewName() const { return itsNewName; }
|
||||||
|
|
||||||
void NullMe() { itsSong = 0; }
|
std::string toString(const std::string &) const;
|
||||||
void CopyPtr(bool copy) { copyPtr = copy; }
|
|
||||||
|
void NullMe() { itsSong = 0; }
|
||||||
//void GetEmptyFields(bool get) { itsGetEmptyFields = get; }
|
void CopyPtr(bool copy) { copyPtr = copy; }
|
||||||
void Localize();
|
|
||||||
//void Delocalize();
|
//void GetEmptyFields(bool get) { itsGetEmptyFields = get; }
|
||||||
void Clear();
|
void Localize();
|
||||||
bool Empty() const;
|
//void Delocalize();
|
||||||
bool IsFromDB() const;
|
void Clear();
|
||||||
bool IsStream() const { return isStream; }
|
bool Empty() const;
|
||||||
bool Localized() const { return isLocalised; }
|
bool IsFromDB() const;
|
||||||
|
bool IsStream() const { return isStream; }
|
||||||
Song & operator=(const Song &);
|
bool Localized() const { return isLocalised; }
|
||||||
bool operator==(const Song &) const;
|
|
||||||
bool operator!=(const Song &) const;
|
Song & operator=(const Song &);
|
||||||
bool operator<(const Song &rhs) const;
|
bool operator==(const Song &) const;
|
||||||
|
bool operator!=(const Song &) const;
|
||||||
static std::string ShowTime(int);
|
bool operator<(const Song &rhs) const;
|
||||||
private:
|
|
||||||
void __Count_Last_Slash_Position();
|
static std::string ShowTime(int);
|
||||||
|
private:
|
||||||
mpd_Song *itsSong;
|
void __Count_Last_Slash_Position();
|
||||||
std::string itsNewName;
|
|
||||||
size_t itsSlash;
|
mpd_Song *itsSong;
|
||||||
long long itsHash;
|
std::string itsNewName;
|
||||||
bool copyPtr;
|
size_t itsSlash;
|
||||||
bool isStream;
|
long long itsHash;
|
||||||
bool isLocalised;
|
bool copyPtr;
|
||||||
|
bool isStream;
|
||||||
|
bool isLocalised;
|
||||||
//bool itsGetEmptyFields;
|
//bool itsGetEmptyFields;
|
||||||
};
|
};
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -30,6 +30,7 @@
|
|||||||
#include "mpegfile.h"
|
#include "mpegfile.h"
|
||||||
|
|
||||||
#include "charset.h"
|
#include "charset.h"
|
||||||
|
#include "display.h"
|
||||||
#include "helpers.h"
|
#include "helpers.h"
|
||||||
#include "status_checker.h"
|
#include "status_checker.h"
|
||||||
|
|
||||||
@@ -238,51 +239,6 @@ string FindSharedDir(const SongList &v)
|
|||||||
return result;
|
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)
|
void ReadTagsFromFile(mpd_Song *s)
|
||||||
{
|
{
|
||||||
TagLib::FileRef f(s->file);
|
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);
|
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->SetTimeout(ncmpcpp_window_timeout);
|
||||||
Main->SetItemDisplayer(GenericDisplayer);
|
Main->SetItemDisplayer(Display::Generic);
|
||||||
Main->AddOption("Get tags from filename");
|
Main->AddOption("Get tags from filename");
|
||||||
Main->AddOption("Rename files");
|
Main->AddOption("Rename files");
|
||||||
Main->AddSeparator();
|
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 = 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->SetTimeout(ncmpcpp_window_timeout);
|
||||||
Main->SetItemDisplayer(GenericDisplayer);
|
Main->SetItemDisplayer(Display::Generic);
|
||||||
|
|
||||||
if (!patterns_list.empty())
|
if (!patterns_list.empty())
|
||||||
Config.pattern = patterns_list.front();
|
Config.pattern = patterns_list.front();
|
||||||
|
|||||||
@@ -32,23 +32,22 @@
|
|||||||
#include "mpdpp.h"
|
#include "mpdpp.h"
|
||||||
#include "settings.h"
|
#include "settings.h"
|
||||||
|
|
||||||
typedef void (Song::*SongSetFunction)(const std::string &);
|
typedef void (MPD::Song::*SongSetFunction)(const std::string &);
|
||||||
typedef std::string (Song::*SongGetFunction)() const;
|
typedef std::string (MPD::Song::*SongGetFunction)() const;
|
||||||
|
|
||||||
std::string FindSharedDir(Menu<Song> *);
|
std::string FindSharedDir(Menu<MPD::Song> *);
|
||||||
std::string FindSharedDir(const MPD::SongList &);
|
std::string FindSharedDir(const MPD::SongList &);
|
||||||
void DisplayTag(const Song &, void *, Menu<Song> *);
|
|
||||||
|
|
||||||
SongSetFunction IntoSetFunction(mpd_TagItems);
|
SongSetFunction IntoSetFunction(mpd_TagItems);
|
||||||
|
|
||||||
void ReadTagsFromFile(mpd_Song *);
|
void ReadTagsFromFile(mpd_Song *);
|
||||||
bool GetSongTags(Song &);
|
bool GetSongTags(MPD::Song &);
|
||||||
bool WriteTags(Song &);
|
bool WriteTags(MPD::Song &);
|
||||||
|
|
||||||
void __deal_with_filenames(MPD::SongList &);
|
void __deal_with_filenames(MPD::SongList &);
|
||||||
|
|
||||||
void CapitalizeFirstLetters(Song &);
|
void CapitalizeFirstLetters(MPD::Song &);
|
||||||
void LowerAllLetters(Song &);
|
void LowerAllLetters(MPD::Song &);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user