#include "styleagent.h"
|
#include "styleagent_p.h"
|
|
#include <QtCore/QVariant>
|
|
namespace QWK {
|
|
StyleAgentPrivate::StyleAgentPrivate() {
|
}
|
|
StyleAgentPrivate::~StyleAgentPrivate() = default;
|
|
void StyleAgentPrivate::init() {
|
}
|
|
void StyleAgentPrivate::notifyThemeChanged(StyleAgent::SystemTheme theme) {
|
if (theme == systemTheme)
|
return;
|
systemTheme = theme;
|
|
Q_Q(StyleAgent);
|
Q_EMIT q->systemThemeChanged();
|
}
|
|
void StyleAgentPrivate::_q_windowDestroyed() {
|
windowAttributes.remove(static_cast<QWindow *>(sender()));
|
}
|
|
StyleAgent::StyleAgent(QObject *parent) : StyleAgent(*new StyleAgentPrivate(), parent) {
|
Q_D(StyleAgent);
|
d->setupSystemThemeHook();
|
}
|
|
StyleAgent::~StyleAgent() {
|
Q_D(StyleAgent);
|
d->removeSystemThemeHook();
|
}
|
|
StyleAgent::SystemTheme StyleAgent::systemTheme() const {
|
Q_D(const StyleAgent);
|
return d->systemTheme;
|
}
|
|
QVariant StyleAgent::windowAttribute(QWindow *window, const QString &key) const {
|
Q_D(const StyleAgent);
|
return d->windowAttributes.value(window).value(key);
|
}
|
|
bool StyleAgent::setWindowAttribute(QWindow *window, const QString &key,
|
const QVariant &attribute) {
|
Q_D(StyleAgent);
|
if (!window)
|
return false;
|
|
auto it = d->windowAttributes.find(window);
|
if (it == d->windowAttributes.end()) {
|
if (!attribute.isValid())
|
return true;
|
if (!d->updateWindowAttribute(window, key, attribute, {}))
|
return false;
|
connect(window, &QWindow::destroyed, d, &StyleAgentPrivate::_q_windowDestroyed);
|
d->windowAttributes.insert(window, QVariantHash{
|
{key, attribute}
|
});
|
} else {
|
auto &attributes = it.value();
|
auto oldAttribute = attributes.value(key);
|
if (oldAttribute == attribute)
|
return true;
|
if (!d->updateWindowAttribute(window, key, attribute, oldAttribute))
|
return false;
|
attributes.insert(key, attribute);
|
}
|
return true;
|
}
|
|
StyleAgent::StyleAgent(StyleAgentPrivate &d, QObject *parent) : QObject(parent), d_ptr(&d) {
|
d.q_ptr = this;
|
|
d.init();
|
}
|
|
}
|