MuseScore/src/playback/internal/playbackuiactions.cpp
2022-11-30 18:30:37 +05:30

223 lines
7.2 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* SPDX-License-Identifier: GPL-3.0-only
* MuseScore-CLA-applies
*
* MuseScore
* Music Composition & Notation
*
* Copyright (C) 2021 MuseScore BVBA and others
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 3 as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#include "playbackuiactions.h"
#include "ui/view/iconcodes.h"
#include "types/translatablestring.h"
using namespace mu::playback;
using namespace mu::ui;
using namespace mu::actions;
const UiActionList PlaybackUiActions::m_mainActions = {
UiAction("play",
mu::context::UiCtxNotationOpened,
mu::context::CTX_NOTATION_FOCUSED,
TranslatableString("action", "Play"),
TranslatableString("action", "Play"),
IconCode::Code::PLAY
),
UiAction("stop",
mu::context::UiCtxNotationOpened,
mu::context::CTX_NOTATION_OPENED,
TranslatableString("action", "Stop"),
TranslatableString("action", "Stop playback"),
IconCode::Code::STOP
),
UiAction("rewind",
mu::context::UiCtxNotationOpened,
mu::context::CTX_NOTATION_FOCUSED,
TranslatableString("action", "Rewind"),
TranslatableString("action", "Rewind"),
IconCode::Code::REWIND
),
UiAction("loop",
mu::context::UiCtxNotationOpened,
mu::context::CTX_NOTATION_FOCUSED,
TranslatableString("action", "Loop playback"),
TranslatableString("action", "Toggle Loop playback"),
IconCode::Code::LOOP,
Checkable::Yes
),
UiAction("metronome",
mu::context::UiCtxNotationOpened,
mu::context::CTX_NOTATION_FOCUSED,
TranslatableString("action", "Metronome"),
TranslatableString("action", "Toggle metronome playback"),
IconCode::Code::METRONOME,
Checkable::Yes
),
UiAction("playback-setup",
mu::context::UiCtxNotationOpened,
mu::context::CTX_NOTATION_FOCUSED,
TranslatableString("action", "Playback setup"),
TranslatableString("action", "Open playback setup dialog"),
IconCode::Code::NONE
)
};
const UiActionList PlaybackUiActions::m_settingsActions = {
UiAction("midi-on",
mu::context::UiCtxAny,
mu::context::CTX_ANY,
TranslatableString("action", "Enable MIDI input"),
TranslatableString("action", "Toggle MIDI input"),
IconCode::Code::MIDI_INPUT,
Checkable::Yes
),
UiAction("repeat",
mu::context::UiCtxAny,
mu::context::CTX_NOTATION_FOCUSED,
TranslatableString("action", "Play repeats"),
TranslatableString("action", "Play repeats"),
IconCode::Code::PLAY_REPEATS,
Checkable::Yes
),
UiAction("play-chord-symbols",
mu::context::UiCtxAny,
mu::context::CTX_NOTATION_FOCUSED,
TranslatableString("action", "Play chord symbols"),
TranslatableString("action", "Play chord symbols"),
IconCode::Code::CHORD_SYMBOL,
Checkable::Yes
),
UiAction("pan",
mu::context::UiCtxAny,
mu::context::CTX_ANY,
TranslatableString("action", "Pan score automatically"),
TranslatableString("action", "Pan score automatically during playback"),
IconCode::Code::PAN_SCORE,
Checkable::Yes
),
// UiAction("countin", // See #14807
// mu::context::UiCtxAny,
// mu::context::CTX_ANY,
// TranslatableString("action", "Enable count-in when playing"),
// TranslatableString("action", "Enable count-in when playing"),
// IconCode::Code::COUNT_IN,
// Checkable::Yes
// ),
};
const UiActionList PlaybackUiActions::m_loopBoundaryActions = {
UiAction("loop-in",
mu::context::UiCtxAny,
mu::context::CTX_NOTATION_FOCUSED,
TranslatableString("action", "Set loop marker left"),
TranslatableString("action", "Set loop marker left"),
IconCode::Code::LOOP_IN
),
UiAction("loop-out",
mu::context::UiCtxAny,
mu::context::CTX_NOTATION_FOCUSED,
TranslatableString("action", "Set loop marker right"),
TranslatableString("action", "Set loop marker right"),
IconCode::Code::LOOP_OUT
),
};
PlaybackUiActions::PlaybackUiActions(std::shared_ptr<PlaybackController> controller)
: m_controller(controller)
{
}
void PlaybackUiActions::init()
{
m_controller->actionCheckedChanged().onReceive(this, [this](const ActionCode& code) {
m_actionCheckedChanged.send({ code });
});
m_controller->isPlayAllowedChanged().onNotify(this, [this]() {
ActionCodeList codes;
for (const UiAction& action : actionsList()) {
codes.push_back(action.code);
}
m_actionEnabledChanged.send(codes);
});
}
const UiActionList& PlaybackUiActions::actionsList() const
{
static UiActionList alist;
if (alist.empty()) {
alist.insert(alist.end(), m_mainActions.cbegin(), m_mainActions.cend());
alist.insert(alist.end(), m_settingsActions.cbegin(), m_settingsActions.cend());
alist.insert(alist.end(), m_loopBoundaryActions.cbegin(), m_loopBoundaryActions.cend());
}
return alist;
}
bool PlaybackUiActions::actionEnabled(const UiAction& act) const
{
if (!m_controller->isPlayAllowed()) {
return false;
}
if (!m_controller->canReceiveAction(act.code)) {
return false;
}
return true;
}
bool PlaybackUiActions::actionChecked(const UiAction& act) const
{
return m_controller->actionChecked(act.code);
}
mu::async::Channel<mu::actions::ActionCodeList> PlaybackUiActions::actionEnabledChanged() const
{
return m_actionEnabledChanged;
}
mu::async::Channel<mu::actions::ActionCodeList> PlaybackUiActions::actionCheckedChanged() const
{
return m_actionCheckedChanged;
}
const UiActionList& PlaybackUiActions::settingsActions()
{
return m_settingsActions;
}
const UiActionList& PlaybackUiActions::loopBoundaryActions()
{
return m_loopBoundaryActions;
}
const mu::ui::ToolConfig& PlaybackUiActions::defaultPlaybackToolConfig()
{
static ToolConfig config;
if (!config.isValid()) {
config.items = {
{ "rewind", true },
{ "play", true },
{ "loop", true },
{ "loop-in", true },
{ "loop-out", true },
{ "metronome", true },
};
}
return config;
}