actions: use namespace

This commit is contained in:
Andrzej Rybczak
2012-10-06 18:28:14 +02:00
parent 6709219aac
commit 3bd02f6abf
9 changed files with 633 additions and 616 deletions

View File

@@ -65,23 +65,30 @@
using namespace std::placeholders; using namespace std::placeholders;
using Global::myScreen; using Global::myScreen;
bool Action::OriginalStatusbarVisibility;
bool Action::ExitMainLoop = false;
size_t Action::HeaderHeight;
size_t Action::FooterHeight;
size_t Action::FooterStartY;
namespace {// namespace {//
std::map<ActionType, Action *> Actions; enum class Find { Forward, Backward };
std::map<ActionType, Actions::BaseAction *> AvailableActions;
void insertAction(Action *a);
void populateActions(); void populateActions();
void seek();
void findItem(const Find direction);
void listsChangeFinisher();
} }
void Action::validateScreenSize() namespace Actions {//
bool OriginalStatusbarVisibility;
bool ExitMainLoop = false;
size_t HeaderHeight;
size_t FooterHeight;
size_t FooterStartY;
void validateScreenSize()
{ {
using Global::MainHeight; using Global::MainHeight;
@@ -93,7 +100,7 @@ void Action::validateScreenSize()
} }
} }
void Action::initializeScreens() void initializeScreens()
{ {
myHelp = new Help; myHelp = new Help;
myPlaylist = new Playlist; myPlaylist = new Playlist;
@@ -130,7 +137,7 @@ void Action::initializeScreens()
} }
void Action::setResizeFlags() void setResizeFlags()
{ {
myHelp->hasToBeResized = 1; myHelp->hasToBeResized = 1;
myPlaylist->hasToBeResized = 1; myPlaylist->hasToBeResized = 1;
@@ -166,7 +173,7 @@ void Action::setResizeFlags()
# endif // ENABLE_CLOCK # endif // ENABLE_CLOCK
} }
void Action::resizeScreen(bool reload_main_window) void resizeScreen(bool reload_main_window)
{ {
using Global::MainHeight; using Global::MainHeight;
using Global::wHeader; using Global::wHeader;
@@ -223,7 +230,7 @@ void Action::resizeScreen(bool reload_main_window)
refresh(); refresh();
} }
void Action::setWindowsDimensions() void setWindowsDimensions()
{ {
using Global::MainStartY; using Global::MainStartY;
using Global::MainHeight; using Global::MainHeight;
@@ -244,173 +251,7 @@ void Action::setWindowsDimensions()
FooterHeight = Config.statusbar_visibility ? 2 : 1; FooterHeight = Config.statusbar_visibility ? 2 : 1;
} }
void Action::seek() bool connectToMPD()
{
using Global::wHeader;
using Global::wFooter;
using Global::Timer;
using Global::SeekingInProgress;
if (!Mpd.GetTotalTime())
{
Statusbar::msg("Unknown item length");
return;
}
Progressbar::lock();
Statusbar::lock();
int songpos = Mpd.GetElapsedTime();
timeval t = Timer;
int old_timeout = wFooter->getTimeout();
wFooter->setTimeout(500);
SeekingInProgress = true;
while (true)
{
Status::trace();
myPlaylist->UpdateTimer();
int howmuch = Config.incremental_seeking ? (Timer.tv_sec-t.tv_sec)/2+Config.seek_time : Config.seek_time;
Key input = Key::read(*wFooter);
auto k = Bindings.get(input);
if (k.first == k.second || !k.first->isSingle()) // no single action?
break;
Action *a = k.first->action();
if (dynamic_cast<SeekForward *>(a))
{
if (songpos < Mpd.GetTotalTime())
{
songpos += howmuch;
if (songpos > Mpd.GetTotalTime())
songpos = Mpd.GetTotalTime();
}
}
else if (dynamic_cast<SeekBackward *>(a))
{
if (songpos > 0)
{
songpos -= howmuch;
if (songpos < 0)
songpos = 0;
}
}
else
break;
*wFooter << NC::fmtBold;
std::string tracklength;
if (Config.new_design)
{
if (Config.display_remaining_time)
{
tracklength = "-";
tracklength += MPD::Song::ShowTime(Mpd.GetTotalTime()-songpos);
}
else
tracklength = MPD::Song::ShowTime(songpos);
tracklength += "/";
tracklength += MPD::Song::ShowTime(Mpd.GetTotalTime());
*wHeader << NC::XY(0, 0) << tracklength << " ";
wHeader->refresh();
}
else
{
tracklength = " [";
if (Config.display_remaining_time)
{
tracklength += "-";
tracklength += MPD::Song::ShowTime(Mpd.GetTotalTime()-songpos);
}
else
tracklength += MPD::Song::ShowTime(songpos);
tracklength += "/";
tracklength += MPD::Song::ShowTime(Mpd.GetTotalTime());
tracklength += "]";
*wFooter << NC::XY(wFooter->getWidth()-tracklength.length(), 1) << tracklength;
}
*wFooter << NC::fmtBoldEnd;
Progressbar::draw(songpos, Mpd.GetTotalTime());
wFooter->refresh();
}
SeekingInProgress = false;
Mpd.Seek(songpos);
wFooter->setTimeout(old_timeout);
Progressbar::unlock();
Statusbar::unlock();
}
void Action::findItem(const Find direction)
{
using Global::wFooter;
Searchable *w = dynamic_cast<Searchable *>(myScreen);
assert(w);
assert(w->allowsSearching());
Statusbar::lock();
Statusbar::put() << "Find " << (direction == Find::Forward ? "forward" : "backward") << ": ";
std::string findme = wFooter->getString();
Statusbar::unlock();
if (!findme.empty())
Statusbar::msg("Searching...");
bool success = w->search(findme);
if (findme.empty())
return;
if (success)
Statusbar::msg("Searching finished");
else
Statusbar::msg("Unable to find \"%s\"", findme.c_str());
if (direction == Find::Forward)
w->nextFound(Config.wrapped_search);
else
w->prevFound(Config.wrapped_search);
if (myScreen == myPlaylist)
myPlaylist->EnableHighlighting();
}
void Action::listsChangeFinisher()
{
if (myScreen == myLibrary
|| myScreen == myPlaylistEditor
# ifdef HAVE_TAGLIB_H
|| myScreen == myTagEditor
# endif // HAVE_TAGLIB_H
)
{
if (myScreen->activeWindow() == &myLibrary->Tags)
{
myLibrary->Albums.clear();
myLibrary->Songs.clear();
}
else if (myScreen->activeWindow() == &myLibrary->Albums)
{
myLibrary->Songs.clear();
}
else if (myScreen->isActiveWindow(myPlaylistEditor->Playlists))
{
myPlaylistEditor->Content.clear();
}
# ifdef HAVE_TAGLIB_H
else if (myScreen->activeWindow() == myTagEditor->Dirs)
{
myTagEditor->Tags->clear();
}
# endif // HAVE_TAGLIB_H
}
}
bool Action::connectToMPD()
{ {
if (!Mpd.Connect()) if (!Mpd.Connect())
{ {
@@ -422,7 +263,7 @@ bool Action::connectToMPD()
return true; return true;
} }
bool Action::askYesNoQuestion(const std::string &question, void (*callback)()) bool askYesNoQuestion(const std::string &question, void (*callback)())
{ {
using Global::wFooter; using Global::wFooter;
@@ -441,7 +282,7 @@ bool Action::askYesNoQuestion(const std::string &question, void (*callback)())
return answer == 'y'; return answer == 'y';
} }
bool Action::isMPDMusicDirSet() bool isMPDMusicDirSet()
{ {
if (Config.mpd_music_dir.empty()) if (Config.mpd_music_dir.empty())
{ {
@@ -451,19 +292,19 @@ bool Action::isMPDMusicDirSet()
return true; return true;
} }
Action *Action::get(ActionType at) BaseAction *get(ActionType at)
{ {
if (Actions.empty()) if (AvailableActions.empty())
populateActions(); populateActions();
return Actions[at]; return AvailableActions[at];
} }
Action *Action::get(const std::string &name) BaseAction *get(const std::string &name)
{ {
Action *result = 0; BaseAction *result = 0;
if (Actions.empty()) if (AvailableActions.empty())
populateActions(); populateActions();
for (auto it = Actions.begin(); it != Actions.end(); ++it) for (auto it = AvailableActions.begin(); it != AvailableActions.end(); ++it)
{ {
if (it->second->name() == name) if (it->second->name() == name)
{ {
@@ -1651,7 +1492,7 @@ void ToggleScreenLock::run()
if (myLockedScreen != 0) if (myLockedScreen != 0)
{ {
BaseScreen::unlock(); BaseScreen::unlock();
Action::setResizeFlags(); Actions::setResizeFlags();
myScreen->resize(); myScreen->resize();
Statusbar::msg("Screen unlocked"); Statusbar::msg("Screen unlocked");
} }
@@ -1982,7 +1823,7 @@ bool FindItemBackward::canBeRun() const
void FindItemForward::run() void FindItemForward::run()
{ {
findItem(Find::Forward); findItem(::Find::Forward);
listsChangeFinisher(); listsChangeFinisher();
} }
@@ -1994,7 +1835,7 @@ bool FindItemForward::canBeRun() const
void FindItemBackward::run() void FindItemBackward::run()
{ {
findItem(Find::Backward); findItem(::Find::Backward);
listsChangeFinisher(); listsChangeFinisher();
} }
@@ -2574,133 +2415,302 @@ void ShowServerInfo::run()
myServerInfo->switchTo(); myServerInfo->switchTo();
} }
namespace {//
void insertAction(Action *a)
{
Actions[a->type()] = a;
} }
namespace {//
void populateActions() void populateActions()
{ {
insertAction(new Dummy()); auto insert_action = [](Actions::BaseAction *a) {
insertAction(new MouseEvent()); AvailableActions[a->type()] = a;
insertAction(new ScrollUp()); };
insertAction(new ScrollDown()); insert_action(new Actions::Dummy());
insertAction(new ScrollUpArtist()); insert_action(new Actions::MouseEvent());
insertAction(new ScrollUpAlbum()); insert_action(new Actions::ScrollUp());
insertAction(new ScrollDownArtist()); insert_action(new Actions::ScrollDown());
insertAction(new ScrollDownAlbum()); insert_action(new Actions::ScrollUpArtist());
insertAction(new PageUp()); insert_action(new Actions::ScrollUpAlbum());
insertAction(new PageDown()); insert_action(new Actions::ScrollDownArtist());
insertAction(new MoveHome()); insert_action(new Actions::ScrollDownAlbum());
insertAction(new MoveEnd()); insert_action(new Actions::PageUp());
insertAction(new ToggleInterface()); insert_action(new Actions::PageDown());
insertAction(new JumpToParentDirectory()); insert_action(new Actions::MoveHome());
insertAction(new PressEnter()); insert_action(new Actions::MoveEnd());
insertAction(new PressSpace()); insert_action(new Actions::ToggleInterface());
insertAction(new PreviousColumn()); insert_action(new Actions::JumpToParentDirectory());
insertAction(new NextColumn()); insert_action(new Actions::PressEnter());
insertAction(new MasterScreen()); insert_action(new Actions::PressSpace());
insertAction(new SlaveScreen()); insert_action(new Actions::PreviousColumn());
insertAction(new VolumeUp()); insert_action(new Actions::NextColumn());
insertAction(new VolumeDown()); insert_action(new Actions::MasterScreen());
insertAction(new DeletePlaylistItems()); insert_action(new Actions::SlaveScreen());
insertAction(new DeleteStoredPlaylist()); insert_action(new Actions::VolumeUp());
insertAction(new DeleteBrowserItems()); insert_action(new Actions::VolumeDown());
insertAction(new ReplaySong()); insert_action(new Actions::DeletePlaylistItems());
insertAction(new PreviousSong()); insert_action(new Actions::DeleteStoredPlaylist());
insertAction(new NextSong()); insert_action(new Actions::DeleteBrowserItems());
insertAction(new Pause()); insert_action(new Actions::ReplaySong());
insertAction(new Stop()); insert_action(new Actions::PreviousSong());
insertAction(new ExecuteCommand()); insert_action(new Actions::NextSong());
insertAction(new SavePlaylist()); insert_action(new Actions::Pause());
insertAction(new MoveSortOrderUp()); insert_action(new Actions::Stop());
insertAction(new MoveSortOrderDown()); insert_action(new Actions::ExecuteCommand());
insertAction(new MoveSelectedItemsUp()); insert_action(new Actions::SavePlaylist());
insertAction(new MoveSelectedItemsDown()); insert_action(new Actions::MoveSortOrderUp());
insertAction(new MoveSelectedItemsTo()); insert_action(new Actions::MoveSortOrderDown());
insertAction(new Add()); insert_action(new Actions::MoveSelectedItemsUp());
insertAction(new SeekForward()); insert_action(new Actions::MoveSelectedItemsDown());
insertAction(new SeekBackward()); insert_action(new Actions::MoveSelectedItemsTo());
insertAction(new ToggleDisplayMode()); insert_action(new Actions::Add());
insertAction(new ToggleSeparatorsBetweenAlbums()); insert_action(new Actions::SeekForward());
insertAction(new ToggleLyricsFetcher()); insert_action(new Actions::SeekBackward());
insertAction(new ToggleFetchingLyricsInBackground()); insert_action(new Actions::ToggleDisplayMode());
insertAction(new TogglePlayingSongCentering()); insert_action(new Actions::ToggleSeparatorsBetweenAlbums());
insertAction(new UpdateDatabase()); insert_action(new Actions::ToggleLyricsFetcher());
insertAction(new JumpToPlayingSong()); insert_action(new Actions::ToggleFetchingLyricsInBackground());
insertAction(new ToggleRepeat()); insert_action(new Actions::TogglePlayingSongCentering());
insertAction(new Shuffle()); insert_action(new Actions::UpdateDatabase());
insertAction(new ToggleRandom()); insert_action(new Actions::JumpToPlayingSong());
insertAction(new StartSearching()); insert_action(new Actions::ToggleRepeat());
insertAction(new SaveTagChanges()); insert_action(new Actions::Shuffle());
insertAction(new ToggleSingle()); insert_action(new Actions::ToggleRandom());
insertAction(new ToggleConsume()); insert_action(new Actions::StartSearching());
insertAction(new ToggleCrossfade()); insert_action(new Actions::SaveTagChanges());
insertAction(new SetCrossfade()); insert_action(new Actions::ToggleSingle());
insertAction(new EditSong()); insert_action(new Actions::ToggleConsume());
insertAction(new EditLibraryTag()); insert_action(new Actions::ToggleCrossfade());
insertAction(new EditLibraryAlbum()); insert_action(new Actions::SetCrossfade());
insertAction(new EditDirectoryName()); insert_action(new Actions::EditSong());
insertAction(new EditPlaylistName()); insert_action(new Actions::EditLibraryTag());
insertAction(new EditLyrics()); insert_action(new Actions::EditLibraryAlbum());
insertAction(new JumpToBrowser()); insert_action(new Actions::EditDirectoryName());
insertAction(new JumpToMediaLibrary()); insert_action(new Actions::EditPlaylistName());
insertAction(new JumpToPlaylistEditor()); insert_action(new Actions::EditLyrics());
insertAction(new ToggleScreenLock()); insert_action(new Actions::JumpToBrowser());
insertAction(new JumpToTagEditor()); insert_action(new Actions::JumpToMediaLibrary());
insertAction(new JumpToPositionInSong()); insert_action(new Actions::JumpToPlaylistEditor());
insertAction(new ReverseSelection()); insert_action(new Actions::ToggleScreenLock());
insertAction(new RemoveSelection()); insert_action(new Actions::JumpToTagEditor());
insertAction(new SelectAlbum()); insert_action(new Actions::JumpToPositionInSong());
insertAction(new AddSelectedItems()); insert_action(new Actions::ReverseSelection());
insertAction(new CropMainPlaylist()); insert_action(new Actions::RemoveSelection());
insertAction(new CropPlaylist()); insert_action(new Actions::SelectAlbum());
insertAction(new ClearMainPlaylist()); insert_action(new Actions::AddSelectedItems());
insertAction(new ClearPlaylist()); insert_action(new Actions::CropMainPlaylist());
insertAction(new SortPlaylist()); insert_action(new Actions::CropPlaylist());
insertAction(new ReversePlaylist()); insert_action(new Actions::ClearMainPlaylist());
insertAction(new ApplyFilter()); insert_action(new Actions::ClearPlaylist());
insertAction(new Find()); insert_action(new Actions::SortPlaylist());
insertAction(new FindItemForward()); insert_action(new Actions::ReversePlaylist());
insertAction(new FindItemBackward()); insert_action(new Actions::ApplyFilter());
insertAction(new NextFoundItem()); insert_action(new Actions::Find());
insertAction(new PreviousFoundItem()); insert_action(new Actions::FindItemForward());
insertAction(new ToggleFindMode()); insert_action(new Actions::FindItemBackward());
insertAction(new ToggleReplayGainMode()); insert_action(new Actions::NextFoundItem());
insertAction(new ToggleSpaceMode()); insert_action(new Actions::PreviousFoundItem());
insertAction(new ToggleAddMode()); insert_action(new Actions::ToggleFindMode());
insertAction(new ToggleMouse()); insert_action(new Actions::ToggleReplayGainMode());
insertAction(new ToggleBitrateVisibility()); insert_action(new Actions::ToggleSpaceMode());
insertAction(new AddRandomItems()); insert_action(new Actions::ToggleAddMode());
insertAction(new ToggleBrowserSortMode()); insert_action(new Actions::ToggleMouse());
insertAction(new ToggleLibraryTagType()); insert_action(new Actions::ToggleBitrateVisibility());
insertAction(new ToggleMediaLibrarySortMode()); insert_action(new Actions::AddRandomItems());
insertAction(new RefetchLyrics()); insert_action(new Actions::ToggleBrowserSortMode());
insertAction(new RefetchArtistInfo()); insert_action(new Actions::ToggleLibraryTagType());
insertAction(new SetSelectedItemsPriority()); insert_action(new Actions::ToggleMediaLibrarySortMode());
insertAction(new FilterPlaylistOnPriorities()); insert_action(new Actions::RefetchLyrics());
insertAction(new ShowSongInfo()); insert_action(new Actions::RefetchArtistInfo());
insertAction(new ShowArtistInfo()); insert_action(new Actions::SetSelectedItemsPriority());
insertAction(new ShowLyrics()); insert_action(new Actions::FilterPlaylistOnPriorities());
insertAction(new Quit()); insert_action(new Actions::ShowSongInfo());
insertAction(new NextScreen()); insert_action(new Actions::ShowArtistInfo());
insertAction(new PreviousScreen()); insert_action(new Actions::ShowLyrics());
insertAction(new ShowHelp()); insert_action(new Actions::Quit());
insertAction(new ShowPlaylist()); insert_action(new Actions::NextScreen());
insertAction(new ShowBrowser()); insert_action(new Actions::PreviousScreen());
insertAction(new ChangeBrowseMode()); insert_action(new Actions::ShowHelp());
insertAction(new ShowSearchEngine()); insert_action(new Actions::ShowPlaylist());
insertAction(new ResetSearchEngine()); insert_action(new Actions::ShowBrowser());
insertAction(new ShowMediaLibrary()); insert_action(new Actions::ChangeBrowseMode());
insertAction(new ToggleMediaLibraryColumnsMode()); insert_action(new Actions::ShowSearchEngine());
insertAction(new ShowPlaylistEditor()); insert_action(new Actions::ResetSearchEngine());
insertAction(new ShowTagEditor()); insert_action(new Actions::ShowMediaLibrary());
insertAction(new ShowOutputs()); insert_action(new Actions::ToggleMediaLibraryColumnsMode());
insertAction(new ShowVisualizer()); insert_action(new Actions::ShowPlaylistEditor());
insertAction(new ShowClock()); insert_action(new Actions::ShowTagEditor());
insertAction(new ShowServerInfo()); insert_action(new Actions::ShowOutputs());
insert_action(new Actions::ShowVisualizer());
insert_action(new Actions::ShowClock());
insert_action(new Actions::ShowServerInfo());
}
void seek()
{
using Global::wHeader;
using Global::wFooter;
using Global::Timer;
using Global::SeekingInProgress;
if (!Mpd.GetTotalTime())
{
Statusbar::msg("Unknown item length");
return;
}
Progressbar::lock();
Statusbar::lock();
int songpos = Mpd.GetElapsedTime();
timeval t = Timer;
int old_timeout = wFooter->getTimeout();
wFooter->setTimeout(500);
auto seekForward = Actions::get(aSeekForward);
auto seekBackward = Actions::get(aSeekBackward);
SeekingInProgress = true;
while (true)
{
Status::trace();
myPlaylist->UpdateTimer();
int howmuch = Config.incremental_seeking ? (Timer.tv_sec-t.tv_sec)/2+Config.seek_time : Config.seek_time;
Key input = Key::read(*wFooter);
auto k = Bindings.get(input);
if (k.first == k.second || !k.first->isSingle()) // no single action?
break;
auto a = k.first->action();
if (a == seekForward)
{
if (songpos < Mpd.GetTotalTime())
{
songpos += howmuch;
if (songpos > Mpd.GetTotalTime())
songpos = Mpd.GetTotalTime();
}
}
else if (a == seekBackward)
{
if (songpos > 0)
{
songpos -= howmuch;
if (songpos < 0)
songpos = 0;
}
}
else
break;
*wFooter << NC::fmtBold;
std::string tracklength;
if (Config.new_design)
{
if (Config.display_remaining_time)
{
tracklength = "-";
tracklength += MPD::Song::ShowTime(Mpd.GetTotalTime()-songpos);
}
else
tracklength = MPD::Song::ShowTime(songpos);
tracklength += "/";
tracklength += MPD::Song::ShowTime(Mpd.GetTotalTime());
*wHeader << NC::XY(0, 0) << tracklength << " ";
wHeader->refresh();
}
else
{
tracklength = " [";
if (Config.display_remaining_time)
{
tracklength += "-";
tracklength += MPD::Song::ShowTime(Mpd.GetTotalTime()-songpos);
}
else
tracklength += MPD::Song::ShowTime(songpos);
tracklength += "/";
tracklength += MPD::Song::ShowTime(Mpd.GetTotalTime());
tracklength += "]";
*wFooter << NC::XY(wFooter->getWidth()-tracklength.length(), 1) << tracklength;
}
*wFooter << NC::fmtBoldEnd;
Progressbar::draw(songpos, Mpd.GetTotalTime());
wFooter->refresh();
}
SeekingInProgress = false;
Mpd.Seek(songpos);
wFooter->setTimeout(old_timeout);
Progressbar::unlock();
Statusbar::unlock();
}
void findItem(const Find direction)
{
using Global::wFooter;
Searchable *w = dynamic_cast<Searchable *>(myScreen);
assert(w);
assert(w->allowsSearching());
Statusbar::lock();
Statusbar::put() << "Find " << (direction == Find::Forward ? "forward" : "backward") << ": ";
std::string findme = wFooter->getString();
Statusbar::unlock();
if (!findme.empty())
Statusbar::msg("Searching...");
bool success = w->search(findme);
if (findme.empty())
return;
if (success)
Statusbar::msg("Searching finished");
else
Statusbar::msg("Unable to find \"%s\"", findme.c_str());
if (direction == ::Find::Forward)
w->nextFound(Config.wrapped_search);
else
w->prevFound(Config.wrapped_search);
if (myScreen == myPlaylist)
myPlaylist->EnableHighlighting();
}
void listsChangeFinisher()
{
if (myScreen == myLibrary
|| myScreen == myPlaylistEditor
# ifdef HAVE_TAGLIB_H
|| myScreen == myTagEditor
# endif // HAVE_TAGLIB_H
)
{
if (myScreen->activeWindow() == &myLibrary->Tags)
{
myLibrary->Albums.clear();
myLibrary->Songs.clear();
}
else if (myScreen->activeWindow() == &myLibrary->Albums)
{
myLibrary->Songs.clear();
}
else if (myScreen->isActiveWindow(myPlaylistEditor->Playlists))
{
myPlaylistEditor->Content.clear();
}
# ifdef HAVE_TAGLIB_H
else if (myScreen->activeWindow() == myTagEditor->Dirs)
{
myTagEditor->Tags->clear();
}
# endif // HAVE_TAGLIB_H
}
} }
} }

File diff suppressed because it is too large Load Diff

View File

@@ -92,13 +92,13 @@ Key stringToKey(const std::string &s)
} }
template <typename F> template <typename F>
Action *parseActionLine(const std::string &line, F error) Actions::BaseAction *parseActionLine(const std::string &line, F error)
{ {
Action *result = 0; Actions::BaseAction *result = 0;
size_t i = 0; size_t i = 0;
for (; i < line.size() && !isspace(line[i]); ++i) { } for (; i < line.size() && !isspace(line[i]); ++i) { }
if (i == line.size()) // only action name if (i == line.size()) // only action name
result = Action::get(line); result = Actions::get(line);
else // there is something else else // there is something else
{ {
std::string action_name = line.substr(0, i); std::string action_name = line.substr(0, i);
@@ -107,8 +107,9 @@ Action *parseActionLine(const std::string &line, F error)
// push single character into input queue // push single character into input queue
std::string arg = getEnclosedString(line, '"', '"', 0); std::string arg = getEnclosedString(line, '"', '"', 0);
Key k = stringToSpecialKey(arg); Key k = stringToSpecialKey(arg);
auto queue = std::vector<int>{ k.getChar() };
if (k != Key::noOp) if (k != Key::noOp)
result = new PushCharacters(&Global::wFooter, std::vector<int>{ k.getChar() }); result = new Actions::PushCharacters(&Global::wFooter, std::move(queue));
else else
error() << "invalid character passed to push_character: '" << arg << "'\n"; error() << "invalid character passed to push_character: '" << arg << "'\n";
} }
@@ -122,7 +123,7 @@ Action *parseActionLine(const std::string &line, F error)
// if char is signed, erase 1s from char -> int conversion // if char is signed, erase 1s from char -> int conversion
for (auto it = arg.begin(); it != arg.end(); ++it) for (auto it = arg.begin(); it != arg.end(); ++it)
*it &= 0xff; *it &= 0xff;
result = new PushCharacters(&Global::wFooter, std::move(queue)); result = new Actions::PushCharacters(&Global::wFooter, std::move(queue));
} }
else else
error() << "empty argument passed to push_characters\n"; error() << "empty argument passed to push_characters\n";
@@ -133,7 +134,7 @@ Action *parseActionLine(const std::string &line, F error)
std::string arg = getEnclosedString(line, '"', '"', 0); std::string arg = getEnclosedString(line, '"', '"', 0);
ScreenType screen_type = stringToScreenType(arg); ScreenType screen_type = stringToScreenType(arg);
if (screen_type != ScreenType::Unknown) if (screen_type != ScreenType::Unknown)
result = new RequireScreen(screen_type); result = new Actions::RequireScreen(screen_type);
else else
error() << "unknown screen passed to require_screen: '" << arg << "'\n"; error() << "unknown screen passed to require_screen: '" << arg << "'\n";
} }
@@ -141,9 +142,9 @@ Action *parseActionLine(const std::string &line, F error)
{ {
// require that given action is runnable // require that given action is runnable
std::string arg = getEnclosedString(line, '"', '"', 0); std::string arg = getEnclosedString(line, '"', '"', 0);
Action *action = Action::get(arg); auto action = Actions::get(arg);
if (action) if (action)
result = new RequireRunnable(action); result = new Actions::RequireRunnable(action);
else else
error() << "unknown action passed to require_runnable: '" << arg << "'\n"; error() << "unknown action passed to require_runnable: '" << arg << "'\n";
} }
@@ -151,7 +152,7 @@ Action *parseActionLine(const std::string &line, F error)
{ {
std::string command = getEnclosedString(line, '"', '"', 0); std::string command = getEnclosedString(line, '"', '"', 0);
if (!command.empty()) if (!command.empty())
result = new RunExternalCommand(std::move(command)); result = new Actions::RunExternalCommand(std::move(command));
else else
error() << "empty command passed to run_external_command\n"; error() << "empty command passed to run_external_command\n";
} }
@@ -312,7 +313,7 @@ bool BindingsConfiguration::read(const std::string &file)
else if (isspace(line[0])) // name of action to be bound else if (isspace(line[0])) // name of action to be bound
{ {
trim(line); trim(line);
Action *action = parseActionLine(line, error); auto action = parseActionLine(line, error);
if (action) if (action)
actions.push_back(action); actions.push_back(action);
else else

View File

@@ -72,9 +72,9 @@ struct Key
/// Represents either single action or chain of actions bound to a certain key /// Represents either single action or chain of actions bound to a certain key
struct Binding struct Binding
{ {
typedef std::vector<Action *> ActionChain; typedef std::vector<Actions::BaseAction *> ActionChain;
Binding(ActionType at) : m_is_single(true), m_action(Action::get(at)) { } Binding(ActionType at) : m_is_single(true), m_action(Actions::get(at)) { }
Binding(const ActionChain &actions) { Binding(const ActionChain &actions) {
assert(actions.size() > 0); assert(actions.size() > 0);
if (actions.size() == 1) { if (actions.size() == 1) {
@@ -107,7 +107,7 @@ struct Binding
assert(!m_is_single); assert(!m_is_single);
return m_chain; return m_chain;
} }
Action *action() const { Actions::BaseAction *action() const {
assert(m_is_single); assert(m_is_single);
return m_action; return m_action;
} }
@@ -115,7 +115,7 @@ struct Binding
private: private:
bool m_is_single; bool m_is_single;
union { union {
Action *m_action; Actions::BaseAction *m_action;
ActionChain *m_chain; ActionChain *m_chain;
}; };
}; };

View File

@@ -121,7 +121,7 @@ void ParseArgv(int argc, char **argv)
exit(0); exit(0);
} }
if (!Action::connectToMPD()) if (!Actions::connectToMPD())
exit(1); exit(1);
if (!strcmp(argv[i], "-s") || !strcmp(argv[i], "--screen")) if (!strcmp(argv[i], "-s") || !strcmp(argv[i], "--screen"))

View File

@@ -21,6 +21,8 @@
#include "global.h" #include "global.h"
#include "macro_utilities.h" #include "macro_utilities.h"
namespace Actions {//
void PushCharacters::run() void PushCharacters::run()
{ {
for (auto it = m_queue.begin(); it != m_queue.end(); ++it) for (auto it = m_queue.begin(); it != m_queue.end(); ++it)
@@ -42,3 +44,5 @@ void RunExternalCommand::run()
GNUC_UNUSED int res; GNUC_UNUSED int res;
res = std::system(m_command.c_str()); res = std::system(m_command.c_str());
} }
}

View File

@@ -25,10 +25,12 @@
#include "actions.h" #include "actions.h"
#include "screen_type.h" #include "screen_type.h"
struct PushCharacters : public Action namespace Actions {//
struct PushCharacters : public BaseAction
{ {
PushCharacters(NC::Window **w, std::vector<int> &&queue) PushCharacters(NC::Window **w, std::vector<int> &&queue)
: Action(aMacroUtility, ""), m_window(w), m_queue(queue) { } : BaseAction(aMacroUtility, ""), m_window(w), m_queue(queue) { }
protected: protected:
virtual void run(); virtual void run();
@@ -38,23 +40,23 @@ private:
std::vector<int> m_queue; std::vector<int> m_queue;
}; };
struct RequireRunnable : public Action struct RequireRunnable : public BaseAction
{ {
RequireRunnable(Action *action) RequireRunnable(BaseAction *action)
: Action(aMacroUtility, ""), m_action(action) { assert(action); } : BaseAction(aMacroUtility, ""), m_action(action) { assert(action); }
protected: protected:
virtual bool canBeRun() const; virtual bool canBeRun() const;
virtual void run() { } virtual void run() { }
private: private:
Action *m_action; BaseAction *m_action;
}; };
struct RequireScreen : public Action struct RequireScreen : public BaseAction
{ {
RequireScreen(ScreenType screen_type) RequireScreen(ScreenType screen_type)
: Action(aMacroUtility, ""), m_screen_type(screen_type) { } : BaseAction(aMacroUtility, ""), m_screen_type(screen_type) { }
protected: protected:
virtual bool canBeRun() const; virtual bool canBeRun() const;
@@ -64,10 +66,10 @@ private:
ScreenType m_screen_type; ScreenType m_screen_type;
}; };
struct RunExternalCommand : public Action struct RunExternalCommand : public BaseAction
{ {
RunExternalCommand(std::string command) RunExternalCommand(std::string command)
: Action(aMacroUtility, ""), m_command(command) { } : BaseAction(aMacroUtility, ""), m_command(command) { }
protected: protected:
virtual void run(); virtual void run();
@@ -76,4 +78,6 @@ private:
std::string m_command; std::string m_command;
}; };
}
#endif // NCMPCPP_MACRO_UTILITIES_H #endif // NCMPCPP_MACRO_UTILITIES_H

View File

@@ -60,7 +60,7 @@ namespace
} }
else if (signal == SIGWINCH) else if (signal == SIGWINCH)
{ {
Action::resizeScreen(true); Actions::resizeScreen(true);
} }
} }
# endif // !WIN32 # endif // !WIN32
@@ -121,7 +121,7 @@ int main(int argc, char **argv)
if (argc > 1) if (argc > 1)
ParseArgv(argc, argv); ParseArgv(argc, argv);
if (!Action::connectToMPD()) if (!Actions::connectToMPD())
exit(1); exit(1);
if (Mpd.Version() < 16) if (Mpd.Version() < 16)
@@ -142,7 +142,7 @@ int main(int argc, char **argv)
NC::initScreen("ncmpcpp ver. " VERSION, Config.colors_enabled); NC::initScreen("ncmpcpp ver. " VERSION, Config.colors_enabled);
Action::OriginalStatusbarVisibility = Config.statusbar_visibility; Actions::OriginalStatusbarVisibility = Config.statusbar_visibility;
if (!Config.titles_visibility) if (!Config.titles_visibility)
wattron(stdscr, COLOR_PAIR(Config.main_color)); wattron(stdscr, COLOR_PAIR(Config.main_color));
@@ -150,15 +150,15 @@ int main(int argc, char **argv)
if (Config.new_design) if (Config.new_design)
Config.statusbar_visibility = 0; Config.statusbar_visibility = 0;
Action::setWindowsDimensions(); Actions::setWindowsDimensions();
Action::validateScreenSize(); Actions::validateScreenSize();
Action::initializeScreens(); Actions::initializeScreens();
wHeader = new NC::Window(0, 0, COLS, Action::HeaderHeight, "", Config.header_color, NC::brNone); wHeader = new NC::Window(0, 0, COLS, Actions::HeaderHeight, "", Config.header_color, NC::brNone);
if (Config.header_visibility || Config.new_design) if (Config.header_visibility || Config.new_design)
wHeader->display(); wHeader->display();
wFooter = new NC::Window(0, Action::FooterStartY, COLS, Action::FooterHeight, "", Config.statusbar_color, NC::brNone); wFooter = new NC::Window(0, Actions::FooterStartY, COLS, Actions::FooterHeight, "", Config.statusbar_color, NC::brNone);
wFooter->setTimeout(500); wFooter->setTimeout(500);
wFooter->setGetStringHelper(Statusbar::Helpers::getString); wFooter->setGetStringHelper(Statusbar::Helpers::getString);
if (Mpd.SupportsIdle()) if (Mpd.SupportsIdle())
@@ -202,7 +202,7 @@ int main(int argc, char **argv)
signal(SIGWINCH, sighandler); signal(SIGWINCH, sighandler);
# endif // !WIN32 # endif // !WIN32
while (!Action::ExitMainLoop) while (!Actions::ExitMainLoop)
{ {
if (!Mpd.Connected()) if (!Mpd.Connected())
{ {

View File

@@ -468,7 +468,7 @@ void TagEditor::enterPressed()
if (w == TagTypes && id == 5) if (w == TagTypes && id == 5)
{ {
bool yes = Action::askYesNoQuestion("Number tracks?", Status::trace); bool yes = Actions::askYesNoQuestion("Number tracks?", Status::trace);
if (yes) if (yes)
{ {
auto it = EditedSongs.begin(); auto it = EditedSongs.begin();
@@ -929,7 +929,7 @@ bool TagEditor::ifAnyModifiedAskForDiscarding()
{ {
bool result = true; bool result = true;
if (isAnyModified(*Tags)) if (isAnyModified(*Tags))
result = Action::askYesNoQuestion("There are pending changes, are you sure?", Status::trace); result = Actions::askYesNoQuestion("There are pending changes, are you sure?", Status::trace);
return result; return result;
} }