summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRusty Wagner <rusty.wagner@gmail.com>2021-10-27 19:12:33 -0400
committerRusty Wagner <rusty.wagner@gmail.com>2021-10-27 19:12:33 -0400
commitc6f170d1541c53a5b2a9821b31f77612d0b8559f (patch)
treed087ef55e94f59e6c17b0508de19f361fa712735
parent644f9709668eca8c206d662bf40361180ed1cb8c (diff)
Add API for global actions on global area widgets
-rw-r--r--ui/globalarea.h105
1 files changed, 105 insertions, 0 deletions
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<class T>
+ 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<T*>(widget);
+ }
+
+ template<class T>
+ static UIAction globalAreaAction(const QString& title,
+ const std::function<void(T* obj)>& activate)
+ {
+ return globalAreaAction<T>(title,
+ [=](T* obj, const UIActionContext&) { activate(obj); },
+ [=](T*, const UIActionContext&) { return true; });
+ }
+
+ template<class T>
+ static UIAction globalAreaAction(const QString& title,
+ const std::function<void(T* obj, const UIActionContext& ctxt)>& activate)
+ {
+ return globalAreaAction<T>(title, activate,
+ [](T*, const UIActionContext&) { return true; });
+ }
+
+ template<class T>
+ static UIAction globalAreaAction(const QString& title,
+ const std::function<void(T* obj)>& activate, const std::function<bool(T* obj)>& isValid)
+ {
+ return globalAreaAction<T>(title,
+ [=](T* obj, const UIActionContext&) { activate(obj); },
+ [=](T* obj, const UIActionContext&) { return isValid(obj); });
+ }
+
+ template<class T>
+ static UIAction globalAreaAction(const QString& title,
+ const std::function<void(T* obj, const UIActionContext& ctxt)>& activate,
+ const std::function<bool(T* obj, const UIActionContext& ctxt)>& isValid)
+ {
+ std::function<T*(const UIActionContext& ctxt)> 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<T*>(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<class T>
+ static std::function<bool(const UIActionContext&)> globalAreaActionChecked(const QString& title,
+ const std::function<bool(T* obj)>& isChecked)
+ {
+ return globalAreaActionChecked<T>(title,
+ [=](T* obj, const UIActionContext&) { return isChecked(obj); });
+ }
+
+ template<class T>
+ static std::function<bool(const UIActionContext&)> globalAreaActionChecked(const QString& title,
+ const std::function<bool(T* obj, const UIActionContext& ctxt)>& 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<T*>(widget);
+ if (obj)
+ return isChecked(obj, ctxt);
+ return false;
+ };
+ }
+
Q_SIGNALS:
void widgetClosed(GlobalAreaWidget* widget);