From 103de33c9206a468e802945a7904a4da7846f5f8 Mon Sep 17 00:00:00 2001 From: Michail Vourlakos Date: Thu, 2 Jan 2020 17:06:50 +0200 Subject: [PATCH] trying to implement real panels sliding in/ou --- app/view/positioner.cpp | 173 +++++++++++------- app/view/positioner.h | 8 + app/view/visibilitymanager.cpp | 8 +- .../package/contents/ui/VisibilityManager.qml | 12 +- .../contents/ui/layouts/LayoutsContainer.qml | 8 + containment/package/contents/ui/main.qml | 2 +- 6 files changed, 137 insertions(+), 74 deletions(-) diff --git a/app/view/positioner.cpp b/app/view/positioner.cpp index c9c07f31c..cd709c96b 100644 --- a/app/view/positioner.cpp +++ b/app/view/positioner.cpp @@ -278,7 +278,7 @@ void Positioner::reconsiderScreen() //!check if the associated screen is running for (const auto scr : qGuiApp->screens()) { if (m_screenToFollowId == scr->name() - || (m_view->onPrimary() && scr == qGuiApp->primaryScreen())) { + || (m_view->onPrimary() && scr == qGuiApp->primaryScreen())) { screenExists = true; } } @@ -291,7 +291,7 @@ void Positioner::reconsiderScreen() || m_view->screen() != qGuiApp->primaryScreen())) { using Plasma::Types; QList edges{Types::BottomEdge, Types::LeftEdge, - Types::TopEdge, Types::RightEdge}; + Types::TopEdge, Types::RightEdge}; edges = m_view->layout() ? m_view->layout()->availableEdgesForView(qGuiApp->primaryScreen(), m_view) : edges; @@ -336,7 +336,7 @@ void Positioner::screenChanged(QScreen *scr) void Positioner::syncGeometry() { - if (!(m_view->screen() && m_view->containment()) || m_inDelete) { + if (!(m_view->screen() && m_view->containment()) || m_inDelete || m_slideOffset!=0) { return; } @@ -418,7 +418,7 @@ void Positioner::syncGeometry() void Positioner::validateDockGeometry() { - if (m_view->geometry() != m_validGeometry) { + if (m_slideOffset==0 && m_view->geometry() != m_validGeometry) { m_validateGeometryTimer.start(); } } @@ -436,19 +436,19 @@ QRect Positioner::maximumNormalGeometry() maxGeometry.setRect(0, 0, maxWidth, maxHeight); switch (m_view->location()) { - case Plasma::Types::LeftEdge: - xPos = m_view->screen()->geometry().x(); - maxGeometry.setRect(xPos, yPos, maxWidth, maxHeight); - break; - - case Plasma::Types::RightEdge: - xPos = m_view->screen()->geometry().right() - maxWidth + 1; - maxGeometry.setRect(xPos, yPos, maxWidth, maxHeight); - break; - - default: - //! bypass clang warnings - break; + case Plasma::Types::LeftEdge: + xPos = m_view->screen()->geometry().x(); + maxGeometry.setRect(xPos, yPos, maxWidth, maxHeight); + break; + + case Plasma::Types::RightEdge: + xPos = m_view->screen()->geometry().right() - maxWidth + 1; + maxGeometry.setRect(xPos, yPos, maxWidth, maxHeight); + break; + + default: + //! bypass clang warnings + break; } //! this is needed in order to preserve that the top dock will be above @@ -461,7 +461,7 @@ QRect Positioner::maximumNormalGeometry() && m_view->visibility()->mode() != Latte::Types::WindowsAlwaysCover) { KWindowSystem::setState(m_view->winId(), NET::KeepAbove); } else { - // KWindowSystem::clearState(m_view->winId(), NET::KeepAbove); + // KWindowSystem::clearState(m_view->winId(), NET::KeepAbove); } return maxGeometry; @@ -482,49 +482,49 @@ void Positioner::updatePosition(QRect availableScreenRect) int screenEdgeMargin = (m_view->behaveAsPlasmaPanel() && m_view->screenEdgeMarginEnabled()) ? m_view->screenEdgeMargin() : 0; switch (m_view->location()) { - case Plasma::Types::TopEdge: - if (m_view->behaveAsPlasmaPanel()) { - position = {screenGeometry.x() + length(screenGeometry.width()), - screenGeometry.y() + screenEdgeMargin}; - } else { - position = {screenGeometry.x(), screenGeometry.y()}; - } + case Plasma::Types::TopEdge: + if (m_view->behaveAsPlasmaPanel()) { + position = {screenGeometry.x() + length(screenGeometry.width()), + screenGeometry.y() + screenEdgeMargin}; + } else { + position = {screenGeometry.x(), screenGeometry.y()}; + } - break; + break; - case Plasma::Types::BottomEdge: - if (m_view->behaveAsPlasmaPanel()) { - position = {screenGeometry.x() + length(screenGeometry.width()), - screenGeometry.y() + screenGeometry.height() - cleanThickness - screenEdgeMargin}; - } else { - position = {screenGeometry.x(), screenGeometry.y() + screenGeometry.height() - m_view->height()}; - } + case Plasma::Types::BottomEdge: + if (m_view->behaveAsPlasmaPanel()) { + position = {screenGeometry.x() + length(screenGeometry.width()), + screenGeometry.y() + screenGeometry.height() - cleanThickness - screenEdgeMargin}; + } else { + position = {screenGeometry.x(), screenGeometry.y() + screenGeometry.height() - m_view->height()}; + } - break; + break; - case Plasma::Types::RightEdge: - if (m_view->behaveAsPlasmaPanel()) { - position = {availableScreenRect.right() - cleanThickness + 1 - screenEdgeMargin, - availableScreenRect.y() + length(availableScreenRect.height())}; - } else { - position = {availableScreenRect.right() - m_view->width() + 1, availableScreenRect.y()}; - } + case Plasma::Types::RightEdge: + if (m_view->behaveAsPlasmaPanel()) { + position = {availableScreenRect.right() - cleanThickness + 1 - screenEdgeMargin, + availableScreenRect.y() + length(availableScreenRect.height())}; + } else { + position = {availableScreenRect.right() - m_view->width() + 1, availableScreenRect.y()}; + } - break; + break; - case Plasma::Types::LeftEdge: - if (m_view->behaveAsPlasmaPanel()) { - position = {availableScreenRect.x() + screenEdgeMargin, - availableScreenRect.y() + length(availableScreenRect.height())}; - } else { - position = {availableScreenRect.x(), availableScreenRect.y()}; - } + case Plasma::Types::LeftEdge: + if (m_view->behaveAsPlasmaPanel()) { + position = {availableScreenRect.x() + screenEdgeMargin, + availableScreenRect.y() + length(availableScreenRect.height())}; + } else { + position = {availableScreenRect.x(), availableScreenRect.y()}; + } - break; + break; - default: - qWarning() << "wrong location, couldn't update the panel position" - << m_view->location(); + default: + qWarning() << "wrong location, couldn't update the panel position" + << m_view->location(); } m_validGeometry.setTopLeft(position); @@ -536,6 +536,49 @@ void Positioner::updatePosition(QRect availableScreenRect) } } +int Positioner::slideOffset() const +{ + return m_slideOffset; +} + +void Positioner::setSlideOffset(int offset) +{ + if (m_slideOffset == offset) { + return; + } + + m_slideOffset = offset; + + QPoint slidedTopLeft; + + if (m_view->location() == Plasma::Types::TopEdge) { + int boundedY = qMax(m_view->screenGeometry().top() - (m_validGeometry.height() - 1), m_validGeometry.y() - qAbs(m_slideOffset)); + slidedTopLeft = {m_validGeometry.x(), boundedY}; + + } else if (m_view->location() == Plasma::Types::BottomEdge) { + int boundedY = qMin(m_view->screenGeometry().bottom() - 1, m_validGeometry.y() + qAbs(m_slideOffset)); + slidedTopLeft = {m_validGeometry.x(), boundedY}; + + } else if (m_view->location() == Plasma::Types::RightEdge) { + int boundedX = qMax(m_view->screenGeometry().right() - 1, m_validGeometry.x() + qAbs(m_slideOffset)); + slidedTopLeft = {boundedX, m_validGeometry.y()}; + + } else if (m_view->location() == Plasma::Types::LeftEdge) { + int boundedX = qMax(m_view->screenGeometry().left() - (m_validGeometry.width() - 1), m_validGeometry.x() - qAbs(m_slideOffset)); + slidedTopLeft = {boundedX, m_validGeometry.y()}; + + } + + m_view->setPosition(slidedTopLeft); + + if (m_view->surface()) { + m_view->surface()->setPosition(slidedTopLeft); + } + + emit slideOffsetChanged(); +} + + void Positioner::resizeWindow(QRect availableScreenRect) { QSize screenSize = m_view->screen()->size(); @@ -571,18 +614,18 @@ void Positioner::updateFormFactor() return; switch (m_view->location()) { - case Plasma::Types::TopEdge: - case Plasma::Types::BottomEdge: - m_view->containment()->setFormFactor(Plasma::Types::Horizontal); - break; - - case Plasma::Types::LeftEdge: - case Plasma::Types::RightEdge: - m_view->containment()->setFormFactor(Plasma::Types::Vertical); - break; - - default: - qWarning() << "wrong location, couldn't update the panel position" << m_view->location(); + case Plasma::Types::TopEdge: + case Plasma::Types::BottomEdge: + m_view->containment()->setFormFactor(Plasma::Types::Horizontal); + break; + + case Plasma::Types::LeftEdge: + case Plasma::Types::RightEdge: + m_view->containment()->setFormFactor(Plasma::Types::Vertical); + break; + + default: + qWarning() << "wrong location, couldn't update the panel position" << m_view->location(); } } diff --git a/app/view/positioner.h b/app/view/positioner.h index 9970ea37a..9c8aa38c4 100644 --- a/app/view/positioner.h +++ b/app/view/positioner.h @@ -49,6 +49,8 @@ class Positioner: public QObject Q_OBJECT Q_PROPERTY(int currentScreenId READ currentScreenId NOTIFY currentScreenChanged) + //! animating window slide + Q_PROPERTY(int slideOffset READ slideOffset WRITE setSlideOffset NOTIFY slideOffsetChanged) Q_PROPERTY(QString currentScreenName READ currentScreenName NOTIFY currentScreenChanged) public: @@ -58,6 +60,9 @@ public: int currentScreenId() const; QString currentScreenName() const; + int slideOffset() const; + void setSlideOffset(int offset); + bool inLocationChangeAnimation(); void setScreenToFollow(QScreen *scr, bool updateScreenId = true); @@ -77,6 +82,7 @@ signals: void currentScreenChanged(); void edgeChanged(); void screenGeometryChanged(); + void slideOffsetChanged(); void windowSizeChanged(); //! these two signals are used from config ui and containment ui @@ -110,6 +116,8 @@ private: private: bool m_inDelete{false}; + int m_slideOffset{0}; + //! it is used in order to enforce X11 to never miss window geometry QRect m_validGeometry; diff --git a/app/view/visibilitymanager.cpp b/app/view/visibilitymanager.cpp index ad4f36269..db1688434 100644 --- a/app/view/visibilitymanager.cpp +++ b/app/view/visibilitymanager.cpp @@ -374,9 +374,7 @@ void VisibilityManager::setIsBelowLayer(bool below) m_isBelowLayer = below; - if (m_mode == Latte::Types::WindowsCanCover) { - updateGhostWindowState(); - } + updateGhostWindowState(); emit isBelowLayerChanged(); } @@ -398,7 +396,9 @@ void VisibilityManager::setIsHidden(bool isHidden) m_isHidden = isHidden; - updateGhostWindowState(); + if (!m_latteView->behaveAsPlasmaPanel()) { + updateGhostWindowState(); + } emit isHiddenChanged(); } diff --git a/containment/package/contents/ui/VisibilityManager.qml b/containment/package/contents/ui/VisibilityManager.qml index 8666fb92a..a920fb588 100644 --- a/containment/package/contents/ui/VisibilityManager.qml +++ b/containment/package/contents/ui/VisibilityManager.qml @@ -695,9 +695,13 @@ Item{ } PropertyAnimation { - target: layoutsContainer - property: root.isVertical ? "x" : "y" + target: !root.behaveAsPlasmaPanel ? layoutsContainer : latteView.positioner + property: !root.behaveAsPlasmaPanel ? (root.isVertical ? "x" : "y") : "slideOffset" to: { + if (root.behaveAsPlasmaPanel) { + return slidingOutToPos; + } + if (Latte.WindowSystem.compositingActive) { return slidingOutToPos; } else { @@ -752,8 +756,8 @@ Item{ } PropertyAnimation { - target: layoutsContainer - property: root.isVertical ? "x" : "y" + target: !root.behaveAsPlasmaPanel ? layoutsContainer : latteView.positioner + property: !root.behaveAsPlasmaPanel ? (root.isVertical ? "x" : "y") : "slideOffset" to: 0 duration: manager.animationSpeed easing.type: Easing.OutQuad diff --git a/containment/package/contents/ui/layouts/LayoutsContainer.qml b/containment/package/contents/ui/layouts/LayoutsContainer.qml index 39bc66856..8103f3f5f 100644 --- a/containment/package/contents/ui/layouts/LayoutsContainer.qml +++ b/containment/package/contents/ui/layouts/LayoutsContainer.qml @@ -50,6 +50,10 @@ Item{ target: layoutsContainer property: "x" value: { + if (root.behaveAsPlasmaPanel) { + return 0; + } + if ( latteView && root.isHorizontal && useMaxLength ){ return ((latteView.width/2) - (root.maxLength/2) + root.offset); } else { @@ -78,6 +82,10 @@ Item{ target: layoutsContainer property: "y" value: { + if (root.behaveAsPlasmaPanel) { + return 0; + } + if ( latteView && root.isVertical && useMaxLength ) { return ((latteView.height/2) - (root.maxLength/2) + root.offset); } else { diff --git a/containment/package/contents/ui/main.qml b/containment/package/contents/ui/main.qml index 23827f010..03de0fc4f 100644 --- a/containment/package/contents/ui/main.qml +++ b/containment/package/contents/ui/main.qml @@ -85,7 +85,7 @@ Item { } return (visibilityManager.panelIsBiggerFromIconSize && (maxZoomFactor === 1.0) - && (latteView.visibility.mode === Latte.Types.AlwaysVisible || latteView.visibility.mode === Latte.Types.WindowsGoBelow) + //&& (latteView.visibility.mode === Latte.Types.AlwaysVisible || latteView.visibility.mode === Latte.Types.WindowsGoBelow) && (plasmoid.configuration.panelPosition === Latte.Types.Justify) && !root.editMode); }