From 58ff01ffe91d1406de65a4ccf04ab563ab816fdf Mon Sep 17 00:00:00 2001 From: Igor Date: Fri, 20 Sep 2024 12:30:35 +0200 Subject: [PATCH] added the ability to change properties of UiActions --- .../shortcuts/view/shortcutsmodel.cpp | 2 +- .../ui/internal/uiactionsregister.cpp | 41 ++++++++++++++++--- src/framework/ui/internal/uiactionsregister.h | 9 +++- src/framework/ui/iuiactionsmodule.h | 8 ++++ src/framework/ui/iuiactionsregister.h | 11 +++-- 5 files changed, 59 insertions(+), 12 deletions(-) diff --git a/src/framework/shortcuts/view/shortcutsmodel.cpp b/src/framework/shortcuts/view/shortcutsmodel.cpp index 9affde30aef7d..0908d72227c4f 100644 --- a/src/framework/shortcuts/view/shortcutsmodel.cpp +++ b/src/framework/shortcuts/view/shortcutsmodel.cpp @@ -102,7 +102,7 @@ void ShortcutsModel::load() beginResetModel(); m_shortcuts.clear(); - for (const UiAction& action : uiactionsRegister()->getActions()) { + for (const UiAction& action : uiactionsRegister()->actionList()) { Shortcut shortcut = shortcutsRegister()->shortcut(action.code); if (!shortcut.isValid()) { shortcut.action = action.code; diff --git a/src/framework/ui/internal/uiactionsregister.cpp b/src/framework/ui/internal/uiactionsregister.cpp index 4721c5d1404cb..bcfb97879bcaa 100644 --- a/src/framework/ui/internal/uiactionsregister.cpp +++ b/src/framework/ui/internal/uiactionsregister.cpp @@ -62,6 +62,10 @@ void UiActionsRegister::reg(const IUiActionsModulePtr& module) updateChecked(newActionCodeList); updateShortcuts(newActionCodeList); + module->actionsChanged().onReceive(this, [this](const UiActionList& actions) { + updateActions(actions); + }); + module->actionEnabledChanged().onReceive(this, [this](const ActionCodeList& codes) { updateEnabled(codes); m_actionStateChanged.send(codes); @@ -95,12 +99,7 @@ const UiActionsRegister::Info& UiActionsRegister::info(const ActionCode& code) c return null; } -const UiAction& UiActionsRegister::action(const ActionCode& code) const -{ - return info(code).action; -} - -const std::vector UiActionsRegister::getActions() const +std::vector UiActionsRegister::actionList() const { std::vector allActions; @@ -111,6 +110,16 @@ const std::vector UiActionsRegister::getActions() const return allActions; } +const UiAction& UiActionsRegister::action(const ActionCode& code) const +{ + return info(code).action; +} + +async::Channel UiActionsRegister::actionsChanged() const +{ + return m_actionsChanged; +} + UiActionState UiActionsRegister::actionState(const ActionCode& code) const { const Info& inf = info(code); @@ -146,6 +155,26 @@ void UiActionsRegister::updateShortcutsAll() } } +void UiActionsRegister::updateActions(const UiActionList& actions) +{ + ActionCodeList codes; + for (const UiAction& act : actions) { + Info& inf = info(act.code); + IF_ASSERT_FAILED(inf.isValid()) { + continue; + } + + inf.action = act; + + codes.push_back(act.code); + } + + m_actionsChanged.send(actions); + + updateEnabled(codes); + updateChecked(codes); +} + void UiActionsRegister::doUpdateEnabled(Info& inf, const IUiContextResolverPtr& ctxResolver, const UiContext& currentCtx, diff --git a/src/framework/ui/internal/uiactionsregister.h b/src/framework/ui/internal/uiactionsregister.h index 8b892a98ab663..aca64ae83598b 100644 --- a/src/framework/ui/internal/uiactionsregister.h +++ b/src/framework/ui/internal/uiactionsregister.h @@ -44,8 +44,12 @@ class UiActionsRegister : public IUiActionsRegister, public Injectable, public a void init(); void reg(const IUiActionsModulePtr& actions) override; + + std::vector actionList() const override; + const UiAction& action(const actions::ActionCode& code) const override; - const std::vector getActions() const override; + async::Channel actionsChanged() const override; + UiActionState actionState(const actions::ActionCode& code) const override; async::Channel actionStateChanged() const override; @@ -69,6 +73,8 @@ class UiActionsRegister : public IUiActionsRegister, public Injectable, public a void updateShortcuts(const actions::ActionCodeList& codes); void updateShortcutsAll(); + void updateActions(const UiActionList& actions); + void updateEnabled(const actions::ActionCodeList& codes); void updateEnabledAll(); void doUpdateEnabled(Info& inf, const IUiContextResolverPtr& ctxResolver, const UiContext& currentCtx, @@ -78,6 +84,7 @@ class UiActionsRegister : public IUiActionsRegister, public Injectable, public a void updateChecked(const actions::ActionCodeList& codes); std::unordered_map m_actions; + async::Channel m_actionsChanged; async::Channel m_actionStateChanged; }; } diff --git a/src/framework/ui/iuiactionsmodule.h b/src/framework/ui/iuiactionsmodule.h index f3d6bc773fbe2..e486fa80c5aef 100644 --- a/src/framework/ui/iuiactionsmodule.h +++ b/src/framework/ui/iuiactionsmodule.h @@ -35,6 +35,14 @@ class IUiActionsModule virtual ~IUiActionsModule() = default; virtual const UiActionList& actionsList() const = 0; + virtual async::Channel actionsChanged() const + { + //! NOTE Usually actions don't change, + //! so let's add a default implementation here. + static async::Channel ch; + return ch; + } + virtual bool actionEnabled(const UiAction& act) const = 0; virtual async::Channel actionEnabledChanged() const = 0; diff --git a/src/framework/ui/iuiactionsregister.h b/src/framework/ui/iuiactionsregister.h index e148dd34c62e6..ee6f2e28875f8 100644 --- a/src/framework/ui/iuiactionsregister.h +++ b/src/framework/ui/iuiactionsregister.h @@ -38,10 +38,13 @@ class IUiActionsRegister : MODULE_EXPORT_INTERFACE virtual void reg(const IUiActionsModulePtr& actions) = 0; - virtual const UiAction& action(const muse::actions::ActionCode& code) const = 0; - virtual const std::vector getActions() const = 0; - virtual UiActionState actionState(const muse::actions::ActionCode& code) const = 0; - virtual async::Channel actionStateChanged() const = 0; + virtual std::vector actionList() const = 0; + + virtual const UiAction& action(const actions::ActionCode& code) const = 0; + virtual async::Channel actionsChanged() const = 0; + + virtual UiActionState actionState(const actions::ActionCode& code) const = 0; + virtual async::Channel actionStateChanged() const = 0; }; }