diff --git a/clients/aurorae/src/aurorae.cpp b/clients/aurorae/src/aurorae.cpp index ab117a4d94..caf2b20de0 100644 --- a/clients/aurorae/src/aurorae.cpp +++ b/clients/aurorae/src/aurorae.cpp @@ -85,6 +85,7 @@ void AuroraeFactory::initAurorae(KConfig &conf, KConfigGroup &group) m_component->loadUrl(QUrl(KStandardDirs::locate("data", "kwin/aurorae/aurorae.qml"))); m_engine->rootContext()->setContextProperty("auroraeTheme", m_theme); m_engine->rootContext()->setContextProperty("options", this); + m_themeName = themeName; } void AuroraeFactory::initQML(const KConfigGroup &group) @@ -117,6 +118,7 @@ void AuroraeFactory::initQML(const KConfigGroup &group) m_engine->addImportPath(importPath); } m_component->loadUrl(QUrl::fromLocalFile(file)); + m_themeName = themeName; } AuroraeFactory::~AuroraeFactory() @@ -159,6 +161,7 @@ bool AuroraeFactory::reset(unsigned long changed) m_theme->setBorderSize((KDecorationDefines::BorderSize)themeGroup.readEntry("BorderSize", KDecorationDefines::BorderNormal)); m_theme->setButtonSize((KDecorationDefines::BorderSize)themeGroup.readEntry("ButtonSize", KDecorationDefines::BorderNormal)); } + emit configChanged(); return false; // need hard reset } @@ -248,6 +251,7 @@ AuroraeClient::AuroraeClient(KDecorationBridge *bridge, KDecorationFactory *fact connect(this, SIGNAL(keepAboveChanged(bool)), SIGNAL(keepAboveChangedWrapper())); connect(this, SIGNAL(keepBelowChanged(bool)), SIGNAL(keepBelowChangedWrapper())); connect(AuroraeFactory::instance(), SIGNAL(buttonsChanged()), SIGNAL(buttonsChanged())); + connect(AuroraeFactory::instance(), SIGNAL(configChanged()), SIGNAL(configChanged())); } AuroraeClient::~AuroraeClient() @@ -556,6 +560,12 @@ void AuroraeClient::doTitlebarDblClickOperation() KDecorationUnstable::titlebarDblClickOperation(); } +QVariant AuroraeClient::readConfig(const QString &key, const QVariant &defaultValue) +{ + KSharedConfigPtr config = KSharedConfig::openConfig("auroraerc"); + return config->group(AuroraeFactory::instance()->currentThemeName()).readEntry(key, defaultValue); +} + } // namespace Aurorae extern "C" diff --git a/clients/aurorae/src/aurorae.h b/clients/aurorae/src/aurorae.h index f37e1f4a08..6018a9a4e8 100644 --- a/clients/aurorae/src/aurorae.h +++ b/clients/aurorae/src/aurorae.h @@ -61,6 +61,9 @@ public: QString leftButtons(); QString rightButtons(); bool customButtonPositions(); + const QString ¤tThemeName() const { + return m_themeName; + } QFont activeTitleFont(); QFont inactiveTitleFont(); @@ -78,6 +81,7 @@ private: Q_SIGNALS: void buttonsChanged(); void titleFontChanged(); + void configChanged(); private: static AuroraeFactory *s_instance; @@ -86,6 +90,7 @@ private: QDeclarativeEngine *m_engine; QDeclarativeComponent *m_component; EngineType m_engineType; + QString m_themeName; }; class AuroraeClient : public KDecorationUnstable @@ -138,6 +143,8 @@ public: bool isMaximized() const; int doubleClickInterval() const; + Q_INVOKABLE QVariant readConfig(const QString &key, const QVariant &defaultValue = QVariant()); + Q_SIGNALS: void activeChanged(); void captionChanged(); @@ -148,6 +155,11 @@ Q_SIGNALS: void keepAboveChangedWrapper(); void keepBelowChangedWrapper(); void buttonsChanged(); + /** + * Signal emitted when the decoration's configuration might have changed. + * A decoration could reload it's configuration when this signal is emitted. + **/ + void configChanged(); public slots: void menuClicked(); diff --git a/clients/aurorae/src/decorationoptions.h b/clients/aurorae/src/decorationoptions.h index fd508b0f74..4f469fec16 100644 --- a/clients/aurorae/src/decorationoptions.h +++ b/clients/aurorae/src/decorationoptions.h @@ -51,6 +51,7 @@ namespace KWin class DecorationOptions : public QObject { Q_OBJECT + Q_ENUMS(BorderSize) /** * The decoration Object for which this set of options should be used. The decoration is * required to get the correct colors and fonts depending on whether the decoration represents @@ -112,6 +113,15 @@ class DecorationOptions : public QObject **/ Q_PROPERTY(QString titleButtonsRight READ titleButtonsRight NOTIFY titleButtonsChanged) public: + enum BorderSize { + BorderTiny, ///< Minimal borders + BorderNormal, ///< Standard size borders, the default setting + BorderLarge, ///< Larger borders + BorderVeryLarge, ///< Very large borders + BorderHuge, ///< Huge borders + BorderVeryHuge, ///< Very huge borders + BorderOversized ///< Oversized borders + }; explicit DecorationOptions(QObject *parent = 0); virtual ~DecorationOptions(); diff --git a/kcmkwin/kwindecoration/decorationmodel.cpp b/kcmkwin/kwindecoration/decorationmodel.cpp index 9a55e3cc2b..8ac4a3f3ed 100644 --- a/kcmkwin/kwindecoration/decorationmodel.cpp +++ b/kcmkwin/kwindecoration/decorationmodel.cpp @@ -69,6 +69,8 @@ DecorationModel::DecorationModel(KSharedConfigPtr config, QObject* parent) roleNames[TypeRole] = "type"; roleNames[AuroraeNameRole] = "auroraeThemeName"; roleNames[QmlMainScriptRole] = "mainScript"; + roleNames[BorderSizeRole] = "borderSize"; + roleNames[ButtonSizeRole] = "buttonSize"; setRoleNames(roleNames); m_config = KSharedConfig::openConfig("auroraerc"); findDecorations(); @@ -136,9 +138,9 @@ void DecorationModel::findDecorations() // not a valid QML theme continue; } - // TODO: read proper border sizes - data.borderSize = KDecorationDefines::BorderNormal; - data.buttonSize = KDecorationDefines::BorderNormal; + KConfigGroup config(m_config, data.auroraeName); + data.borderSize = (KDecorationDefines::BorderSize)config.readEntry< int >("BorderSize", KDecorationDefines::BorderNormal); + data.buttonSize = (KDecorationDefines::BorderSize)config.readEntry< int >("ButtonSize", KDecorationDefines::BorderNormal); data.comment = service->comment(); KPluginInfo info(service); data.author = info.author(); @@ -243,7 +245,8 @@ QVariant DecorationModel::data(const QModelIndex& index, int role) const return sizes; } case ButtonSizeRole: - if (m_decorations[ index.row()].type == DecorationModelData::AuroraeDecoration) + if (m_decorations[ index.row()].type == DecorationModelData::AuroraeDecoration || + m_decorations[ index.row()].type == DecorationModelData::QmlDecoration) return static_cast< int >(m_decorations[ index.row()].buttonSize); else return QVariant(); @@ -259,23 +262,27 @@ bool DecorationModel::setData(const QModelIndex& index, const QVariant& value, i if (!index.isValid() || (role != BorderSizeRole && role != ButtonSizeRole)) return QAbstractItemModel::setData(index, value, role); + const DecorationModelData::DecorationType type = m_decorations[ index.row()].type; + if (role == BorderSizeRole) { m_decorations[ index.row()].borderSize = (KDecorationDefines::BorderSize)value.toInt(); - if (m_decorations[ index.row()].type == DecorationModelData::AuroraeDecoration) { + if (type == DecorationModelData::AuroraeDecoration || type == DecorationModelData::QmlDecoration) { KConfigGroup config(m_config, m_decorations[ index.row()].auroraeName); config.writeEntry("BorderSize", value.toInt()); config.sync(); } emit dataChanged(index, index); + emit configChanged(m_decorations[ index.row()].auroraeName); regeneratePreview(index); return true; } - if (role == ButtonSizeRole && m_decorations[ index.row()].type == DecorationModelData::AuroraeDecoration) { + if (role == ButtonSizeRole && (type == DecorationModelData::AuroraeDecoration || type == DecorationModelData::QmlDecoration)) { m_decorations[ index.row()].buttonSize = (KDecorationDefines::BorderSize)value.toInt(); KConfigGroup config(m_config, m_decorations[ index.row()].auroraeName); config.writeEntry("ButtonSize", value.toInt()); config.sync(); emit dataChanged(index, index); + emit configChanged(m_decorations[ index.row()].auroraeName); regeneratePreview(index); return true; } @@ -423,9 +430,14 @@ QModelIndex DecorationModel::indexOfAuroraeName(const QString &auroraeName, cons void DecorationModel::setBorderSize(const QModelIndex& index, KDecorationDefines::BorderSize size) { - if (!index.isValid() || m_decorations[ index.row()].type == DecorationModelData::AuroraeDecoration) + if (!index.isValid() || m_decorations[ index.row()].type == DecorationModelData::AuroraeDecoration || m_decorations[ index.row()].type == DecorationModelData::QmlDecoration) return; m_decorations[ index.row()].borderSize = size; } +QVariant DecorationModel::readConfig(const QString &themeName, const QString &key, const QVariant &defaultValue) +{ + return m_config->group(themeName).readEntry(key, defaultValue); +} + } // namespace KWin diff --git a/kcmkwin/kwindecoration/decorationmodel.h b/kcmkwin/kwindecoration/decorationmodel.h index 69fd22c5d1..11bc3741dd 100644 --- a/kcmkwin/kwindecoration/decorationmodel.h +++ b/kcmkwin/kwindecoration/decorationmodel.h @@ -112,6 +112,11 @@ public: void regeneratePreviews(int firstIndex = 0); void stopPreviewGeneration(); + + Q_INVOKABLE QVariant readConfig(const QString &themeName, const QString &key, const QVariant &defaultValue = QVariant()); + +Q_SIGNALS: + void configChanged(QString themeName); public slots: void regeneratePreview(const QModelIndex& index, const QSize& size); private slots: diff --git a/kcmkwin/kwindecoration/kwindecoration.cpp b/kcmkwin/kwindecoration/kwindecoration.cpp index 51a3b5ce18..95e755e91e 100644 --- a/kcmkwin/kwindecoration/kwindecoration.cpp +++ b/kcmkwin/kwindecoration/kwindecoration.cpp @@ -98,6 +98,7 @@ KWinDecorationModule::KWinDecorationModule(QWidget* parent, const QVariantList & m_ui->decorationList->engine()->addImportPath(importPath); } m_ui->decorationList->rootContext()->setContextProperty("decorationModel", m_proxyModel); + m_ui->decorationList->rootContext()->setContextProperty("decorationBaseModel", m_model); m_ui->decorationList->rootContext()->setContextProperty("options", m_decorationButtons); m_ui->decorationList->rootContext()->setContextProperty("highlightColor", m_ui->decorationList->palette().color(QPalette::Highlight)); m_ui->decorationList->rootContext()->setContextProperty("sliderWidth", m_ui->decorationList->verticalScrollBar()->width()); @@ -342,7 +343,8 @@ void KWinDecorationModule::slotConfigureDecoration() { const QModelIndex index = m_proxyModel->mapToSource(m_proxyModel->index(m_ui->decorationList->rootObject()->property("currentIndex").toInt(), 0)); bool reload = false; - if (index.data(DecorationModel::TypeRole).toInt() == DecorationModelData::AuroraeDecoration) { + if (index.data(DecorationModel::TypeRole).toInt() == DecorationModelData::AuroraeDecoration || + index.data(DecorationModel::TypeRole).toInt() == DecorationModelData::QmlDecoration) { QPointer< KDialog > dlg = new KDialog(this); dlg->setCaption(i18n("Decoration Options")); dlg->setButtons(KDialog::Ok | KDialog::Cancel); diff --git a/kcmkwin/kwindecoration/qml/AuroraeDecoration.qml b/kcmkwin/kwindecoration/qml/AuroraeDecoration.qml index 8db4065df7..e8108264b3 100644 --- a/kcmkwin/kwindecoration/qml/AuroraeDecoration.qml +++ b/kcmkwin/kwindecoration/qml/AuroraeDecoration.qml @@ -20,6 +20,7 @@ Item { property alias active: decoration.active property alias source: auroraeLoader.source QtObject { + signal configChanged id: decoration property bool active: false property string caption: display @@ -43,9 +44,26 @@ Item { property string leftButtons: "MS" property string rightButtons: "HIA__X" function titleMouseMoved() {} + function readConfig(key, defaultValue) { + if (key == "BorderSize") { + return borderSize; + } else if (key == "ButtonSize") { + return buttonSize; + } else { + return decorationBaseModel.readConfig(auroraeThemeName, key, defaultValue); + } + } } Loader { id: auroraeLoader anchors.fill: parent } + Connections { + target: decorationBaseModel + onConfigChanged: { + if (auroraeThemeName == themeName) { + decoration.configChanged(); + } + } + } }