remove color parser / update Window, Scrollpad class and related stuff
This commit is contained in:
@@ -19,7 +19,7 @@ dnl ========================
|
|||||||
if test "$unicode" = "yes" ; then
|
if test "$unicode" = "yes" ; then
|
||||||
ncurses_config_bin=ncursesw5-config
|
ncurses_config_bin=ncursesw5-config
|
||||||
ncurses_lib=ncursesw
|
ncurses_lib=ncursesw
|
||||||
CPPFLAGS="$CPPFLAGS -DUTF8_ENABLED"
|
CPPFLAGS="$CPPFLAGS -D_UTF8"
|
||||||
else
|
else
|
||||||
ncurses_config_bin=ncurses5-config
|
ncurses_config_bin=ncurses5-config
|
||||||
ncurses_lib=ncurses
|
ncurses_lib=ncurses
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
bin_PROGRAMS = ncmpcpp
|
bin_PROGRAMS = ncmpcpp
|
||||||
ncmpcpp_SOURCES = browser.cpp color_parser.cpp help.cpp helpers.cpp \
|
ncmpcpp_SOURCES = browser.cpp help.cpp helpers.cpp libmpdclient.c lyrics.cpp \
|
||||||
libmpdclient.c lyrics.cpp menu.cpp misc.cpp mpdpp.cpp ncmpcpp.cpp scrollpad.cpp \
|
menu.cpp misc.cpp mpdpp.cpp ncmpcpp.cpp scrollpad.cpp search_engine.cpp \
|
||||||
search_engine.cpp settings.cpp song.cpp status_checker.cpp str_pool.c tag_editor.cpp \
|
settings.cpp song.cpp status_checker.cpp str_pool.c tag_editor.cpp window.cpp
|
||||||
window.cpp
|
|
||||||
|
|
||||||
# set the include path found by configure
|
# set the include path found by configure
|
||||||
INCLUDES= $(all_includes)
|
INCLUDES= $(all_includes)
|
||||||
|
|||||||
194
src/help.cpp
194
src/help.cpp
@@ -88,133 +88,129 @@ namespace
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
string GetKeybindings()
|
void GetKeybindings(Scrollpad &help)
|
||||||
{
|
{
|
||||||
string result;
|
help << " " << fmtBold << "Keys - Movement\n -----------------------------------------\n" << fmtBoldEnd;
|
||||||
|
help << DisplayKeys(Key.Up) << "Move Cursor up\n";
|
||||||
|
help << DisplayKeys(Key.Down) << "Move Cursor down\n";
|
||||||
|
help << DisplayKeys(Key.PageUp) << "Page up\n";
|
||||||
|
help << DisplayKeys(Key.PageDown) << "Page down\n";
|
||||||
|
help << DisplayKeys(Key.Home) << "Home\n";
|
||||||
|
help << DisplayKeys(Key.End) << "End\n\n";
|
||||||
|
|
||||||
result += " [.b]Keys - Movement\n -----------------------------------------[/b]\n";
|
help << DisplayKeys(Key.ScreenSwitcher) << "Switch between playlist and browser\n";
|
||||||
result += DisplayKeys(Key.Up) + "Move Cursor up\n";
|
help << DisplayKeys(Key.Help) << "Help screen\n";
|
||||||
result += DisplayKeys(Key.Down) + "Move Cursor down\n";
|
help << DisplayKeys(Key.Playlist) << "Playlist screen\n";
|
||||||
result += DisplayKeys(Key.PageUp) + "Page up\n";
|
help << DisplayKeys(Key.Browser) << "Browse screen\n";
|
||||||
result += DisplayKeys(Key.PageDown) + "Page down\n";
|
help << DisplayKeys(Key.SearchEngine) << "Search engine\n";
|
||||||
result += DisplayKeys(Key.Home) + "Home\n";
|
help << DisplayKeys(Key.MediaLibrary) << "Media library\n";
|
||||||
result += DisplayKeys(Key.End) + "End\n\n";
|
help << DisplayKeys(Key.PlaylistEditor) << "Playlist editor\n";
|
||||||
|
|
||||||
result += DisplayKeys(Key.ScreenSwitcher) + "Switch between playlist and browser\n";
|
|
||||||
result += DisplayKeys(Key.Help) + "Help screen\n";
|
|
||||||
result += DisplayKeys(Key.Playlist) + "Playlist screen\n";
|
|
||||||
result += DisplayKeys(Key.Browser) + "Browse screen\n";
|
|
||||||
result += DisplayKeys(Key.SearchEngine) + "Search engine\n";
|
|
||||||
result += DisplayKeys(Key.MediaLibrary) + "Media library\n";
|
|
||||||
result += DisplayKeys(Key.PlaylistEditor) + "Playlist editor\n";
|
|
||||||
# ifdef HAVE_TAGLIB_H
|
# ifdef HAVE_TAGLIB_H
|
||||||
result += DisplayKeys(Key.TagEditor) + "Tag editor\n\n\n";
|
help << DisplayKeys(Key.TagEditor) << "Tag editor\n\n\n";
|
||||||
# else
|
# else
|
||||||
result += "\n\n";
|
help << "\n\n";
|
||||||
# endif // HAVE_TAGLIB_H
|
# endif // HAVE_TAGLIB_H
|
||||||
|
|
||||||
result += " [.b]Keys - Global\n -----------------------------------------[/b]\n";
|
help << " " << fmtBold << "Keys - Global\n -----------------------------------------\n" << fmtBoldEnd;
|
||||||
result += DisplayKeys(Key.Stop) + "Stop\n";
|
help << DisplayKeys(Key.Stop) << "Stop\n";
|
||||||
result += DisplayKeys(Key.Pause) + "Pause\n";
|
help << DisplayKeys(Key.Pause) << "Pause\n";
|
||||||
result += DisplayKeys(Key.Next) + "Next track\n";
|
help << DisplayKeys(Key.Next) << "Next track\n";
|
||||||
result += DisplayKeys(Key.Prev) + "Previous track\n";
|
help << DisplayKeys(Key.Prev) << "Previous track\n";
|
||||||
result += DisplayKeys(Key.SeekForward) + "Seek forward\n";
|
help << DisplayKeys(Key.SeekForward) << "Seek forward\n";
|
||||||
result += DisplayKeys(Key.SeekBackward) + "Seek backward\n";
|
help << DisplayKeys(Key.SeekBackward) << "Seek backward\n";
|
||||||
result += DisplayKeys(Key.VolumeDown) + "Decrease volume\n";
|
help << DisplayKeys(Key.VolumeDown) << "Decrease volume\n";
|
||||||
result += DisplayKeys(Key.VolumeUp) + "Increase volume\n\n";
|
help << DisplayKeys(Key.VolumeUp) << "Increase volume\n\n";
|
||||||
|
|
||||||
result += DisplayKeys(Key.ToggleSpaceMode) + "Toggle space mode (select/add)\n";
|
help << DisplayKeys(Key.ToggleSpaceMode) << "Toggle space mode (select/add)\n";
|
||||||
result += DisplayKeys(Key.ToggleAddMode) + "Toggle add mode\n";
|
help << DisplayKeys(Key.ToggleAddMode) << "Toggle add mode\n";
|
||||||
result += DisplayKeys(Key.ReverseSelection) + "Reverse selection\n";
|
help << DisplayKeys(Key.ReverseSelection) << "Reverse selection\n";
|
||||||
result += DisplayKeys(Key.DeselectAll) + "Deselect all items\n";
|
help << DisplayKeys(Key.DeselectAll) << "Deselect all items\n";
|
||||||
result += DisplayKeys(Key.AddSelected) + "Add selected items to playlist/m3u file\n\n";
|
help << DisplayKeys(Key.AddSelected) << "Add selected items to playlist/m3u file\n\n";
|
||||||
|
|
||||||
result += DisplayKeys(Key.ToggleRepeat) + "Toggle repeat mode\n";
|
help << DisplayKeys(Key.ToggleRepeat) << "Toggle repeat mode\n";
|
||||||
result += DisplayKeys(Key.ToggleRepeatOne) + "Toggle \"repeat one\" mode\n";
|
help << DisplayKeys(Key.ToggleRepeatOne) << "Toggle \"repeat one\" mode\n";
|
||||||
result += DisplayKeys(Key.ToggleRandom) + "Toggle random mode\n";
|
help << DisplayKeys(Key.ToggleRandom) << "Toggle random mode\n";
|
||||||
result += DisplayKeys(Key.Shuffle) + "Shuffle playlist\n";
|
help << DisplayKeys(Key.Shuffle) << "Shuffle playlist\n";
|
||||||
result += DisplayKeys(Key.ToggleCrossfade) + "Toggle crossfade mode\n";
|
help << DisplayKeys(Key.ToggleCrossfade) << "Toggle crossfade mode\n";
|
||||||
result += DisplayKeys(Key.SetCrossfade) + "Set crossfade\n";
|
help << DisplayKeys(Key.SetCrossfade) << "Set crossfade\n";
|
||||||
result += DisplayKeys(Key.UpdateDB) + "Start a music database update\n\n";
|
help << DisplayKeys(Key.UpdateDB) << "Start a music database update\n\n";
|
||||||
|
|
||||||
result += DisplayKeys(Key.FindForward) + "Forward find\n";
|
help << DisplayKeys(Key.FindForward) << "Forward find\n";
|
||||||
result += DisplayKeys(Key.FindBackward) + "Backward find\n";
|
help << DisplayKeys(Key.FindBackward) << "Backward find\n";
|
||||||
result += DisplayKeys(Key.PrevFoundPosition) + "Go to previous found position\n";
|
help << DisplayKeys(Key.PrevFoundPosition) << "Go to previous found position\n";
|
||||||
result += DisplayKeys(Key.NextFoundPosition) + "Go to next found position\n";
|
help << DisplayKeys(Key.NextFoundPosition) << "Go to next found position\n";
|
||||||
result += DisplayKeys(Key.ToggleFindMode) + "Toggle find mode (normal/wrapped)\n";
|
help << DisplayKeys(Key.ToggleFindMode) << "Toggle find mode (normal/wrapped)\n";
|
||||||
result += DisplayKeys(Key.GoToContainingDir) + "Go to directory containing current item\n";
|
help << DisplayKeys(Key.GoToContainingDir) << "Go to directory containing current item\n";
|
||||||
# ifdef HAVE_TAGLIB_H
|
# ifdef HAVE_TAGLIB_H
|
||||||
result += DisplayKeys(Key.EditTags) + "Edit song's tags/playlist's name\n";
|
help << DisplayKeys(Key.EditTags) << "Edit song's tags/playlist's name\n";
|
||||||
# endif // HAVE_TAGLIB_H
|
# endif // HAVE_TAGLIB_H
|
||||||
result += DisplayKeys(Key.GoToPosition) + "Go to chosen position in current song\n";
|
help << DisplayKeys(Key.GoToPosition) << "Go to chosen position in current song\n";
|
||||||
result += DisplayKeys(Key.SongInfo) + "Show song's info\n";
|
help << DisplayKeys(Key.SongInfo) << "Show song's info\n";
|
||||||
# ifdef HAVE_CURL_CURL_H
|
# ifdef HAVE_CURL_CURL_H
|
||||||
result += DisplayKeys(Key.ArtistInfo) + "Show artist's info\n";
|
help << DisplayKeys(Key.ArtistInfo) << "Show artist's info\n";
|
||||||
# endif // HAVE_CURL_CURL_H
|
# endif // HAVE_CURL_CURL_H
|
||||||
result += DisplayKeys(Key.Lyrics) + "Show/hide song's lyrics\n\n";
|
help << DisplayKeys(Key.Lyrics) << "Show/hide song's lyrics\n\n";
|
||||||
|
|
||||||
result += DisplayKeys(Key.Quit) + "Quit\n\n\n";
|
help << DisplayKeys(Key.Quit) << "Quit\n\n\n";
|
||||||
|
|
||||||
|
|
||||||
result += " [.b]Keys - Playlist screen\n -----------------------------------------[/b]\n";
|
help << " " << fmtBold << "Keys - Playlist screen\n -----------------------------------------\n" << fmtBoldEnd;
|
||||||
result += DisplayKeys(Key.Enter) + "Play\n";
|
help << DisplayKeys(Key.Enter) << "Play\n";
|
||||||
result += DisplayKeys(Key.Delete) + "Delete item/selected items from playlist\n";
|
help << DisplayKeys(Key.Delete) << "Delete item/selected items from playlist\n";
|
||||||
result += DisplayKeys(Key.Clear) + "Clear playlist\n";
|
help << DisplayKeys(Key.Clear) << "Clear playlist\n";
|
||||||
result += DisplayKeys(Key.Crop) + "Clear playlist but hold currently playing/selected items\n";
|
help << DisplayKeys(Key.Crop) << "Clear playlist but hold currently playing/selected items\n";
|
||||||
result += DisplayKeys(Key.MvSongUp) + "Move item/group of items up\n";
|
help << DisplayKeys(Key.MvSongUp) << "Move item/group of items up\n";
|
||||||
result += DisplayKeys(Key.MvSongDown) + "Move item/group of items down\n";
|
help << DisplayKeys(Key.MvSongDown) << "Move item/group of items down\n";
|
||||||
result += DisplayKeys(Key.Add) + "Add url/file/directory to playlist\n";
|
help << DisplayKeys(Key.Add) << "Add url/file/directory to playlist\n";
|
||||||
result += DisplayKeys(Key.SavePlaylist) + "Save playlist\n";
|
help << DisplayKeys(Key.SavePlaylist) << "Save playlist\n";
|
||||||
result += DisplayKeys(Key.GoToNowPlaying) + "Go to currently playing position\n";
|
help << DisplayKeys(Key.GoToNowPlaying) << "Go to currently playing position\n";
|
||||||
result += DisplayKeys(Key.TogglePlaylistDisplayMode) + "Toggle playlist display mode\n";
|
help << DisplayKeys(Key.TogglePlaylistDisplayMode) << "Toggle playlist display mode\n";
|
||||||
result += DisplayKeys(Key.ToggleAutoCenter) + "Toggle auto center mode\n\n\n";
|
help << DisplayKeys(Key.ToggleAutoCenter) << "Toggle auto center mode\n\n\n";
|
||||||
|
|
||||||
result += " [.b]Keys - Browse screen\n -----------------------------------------[/b]\n";
|
help << " " << fmtBold << "Keys - Browse screen\n -----------------------------------------\n" << fmtBoldEnd;
|
||||||
result += DisplayKeys(Key.Enter) + "Enter directory/Add item to playlist and play\n";
|
help << DisplayKeys(Key.Enter) << "Enter directory/Add item to playlist and play\n";
|
||||||
result += DisplayKeys(Key.Space) + "Add item to playlist\n";
|
help << DisplayKeys(Key.Space) << "Add item to playlist\n";
|
||||||
if (Mpd->GetHostname()[0] == '/') // are we connected to unix socket?
|
if (Mpd->GetHostname()[0] == '/') // are we connected to unix socket?
|
||||||
result += DisplayKeys(Key.SwitchTagTypeList) + "Browse MPD database/local filesystem\n";
|
help << DisplayKeys(Key.SwitchTagTypeList) << "Browse MPD database/local filesystem\n";
|
||||||
result += DisplayKeys(Key.GoToParentDir) + "Go to parent directory\n";
|
help << DisplayKeys(Key.GoToParentDir) << "Go to parent directory\n";
|
||||||
result += DisplayKeys(Key.Delete) + "Delete playlist\n\n\n";
|
help << DisplayKeys(Key.Delete) << "Delete playlist\n\n\n";
|
||||||
|
|
||||||
|
|
||||||
result += " [.b]Keys - Search engine\n -----------------------------------------[/b]\n";
|
help << " " << fmtBold << "Keys - Search engine\n -----------------------------------------\n" << fmtBoldEnd;
|
||||||
result += DisplayKeys(Key.Enter) + "Add item to playlist and play/change option\n";
|
help << DisplayKeys(Key.Enter) << "Add item to playlist and play/change option\n";
|
||||||
result += DisplayKeys(Key.Space) + "Add item to playlist\n";
|
help << DisplayKeys(Key.Space) << "Add item to playlist\n";
|
||||||
result += DisplayKeys(Key.StartSearching) + "Start searching immediately\n\n\n";
|
help << DisplayKeys(Key.StartSearching) << "Start searching immediately\n\n\n";
|
||||||
|
|
||||||
|
|
||||||
result += " [.b]Keys - Media library\n -----------------------------------------[/b]\n";
|
help << " " << fmtBold << "Keys - Media library\n -----------------------------------------\n" << fmtBoldEnd;
|
||||||
result += DisplayKeys(&Key.VolumeDown[0], 1) + "Previous column\n";
|
help << DisplayKeys(&Key.VolumeDown[0], 1) << "Previous column\n";
|
||||||
result += DisplayKeys(&Key.VolumeUp[0], 1) + "Next column\n";
|
help << DisplayKeys(&Key.VolumeUp[0], 1) << "Next column\n";
|
||||||
result += DisplayKeys(Key.Enter) + "Add to playlist and play song/album/artist's songs\n";
|
help << DisplayKeys(Key.Enter) << "Add to playlist and play song/album/artist's songs\n";
|
||||||
result += DisplayKeys(Key.Space) + "Add to playlist song/album/artist's songs\n";
|
help << DisplayKeys(Key.Space) << "Add to playlist song/album/artist's songs\n";
|
||||||
result += DisplayKeys(Key.SwitchTagTypeList) + "Tag type list switcher (left column)\n\n\n";
|
help << DisplayKeys(Key.SwitchTagTypeList) << "Tag type list switcher (left column)\n\n\n";
|
||||||
|
|
||||||
result += " [.b]Keys - Playlist Editor\n -----------------------------------------[/b]\n";
|
help << " " << fmtBold << "Keys - Playlist Editorz\n -----------------------------------------\n" << fmtBoldEnd;
|
||||||
result += DisplayKeys(&Key.VolumeDown[0], 1) + "Previous column\n";
|
help << DisplayKeys(&Key.VolumeDown[0], 1) << "Previous column\n";
|
||||||
result += DisplayKeys(&Key.VolumeUp[0], 1) + "Next column\n";
|
help << DisplayKeys(&Key.VolumeUp[0], 1) << "Next column\n";
|
||||||
result += DisplayKeys(Key.Enter) + "Add item to playlist and play\n";
|
help << DisplayKeys(Key.Enter) << "Add item to playlist and play\n";
|
||||||
result += DisplayKeys(Key.Space) + "Add to playlist/select item\n";
|
help << DisplayKeys(Key.Space) << "Add to playlist/select item\n";
|
||||||
# ifndef HAVE_TAGLIB_H
|
# ifndef HAVE_TAGLIB_H
|
||||||
result += DisplayKeys(Key.EditTags) + "Edit playlist's name\n";
|
help << DisplayKeys(Key.EditTags) << "Edit playlist's name\n";
|
||||||
# endif // ! HAVE_TAGLIB_H
|
# endif // ! HAVE_TAGLIB_H
|
||||||
result += DisplayKeys(Key.MvSongUp) + "Move item/group of items up\n";
|
help << DisplayKeys(Key.MvSongUp) << "Move item/group of items up\n";
|
||||||
result += DisplayKeys(Key.MvSongDown) + "Move item/group of items down\n";
|
help << DisplayKeys(Key.MvSongDown) << "Move item/group of items down\n";
|
||||||
|
|
||||||
result += "\n\n [.b]Keys - Lyrics\n -----------------------------------------[/b]\n";
|
help << "\n\n " << fmtBold << "Keys - Lyrics\n -----------------------------------------\n" << fmtBoldEnd;
|
||||||
result += DisplayKeys(Key.Space) + "Switch for following lyrics of now playing song\n";
|
help << DisplayKeys(Key.Space) << "Switch for following lyrics of now playing song\n";
|
||||||
|
|
||||||
# ifdef HAVE_TAGLIB_H
|
# ifdef HAVE_TAGLIB_H
|
||||||
result += "\n\n [.b]Keys - Tag editor\n -----------------------------------------[/b]\n";
|
help << "\n\n " << fmtBold << "Keys - Tag editor\n -----------------------------------------\n" << fmtBoldEnd;
|
||||||
result += DisplayKeys(Key.Enter) + "Change tag/filename for one song (left column)\n";
|
help << DisplayKeys(Key.Enter) << "Change tag/filename for one song (left column)\n";
|
||||||
result += DisplayKeys(Key.Enter) + "Perform operation on all/selected songs (middle column)\n";
|
help << DisplayKeys(Key.Enter) << "Perform operation on all/selected songs (middle column)\n";
|
||||||
result += DisplayKeys(Key.Space) + "Switch to albums/directories view (left column)\n";
|
help << DisplayKeys(Key.Space) << "Switch to albums/directories view (left column)\n";
|
||||||
result += DisplayKeys(Key.Space) + "Select/deselect song (right column)\n";
|
help << DisplayKeys(Key.Space) << "Select/deselect song (right column)\n";
|
||||||
result += DisplayKeys(&Key.VolumeDown[0], 1) + "Previous column\n";
|
help << DisplayKeys(&Key.VolumeDown[0], 1) << "Previous column\n";
|
||||||
result += DisplayKeys(&Key.VolumeUp[0], 1) + "Next column\n";
|
help << DisplayKeys(&Key.VolumeUp[0], 1) << "Next column\n";
|
||||||
# endif // HAVE_TAGLIB_H
|
# endif // HAVE_TAGLIB_H
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
|
|
||||||
#include "ncmpcpp.h"
|
#include "ncmpcpp.h"
|
||||||
|
|
||||||
string GetKeybindings();
|
void GetKeybindings(Scrollpad &);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ bool ParseArgv(int argc, char **argv)
|
|||||||
# ifdef HAVE_TAGLIB_H
|
# ifdef HAVE_TAGLIB_H
|
||||||
<< " taglib"
|
<< " taglib"
|
||||||
# endif
|
# endif
|
||||||
# ifdef UTF8_ENABLED
|
# ifdef _UTF8
|
||||||
<< " unicode"
|
<< " unicode"
|
||||||
# endif
|
# endif
|
||||||
<< endl;
|
<< endl;
|
||||||
@@ -462,7 +462,7 @@ string DisplaySongInColumns(const Song &s, void *s_template, const Menu<Song> *)
|
|||||||
|
|
||||||
my_string_t result, v;
|
my_string_t result, v;
|
||||||
|
|
||||||
# ifdef UTF8_ENABLED
|
# ifdef _UTF8
|
||||||
const wstring space = L" ";
|
const wstring space = L" ";
|
||||||
const wstring open_col = L"[.";
|
const wstring open_col = L"[.";
|
||||||
const wstring close_col = L"]";
|
const wstring close_col = L"]";
|
||||||
@@ -534,7 +534,7 @@ string DisplaySongInColumns(const Song &s, void *s_template, const Menu<Song> *)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
v = TO_WSTRING(Window::OmitBBCodes(ss)).substr(0, width-1);
|
v = TO_WSTRING(ss.substr(0, width-1));
|
||||||
for (int i = v.length(); i < width; i++, v += space) { }
|
for (int i = v.length(); i < width; i++, v += space) { }
|
||||||
if (!color.empty())
|
if (!color.empty())
|
||||||
{
|
{
|
||||||
@@ -822,14 +822,13 @@ string DisplaySong(const Song &s, void *s_template, const Menu<Song> *menu)
|
|||||||
}
|
}
|
||||||
if (right && menu)
|
if (right && menu)
|
||||||
{
|
{
|
||||||
result = lresult + "[." + IntoStr(menu->GetWidth()-Window::RealLength(result)) + "]" + result;
|
result = lresult + "[." + IntoStr(menu->GetWidth()-result.length()) + "]" + result;
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
string GetInfo(Song &s)
|
void GetInfo(Song &s, Scrollpad &info)
|
||||||
{
|
{
|
||||||
string result;
|
|
||||||
# ifdef HAVE_TAGLIB_H
|
# ifdef HAVE_TAGLIB_H
|
||||||
string path_to_file;
|
string path_to_file;
|
||||||
if (s.IsFromDB())
|
if (s.IsFromDB())
|
||||||
@@ -840,28 +839,27 @@ string GetInfo(Song &s)
|
|||||||
s.SetComment(f.tag()->comment().to8Bit(UNICODE));
|
s.SetComment(f.tag()->comment().to8Bit(UNICODE));
|
||||||
# endif // HAVE_TAGLIB_H
|
# endif // HAVE_TAGLIB_H
|
||||||
|
|
||||||
result = "[.b][." + Config.color1 + "]Filename: [/" + Config.color1 + "][." + Config.color2 + "][/b]" + s.GetName() + "[/" + Config.color2 + "]\n";
|
info << fmtBold << clWhite << "Filename: " << fmtBoldEnd << clGreen << s.GetName() << "\n" << clEnd;
|
||||||
result += "[.b][." + Config.color1 + "]Directory: [/" + Config.color1 + "][." + Config.color2 + "][/b]" + s.GetDirectory() + "[/" + Config.color2 + "]\n\n";
|
info << fmtBold << "Directory: " << fmtBoldEnd << clGreen << s.GetDirectory() + "\n\n" << clEnd;
|
||||||
result += "[.b][." + Config.color1 + "]Length: [/" + Config.color1 + "][." + Config.color2 + "][/b]" + s.GetLength() + "[/" + Config.color2 + "]\n";
|
info << fmtBold << "Length: " << fmtBoldEnd << clGreen << s.GetLength() + "\n" << clEnd;
|
||||||
# ifdef HAVE_TAGLIB_H
|
# ifdef HAVE_TAGLIB_H
|
||||||
if (!f.isNull())
|
if (!f.isNull())
|
||||||
{
|
{
|
||||||
result += "[.b][." + Config.color1 + "]Bitrate: [/" + Config.color1 + "][." + Config.color2 + "][/b]" + IntoStr(f.audioProperties()->bitrate()) + " kbps[/" + Config.color2 + "]\n";
|
info << fmtBold << "Bitrate: " << fmtBoldEnd << clGreen << f.audioProperties()->bitrate() << " kbps\n" << clEnd;
|
||||||
result += "[.b][." + Config.color1 + "]Sample rate: [/" + Config.color1 + "][." + Config.color2 + "][/b]" + IntoStr(f.audioProperties()->sampleRate()) + " Hz[/" + Config.color2 + "]\n";
|
info << fmtBold << "Sample rate: " << fmtBoldEnd << clGreen << f.audioProperties()->sampleRate() << " Hz\n" << clEnd;
|
||||||
result += "[.b][." + Config.color1 + "]Channels: [/" + Config.color1 + "][." + Config.color2 + "][/b]" + string(f.audioProperties()->channels() == 1 ? "Mono" : "Stereo") + "[/" + Config.color2 + "]\n";
|
info << fmtBold << "Channels: " << fmtBoldEnd << clGreen << (f.audioProperties()->channels() == 1 ? "Mono" : "Stereo") << "\n" << clDefault;
|
||||||
}
|
}
|
||||||
# endif // HAVE_TAGLIB_H
|
# endif // HAVE_TAGLIB_H
|
||||||
result += "\n[.b]Title:[/b] " + s.GetTitle();
|
info << fmtBold << "\nTitle: " << fmtBoldEnd << s.GetTitle();
|
||||||
result += "\n[.b]Artist:[/b] " + s.GetArtist();
|
info << fmtBold << "\nArtist: " << fmtBoldEnd << s.GetArtist();
|
||||||
result += "\n[.b]Album:[/b] " + s.GetAlbum();
|
info << fmtBold << "\nAlbum: " << fmtBoldEnd << s.GetAlbum();
|
||||||
result += "\n[.b]Year:[/b] " + s.GetYear();
|
info << fmtBold << "\nYear: " << fmtBoldEnd << s.GetYear();
|
||||||
result += "\n[.b]Track:[/b] " + s.GetTrack();
|
info << fmtBold << "\nTrack: " << fmtBoldEnd << s.GetTrack();
|
||||||
result += "\n[.b]Genre:[/b] " + s.GetGenre();
|
info << fmtBold << "\nGenre: " << fmtBoldEnd << s.GetGenre();
|
||||||
result += "\n[.b]Composer:[/b] " + s.GetComposer();
|
info << fmtBold << "\nComposer: " << fmtBoldEnd << s.GetComposer();
|
||||||
result += "\n[.b]Performer:[/b] " + s.GetPerformer();
|
info << fmtBold << "\nPerformer: " << fmtBoldEnd << s.GetPerformer();
|
||||||
result += "\n[.b]Disc:[/b] " + s.GetDisc();
|
info << fmtBold << "\nDisc: " << fmtBoldEnd << s.GetDisc();
|
||||||
result += "\n[.b]Comment:[/b] " + s.GetComment();
|
info << fmtBold << "\nComment: " << fmtBoldEnd << s.GetComment();
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShowMessage(const char *format, ...)
|
void ShowMessage(const char *format, ...)
|
||||||
@@ -877,9 +875,9 @@ void ShowMessage(const char *format, ...)
|
|||||||
wFooter->Bold(0);
|
wFooter->Bold(0);
|
||||||
va_list list;
|
va_list list;
|
||||||
va_start(list, format);
|
va_start(list, format);
|
||||||
wmove(wFooter->RawWin(), Config.statusbar_visibility, 0);
|
wmove(wFooter->Raw(), Config.statusbar_visibility, 0);
|
||||||
vw_printw(wFooter->RawWin(), format, list);
|
vw_printw(wFooter->Raw(), format, list);
|
||||||
wclrtoeol(wFooter->RawWin());
|
wclrtoeol(wFooter->Raw());
|
||||||
va_end(list);
|
va_end(list);
|
||||||
wFooter->Bold(1);
|
wFooter->Bold(1);
|
||||||
wFooter->Refresh();
|
wFooter->Refresh();
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ string DisplayStringPair(const StringPair &, void *, const Menu<StringPair> *);
|
|||||||
string DisplayColumns(string);
|
string DisplayColumns(string);
|
||||||
string DisplaySongInColumns(const Song &, void *, const Menu<Song> *);
|
string DisplaySongInColumns(const Song &, void *, const Menu<Song> *);
|
||||||
string DisplaySong(const Song &, void * = &Config.song_list_format, const Menu<Song> * = NULL);
|
string DisplaySong(const Song &, void * = &Config.song_list_format, const Menu<Song> * = NULL);
|
||||||
string GetInfo(Song &);
|
void GetInfo(Song &, Scrollpad &);
|
||||||
void ShowMessage(const char *, ...);
|
void ShowMessage(const char *, ...);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
189
src/lyrics.cpp
189
src/lyrics.cpp
@@ -26,13 +26,16 @@
|
|||||||
#include "settings.h"
|
#include "settings.h"
|
||||||
#include "song.h"
|
#include "song.h"
|
||||||
|
|
||||||
|
extern Scrollpad *sLyrics;
|
||||||
|
extern Scrollpad *sInfo;
|
||||||
|
|
||||||
const string artists_folder = home_folder + "/" + ".ncmpcpp/artists";
|
const string artists_folder = home_folder + "/" + ".ncmpcpp/artists";
|
||||||
const string lyrics_folder = home_folder + "/" + ".lyrics";
|
const string lyrics_folder = home_folder + "/" + ".lyrics";
|
||||||
|
|
||||||
#ifdef HAVE_CURL_CURL_H
|
#ifdef HAVE_CURL_CURL_H
|
||||||
|
extern pthread_t lyrics_downloader;
|
||||||
|
extern pthread_t artist_info_downloader;
|
||||||
pthread_mutex_t curl = PTHREAD_MUTEX_INITIALIZER;
|
pthread_mutex_t curl = PTHREAD_MUTEX_INITIALIZER;
|
||||||
bool artist_info_ready = 0;
|
|
||||||
bool lyrics_ready = 0;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
namespace
|
namespace
|
||||||
@@ -74,18 +77,24 @@ void * GetArtistInfo(void *ptr)
|
|||||||
const string fullpath = artists_folder + "/" + filename;
|
const string fullpath = artists_folder + "/" + filename;
|
||||||
mkdir(artists_folder.c_str(), 0755);
|
mkdir(artists_folder.c_str(), 0755);
|
||||||
|
|
||||||
string *result = new string();
|
string result;
|
||||||
std::ifstream input(fullpath.c_str());
|
std::ifstream input(fullpath.c_str());
|
||||||
|
|
||||||
if (input.is_open())
|
if (input.is_open())
|
||||||
{
|
{
|
||||||
|
bool first = 1;
|
||||||
string line;
|
string line;
|
||||||
while (getline(input, line))
|
while (getline(input, line))
|
||||||
*result += line + "\n";
|
{
|
||||||
|
if (!first)
|
||||||
|
*sInfo << "\n";
|
||||||
|
*sInfo << line;
|
||||||
|
first = 0;
|
||||||
|
}
|
||||||
input.close();
|
input.close();
|
||||||
*result = result->substr(0, result->length()-1);
|
sInfo->Flush();
|
||||||
artist_info_ready = 1;
|
artist_info_downloader = 0;
|
||||||
pthread_exit(result);
|
pthread_exit(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (string::iterator it = artist.begin(); it != artist.end(); it++)
|
for (string::iterator it = artist.begin(); it != artist.end(); it++)
|
||||||
@@ -100,7 +109,7 @@ void * GetArtistInfo(void *ptr)
|
|||||||
CURL *info = curl_easy_init();
|
CURL *info = curl_easy_init();
|
||||||
curl_easy_setopt(info, CURLOPT_URL, url.c_str());
|
curl_easy_setopt(info, CURLOPT_URL, url.c_str());
|
||||||
curl_easy_setopt(info, CURLOPT_WRITEFUNCTION, write_data);
|
curl_easy_setopt(info, CURLOPT_WRITEFUNCTION, write_data);
|
||||||
curl_easy_setopt(info, CURLOPT_WRITEDATA, result);
|
curl_easy_setopt(info, CURLOPT_WRITEDATA, &result);
|
||||||
curl_easy_setopt(info, CURLOPT_CONNECTTIMEOUT, 10);
|
curl_easy_setopt(info, CURLOPT_CONNECTTIMEOUT, 10);
|
||||||
code = curl_easy_perform(info);
|
code = curl_easy_perform(info);
|
||||||
curl_easy_cleanup(info);
|
curl_easy_cleanup(info);
|
||||||
@@ -108,131 +117,137 @@ void * GetArtistInfo(void *ptr)
|
|||||||
|
|
||||||
if (code != CURLE_OK)
|
if (code != CURLE_OK)
|
||||||
{
|
{
|
||||||
*result = "Error while fetching artist's info: " + string(curl_easy_strerror(code));
|
*sInfo << "Error while fetching artist's info: " << curl_easy_strerror(code);
|
||||||
artist_info_ready = 1;
|
sInfo->Flush();
|
||||||
pthread_exit(result);
|
artist_info_downloader = 0;
|
||||||
|
pthread_exit(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t a, b;
|
size_t a, b;
|
||||||
bool erase = 0;
|
bool erase = 0;
|
||||||
bool save = 1;
|
bool save = 1;
|
||||||
|
|
||||||
a = result->find("status=\"failed\"");
|
a = result.find("status=\"failed\"");
|
||||||
|
|
||||||
if (a != string::npos)
|
if (a != string::npos)
|
||||||
{
|
{
|
||||||
EscapeHtml(*result);
|
EscapeHtml(result);
|
||||||
*result = "Last.fm returned an error message: " + *result;
|
*sInfo << "Last.fm returned an error message: " << result;
|
||||||
artist_info_ready = 1;
|
sInfo->Flush();
|
||||||
pthread_exit(result);
|
artist_info_downloader = 0;
|
||||||
|
pthread_exit(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
vector<string> similar;
|
vector<string> similar;
|
||||||
for (size_t i = result->find("<name>"); i != string::npos; i = result->find("<name>"))
|
for (size_t i = result.find("<name>"); i != string::npos; i = result.find("<name>"))
|
||||||
{
|
{
|
||||||
(*result)[i] = '.';
|
result[i] = '.';
|
||||||
size_t j = result->find("</name>");
|
size_t j = result.find("</name>");
|
||||||
(*result)[j] = '.';
|
result[j] = '.';
|
||||||
i += 6;
|
i += 6;
|
||||||
similar.push_back(result->substr(i, j-i));
|
similar.push_back(result.substr(i, j-i));
|
||||||
EscapeHtml(similar.back());
|
EscapeHtml(similar.back());
|
||||||
}
|
}
|
||||||
vector<string> urls;
|
vector<string> urls;
|
||||||
for (size_t i = result->find("<url>"); i != string::npos; i = result->find("<url>"))
|
for (size_t i = result.find("<url>"); i != string::npos; i = result.find("<url>"))
|
||||||
{
|
{
|
||||||
(*result)[i] = '.';
|
result[i] = '.';
|
||||||
size_t j = result->find("</url>");
|
size_t j = result.find("</url>");
|
||||||
(*result)[j] = '.';
|
result[j] = '.';
|
||||||
i += 5;
|
i += 5;
|
||||||
urls.push_back(result->substr(i, j-i));
|
urls.push_back(result.substr(i, j-i));
|
||||||
}
|
}
|
||||||
|
|
||||||
a = result->find("<content>")+9;
|
a = result.find("<content>")+9;
|
||||||
b = result->find("</content>");
|
b = result.find("</content>");
|
||||||
|
|
||||||
if (a == b)
|
if (a == b)
|
||||||
{
|
{
|
||||||
*result = "No description available for this artist.";
|
result = "No description available for this artist.";
|
||||||
save = 0;
|
save = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
a += 9; // for <![CDATA[
|
a += 9; // for <![CDATA[
|
||||||
b -= 3; // for ]]>
|
b -= 3; // for ]]>
|
||||||
*result = result->substr(a, b-a);
|
result = result.substr(a, b-a);
|
||||||
}
|
}
|
||||||
|
|
||||||
EscapeHtml(*result);
|
EscapeHtml(result);
|
||||||
for (size_t i = 0; i < result->length(); i++)
|
for (size_t i = 0; i < result.length(); i++)
|
||||||
{
|
{
|
||||||
if (erase)
|
if (erase)
|
||||||
{
|
{
|
||||||
result->erase(result->begin()+i);
|
result.erase(result.begin()+i);
|
||||||
erase = 0;
|
erase = 0;
|
||||||
}
|
}
|
||||||
if ((*result)[i] == 13)
|
if (result[i] == 13)
|
||||||
{
|
{
|
||||||
(*result)[i] = '\n';
|
result[i] = '\n';
|
||||||
erase = 1;
|
erase = 1;
|
||||||
}
|
}
|
||||||
else if ((*result)[i] == '\t')
|
else if (result[i] == '\t')
|
||||||
(*result)[i] = ' ';
|
result[i] = ' ';
|
||||||
}
|
}
|
||||||
|
|
||||||
int i = result->length();
|
int i = result.length();
|
||||||
if (!isgraph((*result)[i-1]))
|
if (!isgraph(result[i-1]))
|
||||||
{
|
{
|
||||||
while (!isgraph((*result)[--i])) { }
|
while (!isgraph(result[--i])) { }
|
||||||
*result = result->substr(0, i+1);
|
result = result.substr(0, i+1);
|
||||||
}
|
}
|
||||||
|
|
||||||
*result += "\n\n[.b]Similar artists:[/b]\n";
|
*sInfo << result;
|
||||||
for (size_t i = 1; i < similar.size(); i++)
|
|
||||||
*result += "\n [." + Config.color2 + "]*[/" + Config.color2 + "] " + similar[i] + " (" + urls[i] + ")";
|
|
||||||
|
|
||||||
*result += "\n\n" + urls.front();
|
*sInfo << fmtBold << "\n\nSimilar artists:\n" << fmtBoldEnd;
|
||||||
|
for (size_t i = 1; i < similar.size(); i++)
|
||||||
|
*sInfo << "\n" << clGreen << " * " << clEnd << similar[i] << " (" << urls[i] << ")";
|
||||||
|
|
||||||
|
*sInfo << "\n\n" << urls.front();
|
||||||
|
|
||||||
if (save)
|
if (save)
|
||||||
{
|
{
|
||||||
std::ofstream output(fullpath.c_str());
|
std::ofstream output(fullpath.c_str());
|
||||||
if (output.is_open())
|
if (output.is_open())
|
||||||
{
|
{
|
||||||
output << *result;
|
output << TO_STRING(sInfo->Content());
|
||||||
output.close();
|
output.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
sInfo->Flush();
|
||||||
artist_info_ready = 1;
|
artist_info_downloader = 0;
|
||||||
pthread_exit(result);
|
pthread_exit(NULL);
|
||||||
}
|
}
|
||||||
#endif // HAVE_CURL_CURL_H
|
#endif // HAVE_CURL_CURL_H
|
||||||
|
|
||||||
void * GetLyrics(void *song)
|
void *GetLyrics(void *song)
|
||||||
{
|
{
|
||||||
string artist = static_cast<Song *>(song)->GetArtist();
|
string artist = static_cast<Song *>(song)->GetArtist();
|
||||||
string title = static_cast<Song *>(song)->GetTitle();
|
string title = static_cast<Song *>(song)->GetTitle();
|
||||||
|
|
||||||
const string filename = artist + " - " + title + ".txt";
|
string filename = artist + " - " + title + ".txt";
|
||||||
const string fullpath = lyrics_folder + "/" + filename;
|
const string fullpath = lyrics_folder + "/" + filename;
|
||||||
mkdir(lyrics_folder.c_str(), 0755);
|
mkdir(lyrics_folder.c_str(), 0755);
|
||||||
|
|
||||||
string *result = new string();
|
|
||||||
|
|
||||||
std::ifstream input(fullpath.c_str());
|
std::ifstream input(fullpath.c_str());
|
||||||
|
|
||||||
if (input.is_open())
|
if (input.is_open())
|
||||||
{
|
{
|
||||||
|
bool first = 1;
|
||||||
string line;
|
string line;
|
||||||
while (getline(input, line))
|
while (getline(input, line))
|
||||||
*result += line + "\n";
|
{
|
||||||
input.close();
|
if (!first)
|
||||||
*result = result->substr(0, result->length()-1);
|
*sLyrics << "\n";
|
||||||
|
*sLyrics << line;
|
||||||
|
first = 0;
|
||||||
|
}
|
||||||
# ifdef HAVE_CURL_CURL_H
|
# ifdef HAVE_CURL_CURL_H
|
||||||
lyrics_ready = 1;
|
sLyrics->Flush();
|
||||||
pthread_exit(result);
|
lyrics_downloader = 0;
|
||||||
|
pthread_exit(NULL);
|
||||||
# endif
|
# endif
|
||||||
}
|
}
|
||||||
|
|
||||||
# ifdef HAVE_CURL_CURL_H
|
# ifdef HAVE_CURL_CURL_H
|
||||||
for (string::iterator it = artist.begin(); it != artist.end(); it++)
|
for (string::iterator it = artist.begin(); it != artist.end(); it++)
|
||||||
if (*it == ' ')
|
if (*it == ' ')
|
||||||
@@ -244,13 +259,19 @@ void * GetLyrics(void *song)
|
|||||||
|
|
||||||
CURLcode code;
|
CURLcode code;
|
||||||
|
|
||||||
string url = "http://lyricwiki.org/api.php?artist=" + artist + "&song=" + title + "&fmt=xml";
|
string result;
|
||||||
|
|
||||||
|
string url = "http://lyricwiki.org/api.php?artist=";
|
||||||
|
url += artist;
|
||||||
|
url += "&song=";
|
||||||
|
url += title;
|
||||||
|
url += "&fmt=xml";
|
||||||
|
|
||||||
pthread_mutex_lock(&curl);
|
pthread_mutex_lock(&curl);
|
||||||
CURL *lyrics = curl_easy_init();
|
CURL *lyrics = curl_easy_init();
|
||||||
curl_easy_setopt(lyrics, CURLOPT_URL, url.c_str());
|
curl_easy_setopt(lyrics, CURLOPT_URL, url.c_str());
|
||||||
curl_easy_setopt(lyrics, CURLOPT_WRITEFUNCTION, write_data);
|
curl_easy_setopt(lyrics, CURLOPT_WRITEFUNCTION, write_data);
|
||||||
curl_easy_setopt(lyrics, CURLOPT_WRITEDATA, result);
|
curl_easy_setopt(lyrics, CURLOPT_WRITEDATA, &result);
|
||||||
curl_easy_setopt(lyrics, CURLOPT_CONNECTTIMEOUT, 10);
|
curl_easy_setopt(lyrics, CURLOPT_CONNECTTIMEOUT, 10);
|
||||||
code = curl_easy_perform(lyrics);
|
code = curl_easy_perform(lyrics);
|
||||||
curl_easy_cleanup(lyrics);
|
curl_easy_cleanup(lyrics);
|
||||||
@@ -258,43 +279,49 @@ void * GetLyrics(void *song)
|
|||||||
|
|
||||||
if (code != CURLE_OK)
|
if (code != CURLE_OK)
|
||||||
{
|
{
|
||||||
*result = "Error while fetching lyrics: " + string(curl_easy_strerror(code));
|
*sLyrics << "Error while fetching lyrics: " << curl_easy_strerror(code);
|
||||||
lyrics_ready = 1;
|
sLyrics->Flush();
|
||||||
pthread_exit(result);
|
lyrics_downloader = 0;
|
||||||
|
pthread_exit(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
int a, b;
|
int a, b;
|
||||||
a = result->find("<lyrics>")+8;
|
a = result.find("<lyrics>")+8;
|
||||||
b = result->find("</lyrics>");
|
b = result.find("</lyrics>");
|
||||||
|
|
||||||
*result = result->substr(a, b-a);
|
result = result.substr(a, b-a);
|
||||||
|
|
||||||
if (*result == "Not found")
|
if (result == "Not found")
|
||||||
{
|
{
|
||||||
lyrics_ready = 1;
|
*sLyrics << result;
|
||||||
pthread_exit(result);
|
sLyrics->Flush();
|
||||||
|
lyrics_downloader = 0;
|
||||||
|
pthread_exit(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (size_t i = result->find("<"); i != string::npos; i = result->find("<"))
|
for (size_t i = result.find("<"); i != string::npos; i = result.find("<"))
|
||||||
result->replace(i, 4, "<");
|
result.replace(i, 4, "<");
|
||||||
for (size_t i = result->find(">"); i != string::npos; i = result->find(">"))
|
for (size_t i = result.find(">"); i != string::npos; i = result.find(">"))
|
||||||
result->replace(i, 4, ">");
|
result.replace(i, 4, ">");
|
||||||
|
|
||||||
EscapeHtml(*result);
|
EscapeHtml(result);
|
||||||
|
|
||||||
|
*sLyrics << result;
|
||||||
|
|
||||||
std::ofstream output(fullpath.c_str());
|
std::ofstream output(fullpath.c_str());
|
||||||
if (output.is_open())
|
if (output.is_open())
|
||||||
{
|
{
|
||||||
output << *result;
|
output << result;
|
||||||
output.close();
|
output.close();
|
||||||
}
|
}
|
||||||
|
sLyrics->Flush();
|
||||||
lyrics_ready = 1;
|
lyrics_downloader = 0;
|
||||||
pthread_exit(result);
|
pthread_exit(NULL);
|
||||||
# else
|
# else
|
||||||
else
|
else
|
||||||
*result = "Local lyrics not found. As ncmpcpp has been compiled without curl support, you can put appropriate lyrics into ~/.lyrics directory (file syntax is \"ARTIST - TITLE.txt\") or recompile ncmpcpp with curl support.";
|
*sLyrics << "Local lyrics not found. As ncmpcpp has been compiled without curl support, you can put appropriate lyrics into ~/.lyrics directory (file syntax is \"ARTIST - TITLE.txt\") or recompile ncmpcpp with curl support.";
|
||||||
return result;
|
sLyrics->Flush();
|
||||||
|
return NULL;
|
||||||
# endif
|
# endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
33
src/menu.h
33
src/menu.h
@@ -67,8 +67,8 @@ class Menu : public Window
|
|||||||
void InsertSeparator(int where) { Insert(where, T(), 0, 1, 1); }
|
void InsertSeparator(int where) { Insert(where, T(), 0, 1, 1); }
|
||||||
virtual string GetOption(int i = -1) const;
|
virtual string GetOption(int i = -1) const;
|
||||||
|
|
||||||
virtual void Refresh(bool redraw_whole_window = 0);
|
virtual void Refresh();
|
||||||
virtual void Go(Where);
|
virtual void Scroll(Where);
|
||||||
virtual void Highlight(int);
|
virtual void Highlight(int);
|
||||||
virtual void Reset();
|
virtual void Reset();
|
||||||
virtual void Clear(bool clear_screen = 1);
|
virtual void Clear(bool clear_screen = 1);
|
||||||
@@ -90,8 +90,8 @@ class Menu : public Window
|
|||||||
bool Empty() const { return itsOptions.empty(); }
|
bool Empty() const { return itsOptions.empty(); }
|
||||||
bool IsBold(int = -1) const;
|
bool IsBold(int = -1) const;
|
||||||
virtual bool IsStatic(int = -1) const;
|
virtual bool IsStatic(int = -1) const;
|
||||||
virtual Window * Clone() const { return new Menu(*this); }
|
virtual Menu<T> *Clone() const { return new Menu<T>(*this); }
|
||||||
virtual Window * EmptyClone() const;
|
virtual Menu<T> *EmptyClone() const;
|
||||||
|
|
||||||
T & Back() { return itsOptions.back()->item; }
|
T & Back() { return itsOptions.back()->item; }
|
||||||
const T & Back() const { return itsOptions.back()->item; }
|
const T & Back() const { return itsOptions.back()->item; }
|
||||||
@@ -317,10 +317,11 @@ void Menu<T>::redraw_screen()
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
void Menu<T>::Refresh(bool redraw_whole_window)
|
void Menu<T>::Refresh()
|
||||||
{
|
{
|
||||||
|
bool redraw_whole_window = 1;
|
||||||
if (!itsOptions.empty() && is_static())
|
if (!itsOptions.empty() && is_static())
|
||||||
itsHighlight == 0 ? Go(wDown) : Go(wUp);
|
itsHighlight == 0 ? Scroll(wDown) : Scroll(wUp);
|
||||||
|
|
||||||
int MaxBeginning = itsOptions.size() < itsHeight ? 0 : itsOptions.size()-itsHeight;
|
int MaxBeginning = itsOptions.size() < itsHeight ? 0 : itsOptions.size()-itsHeight;
|
||||||
if (itsBeginning > MaxBeginning)
|
if (itsBeginning > MaxBeginning)
|
||||||
@@ -376,7 +377,7 @@ void Menu<T>::Refresh(bool redraw_whole_window)
|
|||||||
if (itsOptions[*it]->selected)
|
if (itsOptions[*it]->selected)
|
||||||
option += itsSelectedSuffix;
|
option += itsSelectedSuffix;
|
||||||
|
|
||||||
int strlength = itsOptions[*it]->location != lLeft && BBEnabled ? Window::RealLength(option) : option.length();
|
int strlength = option.length();
|
||||||
|
|
||||||
if (strlength)
|
if (strlength)
|
||||||
{
|
{
|
||||||
@@ -429,7 +430,7 @@ void Menu<T>::Refresh(bool redraw_whole_window)
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
void Menu<T>::Go(Where where)
|
void Menu<T>::Scroll(Where where)
|
||||||
{
|
{
|
||||||
if (Empty())
|
if (Empty())
|
||||||
return;
|
return;
|
||||||
@@ -459,7 +460,7 @@ void Menu<T>::Go(Where where)
|
|||||||
}
|
}
|
||||||
if (is_static())
|
if (is_static())
|
||||||
{
|
{
|
||||||
itsHighlight == 0 ? Go(wDown) : Go(wUp);
|
itsHighlight == 0 ? Scroll(wDown) : Scroll(wUp);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -481,7 +482,7 @@ void Menu<T>::Go(Where where)
|
|||||||
}
|
}
|
||||||
if (is_static())
|
if (is_static())
|
||||||
{
|
{
|
||||||
itsHighlight == MaxHighlight ? Go(wUp) : Go(wDown);
|
itsHighlight == MaxHighlight ? Scroll(wUp) : Scroll(wDown);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -497,7 +498,7 @@ void Menu<T>::Go(Where where)
|
|||||||
}
|
}
|
||||||
if (is_static())
|
if (is_static())
|
||||||
{
|
{
|
||||||
itsHighlight == 0 ? Go(wDown) : Go(wUp);
|
itsHighlight == 0 ? Scroll(wDown) : Scroll(wUp);
|
||||||
}
|
}
|
||||||
redraw_screen();
|
redraw_screen();
|
||||||
break;
|
break;
|
||||||
@@ -514,7 +515,7 @@ void Menu<T>::Go(Where where)
|
|||||||
}
|
}
|
||||||
if (is_static())
|
if (is_static())
|
||||||
{
|
{
|
||||||
itsHighlight == MaxHighlight ? Go(wUp) : Go(wDown);
|
itsHighlight == MaxHighlight ? Scroll(wUp) : Scroll(wDown);
|
||||||
}
|
}
|
||||||
redraw_screen();
|
redraw_screen();
|
||||||
break;
|
break;
|
||||||
@@ -525,7 +526,7 @@ void Menu<T>::Go(Where where)
|
|||||||
itsBeginning = 0;
|
itsBeginning = 0;
|
||||||
if (is_static())
|
if (is_static())
|
||||||
{
|
{
|
||||||
itsHighlight == 0 ? Go(wDown) : Go(wUp);
|
itsHighlight == 0 ? Scroll(wDown) : Scroll(wUp);
|
||||||
}
|
}
|
||||||
redraw_screen();
|
redraw_screen();
|
||||||
break;
|
break;
|
||||||
@@ -536,7 +537,7 @@ void Menu<T>::Go(Where where)
|
|||||||
itsBeginning = MaxBeginning;
|
itsBeginning = MaxBeginning;
|
||||||
if (is_static())
|
if (is_static())
|
||||||
{
|
{
|
||||||
itsHighlight == MaxHighlight ? Go(wUp) : Go(wDown);
|
itsHighlight == MaxHighlight ? Scroll(wUp) : Scroll(wDown);
|
||||||
}
|
}
|
||||||
redraw_screen();
|
redraw_screen();
|
||||||
break;
|
break;
|
||||||
@@ -702,9 +703,9 @@ bool Menu<T>::IsStatic(int option) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
Window * Menu<T>::EmptyClone() const
|
Menu<T> *Menu<T>::EmptyClone() const
|
||||||
{
|
{
|
||||||
return new Menu(GetStartX(), GetStartY(), GetWidth(), GetHeight(), itsTitle, itsBaseColor, itsBorder);
|
return new Menu<T>(GetStartX(), GetStartY(), GetWidth(), GetHeight(), itsTitle, itsBaseColor, itsBorder);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
|
|||||||
159
src/ncmpcpp.cpp
159
src/ncmpcpp.cpp
@@ -47,30 +47,30 @@
|
|||||||
|
|
||||||
#define REFRESH_MEDIA_LIBRARY_SCREEN \
|
#define REFRESH_MEDIA_LIBRARY_SCREEN \
|
||||||
do { \
|
do { \
|
||||||
mLibArtists->Display(redraw_screen); \
|
mLibArtists->Display(); \
|
||||||
mvvline(main_start_y, middle_col_startx-1, 0, main_height); \
|
mvvline(main_start_y, middle_col_startx-1, 0, main_height); \
|
||||||
mLibAlbums->Display(redraw_screen); \
|
mLibAlbums->Display(); \
|
||||||
mvvline(main_start_y, right_col_startx-1, 0, main_height); \
|
mvvline(main_start_y, right_col_startx-1, 0, main_height); \
|
||||||
mLibSongs->Display(redraw_screen); \
|
mLibSongs->Display(); \
|
||||||
if (mLibAlbums->Empty()) \
|
if (mLibAlbums->Empty()) \
|
||||||
mLibAlbums->WriteXY(0, 0, "No albums found."); \
|
mLibAlbums->WriteXY(0, 0, "No albums found."); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define REFRESH_PLAYLIST_EDITOR_SCREEN \
|
#define REFRESH_PLAYLIST_EDITOR_SCREEN \
|
||||||
do { \
|
do { \
|
||||||
mPlaylistList->Display(redraw_screen); \
|
mPlaylistList->Display(); \
|
||||||
mvvline(main_start_y, middle_col_startx-1, 0, main_height); \
|
mvvline(main_start_y, middle_col_startx-1, 0, main_height); \
|
||||||
mPlaylistEditor->Display(redraw_screen); \
|
mPlaylistEditor->Display(); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#ifdef HAVE_TAGLIB_H
|
#ifdef HAVE_TAGLIB_H
|
||||||
# define REFRESH_TAG_EDITOR_SCREEN \
|
# define REFRESH_TAG_EDITOR_SCREEN \
|
||||||
do { \
|
do { \
|
||||||
mEditorLeftCol->Display(redraw_screen); \
|
mEditorLeftCol->Display(); \
|
||||||
mvvline(main_start_y, middle_col_startx-1, 0, main_height); \
|
mvvline(main_start_y, middle_col_startx-1, 0, main_height); \
|
||||||
mEditorTagTypes->Display(redraw_screen); \
|
mEditorTagTypes->Display(); \
|
||||||
mvvline(main_start_y, right_col_startx-1, 0, main_height); \
|
mvvline(main_start_y, right_col_startx-1, 0, main_height); \
|
||||||
mEditorTags->Display(redraw_screen); \
|
mEditorTags->Display(); \
|
||||||
} while (0)
|
} while (0)
|
||||||
#endif // HAVE_TAGLIB_H
|
#endif // HAVE_TAGLIB_H
|
||||||
|
|
||||||
@@ -138,8 +138,6 @@ NcmpcppScreen prev_screen;
|
|||||||
#ifdef HAVE_CURL_CURL_H
|
#ifdef HAVE_CURL_CURL_H
|
||||||
pthread_t lyrics_downloader;
|
pthread_t lyrics_downloader;
|
||||||
pthread_t artist_info_downloader;
|
pthread_t artist_info_downloader;
|
||||||
extern bool artist_info_ready;
|
|
||||||
extern bool lyrics_ready;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
bool dont_change_now_playing = 0;
|
bool dont_change_now_playing = 0;
|
||||||
@@ -202,14 +200,10 @@ int main(int argc, char *argv[])
|
|||||||
if (!ConnectToMPD())
|
if (!ConnectToMPD())
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
setlocale(LC_ALL, "");
|
InitScreen();
|
||||||
initscr();
|
|
||||||
noecho();
|
|
||||||
cbreak();
|
|
||||||
curs_set(0);
|
|
||||||
|
|
||||||
if (Config.colors_enabled)
|
//if (Config.colors_enabled)
|
||||||
Window::EnableColors();
|
// Window::EnableColors();
|
||||||
|
|
||||||
int main_start_y = 2;
|
int main_start_y = 2;
|
||||||
int main_height = LINES-4;
|
int main_height = LINES-4;
|
||||||
@@ -223,7 +217,6 @@ int main(int argc, char *argv[])
|
|||||||
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 ? DisplayColumns(Config.song_columns_list_format) : "", Config.main_color, brNone);
|
||||||
mPlaylist->AutoRefresh(0);
|
|
||||||
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);
|
||||||
@@ -311,12 +304,13 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
sHelp = new Scrollpad(0, main_start_y, COLS, main_height, "", Config.main_color, brNone);
|
sHelp = new Scrollpad(0, main_start_y, COLS, main_height, "", Config.main_color, brNone);
|
||||||
sHelp->SetTimeout(ncmpcpp_window_timeout);
|
sHelp->SetTimeout(ncmpcpp_window_timeout);
|
||||||
sHelp->Add(GetKeybindings());
|
GetKeybindings(*sHelp);
|
||||||
|
sHelp->Flush();
|
||||||
|
|
||||||
sLyrics = static_cast<Scrollpad *>(sHelp->EmptyClone());
|
sLyrics = sHelp->EmptyClone();
|
||||||
sLyrics->SetTimeout(ncmpcpp_window_timeout);
|
sLyrics->SetTimeout(ncmpcpp_window_timeout);
|
||||||
|
|
||||||
sInfo = static_cast<Scrollpad *>(sHelp->EmptyClone());
|
sInfo = sHelp->EmptyClone();
|
||||||
sInfo->SetTimeout(ncmpcpp_window_timeout);
|
sInfo->SetTimeout(ncmpcpp_window_timeout);
|
||||||
|
|
||||||
if (Config.header_visibility)
|
if (Config.header_visibility)
|
||||||
@@ -356,6 +350,12 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
signal(SIGPIPE, SIG_IGN);
|
signal(SIGPIPE, SIG_IGN);
|
||||||
|
|
||||||
|
# ifdef HAVE_CURL_CURL_H
|
||||||
|
pthread_attr_t attr_detached;
|
||||||
|
pthread_attr_init(&attr_detached);
|
||||||
|
pthread_attr_setdetachstate(&attr_detached, PTHREAD_CREATE_DETACHED);
|
||||||
|
# endif // HAVE_CURL_CURL_H
|
||||||
|
|
||||||
while (!main_exit)
|
while (!main_exit)
|
||||||
{
|
{
|
||||||
if (!Mpd->Connected())
|
if (!Mpd->Connected())
|
||||||
@@ -430,7 +430,7 @@ int main(int argc, char *argv[])
|
|||||||
wHeader->Bold(1);
|
wHeader->Bold(1);
|
||||||
if (browsed_dir.length() > max_length_without_scroll)
|
if (browsed_dir.length() > max_length_without_scroll)
|
||||||
{
|
{
|
||||||
# ifdef UTF8_ENABLED
|
# ifdef _UTF8
|
||||||
wbrowseddir += L" ** ";
|
wbrowseddir += L" ** ";
|
||||||
# else
|
# else
|
||||||
wbrowseddir += " ** ";
|
wbrowseddir += " ** ";
|
||||||
@@ -460,10 +460,10 @@ int main(int argc, char *argv[])
|
|||||||
wHeader->SetColor(Config.volume_color);
|
wHeader->SetColor(Config.volume_color);
|
||||||
wHeader->WriteXY(max_allowed_title_length, 0, volume_state);
|
wHeader->WriteXY(max_allowed_title_length, 0, volume_state);
|
||||||
wHeader->SetColor(Config.header_color);
|
wHeader->SetColor(Config.header_color);
|
||||||
|
wHeader->Refresh();
|
||||||
redraw_header = 0;
|
redraw_header = 0;
|
||||||
}
|
}
|
||||||
// header stuff end
|
// header stuff end
|
||||||
|
|
||||||
// media library stuff
|
// media library stuff
|
||||||
if (current_screen == csLibrary)
|
if (current_screen == csLibrary)
|
||||||
{
|
{
|
||||||
@@ -704,7 +704,7 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
if (redraw_screen && wCurrent == mEditorTagTypes && mEditorTagTypes->GetChoice() < 13)
|
if (redraw_screen && wCurrent == mEditorTagTypes && mEditorTagTypes->GetChoice() < 13)
|
||||||
{
|
{
|
||||||
mEditorTags->Refresh(1);
|
mEditorTags->Refresh();
|
||||||
redraw_screen = 0;
|
redraw_screen = 0;
|
||||||
}
|
}
|
||||||
else if (mEditorTagTypes->GetChoice() >= 13)
|
else if (mEditorTagTypes->GetChoice() >= 13)
|
||||||
@@ -722,36 +722,11 @@ int main(int argc, char *argv[])
|
|||||||
else
|
else
|
||||||
reload_lyrics = 0;
|
reload_lyrics = 0;
|
||||||
}
|
}
|
||||||
# ifdef HAVE_CURL_CURL_H
|
|
||||||
if (artist_info_ready)
|
|
||||||
{
|
|
||||||
void *result;
|
|
||||||
string *str_result = 0;
|
|
||||||
pthread_join(artist_info_downloader, &result);
|
|
||||||
str_result = static_cast<string *>(result);
|
|
||||||
sInfo->Add(*str_result);
|
|
||||||
delete str_result;
|
|
||||||
artist_info_downloader = 0;
|
|
||||||
artist_info_ready = 0;
|
|
||||||
}
|
|
||||||
else if (lyrics_ready)
|
|
||||||
{
|
|
||||||
void *result;
|
|
||||||
string *str_result = 0;
|
|
||||||
pthread_join(lyrics_downloader, &result);
|
|
||||||
str_result = static_cast<string *>(result);
|
|
||||||
sLyrics->Add(*str_result);
|
|
||||||
delete str_result;
|
|
||||||
lyrics_downloader = 0;
|
|
||||||
lyrics_ready = 0;
|
|
||||||
}
|
|
||||||
# endif
|
|
||||||
// lyrics end
|
|
||||||
|
|
||||||
if (Config.columns_in_playlist && wCurrent == mPlaylist)
|
if (Config.columns_in_playlist && wCurrent == mPlaylist)
|
||||||
wCurrent->Display(redraw_screen);
|
wCurrent->Display();
|
||||||
else
|
else
|
||||||
wCurrent->Refresh(redraw_screen);
|
wCurrent->Refresh();
|
||||||
redraw_screen = 0;
|
redraw_screen = 0;
|
||||||
|
|
||||||
wCurrent->ReadKey(input);
|
wCurrent->ReadKey(input);
|
||||||
@@ -811,14 +786,14 @@ int main(int argc, char *argv[])
|
|||||||
wCurrent->SetTimeout(50);
|
wCurrent->SetTimeout(50);
|
||||||
while (Keypressed(input, Key.Up))
|
while (Keypressed(input, Key.Up))
|
||||||
{
|
{
|
||||||
wCurrent->Go(wUp);
|
wCurrent->Scroll(wUp);
|
||||||
wCurrent->Refresh();
|
wCurrent->Refresh();
|
||||||
wCurrent->ReadKey(input);
|
wCurrent->ReadKey(input);
|
||||||
}
|
}
|
||||||
wCurrent->SetTimeout(ncmpcpp_window_timeout);
|
wCurrent->SetTimeout(ncmpcpp_window_timeout);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
wCurrent->Go(wUp);
|
wCurrent->Scroll(wUp);
|
||||||
}
|
}
|
||||||
else if (Keypressed(input, Key.Down))
|
else if (Keypressed(input, Key.Down))
|
||||||
{
|
{
|
||||||
@@ -827,30 +802,30 @@ int main(int argc, char *argv[])
|
|||||||
wCurrent->SetTimeout(50);
|
wCurrent->SetTimeout(50);
|
||||||
while (Keypressed(input, Key.Down))
|
while (Keypressed(input, Key.Down))
|
||||||
{
|
{
|
||||||
wCurrent->Go(wDown);
|
wCurrent->Scroll(wDown);
|
||||||
wCurrent->Refresh();
|
wCurrent->Refresh();
|
||||||
wCurrent->ReadKey(input);
|
wCurrent->ReadKey(input);
|
||||||
}
|
}
|
||||||
wCurrent->SetTimeout(ncmpcpp_window_timeout);
|
wCurrent->SetTimeout(ncmpcpp_window_timeout);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
wCurrent->Go(wDown);
|
wCurrent->Scroll(wDown);
|
||||||
}
|
}
|
||||||
else if (Keypressed(input, Key.PageUp))
|
else if (Keypressed(input, Key.PageUp))
|
||||||
{
|
{
|
||||||
wCurrent->Go(wPageUp);
|
wCurrent->Scroll(wPageUp);
|
||||||
}
|
}
|
||||||
else if (Keypressed(input, Key.PageDown))
|
else if (Keypressed(input, Key.PageDown))
|
||||||
{
|
{
|
||||||
wCurrent->Go(wPageDown);
|
wCurrent->Scroll(wPageDown);
|
||||||
}
|
}
|
||||||
else if (Keypressed(input, Key.Home))
|
else if (Keypressed(input, Key.Home))
|
||||||
{
|
{
|
||||||
wCurrent->Go(wHome);
|
wCurrent->Scroll(wHome);
|
||||||
}
|
}
|
||||||
else if (Keypressed(input, Key.End))
|
else if (Keypressed(input, Key.End))
|
||||||
{
|
{
|
||||||
wCurrent->Go(wEnd);
|
wCurrent->Scroll(wEnd);
|
||||||
}
|
}
|
||||||
else if (input == KEY_RESIZE)
|
else if (input == KEY_RESIZE)
|
||||||
{
|
{
|
||||||
@@ -1315,8 +1290,8 @@ int main(int argc, char *argv[])
|
|||||||
ShowMessage("Searching finished!");
|
ShowMessage("Searching finished!");
|
||||||
for (int i = 0; i < search_engine_static_options-4; i++)
|
for (int i = 0; i < search_engine_static_options-4; i++)
|
||||||
mSearcher->MakeStatic(i, 1);
|
mSearcher->MakeStatic(i, 1);
|
||||||
mSearcher->Go(wDown);
|
mSearcher->Scroll(wDown);
|
||||||
mSearcher->Go(wDown);
|
mSearcher->Scroll(wDown);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
ShowMessage("No results found");
|
ShowMessage("No results found");
|
||||||
@@ -1461,7 +1436,7 @@ int main(int argc, char *argv[])
|
|||||||
FreeSongList(list);
|
FreeSongList(list);
|
||||||
if (Keypressed(input, Key.Space))
|
if (Keypressed(input, Key.Space))
|
||||||
{
|
{
|
||||||
wCurrent->Go(wDown);
|
wCurrent->Scroll(wDown);
|
||||||
if (wCurrent == mLibArtists)
|
if (wCurrent == mLibArtists)
|
||||||
{
|
{
|
||||||
mLibAlbums->Clear(0);
|
mLibAlbums->Clear(0);
|
||||||
@@ -1548,7 +1523,7 @@ int main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
FreeSongList(list);
|
FreeSongList(list);
|
||||||
if (Keypressed(input, Key.Space))
|
if (Keypressed(input, Key.Space))
|
||||||
wCurrent->Go(wDown);
|
wCurrent->Scroll(wDown);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
# ifdef HAVE_TAGLIB_H
|
# ifdef HAVE_TAGLIB_H
|
||||||
@@ -1668,7 +1643,7 @@ int main(int argc, char *argv[])
|
|||||||
UnlockStatusbar();
|
UnlockStatusbar();
|
||||||
if (!new_name.empty() && new_name != old_name)
|
if (!new_name.empty() && new_name != old_name)
|
||||||
s.SetNewName(new_name + extension);
|
s.SetNewName(new_name + extension);
|
||||||
mEditorTags->Go(wDown);
|
mEditorTags->Scroll(wDown);
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -1732,7 +1707,7 @@ int main(int argc, char *argv[])
|
|||||||
UnlockStatusbar();
|
UnlockStatusbar();
|
||||||
if (new_tag != mEditorTags->GetOption())
|
if (new_tag != mEditorTags->GetOption())
|
||||||
(mEditorTags->Current().*set)(new_tag);
|
(mEditorTags->Current().*set)(new_tag);
|
||||||
mEditorTags->Go(wDown);
|
mEditorTags->Scroll(wDown);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
# endif // HAVE_TAGLIB_H
|
# endif // HAVE_TAGLIB_H
|
||||||
@@ -1748,7 +1723,7 @@ int main(int argc, char *argv[])
|
|||||||
{
|
{
|
||||||
int i = wCurrent->GetChoice();
|
int i = wCurrent->GetChoice();
|
||||||
wCurrent->Select(i, !wCurrent->Selected(i));
|
wCurrent->Select(i, !wCurrent->Selected(i));
|
||||||
wCurrent->Go(wDown);
|
wCurrent->Scroll(wDown);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -1825,7 +1800,7 @@ int main(int argc, char *argv[])
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mBrowser->Go(wDown);
|
mBrowser->Scroll(wDown);
|
||||||
}
|
}
|
||||||
else if (current_screen == csSearcher && mSearcher->Current().first == ".")
|
else if (current_screen == csSearcher && mSearcher->Current().first == ".")
|
||||||
{
|
{
|
||||||
@@ -1855,7 +1830,7 @@ int main(int argc, char *argv[])
|
|||||||
mSearcher->BoldOption(mSearcher->GetChoice(), 1);
|
mSearcher->BoldOption(mSearcher->GetChoice(), 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mSearcher->Go(wDown);
|
mSearcher->Scroll(wDown);
|
||||||
}
|
}
|
||||||
else if (current_screen == csLibrary)
|
else if (current_screen == csLibrary)
|
||||||
goto ENTER_LIBRARY_SCREEN; // sorry, but that's stupid to copy the same code here.
|
goto ENTER_LIBRARY_SCREEN; // sorry, but that's stupid to copy the same code here.
|
||||||
@@ -2203,7 +2178,7 @@ int main(int argc, char *argv[])
|
|||||||
timer = time(NULL);
|
timer = time(NULL);
|
||||||
to--;
|
to--;
|
||||||
mPlaylist->Swap(to, to+1);
|
mPlaylist->Swap(to, to+1);
|
||||||
mPlaylist->Go(wUp);
|
mPlaylist->Scroll(wUp);
|
||||||
mPlaylist->Refresh();
|
mPlaylist->Refresh();
|
||||||
mPlaylist->ReadKey(input);
|
mPlaylist->ReadKey(input);
|
||||||
}
|
}
|
||||||
@@ -2249,7 +2224,7 @@ int main(int argc, char *argv[])
|
|||||||
timer = time(NULL);
|
timer = time(NULL);
|
||||||
to--;
|
to--;
|
||||||
mPlaylistEditor->Swap(to, to+1);
|
mPlaylistEditor->Swap(to, to+1);
|
||||||
mPlaylistEditor->Go(wUp);
|
mPlaylistEditor->Scroll(wUp);
|
||||||
mPlaylistEditor->Refresh();
|
mPlaylistEditor->Refresh();
|
||||||
mPlaylistEditor->ReadKey(input);
|
mPlaylistEditor->ReadKey(input);
|
||||||
}
|
}
|
||||||
@@ -2306,7 +2281,7 @@ int main(int argc, char *argv[])
|
|||||||
timer = time(NULL);
|
timer = time(NULL);
|
||||||
to++;
|
to++;
|
||||||
mPlaylist->Swap(to, to-1);
|
mPlaylist->Swap(to, to-1);
|
||||||
mPlaylist->Go(wDown);
|
mPlaylist->Scroll(wDown);
|
||||||
mPlaylist->Refresh();
|
mPlaylist->Refresh();
|
||||||
mPlaylist->ReadKey(input);
|
mPlaylist->ReadKey(input);
|
||||||
}
|
}
|
||||||
@@ -2353,7 +2328,7 @@ int main(int argc, char *argv[])
|
|||||||
timer = time(NULL);
|
timer = time(NULL);
|
||||||
to++;
|
to++;
|
||||||
mPlaylistEditor->Swap(to, to-1);
|
mPlaylistEditor->Swap(to, to-1);
|
||||||
mPlaylistEditor->Go(wDown);
|
mPlaylistEditor->Scroll(wDown);
|
||||||
mPlaylistEditor->Refresh();
|
mPlaylistEditor->Refresh();
|
||||||
mPlaylistEditor->ReadKey(input);
|
mPlaylistEditor->ReadKey(input);
|
||||||
}
|
}
|
||||||
@@ -2434,9 +2409,9 @@ int main(int argc, char *argv[])
|
|||||||
double progressbar_size = (double)songpos/(s.GetTotalLength());
|
double progressbar_size = (double)songpos/(s.GetTotalLength());
|
||||||
int howlong = wFooter->GetWidth()*progressbar_size;
|
int howlong = wFooter->GetWidth()*progressbar_size;
|
||||||
|
|
||||||
mvwhline(wFooter->RawWin(), 0, 0, 0, wFooter->GetWidth());
|
mvwhline(wFooter->Raw(), 0, 0, 0, wFooter->GetWidth());
|
||||||
mvwhline(wFooter->RawWin(), 0, 0, '=',howlong);
|
mvwhline(wFooter->Raw(), 0, 0, '=',howlong);
|
||||||
mvwaddch(wFooter->RawWin(), 0, howlong, '>');
|
mvwaddch(wFooter->Raw(), 0, howlong, '>');
|
||||||
wFooter->Bold(0);
|
wFooter->Bold(0);
|
||||||
wFooter->Refresh();
|
wFooter->Refresh();
|
||||||
}
|
}
|
||||||
@@ -2902,17 +2877,17 @@ int main(int argc, char *argv[])
|
|||||||
mDialog->ReadKey(input);
|
mDialog->ReadKey(input);
|
||||||
|
|
||||||
if (Keypressed(input, Key.Up))
|
if (Keypressed(input, Key.Up))
|
||||||
mDialog->Go(wUp);
|
mDialog->Scroll(wUp);
|
||||||
else if (Keypressed(input, Key.Down))
|
else if (Keypressed(input, Key.Down))
|
||||||
mDialog->Go(wDown);
|
mDialog->Scroll(wDown);
|
||||||
else if (Keypressed(input, Key.PageUp))
|
else if (Keypressed(input, Key.PageUp))
|
||||||
mDialog->Go(wPageUp);
|
mDialog->Scroll(wPageUp);
|
||||||
else if (Keypressed(input, Key.PageDown))
|
else if (Keypressed(input, Key.PageDown))
|
||||||
mDialog->Go(wPageDown);
|
mDialog->Scroll(wPageDown);
|
||||||
else if (Keypressed(input, Key.Home))
|
else if (Keypressed(input, Key.Home))
|
||||||
mDialog->Go(wHome);
|
mDialog->Scroll(wHome);
|
||||||
else if (Keypressed(input, Key.End))
|
else if (Keypressed(input, Key.End))
|
||||||
mDialog->Go(wEnd);
|
mDialog->Scroll(wEnd);
|
||||||
}
|
}
|
||||||
|
|
||||||
int id = mDialog->GetChoice();
|
int id = mDialog->GetChoice();
|
||||||
@@ -2927,7 +2902,7 @@ int main(int argc, char *argv[])
|
|||||||
REFRESH_PLAYLIST_EDITOR_SCREEN;
|
REFRESH_PLAYLIST_EDITOR_SCREEN;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
wCurrent->Refresh(1);
|
wCurrent->Refresh();
|
||||||
|
|
||||||
if (id == 0)
|
if (id == 0)
|
||||||
{
|
{
|
||||||
@@ -3040,7 +3015,7 @@ int main(int argc, char *argv[])
|
|||||||
ShowMessage("Searching...");
|
ShowMessage("Searching...");
|
||||||
for (int i = (wCurrent == mSearcher ? search_engine_static_options-1 : 0); i < wCurrent->Size(); i++)
|
for (int i = (wCurrent == mSearcher ? search_engine_static_options-1 : 0); i < wCurrent->Size(); i++)
|
||||||
{
|
{
|
||||||
string name = Window::OmitBBCodes(wCurrent->GetOption(i));
|
string name = wCurrent->GetOption(i);
|
||||||
ToLower(name);
|
ToLower(name);
|
||||||
if (name.find(findme) != string::npos && !wCurrent->IsStatic(i))
|
if (name.find(findme) != string::npos && !wCurrent->IsStatic(i))
|
||||||
{
|
{
|
||||||
@@ -3218,7 +3193,8 @@ int main(int argc, char *argv[])
|
|||||||
redraw_header = 1;
|
redraw_header = 1;
|
||||||
info_title = "Song info";
|
info_title = "Song info";
|
||||||
sInfo->Clear();
|
sInfo->Clear();
|
||||||
sInfo->Add(GetInfo(*s));
|
GetInfo(*s, *sInfo);
|
||||||
|
sInfo->Flush();
|
||||||
sInfo->Hide();
|
sInfo->Hide();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3293,7 +3269,9 @@ int main(int argc, char *argv[])
|
|||||||
sInfo->WriteXY(0, 0, "Fetching artist's info...");
|
sInfo->WriteXY(0, 0, "Fetching artist's info...");
|
||||||
sInfo->Refresh();
|
sInfo->Refresh();
|
||||||
if (!artist_info_downloader)
|
if (!artist_info_downloader)
|
||||||
pthread_create(&artist_info_downloader, NULL, GetArtistInfo, artist);
|
{
|
||||||
|
pthread_create(&artist_info_downloader, &attr_detached, GetArtistInfo, artist);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
delete artist;
|
delete artist;
|
||||||
@@ -3383,11 +3361,11 @@ int main(int argc, char *argv[])
|
|||||||
sLyrics->Refresh();
|
sLyrics->Refresh();
|
||||||
# ifdef HAVE_CURL_CURL_H
|
# ifdef HAVE_CURL_CURL_H
|
||||||
if (!lyrics_downloader)
|
if (!lyrics_downloader)
|
||||||
pthread_create(&lyrics_downloader, NULL, GetLyrics, s);
|
{
|
||||||
|
pthread_create(&lyrics_downloader, &attr_detached, GetLyrics, s);
|
||||||
|
}
|
||||||
# else
|
# else
|
||||||
string *lyrics = static_cast<string *>(GetLyrics(s));
|
GetLyrics(s);
|
||||||
sLyrics->Add(*lyrics);
|
|
||||||
delete lyrics;
|
|
||||||
# endif
|
# endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3551,8 +3529,7 @@ int main(int argc, char *argv[])
|
|||||||
// key mapping end
|
// key mapping end
|
||||||
}
|
}
|
||||||
Mpd->Disconnect();
|
Mpd->Disconnect();
|
||||||
curs_set(1);
|
DestroyScreen();
|
||||||
endwin();
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,11 +20,17 @@
|
|||||||
|
|
||||||
#include "scrollpad.h"
|
#include "scrollpad.h"
|
||||||
|
|
||||||
Scrollpad::Scrollpad(int startx, int starty, int width, int height, const string &title, Color color, Border border) :
|
Scrollpad::Scrollpad(size_t startx,
|
||||||
Window(startx, starty, width, height, title, color, border),
|
size_t starty,
|
||||||
itsBeginning(0),
|
size_t width,
|
||||||
itsRealHeight(1),
|
size_t height,
|
||||||
itsXPos(0)
|
const string &title,
|
||||||
|
Color color,
|
||||||
|
Border border)
|
||||||
|
: Window(startx, starty, width, height, title, color, border),
|
||||||
|
itsBeginning(0),
|
||||||
|
itsRealHeight(1),
|
||||||
|
itsXPos(0)
|
||||||
{
|
{
|
||||||
delwin(itsWindow);
|
delwin(itsWindow);
|
||||||
itsWindow = newpad(itsHeight, itsWidth);
|
itsWindow = newpad(itsHeight, itsWidth);
|
||||||
@@ -34,32 +40,21 @@ Scrollpad::Scrollpad(int startx, int starty, int width, int height, const string
|
|||||||
|
|
||||||
Scrollpad::Scrollpad(const Scrollpad &s) : Window(s)
|
Scrollpad::Scrollpad(const Scrollpad &s) : Window(s)
|
||||||
{
|
{
|
||||||
itsContent = s.itsContent;
|
itsBuffer << s.itsBuffer;
|
||||||
itsRawContent = s.itsRawContent;
|
|
||||||
itsBeginning = s.itsBeginning;
|
itsBeginning = s.itsBeginning;
|
||||||
itsRealHeight = s.itsRealHeight;
|
itsRealHeight = s.itsRealHeight;
|
||||||
itsXPos = s.itsXPos;
|
itsXPos = s.itsXPos;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Scrollpad::Add(string str)
|
void Scrollpad::Flush()
|
||||||
{
|
{
|
||||||
if (itsXPos > 0 && (str[0] != ' ' || str[0] != '\n'))
|
itsRealHeight = 1;
|
||||||
str = " " + str;
|
|
||||||
|
|
||||||
itsRawContent += str;
|
std::basic_string<my_char_t> s = itsBuffer.Str();
|
||||||
|
|
||||||
# ifdef UTF8_ENABLED
|
int x_pos;
|
||||||
wstring s = ToWString(str);
|
int space_pos;
|
||||||
wstring tmp;
|
|
||||||
# else
|
|
||||||
string &s = str;
|
|
||||||
string tmp;
|
|
||||||
# endif
|
|
||||||
|
|
||||||
int x_pos = 0;
|
|
||||||
int space_pos = 0;
|
|
||||||
int tab_size;
|
int tab_size;
|
||||||
bool collect = 0;
|
|
||||||
|
|
||||||
for (size_t i = 0; i < s.length(); i++)
|
for (size_t i = 0; i < s.length(); i++)
|
||||||
{
|
{
|
||||||
@@ -67,7 +62,7 @@ void Scrollpad::Add(string str)
|
|||||||
|
|
||||||
if (s[i] != '\t')
|
if (s[i] != '\t')
|
||||||
{
|
{
|
||||||
# ifdef UTF8_ENABLED
|
# ifdef _UTF8
|
||||||
itsXPos += wcwidth(s[i]);
|
itsXPos += wcwidth(s[i]);
|
||||||
# else
|
# else
|
||||||
itsXPos++;
|
itsXPos++;
|
||||||
@@ -76,41 +71,13 @@ void Scrollpad::Add(string str)
|
|||||||
else
|
else
|
||||||
itsXPos += tab_size;
|
itsXPos += tab_size;
|
||||||
|
|
||||||
if (BBEnabled)
|
|
||||||
{
|
|
||||||
if (s[i] == '[' && (s[i+1] == '.' || s[i+1] == '/'))
|
|
||||||
collect = 1;
|
|
||||||
|
|
||||||
if (collect)
|
|
||||||
{
|
|
||||||
if (s[i] != '[')
|
|
||||||
{
|
|
||||||
tmp += s[i];
|
|
||||||
if (tmp.length() > 10) // the longest bbcode is 10 chars long
|
|
||||||
collect = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
tmp = s[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (s[i] == ']')
|
|
||||||
collect = 0;
|
|
||||||
|
|
||||||
if (!collect && !tmp.empty())
|
|
||||||
{
|
|
||||||
if (IsValidColor(TO_STRING(tmp)))
|
|
||||||
itsXPos -= tmp.length();
|
|
||||||
tmp.clear();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (s[i] == ' ') // if space, remember its position;
|
if (s[i] == ' ') // if space, remember its position;
|
||||||
{
|
{
|
||||||
space_pos = i;
|
space_pos = i;
|
||||||
x_pos = itsXPos;
|
x_pos = itsXPos;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!collect && itsXPos >= itsWidth)
|
if (itsXPos >= itsWidth)
|
||||||
{
|
{
|
||||||
// if line is over, there was at least one space in this line and we are in the middle of the word, restore position to last known space and make it EOL
|
// if line is over, there was at least one space in this line and we are in the middle of the word, restore position to last known space and make it EOL
|
||||||
if (space_pos > 0 && (s[i] != ' ' || s[i+1] != ' '))
|
if (space_pos > 0 && (s[i] != ' ' || s[i+1] != ' '))
|
||||||
@@ -121,15 +88,17 @@ void Scrollpad::Add(string str)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!collect && (itsXPos >= itsWidth || s[i] == '\n'))
|
if (itsXPos >= itsWidth || s[i] == '\n')
|
||||||
{
|
{
|
||||||
itsRealHeight++;
|
itsRealHeight++;
|
||||||
itsXPos = 0;
|
itsXPos = 0;
|
||||||
space_pos = 0;
|
space_pos = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
itsContent += TO_STRING(s);
|
|
||||||
Recreate();
|
Recreate();
|
||||||
|
itsBuffer.SetTemp(&s);
|
||||||
|
reinterpret_cast<Window &>(*this) << itsBuffer;
|
||||||
|
itsBuffer.SetTemp(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Scrollpad::Recreate()
|
void Scrollpad::Recreate()
|
||||||
@@ -139,16 +108,25 @@ void Scrollpad::Recreate()
|
|||||||
SetTimeout(itsWindowTimeout);
|
SetTimeout(itsWindowTimeout);
|
||||||
SetColor(itsBaseColor, itsBgColor);
|
SetColor(itsBaseColor, itsBgColor);
|
||||||
keypad(itsWindow, 1);
|
keypad(itsWindow, 1);
|
||||||
Write(itsContent.c_str());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Scrollpad::Refresh(bool)
|
void Scrollpad::Refresh()
|
||||||
{
|
{
|
||||||
prefresh(itsWindow, itsBeginning, 0, itsStartY, itsStartX, itsStartY+itsHeight-1, itsStartX+itsWidth);
|
prefresh(itsWindow, itsBeginning, 0, itsStartY, itsStartX, itsStartY+itsHeight-1, itsStartX+itsWidth);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Scrollpad::Resize(int width, int height)
|
void Scrollpad::MoveTo(size_t x, size_t y)
|
||||||
{
|
{
|
||||||
|
itsStartX = x;
|
||||||
|
itsStartY = y;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Scrollpad::Resize(size_t width, size_t height)
|
||||||
|
{
|
||||||
|
if (width+itsStartX > size_t(COLS)
|
||||||
|
|| height+itsStartY > size_t(LINES))
|
||||||
|
throw BadSize();
|
||||||
|
|
||||||
if (itsBorder != brNone)
|
if (itsBorder != brNone)
|
||||||
{
|
{
|
||||||
delwin(itsWinBorder);
|
delwin(itsWinBorder);
|
||||||
@@ -161,48 +139,45 @@ void Scrollpad::Resize(int width, int height)
|
|||||||
if (!itsTitle.empty())
|
if (!itsTitle.empty())
|
||||||
width -= 2;
|
width -= 2;
|
||||||
|
|
||||||
if (height > 0 && width > 0)
|
itsHeight = height;
|
||||||
{
|
itsWidth = width;
|
||||||
itsHeight = height;
|
|
||||||
itsWidth = width;
|
|
||||||
|
|
||||||
itsBeginning = 0;
|
itsBeginning = 0;
|
||||||
itsRealHeight = 1;
|
itsRealHeight = itsHeight;
|
||||||
itsXPos = 0;
|
itsXPos = 0;
|
||||||
itsContent.clear();
|
Flush();
|
||||||
string tmp = itsRawContent;
|
|
||||||
itsRawContent.clear();
|
|
||||||
Add(tmp);
|
|
||||||
Recreate();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Scrollpad::Go(Where where)
|
void Scrollpad::Scroll(Where where)
|
||||||
{
|
{
|
||||||
int MaxBeginning = itsContent.size() < itsHeight ? 0 : itsRealHeight-itsHeight;
|
int MaxBeginning = /*itsContent.size() < itsHeight ? 0 : */itsRealHeight-itsHeight;
|
||||||
|
|
||||||
switch (where)
|
switch (where)
|
||||||
{
|
{
|
||||||
case wUp:
|
case wUp:
|
||||||
{
|
{
|
||||||
if (itsBeginning > 0) itsBeginning--; // for scrolling
|
if (itsBeginning > 0)
|
||||||
|
itsBeginning--;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case wDown:
|
case wDown:
|
||||||
{
|
{
|
||||||
if (itsBeginning < MaxBeginning) itsBeginning++; // scroll
|
if (itsBeginning < MaxBeginning)
|
||||||
|
itsBeginning++;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case wPageUp:
|
case wPageUp:
|
||||||
{
|
{
|
||||||
itsBeginning -= itsHeight;
|
itsBeginning -= itsHeight;
|
||||||
if (itsBeginning < 0) itsBeginning = 0;
|
if (itsBeginning < 0)
|
||||||
|
itsBeginning = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case wPageDown:
|
case wPageDown:
|
||||||
{
|
{
|
||||||
itsBeginning += itsHeight;
|
itsBeginning += itsHeight;
|
||||||
if (itsBeginning > MaxBeginning) itsBeginning = MaxBeginning;
|
if (itsBeginning > MaxBeginning)
|
||||||
|
itsBeginning = MaxBeginning;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case wHome:
|
case wHome:
|
||||||
@@ -218,24 +193,44 @@ void Scrollpad::Go(Where where)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Scrollpad::Clear(bool clear_screen)
|
void Scrollpad::Clear(bool clrscr)
|
||||||
{
|
{
|
||||||
itsBeginning = 0;
|
itsBeginning = 0;
|
||||||
itsRealHeight = 1;
|
itsRealHeight = itsHeight;
|
||||||
itsXPos = 0;
|
itsXPos = 0;
|
||||||
itsContent.clear();
|
itsBuffer.Clear();
|
||||||
itsRawContent.clear();
|
|
||||||
wclear(itsWindow);
|
wclear(itsWindow);
|
||||||
delwin(itsWindow);
|
delwin(itsWindow);
|
||||||
itsWindow = newpad(itsHeight, itsWidth);
|
itsWindow = newpad(itsHeight, itsWidth);
|
||||||
SetTimeout(itsWindowTimeout);
|
SetTimeout(itsWindowTimeout);
|
||||||
SetColor(itsColor, itsBgColor);
|
SetColor(itsColor, itsBgColor);
|
||||||
keypad(itsWindow, 1);
|
keypad(itsWindow, 1);
|
||||||
if (clear_screen)
|
if (clrscr)
|
||||||
Window::Clear();
|
Window::Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
Window * Scrollpad::EmptyClone() const
|
Scrollpad &Scrollpad::operator<<(std::ostream &(*os)(std::ostream&))
|
||||||
|
{
|
||||||
|
itsBuffer << os;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef _UTF8
|
||||||
|
Scrollpad &Scrollpad::operator<<(const char *s)
|
||||||
|
{
|
||||||
|
wchar_t *ws = ToWString(s);
|
||||||
|
itsBuffer << ws;
|
||||||
|
delete [] ws;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Scrollpad &Scrollpad::operator<<(const std::string &s)
|
||||||
|
{
|
||||||
|
return operator<<(s.c_str());
|
||||||
|
}
|
||||||
|
#endif // _UTF8
|
||||||
|
|
||||||
|
Scrollpad *Scrollpad::EmptyClone() const
|
||||||
{
|
{
|
||||||
return new Scrollpad(GetStartX(), GetStartY(), GetWidth(), GetHeight(), itsTitle, itsBaseColor, itsBorder);
|
return new Scrollpad(GetStartX(), GetStartY(), GetWidth(), GetHeight(), itsTitle, itsBaseColor, itsBorder);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,28 +22,50 @@
|
|||||||
#define HAVE_SCROLLPAD_H
|
#define HAVE_SCROLLPAD_H
|
||||||
|
|
||||||
#include "window.h"
|
#include "window.h"
|
||||||
|
#include "strbuffer.h"
|
||||||
|
|
||||||
class Scrollpad: public Window
|
class Scrollpad: public Window
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Scrollpad(int, int, int, int, const string &, Color, Border);
|
Scrollpad(size_t, size_t, size_t, size_t, const std::string &, Color, Border);
|
||||||
Scrollpad(const Scrollpad &);
|
Scrollpad(const Scrollpad &);
|
||||||
virtual ~Scrollpad() {}
|
virtual ~Scrollpad() { }
|
||||||
virtual void Add(string);
|
|
||||||
virtual void Refresh(bool = 0);
|
void Flush();
|
||||||
virtual void Go(Where);
|
std::basic_string<my_char_t> Content() { return itsBuffer.Str(); }
|
||||||
virtual void Resize(int, int);
|
|
||||||
virtual void Clear(bool clear_screen = 1);
|
virtual void Refresh();
|
||||||
virtual Window * Clone() const { return new Scrollpad(*this); }
|
virtual void Scroll(Where);
|
||||||
virtual Window * EmptyClone() const;
|
|
||||||
|
virtual void MoveTo(size_t, size_t);
|
||||||
|
virtual void Resize(size_t, size_t);
|
||||||
|
virtual void Clear(bool = 1);
|
||||||
|
|
||||||
|
template <class T> Scrollpad &operator<<(const T &t)
|
||||||
|
{
|
||||||
|
itsBuffer << t;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Scrollpad &operator<<(std::ostream &(*os)(std::ostream &));
|
||||||
|
|
||||||
|
# ifdef _UTF8
|
||||||
|
Scrollpad &operator<<(const char *s);
|
||||||
|
Scrollpad &operator<<(const std::string &s);
|
||||||
|
# endif // _UTF8
|
||||||
|
|
||||||
|
virtual Scrollpad *Clone() const { return new Scrollpad(*this); }
|
||||||
|
virtual Scrollpad *EmptyClone() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void Recreate();
|
virtual void Recreate();
|
||||||
string itsContent;
|
|
||||||
string itsRawContent;
|
basic_buffer<my_char_t> itsBuffer;
|
||||||
|
|
||||||
int itsBeginning;
|
int itsBeginning;
|
||||||
int itsRealHeight;
|
|
||||||
int itsXPos;
|
size_t itsRealHeight;
|
||||||
|
size_t itsXPos;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
12
src/song.cpp
12
src/song.cpp
@@ -30,7 +30,7 @@ string UNKNOWN_ALBUM;
|
|||||||
|
|
||||||
void DefineEmptyTags()
|
void DefineEmptyTags()
|
||||||
{
|
{
|
||||||
if (Config.empty_tags_color != clDefault)
|
/*if (Config.empty_tags_color != clDefault)
|
||||||
{
|
{
|
||||||
const string et_col = IntoStr(Config.empty_tags_color);
|
const string et_col = IntoStr(Config.empty_tags_color);
|
||||||
EMPTY_TAG = "[." + et_col + "]<empty>[/" + et_col + "]";
|
EMPTY_TAG = "[." + et_col + "]<empty>[/" + et_col + "]";
|
||||||
@@ -39,12 +39,12 @@ void DefineEmptyTags()
|
|||||||
UNKNOWN_ALBUM = "[." + et_col + "]<no album>[/" + et_col + "]";
|
UNKNOWN_ALBUM = "[." + et_col + "]<no album>[/" + et_col + "]";
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{*/
|
||||||
EMPTY_TAG = "<empty>";
|
EMPTY_TAG = "<empty>";
|
||||||
UNKNOWN_ARTIST = "<no artist>";
|
UNKNOWN_ARTIST = "<empty>";
|
||||||
UNKNOWN_TITLE = "<no title>";
|
UNKNOWN_TITLE = "<empty>";
|
||||||
UNKNOWN_ALBUM = "<no album";
|
UNKNOWN_ALBUM = "<empty>";
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
Song::Song(mpd_Song *s, bool copy_ptr) : itsSong(s),
|
Song::Song(mpd_Song *s, bool copy_ptr) : itsSong(s),
|
||||||
|
|||||||
@@ -134,8 +134,6 @@ void NcmpcppStatusChanged(Connection *Mpd, StatusChanges changed, void *)
|
|||||||
static string player_state;
|
static string player_state;
|
||||||
|
|
||||||
int sx, sy;
|
int sx, sy;
|
||||||
wFooter->DisableBB();
|
|
||||||
wFooter->AutoRefresh(0);
|
|
||||||
wFooter->Bold(1);
|
wFooter->Bold(1);
|
||||||
wFooter->GetXY(sx, sy);
|
wFooter->GetXY(sx, sy);
|
||||||
|
|
||||||
@@ -174,7 +172,7 @@ void NcmpcppStatusChanged(Connection *Mpd, StatusChanges changed, void *)
|
|||||||
{
|
{
|
||||||
if (!playlist_length || mPlaylist->Size() < mPlaylist->GetHeight())
|
if (!playlist_length || mPlaylist->Size() < mPlaylist->GetHeight())
|
||||||
mPlaylist->Window::Clear();
|
mPlaylist->Window::Clear();
|
||||||
mPlaylist->Refresh(1);
|
mPlaylist->Refresh();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -263,7 +261,7 @@ void NcmpcppStatusChanged(Connection *Mpd, StatusChanges changed, void *)
|
|||||||
{
|
{
|
||||||
WindowTitle("ncmpc++ ver. "VERSION);
|
WindowTitle("ncmpc++ ver. "VERSION);
|
||||||
wFooter->SetColor(Config.progressbar_color);
|
wFooter->SetColor(Config.progressbar_color);
|
||||||
mvwhline(wFooter->RawWin(), 0, 0, 0, wFooter->GetWidth());
|
mvwhline(wFooter->Raw(), 0, 0, 0, wFooter->GetWidth());
|
||||||
wFooter->SetColor(Config.statusbar_color);
|
wFooter->SetColor(Config.statusbar_color);
|
||||||
mPlaylist->BoldOption(old_playing, 0);
|
mPlaylist->BoldOption(old_playing, 0);
|
||||||
now_playing = -1;
|
now_playing = -1;
|
||||||
@@ -291,7 +289,7 @@ void NcmpcppStatusChanged(Connection *Mpd, StatusChanges changed, void *)
|
|||||||
repeat_one_allowed = 0;
|
repeat_one_allowed = 0;
|
||||||
|
|
||||||
if (!Mpd->GetElapsedTime())
|
if (!Mpd->GetElapsedTime())
|
||||||
mvwhline(wFooter->RawWin(), 0, 0, 0, wFooter->GetWidth());
|
mvwhline(wFooter->Raw(), 0, 0, 0, wFooter->GetWidth());
|
||||||
|
|
||||||
if (Config.now_playing_lyrics && !Config.repeat_one_mode && current_screen == csLyrics && prev_screen == csPlaylist)
|
if (Config.now_playing_lyrics && !Config.repeat_one_mode && current_screen == csLyrics && prev_screen == csPlaylist)
|
||||||
reload_lyrics = 1;
|
reload_lyrics = 1;
|
||||||
@@ -330,7 +328,7 @@ void NcmpcppStatusChanged(Connection *Mpd, StatusChanges changed, void *)
|
|||||||
wFooter->Bold(0);
|
wFooter->Bold(0);
|
||||||
if (playing_song.length() > max_length_without_scroll)
|
if (playing_song.length() > max_length_without_scroll)
|
||||||
{
|
{
|
||||||
# ifdef UTF8_ENABLED
|
# ifdef _UTF8
|
||||||
playing_song += L" ** ";
|
playing_song += L" ** ";
|
||||||
# else
|
# else
|
||||||
playing_song += " ** ";
|
playing_song += " ** ";
|
||||||
@@ -354,11 +352,11 @@ void NcmpcppStatusChanged(Connection *Mpd, StatusChanges changed, void *)
|
|||||||
double progressbar_size = (double)elapsed/(s.GetTotalLength());
|
double progressbar_size = (double)elapsed/(s.GetTotalLength());
|
||||||
int howlong = wFooter->GetWidth()*progressbar_size;
|
int howlong = wFooter->GetWidth()*progressbar_size;
|
||||||
wFooter->SetColor(Config.progressbar_color);
|
wFooter->SetColor(Config.progressbar_color);
|
||||||
mvwhline(wFooter->RawWin(), 0, 0, 0, wFooter->GetWidth());
|
mvwhline(wFooter->Raw(), 0, 0, 0, wFooter->GetWidth());
|
||||||
if (s.GetTotalLength())
|
if (s.GetTotalLength())
|
||||||
{
|
{
|
||||||
mvwhline(wFooter->RawWin(), 0, 0, '=',howlong);
|
mvwhline(wFooter->Raw(), 0, 0, '=',howlong);
|
||||||
mvwaddch(wFooter->RawWin(), 0, howlong, '>');
|
mvwaddch(wFooter->Raw(), 0, howlong, '>');
|
||||||
}
|
}
|
||||||
wFooter->SetColor(Config.statusbar_color);
|
wFooter->SetColor(Config.statusbar_color);
|
||||||
}
|
}
|
||||||
@@ -413,10 +411,9 @@ void NcmpcppStatusChanged(Connection *Mpd, StatusChanges changed, void *)
|
|||||||
if (mpd_db_updating)
|
if (mpd_db_updating)
|
||||||
switch_state += mpd_db_updating;
|
switch_state += mpd_db_updating;
|
||||||
|
|
||||||
wHeader->DisableBB();
|
|
||||||
wHeader->Bold(1);
|
wHeader->Bold(1);
|
||||||
wHeader->SetColor(Config.state_line_color);
|
wHeader->SetColor(Config.state_line_color);
|
||||||
mvwhline(wHeader->RawWin(), 1, 0, 0, wHeader->GetWidth());
|
mvwhline(wHeader->Raw(), 1, 0, 0, wHeader->GetWidth());
|
||||||
if (!switch_state.empty())
|
if (!switch_state.empty())
|
||||||
{
|
{
|
||||||
wHeader->WriteXY(wHeader->GetWidth()-switch_state.length()-3, 1, "[");
|
wHeader->WriteXY(wHeader->GetWidth()-switch_state.length()-3, 1, "[");
|
||||||
@@ -425,10 +422,8 @@ void NcmpcppStatusChanged(Connection *Mpd, StatusChanges changed, void *)
|
|||||||
wHeader->SetColor(Config.state_line_color);
|
wHeader->SetColor(Config.state_line_color);
|
||||||
wHeader->WriteXY(wHeader->GetWidth()-2, 1, "]");
|
wHeader->WriteXY(wHeader->GetWidth()-2, 1, "]");
|
||||||
}
|
}
|
||||||
wHeader->Refresh();
|
|
||||||
wHeader->SetColor(Config.header_color);
|
wHeader->SetColor(Config.header_color);
|
||||||
wHeader->Bold(0);
|
wHeader->Bold(0);
|
||||||
wHeader->EnableBB();
|
|
||||||
header_update_status = 0;
|
header_update_status = 0;
|
||||||
}
|
}
|
||||||
if ((changed.Volume) && Config.header_visibility)
|
if ((changed.Volume) && Config.header_visibility)
|
||||||
@@ -439,12 +434,11 @@ void NcmpcppStatusChanged(Connection *Mpd, StatusChanges changed, void *)
|
|||||||
wHeader->WriteXY(wHeader->GetWidth()-volume_state.length(), 0, volume_state);
|
wHeader->WriteXY(wHeader->GetWidth()-volume_state.length(), 0, volume_state);
|
||||||
wHeader->SetColor(Config.header_color);
|
wHeader->SetColor(Config.header_color);
|
||||||
}
|
}
|
||||||
|
wHeader->Refresh();
|
||||||
if (current_screen == csPlaylist)
|
if (current_screen == csPlaylist)
|
||||||
mPlaylist->Refresh();
|
mPlaylist->Refresh();
|
||||||
wFooter->Bold(0);
|
wFooter->Bold(0);
|
||||||
wFooter->GotoXY(sx, sy);
|
wFooter->GotoXY(sx, sy);
|
||||||
wFooter->Refresh();
|
wFooter->Refresh();
|
||||||
wFooter->AutoRefresh(1);
|
|
||||||
wFooter->EnableBB();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -107,7 +107,7 @@ namespace
|
|||||||
|
|
||||||
string GenerateFilename(const Song &s, string &pattern)
|
string GenerateFilename(const Song &s, string &pattern)
|
||||||
{
|
{
|
||||||
string result = Window::OmitBBCodes(DisplaySong(s, &pattern));
|
string result = DisplaySong(s, &pattern);
|
||||||
EscapeUnallowedChars(result);
|
EscapeUnallowedChars(result);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@@ -440,9 +440,9 @@ void __deal_with_filenames(SongList &v)
|
|||||||
Main->Refresh();
|
Main->Refresh();
|
||||||
Main->ReadKey(input);
|
Main->ReadKey(input);
|
||||||
if (Keypressed(input, Key.Down))
|
if (Keypressed(input, Key.Down))
|
||||||
Main->Go(wDown);
|
Main->Scroll(wDown);
|
||||||
else if (Keypressed(input, Key.Up))
|
else if (Keypressed(input, Key.Up))
|
||||||
Main->Go(wUp);
|
Main->Scroll(wUp);
|
||||||
}
|
}
|
||||||
|
|
||||||
width = COLS*0.9;
|
width = COLS*0.9;
|
||||||
@@ -465,7 +465,7 @@ void __deal_with_filenames(SongList &v)
|
|||||||
{
|
{
|
||||||
Legend = new Scrollpad((COLS-width)/2+one_width, (LINES-height)/2, two_width, height, "Legend", Config.main_color, Config.window_border);
|
Legend = new Scrollpad((COLS-width)/2+one_width, (LINES-height)/2, two_width, height, "Legend", Config.main_color, Config.window_border);
|
||||||
Legend->SetTimeout(ncmpcpp_window_timeout);
|
Legend->SetTimeout(ncmpcpp_window_timeout);
|
||||||
Legend->Add("%a - artist\n");
|
/* Legend->Add("%a - artist\n");
|
||||||
Legend->Add("%t - title\n");
|
Legend->Add("%t - title\n");
|
||||||
Legend->Add("%b - album\n");
|
Legend->Add("%b - album\n");
|
||||||
Legend->Add("%y - year\n");
|
Legend->Add("%y - year\n");
|
||||||
@@ -477,7 +477,7 @@ void __deal_with_filenames(SongList &v)
|
|||||||
Legend->Add("%C - comment\n\n");
|
Legend->Add("%C - comment\n\n");
|
||||||
Legend->Add("[.b]Files:[/b]\n");
|
Legend->Add("[.b]Files:[/b]\n");
|
||||||
for (SongList::const_iterator it = v.begin(); it != v.end(); it++)
|
for (SongList::const_iterator it = v.begin(); it != v.end(); it++)
|
||||||
Legend->Add("[." + Config.color2 + "]*[/" + Config.color2 + "] " + (*it)->GetName() + "\n");
|
Legend->Add("[." + Config.color2 + "]*[/" + Config.color2 + "] " + (*it)->GetName() + "\n");*/
|
||||||
|
|
||||||
Preview = static_cast<Scrollpad *>(Legend->EmptyClone());
|
Preview = static_cast<Scrollpad *>(Legend->EmptyClone());
|
||||||
Preview->SetTitle("Preview");
|
Preview->SetTitle("Preview");
|
||||||
@@ -517,17 +517,17 @@ void __deal_with_filenames(SongList &v)
|
|||||||
Active->ReadKey(input);
|
Active->ReadKey(input);
|
||||||
|
|
||||||
if (Keypressed(input, Key.Up))
|
if (Keypressed(input, Key.Up))
|
||||||
Active->Go(wUp);
|
Active->Scroll(wUp);
|
||||||
else if (Keypressed(input, Key.Down))
|
else if (Keypressed(input, Key.Down))
|
||||||
Active->Go(wDown);
|
Active->Scroll(wDown);
|
||||||
else if (Keypressed(input, Key.PageUp))
|
else if (Keypressed(input, Key.PageUp))
|
||||||
Active->Go(wPageUp);
|
Active->Scroll(wPageUp);
|
||||||
else if (Keypressed(input, Key.PageDown))
|
else if (Keypressed(input, Key.PageDown))
|
||||||
Active->Go(wPageDown);
|
Active->Scroll(wPageDown);
|
||||||
else if (Keypressed(input, Key.Home))
|
else if (Keypressed(input, Key.Home))
|
||||||
Active->Go(wHome);
|
Active->Scroll(wHome);
|
||||||
else if (Keypressed(input, Key.End))
|
else if (Keypressed(input, Key.End))
|
||||||
Active->Go(wEnd);
|
Active->Scroll(wEnd);
|
||||||
else if (Keypressed(input, Key.Enter) && Active == Main)
|
else if (Keypressed(input, Key.Enter) && Active == Main)
|
||||||
{
|
{
|
||||||
switch (Main->GetRealChoice())
|
switch (Main->GetRealChoice())
|
||||||
@@ -559,8 +559,8 @@ void __deal_with_filenames(SongList &v)
|
|||||||
{
|
{
|
||||||
if (preview)
|
if (preview)
|
||||||
{
|
{
|
||||||
Preview->Add("[.b]" + s.GetName() + ":[/b]\n");
|
// Preview->Add("[.b]" + s.GetName() + ":[/b]\n");
|
||||||
Preview->Add(ParseFilename(s, Config.pattern, preview) + "\n");
|
// Preview->Add(ParseFilename(s, Config.pattern, preview) + "\n");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
ParseFilename(s, Config.pattern, preview);
|
ParseFilename(s, Config.pattern, preview);
|
||||||
@@ -585,7 +585,7 @@ void __deal_with_filenames(SongList &v)
|
|||||||
}
|
}
|
||||||
if (!preview)
|
if (!preview)
|
||||||
s.SetNewName(new_file + extension);
|
s.SetNewName(new_file + extension);
|
||||||
Preview->Add(file + " [." + Config.color2 + "]->[/" + Config.color2 + "] " + new_file + extension + "\n\n");
|
// Preview->Add(file + " [." + Config.color2 + "]->[/" + Config.color2 + "] " + new_file + extension + "\n\n");
|
||||||
s.GetEmptyFields(0);
|
s.GetEmptyFields(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -635,7 +635,7 @@ void __deal_with_filenames(SongList &v)
|
|||||||
else if (Keypressed(input, Key.VolumeUp) && Active == Main)
|
else if (Keypressed(input, Key.VolumeUp) && Active == Main)
|
||||||
{
|
{
|
||||||
Active->SetBorder(Config.window_border);
|
Active->SetBorder(Config.window_border);
|
||||||
Active->Display(1);
|
Active->Display();
|
||||||
Active = Helper;
|
Active = Helper;
|
||||||
Active->SetBorder(Config.active_window_border);
|
Active->SetBorder(Config.active_window_border);
|
||||||
Active->Display();
|
Active->Display();
|
||||||
@@ -646,7 +646,7 @@ void __deal_with_filenames(SongList &v)
|
|||||||
Active->Display();
|
Active->Display();
|
||||||
Active = Main;
|
Active = Main;
|
||||||
Active->SetBorder(Config.active_window_border);
|
Active->SetBorder(Config.active_window_border);
|
||||||
Active->Display(1);
|
Active->Display();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
627
src/window.cpp
627
src/window.cpp
@@ -20,26 +20,59 @@
|
|||||||
|
|
||||||
#include "window.h"
|
#include "window.h"
|
||||||
|
|
||||||
Window::Window(int startx, int starty, int width, int height, const string &title, Color color, Border border) :
|
void InitScreen()
|
||||||
itsWindow(0),
|
|
||||||
itsWinBorder(0),
|
|
||||||
itsGetStringHelper(0),
|
|
||||||
itsStartX(startx),
|
|
||||||
itsStartY(starty),
|
|
||||||
itsWidth(width),
|
|
||||||
itsHeight(height),
|
|
||||||
itsWindowTimeout(-1),
|
|
||||||
BBEnabled(1),
|
|
||||||
AutoRefreshEnabled(1),
|
|
||||||
itsTitle(title),
|
|
||||||
itsColor(color),
|
|
||||||
itsBaseColor(color),
|
|
||||||
itsBgColor(clDefault),
|
|
||||||
itsBaseBgColor(clDefault),
|
|
||||||
itsBorder(border)
|
|
||||||
{
|
{
|
||||||
if (itsStartX < 0) itsStartX = 0;
|
setlocale(LC_ALL, "");
|
||||||
if (itsStartY < 0) itsStartY = 0;
|
initscr();
|
||||||
|
if (has_colors())
|
||||||
|
{
|
||||||
|
start_color();
|
||||||
|
use_default_colors();
|
||||||
|
int num = 1;
|
||||||
|
for (int i = -1; i < 8; i++)
|
||||||
|
for (int j = 0; j < 8; j++)
|
||||||
|
init_pair(num++, j, i);
|
||||||
|
}
|
||||||
|
noecho();
|
||||||
|
cbreak();
|
||||||
|
curs_set(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DestroyScreen()
|
||||||
|
{
|
||||||
|
curs_set(1);
|
||||||
|
endwin();
|
||||||
|
}
|
||||||
|
|
||||||
|
Window::Window(size_t startx,
|
||||||
|
size_t starty,
|
||||||
|
size_t width,
|
||||||
|
size_t height,
|
||||||
|
const string &title,
|
||||||
|
Color color,
|
||||||
|
Border border)
|
||||||
|
: itsWindow(0),
|
||||||
|
itsWinBorder(0),
|
||||||
|
itsGetStringHelper(0),
|
||||||
|
itsStartX(startx),
|
||||||
|
itsStartY(starty),
|
||||||
|
itsWidth(width),
|
||||||
|
itsHeight(height),
|
||||||
|
itsWindowTimeout(-1),
|
||||||
|
itsX(0),
|
||||||
|
itsY(0),
|
||||||
|
itsTitle(title),
|
||||||
|
itsColor(color),
|
||||||
|
itsBaseColor(color),
|
||||||
|
itsBgColor(clDefault),
|
||||||
|
itsBaseBgColor(clDefault),
|
||||||
|
itsBorder(border)
|
||||||
|
{
|
||||||
|
if (itsStartX > size_t(COLS)
|
||||||
|
|| itsStartY > size_t(LINES)
|
||||||
|
|| itsWidth+itsStartX > size_t(COLS)
|
||||||
|
|| itsHeight+itsStartY > size_t(LINES))
|
||||||
|
throw BadSize();
|
||||||
|
|
||||||
if (itsBorder != brNone)
|
if (itsBorder != brNone)
|
||||||
{
|
{
|
||||||
@@ -57,10 +90,7 @@ Window::Window(int startx, int starty, int width, int height, const string &titl
|
|||||||
itsHeight -= 2;
|
itsHeight -= 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (itsWidth > 0 && itsHeight > 0)
|
itsWindow = newwin(itsHeight, itsWidth, itsStartY, itsStartX);
|
||||||
itsWindow = newwin(itsHeight, itsWidth, itsStartY, itsStartX);
|
|
||||||
else
|
|
||||||
itsWindow = newwin(0, 0, 0, 0);
|
|
||||||
|
|
||||||
SetColor(itsColor);
|
SetColor(itsColor);
|
||||||
keypad(itsWindow, 1);
|
keypad(itsWindow, 1);
|
||||||
@@ -71,12 +101,13 @@ Window::Window(const Window &w)
|
|||||||
itsWindow = dupwin(w.itsWindow);
|
itsWindow = dupwin(w.itsWindow);
|
||||||
itsWinBorder = dupwin(w.itsWinBorder);
|
itsWinBorder = dupwin(w.itsWinBorder);
|
||||||
itsGetStringHelper = w.itsGetStringHelper;
|
itsGetStringHelper = w.itsGetStringHelper;
|
||||||
|
itsWindowTimeout = w.itsWindowTimeout;
|
||||||
|
itsX = w.itsX;
|
||||||
|
itsY = w.itsY;
|
||||||
itsStartX = w.itsStartX;
|
itsStartX = w.itsStartX;
|
||||||
itsStartY = w.itsStartY;
|
itsStartY = w.itsStartY;
|
||||||
itsWidth = w.itsWidth;
|
itsWidth = w.itsWidth;
|
||||||
itsHeight = w.itsHeight;
|
itsHeight = w.itsHeight;
|
||||||
BBEnabled = w.BBEnabled;
|
|
||||||
AutoRefreshEnabled = w.AutoRefreshEnabled;
|
|
||||||
itsTitle = w.itsTitle;
|
itsTitle = w.itsTitle;
|
||||||
itsColors = w.itsColors;
|
itsColors = w.itsColors;
|
||||||
itsColor = w.itsColor;
|
itsColor = w.itsColor;
|
||||||
@@ -84,6 +115,8 @@ Window::Window(const Window &w)
|
|||||||
itsBgColor = w.itsBgColor;
|
itsBgColor = w.itsBgColor;
|
||||||
itsBaseBgColor = w.itsBaseBgColor;
|
itsBaseBgColor = w.itsBaseBgColor;
|
||||||
itsBorder = w.itsBorder;
|
itsBorder = w.itsBorder;
|
||||||
|
SetColor(itsColor, itsBgColor);
|
||||||
|
keypad(itsWindow, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
Window::~Window()
|
Window::~Window()
|
||||||
@@ -230,13 +263,13 @@ void Window::ShowBorder() const
|
|||||||
refresh();
|
refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Window::Display(bool stub)
|
void Window::Display()
|
||||||
{
|
{
|
||||||
ShowBorder();
|
ShowBorder();
|
||||||
Refresh(stub);
|
Refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Window::Refresh(bool)
|
void Window::Refresh()
|
||||||
{
|
{
|
||||||
wrefresh(itsWindow);
|
wrefresh(itsWindow);
|
||||||
}
|
}
|
||||||
@@ -269,11 +302,6 @@ void Window::AltCharset(bool alt) const
|
|||||||
alt ? wattron(itsWindow, A_ALTCHARSET) : wattroff(itsWindow, A_ALTCHARSET);
|
alt ? wattron(itsWindow, A_ALTCHARSET) : wattroff(itsWindow, A_ALTCHARSET);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Window::Delay(bool delay) const
|
|
||||||
{
|
|
||||||
nodelay(itsWindow, !delay);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Window::SetTimeout(int timeout)
|
void Window::SetTimeout(int timeout)
|
||||||
{
|
{
|
||||||
itsWindowTimeout = timeout;
|
itsWindowTimeout = timeout;
|
||||||
@@ -292,145 +320,17 @@ void Window::ReadKey() const
|
|||||||
|
|
||||||
void Window::Write(int limit, const string &str, bool clrtoeol)
|
void Window::Write(int limit, const string &str, bool clrtoeol)
|
||||||
{
|
{
|
||||||
if (BBEnabled)
|
waddstr(itsWindow,str.c_str());
|
||||||
{
|
|
||||||
bool collect = false;
|
|
||||||
string color, tmp;
|
|
||||||
for (string::const_iterator it = str.begin(); it != str.end() && limit > 0; it++)
|
|
||||||
{
|
|
||||||
if (*it == '[' && (*(it+1) == '.' || *(it+1) == '/'))
|
|
||||||
collect = 1;
|
|
||||||
|
|
||||||
if (!collect)
|
|
||||||
{
|
|
||||||
tmp += *it;
|
|
||||||
limit--;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (*it != '[')
|
|
||||||
{
|
|
||||||
color += *it;
|
|
||||||
if (color.length() > 10) collect = 0; // longest bbcode is 10 chars long
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
limit -= color.length();
|
|
||||||
tmp += color;
|
|
||||||
color = *it;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (*it == ']' || it+1 == str.end())
|
|
||||||
collect = 0;
|
|
||||||
|
|
||||||
if (!collect && !color.empty())
|
|
||||||
{
|
|
||||||
waddstr(itsWindow,tmp.c_str());
|
|
||||||
tmp.clear();
|
|
||||||
|
|
||||||
if (isdigit(color[2]))
|
|
||||||
{
|
|
||||||
int x, y;
|
|
||||||
getyx(itsWindow, y, x);
|
|
||||||
Coordinates coords = IntoCoordinates(color);
|
|
||||||
wmove(itsWindow, coords.second == -1 ? y : coords.second, coords.first);
|
|
||||||
limit -= coords.first-x;
|
|
||||||
}
|
|
||||||
else if (IsValidColor(color))
|
|
||||||
{
|
|
||||||
ColorPair colors = IntoColor(color);
|
|
||||||
SetColor(colors.first, colors.second);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
limit -= color.length();
|
|
||||||
tmp += limit > 0 ? color : color.substr(0, color.length()+limit);
|
|
||||||
}
|
|
||||||
color.clear();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!tmp.empty()) waddstr(itsWindow,tmp.c_str());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
waddstr(itsWindow,str.c_str());
|
|
||||||
|
|
||||||
if (clrtoeol)
|
if (clrtoeol)
|
||||||
wclrtoeol(itsWindow);
|
wclrtoeol(itsWindow);
|
||||||
if (AutoRefreshEnabled)
|
|
||||||
wrefresh(itsWindow);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef UTF8_ENABLED
|
#ifdef _UTF8
|
||||||
void Window::Write(int limit, const wstring &str, bool clrtoeol)
|
void Window::Write(int limit, const wstring &str, bool clrtoeol)
|
||||||
{
|
{
|
||||||
if (BBEnabled)
|
wprintw(itsWindow, "%ls", str.c_str());
|
||||||
{
|
|
||||||
bool collect = false;
|
|
||||||
wstring color, tmp;
|
|
||||||
for (wstring::const_iterator it = str.begin(); it != str.end() && limit > 0; it++)
|
|
||||||
{
|
|
||||||
if (*it == '[' && (*(it+1) == '.' || *(it+1) == '/'))
|
|
||||||
collect = 1;
|
|
||||||
|
|
||||||
if (!collect)
|
|
||||||
{
|
|
||||||
tmp += *it;
|
|
||||||
limit -= wcwidth(*it);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (*it != '[')
|
|
||||||
{
|
|
||||||
color += *it;
|
|
||||||
if (color.length() > 10) collect = 0; // longest bbcode is 10 chars long
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
limit -= Length(color);
|
|
||||||
tmp += color;
|
|
||||||
color = *it;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (*it == ']' || it+1 == str.end())
|
|
||||||
collect = 0;
|
|
||||||
|
|
||||||
if (!collect && !color.empty())
|
|
||||||
{
|
|
||||||
wprintw(itsWindow, "%ls", tmp.c_str());
|
|
||||||
tmp.clear();
|
|
||||||
|
|
||||||
if (isdigit(color[2]))
|
|
||||||
{
|
|
||||||
int x, y;
|
|
||||||
getyx(itsWindow, y, x);
|
|
||||||
Coordinates coords = IntoCoordinates(ToString(color));
|
|
||||||
wmove(itsWindow, coords.second < 0 ? y : coords.second, coords.first);
|
|
||||||
limit -= coords.first-x;
|
|
||||||
}
|
|
||||||
else if (IsValidColor(ToString(color)))
|
|
||||||
{
|
|
||||||
ColorPair colors = IntoColor(ToString(color));
|
|
||||||
SetColor(colors.first, colors.second);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
limit -= Length(color);
|
|
||||||
tmp += limit > 0 ? color : color.substr(0, color.length()+limit);
|
|
||||||
}
|
|
||||||
color.clear();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!tmp.empty()) wprintw(itsWindow, "%ls", tmp.c_str());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
wprintw(itsWindow, "%ls", str.c_str());
|
|
||||||
|
|
||||||
if (clrtoeol)
|
if (clrtoeol)
|
||||||
wclrtoeol(itsWindow);
|
wclrtoeol(itsWindow);
|
||||||
if (AutoRefreshEnabled)
|
|
||||||
wrefresh(itsWindow);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Window::WriteXY(int x, int y, int limit, const wstring &str, bool cleartoeol)
|
void Window::WriteXY(int x, int y, int limit, const wstring &str, bool cleartoeol)
|
||||||
@@ -446,20 +346,20 @@ void Window::WriteXY(int x, int y, int limit, const string &str, bool cleartoeol
|
|||||||
Write(limit, str, cleartoeol);
|
Write(limit, str, cleartoeol);
|
||||||
}
|
}
|
||||||
|
|
||||||
string Window::GetString(const string &base, unsigned int length, int width) const
|
string Window::GetString(const string &base, size_t length, size_t width) const
|
||||||
{
|
{
|
||||||
int input, beginning, maxbeginning, minx, x, y, maxx;
|
int input;
|
||||||
|
size_t beginning, maxbeginning, minx, x, y, maxx;
|
||||||
|
|
||||||
getyx(itsWindow, y, x);
|
getyx(itsWindow, y, x);
|
||||||
minx = maxx = x;
|
minx = maxx = x;
|
||||||
|
|
||||||
width--;
|
width--;
|
||||||
if (width == -1)
|
if (width == size_t(-1))
|
||||||
width = itsWidth-x-1;
|
width = itsWidth-x-1;
|
||||||
if (width < 0)
|
|
||||||
return "";
|
|
||||||
|
|
||||||
curs_set(1);
|
curs_set(1);
|
||||||
wstring tmp = ToWString(base);
|
std::wstring tmp = ToWString(base);
|
||||||
|
|
||||||
string tmp_in;
|
string tmp_in;
|
||||||
wchar_t wc_in;
|
wchar_t wc_in;
|
||||||
@@ -570,26 +470,41 @@ string Window::GetString(const string &base, unsigned int length, int width) con
|
|||||||
}
|
}
|
||||||
while (input != 10);
|
while (input != 10);
|
||||||
curs_set(0);
|
curs_set(0);
|
||||||
|
|
||||||
return ToString(tmp);
|
return ToString(tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Window::GetXY(int &x, int &y)
|
||||||
|
{
|
||||||
|
getyx(itsWindow, y, x);
|
||||||
|
itsX = x;
|
||||||
|
itsY = y;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Window::GotoXY(int x, int y)
|
||||||
|
{
|
||||||
|
wmove(itsWindow, y, x);
|
||||||
|
itsX = x;
|
||||||
|
itsY = y;
|
||||||
|
}
|
||||||
|
|
||||||
|
const int &Window::X() const
|
||||||
|
{
|
||||||
|
return itsX;
|
||||||
|
}
|
||||||
|
|
||||||
|
const int &Window::Y() const
|
||||||
|
{
|
||||||
|
return itsY;
|
||||||
|
}
|
||||||
|
|
||||||
void Window::Scrollable(bool scrollable) const
|
void Window::Scrollable(bool scrollable) const
|
||||||
{
|
{
|
||||||
scrollok(itsWindow, scrollable);
|
scrollok(itsWindow, scrollable);
|
||||||
idlok(itsWindow, scrollable);
|
idlok(itsWindow, scrollable);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Window::GetXY(int &x, int &y) const
|
size_t Window::GetWidth() const
|
||||||
{
|
|
||||||
getyx(itsWindow, y, x);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Window::GotoXY(int x, int y) const
|
|
||||||
{
|
|
||||||
wmove(itsWindow, y, x);
|
|
||||||
}
|
|
||||||
|
|
||||||
int Window::GetWidth() const
|
|
||||||
{
|
{
|
||||||
if (itsBorder != brNone)
|
if (itsBorder != brNone)
|
||||||
return itsWidth+2;
|
return itsWidth+2;
|
||||||
@@ -597,9 +512,9 @@ int Window::GetWidth() const
|
|||||||
return itsWidth;
|
return itsWidth;
|
||||||
}
|
}
|
||||||
|
|
||||||
int Window::GetHeight() const
|
size_t Window::GetHeight() const
|
||||||
{
|
{
|
||||||
int height = itsHeight;
|
size_t height = itsHeight;
|
||||||
if (itsBorder != brNone)
|
if (itsBorder != brNone)
|
||||||
height += 2;
|
height += 2;
|
||||||
if (!itsTitle.empty())
|
if (!itsTitle.empty())
|
||||||
@@ -607,7 +522,7 @@ int Window::GetHeight() const
|
|||||||
return height;
|
return height;
|
||||||
}
|
}
|
||||||
|
|
||||||
int Window::GetStartX() const
|
size_t Window::GetStartX() const
|
||||||
{
|
{
|
||||||
if (itsBorder != brNone)
|
if (itsBorder != brNone)
|
||||||
return itsStartX-1;
|
return itsStartX-1;
|
||||||
@@ -615,9 +530,9 @@ int Window::GetStartX() const
|
|||||||
return itsStartX;
|
return itsStartX;
|
||||||
}
|
}
|
||||||
|
|
||||||
int Window::GetStartY() const
|
size_t Window::GetStartY() const
|
||||||
{
|
{
|
||||||
int starty = itsStartY;
|
size_t starty = itsStartY;
|
||||||
if (itsBorder != brNone)
|
if (itsBorder != brNone)
|
||||||
starty--;
|
starty--;
|
||||||
if (!itsTitle.empty())
|
if (!itsTitle.empty())
|
||||||
@@ -625,7 +540,7 @@ int Window::GetStartY() const
|
|||||||
return starty;
|
return starty;
|
||||||
}
|
}
|
||||||
|
|
||||||
string Window::GetTitle() const
|
const string &Window::GetTitle() const
|
||||||
{
|
{
|
||||||
return itsTitle;
|
return itsTitle;
|
||||||
}
|
}
|
||||||
@@ -640,186 +555,216 @@ Border Window::GetBorder() const
|
|||||||
return itsBorder;
|
return itsBorder;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Window::EnableColors()
|
void Window::Scroll(Where where)
|
||||||
{
|
{
|
||||||
if (has_colors())
|
idlok(itsWindow, 1);
|
||||||
|
scrollok(itsWindow, 1);
|
||||||
|
switch (where)
|
||||||
{
|
{
|
||||||
start_color();
|
case wUp:
|
||||||
use_default_colors();
|
wscrl(itsWindow, 1);
|
||||||
int num = 1;
|
break;
|
||||||
for (int i = -1; i < 8; i++)
|
case wDown:
|
||||||
for (int j = 0; j < 8; j++)
|
wscrl(itsWindow, -1);
|
||||||
init_pair(num++, j, i);
|
break;
|
||||||
|
case wPageUp:
|
||||||
|
wscrl(itsWindow, itsWidth);
|
||||||
|
break;
|
||||||
|
case wPageDown:
|
||||||
|
wscrl(itsWindow, -itsWidth);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
idlok(itsWindow, 0);
|
||||||
|
scrollok(itsWindow, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Window &Window::operator<<(const Colors &colors)
|
||||||
|
{
|
||||||
|
if (colors.fg == clEnd || colors.bg == clEnd)
|
||||||
|
return *this;
|
||||||
|
itsColors.push(colors);
|
||||||
|
SetColor(colors.fg, colors.bg);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Window &Window::operator<<(const Color &color)
|
||||||
|
{
|
||||||
|
switch (color)
|
||||||
|
{
|
||||||
|
case clDefault:
|
||||||
|
while (!itsColors.empty())
|
||||||
|
itsColors.pop();
|
||||||
|
SetColor(itsBaseColor, itsBaseBgColor);
|
||||||
|
break;
|
||||||
|
case clEnd:
|
||||||
|
if (!itsColors.empty())
|
||||||
|
itsColors.pop();
|
||||||
|
if (!itsColors.empty())
|
||||||
|
SetColor(itsColors.top().fg, itsColors.top().bg);
|
||||||
|
else
|
||||||
|
SetColor(itsBaseColor, itsBaseBgColor);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
itsColors.push(Colors(color, clDefault));
|
||||||
|
SetColor(itsColors.top().fg, itsColors.top().bg);
|
||||||
|
}
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Window &Window::operator<<(const Format &format)
|
||||||
|
{
|
||||||
|
switch (format)
|
||||||
|
{
|
||||||
|
case fmtNone:
|
||||||
|
Bold(0);
|
||||||
|
Reverse(0);
|
||||||
|
AltCharset(0);
|
||||||
|
break;
|
||||||
|
case fmtBold:
|
||||||
|
Bold(1);
|
||||||
|
break;
|
||||||
|
case fmtBoldEnd:
|
||||||
|
Bold(0);
|
||||||
|
break;
|
||||||
|
case fmtReverse:
|
||||||
|
Reverse(1);
|
||||||
|
break;
|
||||||
|
case fmtReverseEnd:
|
||||||
|
Reverse(0);
|
||||||
|
break;
|
||||||
|
case fmtAltCharset:
|
||||||
|
AltCharset(1);
|
||||||
|
break;
|
||||||
|
case fmtAltCharsetEnd:
|
||||||
|
AltCharset(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Window &Window::operator<<(const XY &coords)
|
||||||
|
{
|
||||||
|
GotoXY(coords.x, coords.y);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Window &Window::operator<<(const char *s)
|
||||||
|
{
|
||||||
|
wprintw(itsWindow, "%s", s);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Window &Window::operator<<(const char &c)
|
||||||
|
{
|
||||||
|
wprintw(itsWindow, "%c", c);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Window &Window::operator<<(const wchar_t *ws)
|
||||||
|
{
|
||||||
|
wprintw(itsWindow, "%ls", ws);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Window &Window::operator<<(const wchar_t &wc)
|
||||||
|
{
|
||||||
|
wprintw(itsWindow, "%lc", wc);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Window &Window::operator<<(const int &i)
|
||||||
|
{
|
||||||
|
wprintw(itsWindow, "%d", i);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Window &Window::operator<<(const double &d)
|
||||||
|
{
|
||||||
|
wprintw(itsWindow, "%f", d);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Window &Window::operator<<(const string &s)
|
||||||
|
{
|
||||||
|
wprintw(itsWindow, "%s", s.c_str());
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Window &Window::operator<<(const wstring &ws)
|
||||||
|
{
|
||||||
|
for (wstring::const_iterator it = ws.begin(); it != ws.end(); it++)
|
||||||
|
wprintw(itsWindow, "%lc", *it);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
Window &Window::operator<<(const size_t &s)
|
||||||
|
{
|
||||||
|
wprintw(itsWindow, "%u", s);
|
||||||
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
Window * Window::EmptyClone() const
|
Window * Window::EmptyClone() const
|
||||||
{
|
{
|
||||||
return new Window(GetStartX(),GetStartY(),GetWidth(),GetHeight(),itsTitle,itsBaseColor,itsBorder);
|
return new Window(GetStartX(), GetStartY(), GetWidth(), GetHeight(), itsTitle, itsBaseColor, itsBorder);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*char * ToString(const wchar_t *ws)
|
char *ToString(const wchar_t *ws)
|
||||||
{
|
{
|
||||||
string s;
|
mbstate_t mbs;
|
||||||
for (int i = 0; i < wcslen(ws); i++)
|
memset(&mbs, 0, sizeof(mbs));
|
||||||
{
|
size_t len = wcsrtombs(NULL, &ws, 0, &mbs);
|
||||||
char *c = new char[MB_CUR_MAX+1]();
|
|
||||||
if (wctomb(c, ws[i]) > 0)
|
if (len == size_t(-1))
|
||||||
s += c;
|
return 0;
|
||||||
delete [] c;
|
|
||||||
}
|
char *s = new char[len+1]();
|
||||||
char *result = strdup(s.c_str());
|
wcsrtombs(s, &ws, len, &mbs);
|
||||||
return result;
|
s[len] = 0;
|
||||||
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
wchar_t * ToWString(const char *s)
|
wchar_t *ToWString(const char *s)
|
||||||
{
|
{
|
||||||
wchar_t *ws = new wchar_t[strlen(s)+1]();
|
mbstate_t mbs;
|
||||||
mbstowcs(ws, s, strlen(s));
|
memset(&mbs, 0, sizeof(mbs));
|
||||||
|
size_t len = mbsrtowcs(NULL, &s, 0, &mbs);
|
||||||
|
|
||||||
|
if (len == size_t(-1))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
wchar_t *ws = new wchar_t[len+1]();
|
||||||
|
mbsrtowcs(ws, &s, len, &mbs);
|
||||||
|
ws[len] = 0;
|
||||||
return ws;
|
return ws;
|
||||||
}*/
|
}
|
||||||
|
|
||||||
string ToString(const wstring &ws)
|
string ToString(const wstring &ws)
|
||||||
{
|
{
|
||||||
string s;
|
string result;
|
||||||
const wchar_t *c_ws = ws.c_str();
|
char *s = ToString(ws.c_str());
|
||||||
mbstate_t mbs;
|
if (s)
|
||||||
memset(&mbs, 0, sizeof(mbs));
|
{
|
||||||
int len = wcsrtombs(NULL, &c_ws, 0, &mbs);
|
result = s;
|
||||||
|
delete [] s;
|
||||||
if (len <= 0)
|
}
|
||||||
return s;
|
return result;
|
||||||
|
|
||||||
char *c_s = new char[len+1]();
|
|
||||||
wcsrtombs(c_s, &c_ws, len, &mbs);
|
|
||||||
c_s[len] = 0;
|
|
||||||
s = c_s;
|
|
||||||
delete [] c_s;
|
|
||||||
return s;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
wstring ToWString(const string &s)
|
wstring ToWString(const string &s)
|
||||||
{
|
{
|
||||||
wstring ws;
|
wstring result;
|
||||||
const char *c_s = s.c_str();
|
wchar_t *ws = ToWString(s.c_str());
|
||||||
mbstate_t mbs;
|
if (ws)
|
||||||
memset(&mbs, 0, sizeof(mbs));
|
|
||||||
int len = mbsrtowcs(NULL, &c_s, 0, &mbs);
|
|
||||||
|
|
||||||
if (len <= 0)
|
|
||||||
return ws;
|
|
||||||
|
|
||||||
wchar_t *c_ws = new wchar_t[len+1]();
|
|
||||||
mbsrtowcs(c_ws, &c_s, len, &mbs);
|
|
||||||
c_ws[len] = 0;
|
|
||||||
ws = c_ws;
|
|
||||||
delete [] c_ws;
|
|
||||||
return ws;
|
|
||||||
}
|
|
||||||
|
|
||||||
Coordinates Window::IntoCoordinates(const string &s)
|
|
||||||
{
|
|
||||||
Coordinates result;
|
|
||||||
size_t sep = s.find(",");
|
|
||||||
if (sep != string::npos)
|
|
||||||
{
|
{
|
||||||
result.first = atoi(s.substr(2, sep-2).c_str());
|
result = ws;
|
||||||
result.second = atoi(s.substr(sep+1).c_str());
|
delete [] ws;
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
result.first = atoi(s.substr(2).c_str());
|
|
||||||
result.second = -1;
|
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
string Window::OmitBBCodes(const string &str)
|
|
||||||
{
|
|
||||||
bool collect = false;
|
|
||||||
string tmp, color, result;
|
|
||||||
for (string::const_iterator it = str.begin(); it != str.end(); it++)
|
|
||||||
{
|
|
||||||
if (*it == '[' && (*(it+1) == '.' || *(it+1) == '/'))
|
|
||||||
collect = 1;
|
|
||||||
|
|
||||||
if (!collect)
|
|
||||||
tmp += *it;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (*it != '[')
|
|
||||||
color += *it;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
tmp += color;
|
|
||||||
color = *it;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (*it == ']' || it+1 == str.end())
|
|
||||||
collect = 0;
|
|
||||||
|
|
||||||
if (!collect && !color.empty())
|
|
||||||
{
|
|
||||||
result += tmp;
|
|
||||||
tmp.clear();
|
|
||||||
if (!isdigit(tmp[2]) && !IsValidColor(color))
|
|
||||||
tmp += color;
|
|
||||||
color.clear();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!tmp.empty()) result += tmp;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Window::RealLength(const string &s)
|
|
||||||
{
|
|
||||||
if (s.empty())
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
bool collect = false;
|
|
||||||
int length = 0;
|
|
||||||
|
|
||||||
# ifdef UTF8_ENABLED
|
|
||||||
wstring ws = ToWString(s);
|
|
||||||
wstring tmp;
|
|
||||||
# else
|
|
||||||
const string &ws = s;
|
|
||||||
string tmp;
|
|
||||||
# endif
|
|
||||||
|
|
||||||
for (int i = 0; i < ws.length(); i++, length++)
|
|
||||||
{
|
|
||||||
if (ws[i] == '[' && (ws[i+1] == '.' || ws[i+1] == '/'))
|
|
||||||
collect = 1;
|
|
||||||
|
|
||||||
if (collect)
|
|
||||||
{
|
|
||||||
if (ws[i] != '[')
|
|
||||||
tmp += ws[i];
|
|
||||||
else
|
|
||||||
tmp = ws[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ws[i] == ']')
|
|
||||||
collect = 0;
|
|
||||||
|
|
||||||
if (!collect && !tmp.empty())
|
|
||||||
{
|
|
||||||
if (isdigit(tmp[2]) || IsValidColor(TO_STRING(tmp)))
|
|
||||||
{
|
|
||||||
# ifdef UTF8_ENABLED
|
|
||||||
length -= Length(tmp);
|
|
||||||
# else
|
|
||||||
length -= tmp.length();
|
|
||||||
# endif
|
|
||||||
}
|
|
||||||
tmp.clear();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return length;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t Window::Length(const wstring &ws)
|
size_t Window::Length(const wstring &ws)
|
||||||
{
|
{
|
||||||
size_t length = 0;
|
size_t length = 0;
|
||||||
|
|||||||
180
src/window.h
180
src/window.h
@@ -33,13 +33,15 @@
|
|||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
|
||||||
#ifdef UTF8_ENABLED
|
#ifdef _UTF8
|
||||||
# define UNICODE 1
|
# define UNICODE 1
|
||||||
|
# define my_char_t wchar_t
|
||||||
# define my_string_t wstring
|
# define my_string_t wstring
|
||||||
# define TO_STRING(x) ToString(x)
|
# define TO_STRING(x) ToString(x)
|
||||||
# define TO_WSTRING(x) ToWString(x)
|
# define TO_WSTRING(x) ToWString(x)
|
||||||
#else
|
#else
|
||||||
# define UNICODE 0
|
# define UNICODE 0
|
||||||
|
# define my_char_t char
|
||||||
# define my_string_t string
|
# define my_string_t string
|
||||||
# define TO_STRING(x) x
|
# define TO_STRING(x) x
|
||||||
# define TO_WSTRING(x) x
|
# define TO_WSTRING(x) x
|
||||||
@@ -49,70 +51,114 @@ using std::string;
|
|||||||
using std::wstring;
|
using std::wstring;
|
||||||
using std::vector;
|
using std::vector;
|
||||||
|
|
||||||
enum Color { clDefault, clBlack, clRed, clGreen, clYellow, clBlue, clMagenta, clCyan, clWhite };
|
enum Color { clDefault, clBlack, clRed, clGreen, clYellow, clBlue, clMagenta, clCyan, clWhite, clEnd };
|
||||||
|
enum Format { fmtNone = 100, fmtBold, fmtBoldEnd, fmtReverse, fmtReverseEnd, fmtAltCharset, fmtAltCharsetEnd };
|
||||||
enum Border { brNone, brBlack, brRed, brGreen, brYellow, brBlue, brMagenta, brCyan, brWhite };
|
enum Border { brNone, brBlack, brRed, brGreen, brYellow, brBlue, brMagenta, brCyan, brWhite };
|
||||||
enum Where { wUp, wDown, wPageUp, wPageDown, wHome, wEnd };
|
enum Where { wUp, wDown, wPageUp, wPageDown, wHome, wEnd };
|
||||||
|
|
||||||
typedef void (*GetStringHelper)();
|
typedef void (*GetStringHelper)();
|
||||||
typedef std::pair<Color, Color> ColorPair;
|
|
||||||
typedef std::pair<int, int> Coordinates;
|
|
||||||
|
|
||||||
string ToString(const wstring &);
|
void InitScreen();
|
||||||
wstring ToWString(const string &);
|
void DestroyScreen();
|
||||||
|
|
||||||
|
struct Colors
|
||||||
|
{
|
||||||
|
Colors(Color one, Color two = clDefault) : fg(one), bg(two) { }
|
||||||
|
Color fg;
|
||||||
|
Color bg;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct XY
|
||||||
|
{
|
||||||
|
XY(int xx, int yy) : x(xx), y(yy) { }
|
||||||
|
int x;
|
||||||
|
int y;
|
||||||
|
};
|
||||||
|
|
||||||
|
char *ToString(const wchar_t *);
|
||||||
|
wchar_t *ToWString(const char *);
|
||||||
|
std::string ToString(const std::wstring &);
|
||||||
|
std::wstring ToWString(const std::string &);
|
||||||
|
|
||||||
class Window
|
class Window
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Window(int, int, int, int, const string &, Color, Border);
|
Window(size_t, size_t, size_t, size_t, const std::string &, Color, Border);
|
||||||
Window(const Window &);
|
Window(const Window &);
|
||||||
virtual ~Window();
|
virtual ~Window();
|
||||||
virtual WINDOW *RawWin() const { return itsWindow; }
|
|
||||||
virtual void SetGetStringHelper(GetStringHelper helper) { itsGetStringHelper = helper; }
|
WINDOW *Raw() const { return itsWindow; }
|
||||||
virtual void SetColor(Color, Color = clDefault);
|
|
||||||
virtual void SetBaseColor(Color, Color = clDefault);
|
size_t GetWidth() const;
|
||||||
virtual void SetBorder(Border);
|
size_t GetHeight() const;
|
||||||
virtual void EnableBB() { BBEnabled = 1; }
|
size_t GetStartX() const;
|
||||||
virtual void DisableBB() { BBEnabled = 0; }
|
size_t GetStartY() const;
|
||||||
virtual void SetTitle(const string &);
|
|
||||||
|
const std::string &GetTitle() const;
|
||||||
|
Color GetColor() const;
|
||||||
|
Border GetBorder() const;
|
||||||
|
std::string GetString(const std::string &, size_t = -1, size_t = 0) const;
|
||||||
|
string GetString(unsigned int length = -1, int width = 0) const { return GetString("", length, width); }
|
||||||
|
void GetXY(int &, int &);
|
||||||
|
void GotoXY(int, int);
|
||||||
|
const int &X() const;
|
||||||
|
const int &Y() const;
|
||||||
|
|
||||||
|
void SetGetStringHelper(GetStringHelper helper) { itsGetStringHelper = helper; }
|
||||||
|
void SetColor(Color, Color = clDefault);
|
||||||
|
void SetBaseColor(Color, Color = clDefault);
|
||||||
|
void SetBorder(Border);
|
||||||
|
void SetTimeout(int);
|
||||||
|
void SetTitle(const string &);
|
||||||
|
|
||||||
|
void Hide(char = 32) const;
|
||||||
|
void Bold(bool) const;
|
||||||
|
void Reverse(bool) const;
|
||||||
|
void AltCharset(bool) const;
|
||||||
|
|
||||||
|
void Display();
|
||||||
|
virtual void Refresh();
|
||||||
|
|
||||||
virtual void MoveTo(int, int);
|
virtual void MoveTo(int, int);
|
||||||
virtual void Resize(int, int);
|
virtual void Resize(int, int);
|
||||||
virtual void Display(bool = 0);
|
|
||||||
virtual void Refresh(bool = 0);
|
|
||||||
virtual void Clear(bool stub = 1);
|
virtual void Clear(bool stub = 1);
|
||||||
virtual void Hide(char = 32) const;
|
|
||||||
virtual void Bold(bool) const;
|
|
||||||
virtual void Reverse(bool) const;
|
|
||||||
virtual void AltCharset(bool) const;
|
|
||||||
virtual void Delay(bool) const;
|
|
||||||
virtual void SetTimeout(int);
|
|
||||||
virtual void AutoRefresh(bool val) { AutoRefreshEnabled = val; }
|
|
||||||
virtual void ReadKey(int &) const;
|
|
||||||
virtual void ReadKey() const;
|
|
||||||
virtual void Write(const string &s, bool cte = 0) { Write(0xFFFF, s, cte); }
|
|
||||||
virtual void Write(int, const string &, bool = 0);
|
|
||||||
virtual void WriteXY(int x, int y, const string &s, bool ete = 0) { WriteXY(x, y, 0xFFFF, s, ete); }
|
|
||||||
virtual void WriteXY(int, int, int, const string &, bool = 0);
|
|
||||||
# ifdef UTF8_ENABLED
|
|
||||||
virtual void Write(const wstring &s, bool cte = 0) { Write(0xFFFF, s, cte); }
|
|
||||||
virtual void Write(int, const wstring &, bool = 0);
|
|
||||||
virtual void WriteXY(int x, int y, const wstring &s, bool ete = 0) { WriteXY(x, y, 0xFFFF, s, ete); }
|
|
||||||
virtual void WriteXY(int, int, int, const wstring &, bool = 0);
|
|
||||||
# endif
|
|
||||||
virtual string GetString(const string &, unsigned int = -1, int = 0) const;
|
|
||||||
virtual string GetString(unsigned int length = -1, int width = 0) const { return GetString("", length, width); }
|
|
||||||
virtual void Scrollable(bool) const;
|
|
||||||
virtual void GetXY(int &, int &) const;
|
|
||||||
virtual void GotoXY(int, int) const;
|
|
||||||
virtual int GetWidth() const;
|
|
||||||
virtual int GetHeight() const;
|
|
||||||
virtual int GetStartX() const;
|
|
||||||
virtual int GetStartY() const;
|
|
||||||
virtual string GetTitle() const;
|
|
||||||
virtual Color GetColor() const;
|
|
||||||
virtual Border GetBorder() const;
|
|
||||||
|
|
||||||
virtual Window * Clone() const { return new Window(*this); }
|
void ReadKey(int &) const;
|
||||||
virtual Window * EmptyClone() const;
|
void ReadKey() const;
|
||||||
|
|
||||||
|
void Write(const string &s, bool cte = 0) { Write(0xFFFF, s, cte); }
|
||||||
|
void Write(int, const string &, bool = 0);
|
||||||
|
void WriteXY(int x, int y, const string &s, bool ete = 0) { WriteXY(x, y, 0xFFFF, s, ete); }
|
||||||
|
void WriteXY(int, int, int, const string &, bool = 0);
|
||||||
|
# ifdef _UTF8
|
||||||
|
void Write(const wstring &s, bool cte = 0) { Write(0xFFFF, s, cte); }
|
||||||
|
void Write(int, const wstring &, bool = 0);
|
||||||
|
void WriteXY(int x, int y, const wstring &s, bool ete = 0) { WriteXY(x, y, 0xFFFF, s, ete); }
|
||||||
|
void WriteXY(int, int, int, const wstring &, bool = 0);
|
||||||
|
# endif
|
||||||
|
|
||||||
|
void Scrollable(bool) const;
|
||||||
|
virtual void Scroll(Where);
|
||||||
|
|
||||||
|
Window &operator<<(const Colors &);
|
||||||
|
Window &operator<<(const Color &);
|
||||||
|
Window &operator<<(const Format &);
|
||||||
|
Window &operator<<(const XY &);
|
||||||
|
Window &operator<<(const char *);
|
||||||
|
Window &operator<<(const char &);
|
||||||
|
Window &operator<<(const wchar_t *);
|
||||||
|
Window &operator<<(const wchar_t &);
|
||||||
|
Window &operator<<(const int &);
|
||||||
|
Window &operator<<(const double &);
|
||||||
|
Window &operator<<(const size_t &);
|
||||||
|
|
||||||
|
Window &operator<<(const std::string &);
|
||||||
|
Window &operator<<(const std::wstring &);
|
||||||
|
|
||||||
|
virtual Window *Clone() const { return new Window(*this); }
|
||||||
|
virtual Window *EmptyClone() const;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// stubs for inherits, ugly shit, needs improvement
|
// stubs for inherits, ugly shit, needs improvement
|
||||||
virtual void Select(int, bool) { }
|
virtual void Select(int, bool) { }
|
||||||
@@ -123,38 +169,40 @@ class Window
|
|||||||
virtual bool IsStatic(int = -1) const { return 0; }
|
virtual bool IsStatic(int = -1) const { return 0; }
|
||||||
virtual void Highlight(int) { }
|
virtual void Highlight(int) { }
|
||||||
virtual string GetOption(int = -1) const { return ""; }
|
virtual string GetOption(int = -1) const { return ""; }
|
||||||
virtual void Go(Where) { } // for Menu and Scrollpad class
|
|
||||||
virtual int GetChoice() const { return -1; } // for Menu class
|
virtual int GetChoice() const { return -1; } // for Menu class
|
||||||
virtual void Add(string str) { Write(str); } // for Scrollpad class
|
//virtual void Add(string str) { Write(str); } // for Scrollpad class
|
||||||
|
|
||||||
static void EnableColors();
|
|
||||||
static Coordinates IntoCoordinates(const string &);
|
|
||||||
static bool IsValidColor(const string &);
|
|
||||||
static string OmitBBCodes(const string &);
|
|
||||||
static size_t RealLength(const string &);
|
|
||||||
static size_t Length(const string &s) { return Length(ToWString(s)); }
|
|
||||||
static size_t Length(const wstring &);
|
static size_t Length(const wstring &);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
class BadSize { };
|
||||||
|
|
||||||
virtual void Recreate();
|
virtual void Recreate();
|
||||||
virtual void ShowBorder() const;
|
virtual void ShowBorder() const;
|
||||||
virtual ColorPair IntoColor(const string &);
|
|
||||||
WINDOW *itsWindow;
|
WINDOW *itsWindow;
|
||||||
WINDOW *itsWinBorder;
|
WINDOW *itsWinBorder;
|
||||||
|
|
||||||
GetStringHelper itsGetStringHelper;
|
GetStringHelper itsGetStringHelper;
|
||||||
int itsStartX;
|
|
||||||
int itsStartY;
|
size_t itsStartX;
|
||||||
int itsWidth;
|
size_t itsStartY;
|
||||||
int itsHeight;
|
size_t itsWidth;
|
||||||
|
size_t itsHeight;
|
||||||
|
|
||||||
int itsWindowTimeout;
|
int itsWindowTimeout;
|
||||||
bool BBEnabled;
|
int itsX;
|
||||||
bool AutoRefreshEnabled;
|
int itsY;
|
||||||
|
|
||||||
string itsTitle;
|
string itsTitle;
|
||||||
std::stack<ColorPair> itsColors;
|
std::stack<Colors> itsColors;
|
||||||
|
|
||||||
Color itsColor;
|
Color itsColor;
|
||||||
Color itsBaseColor;
|
Color itsBaseColor;
|
||||||
Color itsBgColor;
|
Color itsBgColor;
|
||||||
Color itsBaseBgColor;
|
Color itsBaseBgColor;
|
||||||
|
|
||||||
Border itsBorder;
|
Border itsBorder;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user