Albert
Loading...
Searching...
No Matches
plugin.h
Go to the documentation of this file.
1// Copyright (c) 2023-2024 Manuel Schneider
2
3#pragma once
4#include "albert/config.h"
5#include "albert/extension.h"
7#include <QObject>
8#include <QStringLiteral>
9
10#define EXPAND_STRINGIZE(s) STRINGIZE(s)
11#define STRINGIZE(s) #s
12
26#define ALBERT_PLUGIN_PROPERTY_NONTRIVIAL(type, name, defaultValue) \
27public: static const type name##_default{defaultValue}; \
28protected: void store_##name() { settings()->setValue(EXPAND_STRINGIZE(name), name()); } \
29protected: void restore_##name() { set_##name##_(settings()->value(EXPAND_STRINGIZE(name), name##_default).value<type>()); } \
30public: void reset_##name() { set_##name##_(name##_default); settings()->remove(EXPAND_STRINGIZE(name)); } \
31Q_SIGNAL void name##Changed(); \
32Q_PROPERTY(type name READ name WRITE set_##name RESET reset_##name NOTIFY name##Changed USER true) \
33public: void set_##name(type val) { if (val != name()){ set_##name##_(val); store_##name(); emit name##Changed(); } } \
34private: void set_##name##_(type); \
35public: type name() const; \
36
37
46#define ALBERT_PLUGIN_PROPERTY(type, name, defaultValue) \
47public: static const type name##_default{defaultValue}; \
48protected: void store_##name() { settings()->setValue(EXPAND_STRINGIZE(name), name()); } \
49protected: void restore_##name() { name##_ = settings()->value(EXPAND_STRINGIZE(name), name##_default).value<type>(); } \
50public: void reset_##name() { name##_ = name##_default; settings()->remove(EXPAND_STRINGIZE(name)); } \
51Q_SIGNAL void name##Changed(); \
52Q_PROPERTY(type name READ name WRITE set_##name RESET reset_##name NOTIFY name##Changed USER true) \
53private: type name##_{defaultValue}; \
54public: type name() const { return name##_; } \
55public: void set_##name(type val) { if (val != name()){ name##_=val; store_##name(); emit name##Changed(); } } \
56
57
66#define ALBERT_PLUGIN_PROPERTY_CONNECT(object, name, widget, widget_setter, widget_signal) \
67widget->widget_setter(object->name()); \
68connect(widget, &std::remove_pointer<decltype(widget)>::type::widget_signal, \
69 object, &std::remove_pointer<decltype(object)>::type::set_##name); \
70connect(object, &std::remove_pointer<decltype(object)>::type::name##Changed, \
71 widget, [o=object,w=widget](){ w->widget_setter(o->name()); });
72
73
85#define ALBERT_PLUGIN Q_PLUGIN_METADATA(IID ALBERT_PLUGIN_IID FILE "metadata.json")
86
87
89{
90
110class ALBERT_EXPORT Plugin : public QObject, public PluginInstance {};
111
122class ALBERT_EXPORT ExtensionPlugin : public Plugin, virtual public Extension
123{
124public:
126 QString id() const override;
127
129 QString name() const override;
130
132 QString description() const override;
133
135 void initialize(ExtensionRegistry&, std::map<QString,PluginInstance*>) override;
136
139
140};
141
142}
The common extension pool.
Definition: extensionregistry.h:22
The extension interface class.
Definition: extension.h:18
Abstract plugin instance class.
Definition: plugininstance.h:22
Convenience base class for extension plugins.
Definition: plugin.h:123
QString id() const override
Override returning PluginInstance::id.
QString description() const override
Override returning PluginInstance::description.
void finalize(ExtensionRegistry &) override
Override deregistering itself as extension.
void initialize(ExtensionRegistry &, std::map< QString, PluginInstance * >) override
Override registering itself as extension.
QString name() const override
Override returning PluginInstance::name.
Base class for native plugins.
Definition: plugin.h:110
Definition: plugin.h:89