From c6f170d1541c53a5b2a9821b31f77612d0b8559f Mon Sep 17 00:00:00 2001 From: Rusty Wagner Date: Wed, 27 Oct 2021 19:12:33 -0400 Subject: Add API for global actions on global area widgets --- ui/globalarea.h | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) diff --git a/ui/globalarea.h b/ui/globalarea.h index c49679a1..94b0b715 100644 --- a/ui/globalarea.h +++ b/ui/globalarea.h @@ -105,12 +105,117 @@ public: bool toggleVisible(); bool toggleWidgetVisible(const QString& title); void focusWidget(const QString& title); + GlobalAreaWidget* widget(const QString& title); void saveSizes(const QSettings& settings, const QString& windowStateName); void saveState(const QSettings& settings, const QString& windowStateName); void restoreSizes(const QSettings& settings, const QString& windowStateName); void restoreState(const QSettings& settings, const QString& windowStateName); + static GlobalArea* current() + { + UIContext* context = UIContext::activeContext(); + if (!context) + return nullptr; + return context->globalArea(); + } + + template + static T* widget(const QString& title) + { + GlobalArea* globalArea = current(); + if (!globalArea) + return (T*)nullptr; + GlobalAreaWidget* widget = globalArea->widget(title); + if (!widget) + return (T*)nullptr; + return qobject_cast(widget); + } + + template + static UIAction globalAreaAction(const QString& title, + const std::function& activate) + { + return globalAreaAction(title, + [=](T* obj, const UIActionContext&) { activate(obj); }, + [=](T*, const UIActionContext&) { return true; }); + } + + template + static UIAction globalAreaAction(const QString& title, + const std::function& activate) + { + return globalAreaAction(title, activate, + [](T*, const UIActionContext&) { return true; }); + } + + template + static UIAction globalAreaAction(const QString& title, + const std::function& activate, const std::function& isValid) + { + return globalAreaAction(title, + [=](T* obj, const UIActionContext&) { activate(obj); }, + [=](T* obj, const UIActionContext&) { return isValid(obj); }); + } + + template + static UIAction globalAreaAction(const QString& title, + const std::function& activate, + const std::function& isValid) + { + std::function lookup = [=](const UIActionContext& ctxt) { + if (!ctxt.context) + return (T*)nullptr; + GlobalArea* globalArea = ctxt.context->globalArea(); + if (!globalArea || !globalArea->isWidgetVisible(title)) + return (T*)nullptr; + GlobalAreaWidget* widget = globalArea->widget(title); + if (!widget) + return (T*)nullptr; + return qobject_cast(widget); + }; + return UIAction( + [=](const UIActionContext& ctxt) { + T* obj = lookup(ctxt); + if (obj) + activate(obj, ctxt); + }, + [=](const UIActionContext& ctxt) { + T* obj = lookup(ctxt); + if (obj) + return isValid(obj, ctxt); + return false; + }); + } + + template + static std::function globalAreaActionChecked(const QString& title, + const std::function& isChecked) + { + return globalAreaActionChecked(title, + [=](T* obj, const UIActionContext&) { return isChecked(obj); }); + } + + template + static std::function globalAreaActionChecked(const QString& title, + const std::function& isChecked) + { + return [=](const UIActionContext& ctxt) { + if (!ctxt.context) + return false; + GlobalArea* globalArea = ctxt.context->globalArea(); + if (!globalArea || !globalArea->isWidgetVisible(title)) + return false; + GlobalAreaWidget* widget = globalArea->widget(title); + if (!widget) + return false; + T* obj = qobject_cast(widget); + if (obj) + return isChecked(obj, ctxt); + return false; + }; + } + Q_SIGNALS: void widgetClosed(GlobalAreaWidget* widget); -- cgit v1.3.1