5#include <QCoreApplication>
7#include <albert/export.h>
8#include <albert/logging.h>
18 inline operator T()
const {
return dependency_; }
19 inline operator bool()
const {
return dependency_ !=
nullptr; }
20 const T* operator->()
const {
return dependency_; }
21 T* operator->() {
return dependency_; }
22 const T* get()
const {
return dependency_; }
23 T* get() {
return dependency_; }
27 Dependency() =
default;
28 ~Dependency() =
default;
30 T *dependency_ =
nullptr;
58 this->dependency_ =
dynamic_cast<T*
>(App::instance().extensions().at(
id));
60 if (!this->dependency_)
61 throw std::runtime_error(
62 QCoreApplication::translate(
64 "Extension '%1' is available, but it is not of the expected type."
65 ).arg(
id).toStdString());
67 catch (
const std::out_of_range &)
69 throw std::runtime_error(
70 QCoreApplication::translate(
72 "The required extension '%1' is not available."
73 ).arg(
id).toStdString());
100 explicit WeakDependency(
const QString &
id, std::function<
void(
bool)> on_registered = {}):
101 callback(on_registered),
105 this->dependency_ =
dynamic_cast<T*
>(App::instance().extensions().at(
id));
106 if (!this->dependency_)
107 WARN << QStringLiteral(
"Found '%1' but failed casting to expected type.").arg(
id);
108 }
catch (
const std::out_of_range &) { }
110 conn_add_ = QObject::connect(&App::instance(), &App::added,
111 [
this](Extension *e){ onRegistered(e);});
113 conn_rem_ = QObject::connect(&App::instance(), &App::removed,
114 [
this](Extension *e){ onDeregistered(e);});
119 QObject::disconnect(conn_add_);
120 QObject::disconnect(conn_rem_);
123 std::function<void(
bool)> callback;
127 void onRegistered(Extension *e)
129 if (e->id() != this->id_)
132 if (!this->dependency_)
134 if (
auto *d =
dynamic_cast<T*
>(e); d)
136 this->dependency_ = d;
141 WARN << QStringLiteral(
"Failed casting '%1' to expected type.").arg(this->id_);
144 CRIT <<
"WeakDependency already set. Internal logic error?";
147 void onDeregistered(Extension *e)
150 if (e->id() != this->id_)
153 if (this->dependency_)
155 if (
auto *d =
dynamic_cast<T*
>(e); d)
159 this->dependency_ =
nullptr;
162 WARN << QStringLiteral(
"Failed casting '%1' to expected type.").arg(this->id_);
165 CRIT <<
"WeakDependency already unset. Internal logic error?";
168 QMetaObject::Connection conn_add_;
169 QMetaObject::Connection conn_rem_;
Convenience holder class for hard plugin dependencies.
Definition plugindependency.h:46
StrongDependency(QString id)
Constructs a StrongDependency with id.
Definition plugindependency.h:54
Convenience holder class for soft plugin dependencies.
Definition plugindependency.h:94
WeakDependency(const QString &id, std::function< void(bool)> on_registered={})
Constructs a WeakDependency with id and callback on_registered.
Definition plugindependency.h:100
The Albert namespace.
Definition app.h:55