diff --git a/effects/desktopgrid/desktopgrid.h b/effects/desktopgrid/desktopgrid.h --- a/effects/desktopgrid/desktopgrid.h +++ b/effects/desktopgrid/desktopgrid.h @@ -25,35 +25,14 @@ #include #include #include -#include + +#include "kwineffectquickview.h" namespace KWin { class PresentWindowsEffectProxy; -class DesktopButtonsView : public QQuickView -{ - Q_OBJECT -public: - explicit DesktopButtonsView(QWindow *parent = nullptr); - void windowInputMouseEvent(QMouseEvent* e); - void setAddDesktopEnabled(bool enable); - void setRemoveDesktopEnabled(bool enable); - bool isVisible() const; - void show(); - void hide(); -public: - EffectWindow *effectWindow; -Q_SIGNALS: - void addDesktop(); - void removeDesktop(); -private: - bool m_visible; - QPoint m_pos; - bool m_posIsValid; -}; - class DesktopGridEffect : public Effect { @@ -182,7 +161,7 @@ QRect m_windowMoveGeometry; QPoint m_windowMoveStartPoint; - QVector m_desktopButtonsViews; + QVector m_desktopButtons; QAction *m_activateAction; diff --git a/effects/desktopgrid/desktopgrid.cpp b/effects/desktopgrid/desktopgrid.cpp --- a/effects/desktopgrid/desktopgrid.cpp +++ b/effects/desktopgrid/desktopgrid.cpp @@ -36,10 +36,10 @@ #include #include #include -#include -#include -#include +#include +#include +#include #include #include @@ -102,9 +102,6 @@ DesktopGridEffect::~DesktopGridEffect() { - foreach (DesktopButtonsView *view, m_desktopButtonsViews) - view->deleteLater(); - m_desktopButtonsViews.clear(); } void DesktopGridEffect::reconfigure(ReconfigureFlags) @@ -194,19 +191,9 @@ } // paint the add desktop button - foreach (DesktopButtonsView *view, m_desktopButtonsViews) { - if (!view->effectWindow) { - EffectWindow *viewWindow = effects->findWindow(view->winId()); - if (viewWindow) { - viewWindow->setData(WindowForceBlurRole, QVariant(true)); - view->effectWindow = viewWindow; - } - } - if (view->effectWindow) { - WindowPaintData d(view->effectWindow); - d.multiplyOpacity(timeline.currentValue()); - effects->drawWindow(view->effectWindow, PAINT_WINDOW_TRANSLUCENT, infiniteRegion(), d); - } + for (EffectQuickScene* view : m_desktopButtons) { + view->rootItem()->setOpacity(timeline.currentValue()); + effects->renderEffectQuickView(view); } if (isUsingPresentWindows() && windowMove && wasWindowMove) { @@ -313,14 +300,6 @@ (sourceDesktop != highlightedDesktop && highlightedDesktop == paintingDesktop))) { return; // will be painted on top of all other windows } - foreach (DesktopButtonsView *view, m_desktopButtonsViews) { - if (view->effectWindow == w) { - if (!activated && timeline.currentValue() < 0.05) { - view->hide(); - } - return; // will be painted on top of all other windows - } - } qreal xScale = data.xScale(); qreal yScale = data.yScale(); @@ -444,12 +423,6 @@ { if (w == windowMove) windowMove = nullptr; - foreach (DesktopButtonsView *view, m_desktopButtonsViews) { - if (view->effectWindow && view->effectWindow == w) { - view->effectWindow = nullptr; - break; - } - } if (isUsingPresentWindows()) { for (QList::iterator it = m_managers.begin(), end = m_managers.end(); it != end; ++it) { @@ -482,11 +455,9 @@ return; QMouseEvent* me = static_cast< QMouseEvent* >(e); if (!(wasWindowMove || wasDesktopMove)) { - foreach (DesktopButtonsView *view, m_desktopButtonsViews) { - if (view->geometry().contains(me->pos())) { - const QPoint widgetPos = view->mapFromGlobal(me->pos()); - QMouseEvent event(me->type(), widgetPos, me->pos(), me->button(), me->buttons(), me->modifiers()); - view->windowInputMouseEvent(&event); + for (EffectQuickScene *view : m_desktopButtons) { + view->forwardMouseEvent(me); + if (e->isAccepted()) { return; } } @@ -1060,7 +1031,7 @@ [this] { if (activated) return; - foreach (DesktopButtonsView *view, m_desktopButtonsViews) { + for (EffectQuickScene *view : m_desktopButtons) { view->hide(); } } @@ -1125,33 +1096,46 @@ } } } - bool enableAdd = effects->numberOfDesktops() < 20; - bool enableRemove = effects->numberOfDesktops() > 1; - QVector::iterator it = m_desktopButtonsViews.begin(); + auto it = m_desktopButtons.begin(); const int n = DesktopGridConfig::showAddRemove() ? effects->numScreens() : 0; for (int i = 0; i < n; ++i) { - DesktopButtonsView *view; - if (it == m_desktopButtonsViews.end()) { - view = new DesktopButtonsView(); - m_desktopButtonsViews.append(view); - it = m_desktopButtonsViews.end(); // changed through insert! - connect(view, &DesktopButtonsView::addDesktop, this, &DesktopGridEffect::slotAddDesktop); - connect(view, &DesktopButtonsView::removeDesktop, this, &DesktopGridEffect::slotRemoveDesktop); + EffectQuickScene *view; + QSize size; + if (it == m_desktopButtons.end()) { + view = new EffectQuickScene(this); + + connect(view, &EffectQuickView::repaintNeeded, this, []() { + effects->addRepaintFull(); + }); + + view->rootContext()->setContextProperty("effects", effects); + view->setSource(QUrl(QStandardPaths::locate(QStandardPaths::GenericDataLocation, QStringLiteral("kwin/effects/desktopgrid/main.qml")))); + + QQuickItem *rootItem = view->rootItem(); + if (!rootItem) { + delete view; + continue; + } + + m_desktopButtons.append(view); + it = m_desktopButtons.end(); // changed through insert! + + size = QSize(rootItem->implicitWidth(), rootItem->implicitHeight()); } else { view = *it; ++it; + size = view->size(); } - view->setAddDesktopEnabled(enableAdd); - view->setRemoveDesktopEnabled(enableRemove); const QRect screenRect = effects->clientArea(FullScreenArea, i, 1); view->show(); // pseudo show must happen before geometry changes - view->setPosition(screenRect.right() - border/3 - view->width(), - screenRect.bottom() - border/3 - view->height()); + const QPoint position(screenRect.right() - border/3 - size.width(), + screenRect.bottom() - border/3 - size.height()); + view->setGeometry(QRect(position, size)); } - while (it != m_desktopButtonsViews.end()) { + while (it != m_desktopButtons.end()) { (*it)->deleteLater(); - it = m_desktopButtonsViews.erase(it); + it = m_desktopButtons.erase(it); } } @@ -1297,12 +1281,6 @@ if (!activated) return; const uint desktop = effects->numberOfDesktops(); - bool enableAdd = desktop < 20; - bool enableRemove = desktop > 1; - foreach (DesktopButtonsView *view, m_desktopButtonsViews) { - view->setAddDesktopEnabled(enableAdd); - view->setRemoveDesktopEnabled(enableRemove); - } if (old < desktop) desktopsAdded(old); else @@ -1443,76 +1421,5 @@ return true; } -/************************************************ -* DesktopButtonView -************************************************/ -DesktopButtonsView::DesktopButtonsView(QWindow *parent) - : QQuickView(parent) - , effectWindow(nullptr) - , m_visible(false) - , m_posIsValid(false) -{ - setFlags(Qt::X11BypassWindowManagerHint | Qt::FramelessWindowHint); - setColor(Qt::transparent); - - rootContext()->setContextProperty(QStringLiteral("add"), QVariant(true)); - rootContext()->setContextProperty(QStringLiteral("remove"), QVariant(true)); - setSource(QUrl(QStandardPaths::locate(QStandardPaths::GenericDataLocation, QStringLiteral("kwin/effects/desktopgrid/main.qml")))); - if (QObject *item = rootObject()->findChild(QStringLiteral("addButton"))) { - connect(item, SIGNAL(clicked()), SIGNAL(addDesktop())); - } - if (QObject *item = rootObject()->findChild(QStringLiteral("removeButton"))) { - connect(item, SIGNAL(clicked()), SIGNAL(removeDesktop())); - } -} - -void DesktopButtonsView::windowInputMouseEvent(QMouseEvent *e) -{ - if (e->type() == QEvent::MouseMove) { - mouseMoveEvent(e); - } else if (e->type() == QEvent::MouseButtonPress) { - mousePressEvent(e); - } else if (e->type() == QEvent::MouseButtonDblClick) { - mouseDoubleClickEvent(e); - } else if (e->type() == QEvent::MouseButtonRelease) { - mouseReleaseEvent(e); - } -} - -void DesktopButtonsView::setAddDesktopEnabled(bool enable) -{ - rootContext()->setContextProperty(QStringLiteral("add"), QVariant(enable)); -} - -void DesktopButtonsView::setRemoveDesktopEnabled(bool enable) -{ - rootContext()->setContextProperty(QStringLiteral("remove"), QVariant(enable)); -} - -bool DesktopButtonsView::isVisible() const -{ - return m_visible; -} - -void DesktopButtonsView::show() -{ - if (!m_visible && m_posIsValid) { - setPosition(m_pos); - m_posIsValid = false; - } - m_visible = true; - QQuickView::show(); -} - -void DesktopButtonsView::hide() -{ - if (!m_posIsValid) { - m_pos = position(); - m_posIsValid = true; - setPosition(-width(), -height()); - } - m_visible = false; -} - } // namespace diff --git a/effects/desktopgrid/main.qml b/effects/desktopgrid/main.qml --- a/effects/desktopgrid/main.qml +++ b/effects/desktopgrid/main.qml @@ -18,32 +18,20 @@ along with this program. If not, see . *********************************************************************/ import QtQuick 2.0 -import org.kde.plasma.components 2.0 as Plasma +import QtQuick.Layouts 1.2 +import org.kde.plasma.components 3.0 as Plasma -Item { - width: childrenRect.width - height: childrenRect.height - Plasma.ButtonRow { - exclusive: false - width: childrenRect.width - height: childrenRect.height - Plasma.Button { - id: removeButton - objectName: "removeButton" - enabled: remove - width: height - font.bold: true - font.pointSize: 20 - text: "-" - } - Plasma.Button { - id: addButton - objectName: "addButton" - enabled: add - font.bold: true - font.pointSize: 20 - width: height - text: "+" - } +RowLayout { + Plasma.Button { + objectName: "removeButton" + enabled: effects.desktops > 1 + icon.name: "list-remove" + onClicked: effects.desktops-- + } + Plasma.Button { + objectName: "addButton" + enabled: effects.desktops < 20 + icon.name: "list-add" + onClicked: effects.desktops++ } } diff --git a/libkwineffects/kwineffectquickview.cpp b/libkwineffects/kwineffectquickview.cpp --- a/libkwineffects/kwineffectquickview.cpp +++ b/libkwineffects/kwineffectquickview.cpp @@ -346,23 +346,22 @@ : EffectQuickView(parent) , d(new EffectQuickScene::Private) { + d->qmlObject = new KDeclarative::QmlObjectSharedEngine(this); } EffectQuickScene::EffectQuickScene(QObject *parent, EffectQuickView::ExportMode exportMode) : EffectQuickView(parent, exportMode) , d(new EffectQuickScene::Private) { + d->qmlObject = new KDeclarative::QmlObjectSharedEngine(this); } EffectQuickScene::~EffectQuickScene() { } void EffectQuickScene::setSource(const QUrl &source) { - if (!d->qmlObject) { - d->qmlObject = new KDeclarative::QmlObjectSharedEngine(this); - } d->qmlObject->setSource(source); QQuickItem *item = rootItem();