From a0b662886555be36037222e541e84c2dc5787658 Mon Sep 17 00:00:00 2001 From: Andrzej Rybczak Date: Fri, 10 Jun 2016 15:00:32 +0200 Subject: [PATCH] actions: allow action chains to be used for seeking --- NEWS | 1 + src/actions.cpp | 39 +++++++++++++++++++++++++++++++-------- 2 files changed, 32 insertions(+), 8 deletions(-) diff --git a/NEWS b/NEWS index 8d02b83b..4d663706 100644 --- a/NEWS +++ b/NEWS @@ -1,4 +1,5 @@ ncmpcpp-0.7.5 (????-??-??) +* Action chains can be now used for seeking. ncmpcpp 0.7.4 (2016-04-17) * Fetching lyrics from lyricwiki.org was fixed. diff --git a/src/actions.cpp b/src/actions.cpp index d63215c2..e14cbcad 100644 --- a/src/actions.cpp +++ b/src/actions.cpp @@ -2830,9 +2830,34 @@ void seek() int old_timeout = wFooter->getTimeout(); wFooter->setTimeout(BaseScreen::defaultWindowTimeout); - auto seekForward = &Actions::get(Actions::Type::SeekForward); - auto seekBackward = &Actions::get(Actions::Type::SeekBackward); - + // Accept single action of a given type or action chain for which all actions + // can be run and one of them is of the given type. This will still not work + // in some contrived cases, but allows for more flexibility than accepting + // single actions only. + auto hasRunnableAction = [](BindingsConfiguration::BindingIteratorPair &bindings, Actions::Type type) { + bool success = false; + for (auto binding = bindings.first; binding != bindings.second; ++binding) + { + auto &actions = binding->actions(); + for (const auto &action : actions) + { + if (action->canBeRun()) + { + if (action->type() == type) + success = true; + } + else + { + success = false; + break; + } + } + if (success) + break; + } + return success; + }; + SeekingInProgress = true; while (true) { @@ -2843,16 +2868,14 @@ void seek() : Config.seek_time; NC::Key::Type input = readKey(*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 (hasRunnableAction(k, Actions::Type::SeekForward)) { if (songpos < Status::State::totalTime()) songpos = std::min(songpos + howmuch, Status::State::totalTime()); } - else if (a == seekBackward) + else if (hasRunnableAction(k, Actions::Type::SeekBackward)) { if (songpos > 0) {