trying to implement real panels sliding in/ou

pull/11/head
Michail Vourlakos
parent d2170f13c0
commit 103de33c92

@ -278,7 +278,7 @@ void Positioner::reconsiderScreen()
//!check if the associated screen is running //!check if the associated screen is running
for (const auto scr : qGuiApp->screens()) { for (const auto scr : qGuiApp->screens()) {
if (m_screenToFollowId == scr->name() if (m_screenToFollowId == scr->name()
|| (m_view->onPrimary() && scr == qGuiApp->primaryScreen())) { || (m_view->onPrimary() && scr == qGuiApp->primaryScreen())) {
screenExists = true; screenExists = true;
} }
} }
@ -291,7 +291,7 @@ void Positioner::reconsiderScreen()
|| m_view->screen() != qGuiApp->primaryScreen())) { || m_view->screen() != qGuiApp->primaryScreen())) {
using Plasma::Types; using Plasma::Types;
QList<Types::Location> edges{Types::BottomEdge, Types::LeftEdge, QList<Types::Location> 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; 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() 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; return;
} }
@ -418,7 +418,7 @@ void Positioner::syncGeometry()
void Positioner::validateDockGeometry() void Positioner::validateDockGeometry()
{ {
if (m_view->geometry() != m_validGeometry) { if (m_slideOffset==0 && m_view->geometry() != m_validGeometry) {
m_validateGeometryTimer.start(); m_validateGeometryTimer.start();
} }
} }
@ -436,19 +436,19 @@ QRect Positioner::maximumNormalGeometry()
maxGeometry.setRect(0, 0, maxWidth, maxHeight); maxGeometry.setRect(0, 0, maxWidth, maxHeight);
switch (m_view->location()) { switch (m_view->location()) {
case Plasma::Types::LeftEdge: case Plasma::Types::LeftEdge:
xPos = m_view->screen()->geometry().x(); xPos = m_view->screen()->geometry().x();
maxGeometry.setRect(xPos, yPos, maxWidth, maxHeight); maxGeometry.setRect(xPos, yPos, maxWidth, maxHeight);
break; break;
case Plasma::Types::RightEdge: case Plasma::Types::RightEdge:
xPos = m_view->screen()->geometry().right() - maxWidth + 1; xPos = m_view->screen()->geometry().right() - maxWidth + 1;
maxGeometry.setRect(xPos, yPos, maxWidth, maxHeight); maxGeometry.setRect(xPos, yPos, maxWidth, maxHeight);
break; break;
default: default:
//! bypass clang warnings //! bypass clang warnings
break; break;
} }
//! this is needed in order to preserve that the top dock will be above //! 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) { && m_view->visibility()->mode() != Latte::Types::WindowsAlwaysCover) {
KWindowSystem::setState(m_view->winId(), NET::KeepAbove); KWindowSystem::setState(m_view->winId(), NET::KeepAbove);
} else { } else {
// KWindowSystem::clearState(m_view->winId(), NET::KeepAbove); // KWindowSystem::clearState(m_view->winId(), NET::KeepAbove);
} }
return maxGeometry; return maxGeometry;
@ -482,49 +482,49 @@ void Positioner::updatePosition(QRect availableScreenRect)
int screenEdgeMargin = (m_view->behaveAsPlasmaPanel() && m_view->screenEdgeMarginEnabled()) ? m_view->screenEdgeMargin() : 0; int screenEdgeMargin = (m_view->behaveAsPlasmaPanel() && m_view->screenEdgeMarginEnabled()) ? m_view->screenEdgeMargin() : 0;
switch (m_view->location()) { switch (m_view->location()) {
case Plasma::Types::TopEdge: case Plasma::Types::TopEdge:
if (m_view->behaveAsPlasmaPanel()) { if (m_view->behaveAsPlasmaPanel()) {
position = {screenGeometry.x() + length(screenGeometry.width()), position = {screenGeometry.x() + length(screenGeometry.width()),
screenGeometry.y() + screenEdgeMargin}; screenGeometry.y() + screenEdgeMargin};
} else { } else {
position = {screenGeometry.x(), screenGeometry.y()}; position = {screenGeometry.x(), screenGeometry.y()};
} }
break; break;
case Plasma::Types::BottomEdge: case Plasma::Types::BottomEdge:
if (m_view->behaveAsPlasmaPanel()) { if (m_view->behaveAsPlasmaPanel()) {
position = {screenGeometry.x() + length(screenGeometry.width()), position = {screenGeometry.x() + length(screenGeometry.width()),
screenGeometry.y() + screenGeometry.height() - cleanThickness - screenEdgeMargin}; screenGeometry.y() + screenGeometry.height() - cleanThickness - screenEdgeMargin};
} else { } else {
position = {screenGeometry.x(), screenGeometry.y() + screenGeometry.height() - m_view->height()}; position = {screenGeometry.x(), screenGeometry.y() + screenGeometry.height() - m_view->height()};
} }
break; break;
case Plasma::Types::RightEdge: case Plasma::Types::RightEdge:
if (m_view->behaveAsPlasmaPanel()) { if (m_view->behaveAsPlasmaPanel()) {
position = {availableScreenRect.right() - cleanThickness + 1 - screenEdgeMargin, position = {availableScreenRect.right() - cleanThickness + 1 - screenEdgeMargin,
availableScreenRect.y() + length(availableScreenRect.height())}; availableScreenRect.y() + length(availableScreenRect.height())};
} else { } else {
position = {availableScreenRect.right() - m_view->width() + 1, availableScreenRect.y()}; position = {availableScreenRect.right() - m_view->width() + 1, availableScreenRect.y()};
} }
break; break;
case Plasma::Types::LeftEdge: case Plasma::Types::LeftEdge:
if (m_view->behaveAsPlasmaPanel()) { if (m_view->behaveAsPlasmaPanel()) {
position = {availableScreenRect.x() + screenEdgeMargin, position = {availableScreenRect.x() + screenEdgeMargin,
availableScreenRect.y() + length(availableScreenRect.height())}; availableScreenRect.y() + length(availableScreenRect.height())};
} else { } else {
position = {availableScreenRect.x(), availableScreenRect.y()}; position = {availableScreenRect.x(), availableScreenRect.y()};
} }
break; break;
default: default:
qWarning() << "wrong location, couldn't update the panel position" qWarning() << "wrong location, couldn't update the panel position"
<< m_view->location(); << m_view->location();
} }
m_validGeometry.setTopLeft(position); 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) void Positioner::resizeWindow(QRect availableScreenRect)
{ {
QSize screenSize = m_view->screen()->size(); QSize screenSize = m_view->screen()->size();
@ -571,18 +614,18 @@ void Positioner::updateFormFactor()
return; return;
switch (m_view->location()) { switch (m_view->location()) {
case Plasma::Types::TopEdge: case Plasma::Types::TopEdge:
case Plasma::Types::BottomEdge: case Plasma::Types::BottomEdge:
m_view->containment()->setFormFactor(Plasma::Types::Horizontal); m_view->containment()->setFormFactor(Plasma::Types::Horizontal);
break; break;
case Plasma::Types::LeftEdge: case Plasma::Types::LeftEdge:
case Plasma::Types::RightEdge: case Plasma::Types::RightEdge:
m_view->containment()->setFormFactor(Plasma::Types::Vertical); m_view->containment()->setFormFactor(Plasma::Types::Vertical);
break; break;
default: default:
qWarning() << "wrong location, couldn't update the panel position" << m_view->location(); qWarning() << "wrong location, couldn't update the panel position" << m_view->location();
} }
} }

@ -49,6 +49,8 @@ class Positioner: public QObject
Q_OBJECT Q_OBJECT
Q_PROPERTY(int currentScreenId READ currentScreenId NOTIFY currentScreenChanged) 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) Q_PROPERTY(QString currentScreenName READ currentScreenName NOTIFY currentScreenChanged)
public: public:
@ -58,6 +60,9 @@ public:
int currentScreenId() const; int currentScreenId() const;
QString currentScreenName() const; QString currentScreenName() const;
int slideOffset() const;
void setSlideOffset(int offset);
bool inLocationChangeAnimation(); bool inLocationChangeAnimation();
void setScreenToFollow(QScreen *scr, bool updateScreenId = true); void setScreenToFollow(QScreen *scr, bool updateScreenId = true);
@ -77,6 +82,7 @@ signals:
void currentScreenChanged(); void currentScreenChanged();
void edgeChanged(); void edgeChanged();
void screenGeometryChanged(); void screenGeometryChanged();
void slideOffsetChanged();
void windowSizeChanged(); void windowSizeChanged();
//! these two signals are used from config ui and containment ui //! these two signals are used from config ui and containment ui
@ -110,6 +116,8 @@ private:
private: private:
bool m_inDelete{false}; bool m_inDelete{false};
int m_slideOffset{0};
//! it is used in order to enforce X11 to never miss window geometry //! it is used in order to enforce X11 to never miss window geometry
QRect m_validGeometry; QRect m_validGeometry;

@ -374,9 +374,7 @@ void VisibilityManager::setIsBelowLayer(bool below)
m_isBelowLayer = below; m_isBelowLayer = below;
if (m_mode == Latte::Types::WindowsCanCover) { updateGhostWindowState();
updateGhostWindowState();
}
emit isBelowLayerChanged(); emit isBelowLayerChanged();
} }
@ -398,7 +396,9 @@ void VisibilityManager::setIsHidden(bool isHidden)
m_isHidden = isHidden; m_isHidden = isHidden;
updateGhostWindowState(); if (!m_latteView->behaveAsPlasmaPanel()) {
updateGhostWindowState();
}
emit isHiddenChanged(); emit isHiddenChanged();
} }

@ -695,9 +695,13 @@ Item{
} }
PropertyAnimation { PropertyAnimation {
target: layoutsContainer target: !root.behaveAsPlasmaPanel ? layoutsContainer : latteView.positioner
property: root.isVertical ? "x" : "y" property: !root.behaveAsPlasmaPanel ? (root.isVertical ? "x" : "y") : "slideOffset"
to: { to: {
if (root.behaveAsPlasmaPanel) {
return slidingOutToPos;
}
if (Latte.WindowSystem.compositingActive) { if (Latte.WindowSystem.compositingActive) {
return slidingOutToPos; return slidingOutToPos;
} else { } else {
@ -752,8 +756,8 @@ Item{
} }
PropertyAnimation { PropertyAnimation {
target: layoutsContainer target: !root.behaveAsPlasmaPanel ? layoutsContainer : latteView.positioner
property: root.isVertical ? "x" : "y" property: !root.behaveAsPlasmaPanel ? (root.isVertical ? "x" : "y") : "slideOffset"
to: 0 to: 0
duration: manager.animationSpeed duration: manager.animationSpeed
easing.type: Easing.OutQuad easing.type: Easing.OutQuad

@ -50,6 +50,10 @@ Item{
target: layoutsContainer target: layoutsContainer
property: "x" property: "x"
value: { value: {
if (root.behaveAsPlasmaPanel) {
return 0;
}
if ( latteView && root.isHorizontal && useMaxLength ){ if ( latteView && root.isHorizontal && useMaxLength ){
return ((latteView.width/2) - (root.maxLength/2) + root.offset); return ((latteView.width/2) - (root.maxLength/2) + root.offset);
} else { } else {
@ -78,6 +82,10 @@ Item{
target: layoutsContainer target: layoutsContainer
property: "y" property: "y"
value: { value: {
if (root.behaveAsPlasmaPanel) {
return 0;
}
if ( latteView && root.isVertical && useMaxLength ) { if ( latteView && root.isVertical && useMaxLength ) {
return ((latteView.height/2) - (root.maxLength/2) + root.offset); return ((latteView.height/2) - (root.maxLength/2) + root.offset);
} else { } else {

@ -85,7 +85,7 @@ Item {
} }
return (visibilityManager.panelIsBiggerFromIconSize && (maxZoomFactor === 1.0) 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) && (plasmoid.configuration.panelPosition === Latte.Types.Justify)
&& !root.editMode); && !root.editMode);
} }

Loading…
Cancel
Save