diff --git a/kcmkwin/kwindecoration/CMakeLists.txt b/kcmkwin/kwindecoration/CMakeLists.txt index 6a7c536a9f..2abf909807 100644 --- a/kcmkwin/kwindecoration/CMakeLists.txt +++ b/kcmkwin/kwindecoration/CMakeLists.txt @@ -11,11 +11,7 @@ set(kcm_kwindecoration_PART_SRCS buttonsconfigdialog.cpp configdialog.cpp preview.cpp - decorationdelegate.cpp decorationmodel.cpp - ${AURORAE_SOURCE_DIR}/auroraebutton.cpp - ${AURORAE_SOURCE_DIR}/auroraescene.cpp - ${AURORAE_SOURCE_DIR}/auroraetab.cpp ${AURORAE_SOURCE_DIR}/auroraetheme.cpp ${AURORAE_SOURCE_DIR}/themeconfig.cpp ) @@ -28,9 +24,10 @@ kde4_add_ui_files(kcm_kwindecoration_PART_SRCS ) kde4_add_plugin(kcm_kwindecoration ${kcm_kwindecoration_PART_SRCS}) -target_link_libraries(kcm_kwindecoration ${KDE4_PLASMA_LIBS} ${KDE4_KNEWSTUFF3_LIBS} kdecorations ${X11_LIBRARIES}) +target_link_libraries(kcm_kwindecoration ${KDE4_PLASMA_LIBS} ${KDE4_KNEWSTUFF3_LIBS} kdecorations ${QT_QTDECLARATIVE_LIBRARY} ${X11_LIBRARIES}) install(TARGETS kcm_kwindecoration DESTINATION ${PLUGIN_INSTALL_DIR} ) ########### install files ############### install( FILES kwindecoration.desktop DESTINATION ${SERVICES_INSTALL_DIR} ) +install( FILES qml/main.qml qml/AuroraeDecoration.qml DESTINATION ${DATA_INSTALL_DIR}/kwin/kcm_kwindecoration) diff --git a/kcmkwin/kwindecoration/decoration.ui b/kcmkwin/kwindecoration/decoration.ui index eb694d9a7f..34cdcc3bc3 100644 --- a/kcmkwin/kwindecoration/decoration.ui +++ b/kcmkwin/kwindecoration/decoration.ui @@ -22,13 +22,10 @@ - + Select the window decoration. This is the look and feel of both the window borders and the window handle. - - QAbstractItemView::ScrollPerPixel - diff --git a/kcmkwin/kwindecoration/decorationdelegate.cpp b/kcmkwin/kwindecoration/decorationdelegate.cpp deleted file mode 100644 index d0712de06d..0000000000 --- a/kcmkwin/kwindecoration/decorationdelegate.cpp +++ /dev/null @@ -1,62 +0,0 @@ -/******************************************************************** - KWin - the KDE window manager - This file is part of the KDE project. - -Copyright (C) 2009 Martin Gräßlin - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*********************************************************************/ -#include "decorationdelegate.h" -#include "decorationmodel.h" -#include -#include -#include - -namespace KWin -{ - -const int margin = 5; - -DecorationDelegate::DecorationDelegate(QObject* parent) - : QStyledItemDelegate(parent) -{ -} - -DecorationDelegate::~DecorationDelegate() -{ -} - -void DecorationDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const -{ - // highlight selected item - QApplication::style()->drawControl(QStyle::CE_ItemViewItem, &option, painter); - - QPixmap pixmap = index.model()->data(index, DecorationModel::PixmapRole).value(); - - const QSize previewArea = option.rect.size() - QSize(2 * margin, 2 * margin); - if (pixmap.isNull() || pixmap.size() != previewArea) { - emit regeneratePreview(static_cast< const QSortFilterProxyModel* >(index.model())->mapToSource(index), - previewArea); - } else - painter->drawPixmap(option.rect.topLeft() + QPoint(margin, margin), pixmap); -} - -QSize DecorationDelegate::sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const -{ - Q_UNUSED(option) - Q_UNUSED(index) - return QSize(450, 150); -} - -} // namespace KWin diff --git a/kcmkwin/kwindecoration/decorationdelegate.h b/kcmkwin/kwindecoration/decorationdelegate.h deleted file mode 100644 index e849d9f410..0000000000 --- a/kcmkwin/kwindecoration/decorationdelegate.h +++ /dev/null @@ -1,45 +0,0 @@ -/******************************************************************** - KWin - the KDE window manager - This file is part of the KDE project. - -Copyright (C) 2009 Martin Gräßlin - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*********************************************************************/ -#ifndef KWIN_DECORATIONDELEGATE_H -#define KWIN_DECORATIONDELEGATE_H -#include - -class KPushButton; - -namespace KWin -{ - -class DecorationDelegate : public QStyledItemDelegate -{ - Q_OBJECT -public: - DecorationDelegate(QObject* parent = 0); - ~DecorationDelegate(); - - virtual void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const; - virtual QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const; - -signals: - void regeneratePreview(const QModelIndex& index, const QSize& size) const; -}; - -} // namespace KWin - -#endif // KWIN_DECORATIONDELEGATE_H diff --git a/kcmkwin/kwindecoration/decorationmodel.cpp b/kcmkwin/kwindecoration/decorationmodel.cpp index d211dc4c61..253e896c33 100644 --- a/kcmkwin/kwindecoration/decorationmodel.cpp +++ b/kcmkwin/kwindecoration/decorationmodel.cpp @@ -19,8 +19,6 @@ along with this program. If not, see . *********************************************************************/ #include "decorationmodel.h" #include "preview.h" -#include "auroraetheme.h" -#include "auroraescene.h" // kwin #include // Qt @@ -37,6 +35,7 @@ along with this program. If not, see . #include #include #include +#include "kwindecoration.h" namespace KWin { @@ -48,12 +47,15 @@ DecorationModel::DecorationModel(KSharedConfigPtr config, QObject* parent) , m_customButtons(false) , m_leftButtons(QString()) , m_rightButtons(QString()) - , m_theme(new Aurorae::AuroraeTheme(this)) - , m_scene(new Aurorae::AuroraeScene(m_theme, QString(), QString(), true, this)) , m_renderWidget(new QWidget(0)) { + QHash roleNames; + roleNames[Qt::DisplayRole] = "display"; + roleNames[DecorationModel::PixmapRole] = "preview"; + roleNames[TypeRole] = "type"; + roleNames[AuroraeNameRole] = "auroraeThemeName"; + setRoleNames(roleNames); m_config = KSharedConfig::openConfig("auroraerc"); - m_scene->setIcon(KIcon("xorg")); findDecorations(); } @@ -258,7 +260,7 @@ void DecorationModel::regeneratePreviews() QList::iterator it = m_decorations.begin(); for (int i = 0; i < m_decorations.count(); i++) { - regeneratePreview(index(i), m_decorations.at(i).preview.size()); + regeneratePreview(index(i), QSize(qobject_cast(QObject::parent())->itemWidth(), 150)); } } @@ -299,52 +301,6 @@ void DecorationModel::regeneratePreview(const QModelIndex& index, const QSize& s m_preview->setTempBorderSize(m_plugins, data.borderSize); data.preview = m_preview->preview(&document, m_renderWidget); break; - case DecorationModelData::AuroraeDecoration: { - QPixmap pix(size); - pix.fill(Qt::transparent); - KConfig conf("aurorae/themes/" + data.auroraeName + '/' + data.auroraeName + "rc", KConfig::FullConfig, "data"); - m_theme->loadTheme(data.auroraeName, conf); - m_theme->setBorderSize(data.borderSize); - m_theme->setButtonSize(data.buttonSize); - m_scene->setButtons(m_customButtons ? m_leftButtons : m_theme->defaultButtonsLeft(), - m_customButtons ? m_rightButtons : m_theme->defaultButtonsRight()); - int left, top, right, bottom; - m_theme->borders(left, top, right, bottom, false); - int padLeft, padRight, padTop, padBottom; - m_theme->padding(padLeft, padTop, padRight, padBottom); - top = qMin(int(top * .9), 30); - int xoffset = qMin(qMax(10, QApplication::isRightToLeft() ? left : right), 30); - m_scene->setSceneRect(0, 0 , - size.width() - xoffset - 20 + padLeft + padRight, - size.height() - top - 20 + padLeft + padRight); - m_scene->setActive(false, false); - m_scene->addTab(i18n("Inactive Window")); - m_scene->updateLayout(); - QPainter painter(&pix); - QRect rect = QRectF(QPointF(10 + xoffset - padLeft, 10 - padTop), m_scene->sceneRect().size()).toRect(); - m_scene->render(&painter, QStyle::visualRect(QApplication::layoutDirection(), pix.rect(), rect)); - m_scene->setActive(true, false); - m_scene->setCaption(i18n("Active Window")); - rect = QRectF(QPointF(10 - padLeft, top + 10 - padTop), m_scene->sceneRect().size()).toRect(); - m_scene->render(&painter, QStyle::visualRect(QApplication::layoutDirection(), pix.rect(), rect)); - - const int width = rect.width() - left - right - padLeft - padRight; - const int height = rect.height() - top - bottom - padTop - padBottom; - m_renderWidget->setGeometry(0, 0, width, height); - painter.save(); - const QPoint topLeft = QStyle::visualRect(QApplication::layoutDirection(), pix.rect(), rect).topLeft() + - QPoint(left + padLeft, top + padTop); - m_renderWidget->render(&painter, topLeft); - painter.restore(); - //Enable word-wrap - document.setTextWidth(width - margin * 2); - painter.save(); - painter.translate(topLeft); - document.drawContents(&painter, QRectF(margin, margin, width - margin * 2, height - margin * 2)); - painter.restore(); - data.preview = pix; - break; - } default: // nothing break; diff --git a/kcmkwin/kwindecoration/decorationmodel.h b/kcmkwin/kwindecoration/decorationmodel.h index d3a70572b5..5e1f14f1ff 100644 --- a/kcmkwin/kwindecoration/decorationmodel.h +++ b/kcmkwin/kwindecoration/decorationmodel.h @@ -30,12 +30,6 @@ class KDesktopFile; class KDecorationPlugins; class KDecorationPreview; -namespace Aurorae -{ -class AuroraeTheme; -class AuroraeScene; -} - namespace KWin { @@ -113,11 +107,11 @@ public: public slots: void regeneratePreview(const QModelIndex& index, const QSize& size); + void regeneratePreviews(); private: void findDecorations(); void findAuroraeThemes(); - void regeneratePreviews(); void metaData(DecorationModelData& data, const KDesktopFile& df); QList m_decorations; KDecorationPlugins* m_plugins; @@ -125,8 +119,6 @@ private: bool m_customButtons; QString m_leftButtons; QString m_rightButtons; - Aurorae::AuroraeTheme* m_theme; - Aurorae::AuroraeScene* m_scene; KSharedConfigPtr m_config; QWidget* m_renderWidget; }; diff --git a/kcmkwin/kwindecoration/kwindecoration.cpp b/kcmkwin/kwindecoration/kwindecoration.cpp index 304230582c..fe6fce6f41 100644 --- a/kcmkwin/kwindecoration/kwindecoration.cpp +++ b/kcmkwin/kwindecoration/kwindecoration.cpp @@ -31,17 +31,22 @@ #include "kwindecoration.h" #include "buttonsconfigdialog.h" #include "configdialog.h" -#include "decorationdelegate.h" #include "decorationmodel.h" +#include "auroraetheme.h" // Qt #include +#include +#include +#include #include // KDE #include #include #include #include +#include #include +#include // KCModule plugin interface // ========================= @@ -69,9 +74,8 @@ KWinDecorationModule::KWinDecorationModule(QWidget* parent, const QVariantList & , m_rightButtons(QString()) , m_configLoaded(false) { + qmlRegisterType("org.kde.kwin.aurorae", 0, 1, "AuroraeTheme"); m_ui = new KWinDecorationForm(this); - DecorationDelegate* delegate = new DecorationDelegate(this); - m_ui->decorationList->setItemDelegate(delegate); m_ui->configureDecorationButton->setIcon(KIcon("configure")); m_ui->configureButtonsButton->setIcon(KIcon("configure")); m_ui->ghnsButton->setIcon(KIcon("get-hot-new-stuff")); @@ -85,16 +89,21 @@ KWinDecorationModule::KWinDecorationModule(QWidget* parent, const QVariantList & m_proxyModel = new QSortFilterProxyModel(this); m_proxyModel->setSourceModel(m_model); m_proxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive); - m_ui->decorationList->setModel(m_proxyModel); + m_ui->decorationList->setResizeMode(QDeclarativeView::SizeRootObjectToView); + foreach (const QString &importPath, KGlobal::dirs()->findDirs("module", "imports")) { + m_ui->decorationList->engine()->addImportPath(importPath); + } + m_ui->decorationList->rootContext()->setContextProperty("decorationModel", m_proxyModel); + m_ui->decorationList->rootContext()->setContextProperty("auroraeSource", KStandardDirs::locate("data", "kwin/aurorae/aurorae.qml")); + m_ui->decorationList->setSource(KStandardDirs::locate("data", "kwin/kcm_kwindecoration/main.qml")); readConfig(style); - connect(m_ui->decorationList->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), SLOT(slotSelectionChanged())); + connect(m_ui->decorationList->rootObject(), SIGNAL(currentIndexChanged()), SLOT(slotSelectionChanged())); + connect(m_ui->decorationList->rootObject(), SIGNAL(widthChanged()), m_model, SLOT(regeneratePreviews())); connect(m_ui->configureButtonsButton, SIGNAL(clicked(bool)), this, SLOT(slotConfigureButtons())); connect(m_ui->ghnsButton, SIGNAL(clicked(bool)), SLOT(slotGHNSClicked())); connect(m_ui->searchEdit, SIGNAL(textChanged(QString)), m_proxyModel, SLOT(setFilterFixedString(QString))); - connect(delegate, SIGNAL(regeneratePreview(QModelIndex,QSize)), - m_model, SLOT(regeneratePreview(QModelIndex,QSize))); connect(m_ui->configureDecorationButton, SIGNAL(clicked(bool)), SLOT(slotConfigureDecoration())); KAboutData *about = @@ -104,6 +113,7 @@ KWinDecorationModule::KWinDecorationModule(QWidget* parent, const QVariantList & ki18n("(c) 2001 Karol Szwed")); about->addAuthor(ki18n("Karol Szwed"), KLocalizedString(), "gallium@kde.org"); setAboutData(about); + m_model->regeneratePreviews(); } @@ -111,6 +121,11 @@ KWinDecorationModule::~KWinDecorationModule() { } +int KWinDecorationModule::itemWidth() const +{ + return m_ui->decorationList->rootObject()->property("width").toInt(); +} + // This is the selection handler setting void KWinDecorationModule::slotSelectionChanged() { @@ -144,13 +159,13 @@ void KWinDecorationModule::readConfig(const KConfigGroup & conf) const QString themeName = group.readEntry("ThemeName", "example-deco"); const QModelIndex index = m_proxyModel->mapFromSource(m_model->indexOfAuroraeName(themeName)); if (index.isValid()) { - m_ui->decorationList->setCurrentIndex(index); + m_ui->decorationList->rootObject()->setProperty("currentIndex", index.row()); } } else { const QModelIndex index = m_proxyModel->mapFromSource(m_model->indexOfLibrary(libraryName)); if (index.isValid()) { m_model->setBorderSize(index, borderSize); - m_ui->decorationList->setCurrentIndex(index); + m_ui->decorationList->rootObject()->setProperty("currentIndex", index.row()); } } @@ -175,7 +190,7 @@ void KWinDecorationModule::readConfig(const KConfigGroup & conf) // Writes the selected user configuration to the kwin config file void KWinDecorationModule::writeConfig(KConfigGroup & conf) { - const QModelIndex index = m_proxyModel->mapToSource(m_ui->decorationList->currentIndex()); + const QModelIndex index = m_proxyModel->mapToSource(m_proxyModel->index(m_ui->decorationList->rootObject()->property("currentIndex").toInt(), 0)); const QString libName = m_model->data(index, DecorationModel::LibraryNameRole).toString(); // General settings @@ -231,7 +246,7 @@ void KWinDecorationModule::defaults() m_showTooltips = true; const QModelIndex index = m_proxyModel->mapFromSource(m_model->indexOfName(i18n("Oxygen"))); if (index.isValid()) - m_ui->decorationList->setCurrentIndex(index); + m_ui->decorationList->rootObject()->setProperty("currentIndex", index.row()); m_leftButtons = KDecorationOptions::defaultTitleButtonsLeft(); m_rightButtons = KDecorationOptions::defaultTitleButtonsRight(); @@ -273,7 +288,7 @@ void KWinDecorationModule::slotGHNSClicked() QPointer downloadDialog = new KNS3::DownloadDialog("aurorae.knsrc", this); if (downloadDialog->exec() == KDialog::Accepted) { if (!downloadDialog->changedEntries().isEmpty()) { - const QModelIndex index = m_proxyModel->mapToSource(m_ui->decorationList->currentIndex()); + const QModelIndex index = m_proxyModel->mapToSource(m_proxyModel->index(m_ui->decorationList->rootObject()->property("currentIndex").toInt(), 0)); const QString libraryName = m_model->data(index, DecorationModel::LibraryNameRole).toString(); bool aurorae = m_model->data(index, DecorationModel::TypeRole).toInt() == DecorationModelData::AuroraeDecoration; const QString auroraeName = m_model->data(index, DecorationModel::AuroraeNameRole).toString(); @@ -281,11 +296,11 @@ void KWinDecorationModule::slotGHNSClicked() if (aurorae) { const QModelIndex proxyIndex = m_proxyModel->mapFromSource(m_model->indexOfAuroraeName(auroraeName)); if (proxyIndex.isValid()) - m_ui->decorationList->setCurrentIndex(proxyIndex); + m_ui->decorationList->rootObject()->setProperty("currentIndex", proxyIndex.row()); } else { const QModelIndex proxyIndex = m_proxyModel->mapFromSource(m_model->indexOfLibrary(libraryName)); if (proxyIndex.isValid()) - m_ui->decorationList->setCurrentIndex(proxyIndex); + m_ui->decorationList->rootObject()->setProperty("currentIndex", proxyIndex.row()); } } } @@ -294,7 +309,7 @@ void KWinDecorationModule::slotGHNSClicked() void KWinDecorationModule::slotConfigureDecoration() { - const QModelIndex index = m_proxyModel->mapToSource(m_ui->decorationList->currentIndex()); + 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) { QPointer< KDialog > dlg = new KDialog(this); diff --git a/kcmkwin/kwindecoration/kwindecoration.h b/kcmkwin/kwindecoration/kwindecoration.h index 6ef19c04c8..30d4b4314a 100644 --- a/kcmkwin/kwindecoration/kwindecoration.h +++ b/kcmkwin/kwindecoration/kwindecoration.h @@ -66,6 +66,8 @@ public: QString quickHelp() const; + int itemWidth() const; + signals: void pluginLoad(const KConfigGroup& conf); void pluginSave(KConfigGroup &conf); diff --git a/kcmkwin/kwindecoration/qml/AuroraeDecoration.qml b/kcmkwin/kwindecoration/qml/AuroraeDecoration.qml new file mode 100644 index 0000000000..8db4065df7 --- /dev/null +++ b/kcmkwin/kwindecoration/qml/AuroraeDecoration.qml @@ -0,0 +1,51 @@ +/******************************************************************** +Copyright (C) 2012 Martin Gräßlin + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*********************************************************************/ +import QtQuick 1.1 + +Item { + property alias active: decoration.active + property alias source: auroraeLoader.source + QtObject { + id: decoration + property bool active: false + property string caption: display + property int desktop: 1 + property variant icon: "xorg" + property bool closeable: true + property bool maximizeable: true + property bool minimizeable: true + property bool modal: false + property bool moveable: true + property bool onAllDesktops: false + property bool preview: true + property bool resizeable: true + property bool setShade: false + property bool shade: false + property bool shadeable: false + property bool keepAbove: false + property bool keepBelow: false + property bool maximized: false + property bool providesContextHelp: true + property string leftButtons: "MS" + property string rightButtons: "HIA__X" + function titleMouseMoved() {} + } + Loader { + id: auroraeLoader + anchors.fill: parent + } +} diff --git a/kcmkwin/kwindecoration/qml/main.qml b/kcmkwin/kwindecoration/qml/main.qml new file mode 100644 index 0000000000..33e0ee47d1 --- /dev/null +++ b/kcmkwin/kwindecoration/qml/main.qml @@ -0,0 +1,85 @@ +/******************************************************************** +Copyright (C) 2012 Martin Gräßlin + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*********************************************************************/ +import QtQuick 1.1 +import org.kde.qtextracomponents 0.1 as QtExtra +import org.kde.kwin.aurorae 0.1 +import org.kde.plasma.components 0.1 as PlasmaComponents + +Item { + property alias currentIndex: listView.currentIndex + ListView { + id: listView + anchors.fill: parent + model: decorationModel + highlight: PlasmaComponents.Highlight { + width: listView.width - 10 + height: 140 + hover: true + } + delegate: Item { + width: listView.width + height: 150 + QtExtra.QPixmapItem { + pixmap: preview + anchors.fill: parent + visible: type == 0 + } + Item { + id: aurorae + visible: type == 1 + anchors.fill: parent + AuroraeTheme { + id: auroraeTheme + Component.onCompleted: { + auroraeTheme.loadTheme(auroraeThemeName); + inactiveAurorae.source = auroraeSource; + activeAurorae.source = auroraeSource; + } + } + AuroraeDecoration { + id: inactiveAurorae + active: false + anchors { + fill: parent + leftMargin: 40 - auroraeTheme.paddingLeft + rightMargin: 10 - auroraeTheme.paddingRight + topMargin: 10 - auroraeTheme.paddingTop + bottomMargin: 40 - auroraeTheme.paddingBottom + } + } + AuroraeDecoration { + id: activeAurorae + active: true + anchors { + fill: parent + leftMargin: 10 - auroraeTheme.paddingLeft + rightMargin: 40 - auroraeTheme.paddingRight + topMargin: 40 - auroraeTheme.paddingTop + bottomMargin: 10 - auroraeTheme.paddingBottom + } + } + } + MouseArea { + hoverEnabled: false + anchors.fill: parent + onClicked: { + listView.currentIndex = index; + } + } + } + } +}