diff --git a/panels/dock/CMakeLists.txt b/panels/dock/CMakeLists.txt index 1318717d2..0e033179f 100644 --- a/panels/dock/CMakeLists.txt +++ b/panels/dock/CMakeLists.txt @@ -153,7 +153,6 @@ target_link_libraries(dock-plugin PUBLIC PRIVATE PkgConfig::WaylandClient Qt${QT_VERSION_MAJOR}::WaylandCompositorPrivate - dockpanel ) target_include_directories(dock-plugin diff --git a/panels/dock/dockpositioner.cpp b/panels/dock/dockpositioner.cpp index dc7836f41..231a881e6 100644 --- a/panels/dock/dockpositioner.cpp +++ b/panels/dock/dockpositioner.cpp @@ -3,25 +3,28 @@ // SPDX-License-Identifier: GPL-3.0-or-later #include "dockpositioner.h" -#include "dockpanel.h" +#include -#include #include #include +#include +#include + +DS_USE_NAMESPACE namespace dock { -static DockPanel *isInDockPanel(QObject *object) +static DPanel *isInDockPanel(QObject *object) { - auto dockPanel = qobject_cast(DockPanel::qmlAttachedProperties(object)); - if (!dockPanel) { + auto dockPanel = qobject_cast(DPanel::qmlAttachedProperties(object)); + if (!dockPanel || dockPanel->pluginId() != "org.deepin.ds.dock") { qWarning() << "only used in DockPanel."; return nullptr; } return dockPanel; } -DockPositioner::DockPositioner(DockPanel *panel, QObject *parent) +DockPositioner::DockPositioner(DPanel *panel, QObject *parent) : QObject(parent) , m_panel(panel) , m_positionTimer(new QTimer(this)) @@ -31,8 +34,8 @@ DockPositioner::DockPositioner(DockPanel *panel, QObject *parent) connect(m_positionTimer, &QTimer::timeout, this, &DockPositioner::updatePosition); Q_ASSERT(m_panel); - connect(m_panel, &DockPanel::positionChanged, this, &DockPositioner::update); - connect(m_panel, &DockPanel::geometryChanged, this, &DockPositioner::update); + connect(m_panel, SIGNAL(positionChanged(Position)), this, SLOT(update())); + connect(m_panel, SIGNAL(geometryChanged(QRect)), this, SLOT(update())); connect(this, &DockPositioner::boundingChanged, this, &DockPositioner::update); } @@ -72,9 +75,14 @@ int DockPositioner::y() const return m_y; } -QWindow *DockPositioner::window() const +QRect DockPositioner::dockGeometry() const +{ + return m_panel ? m_panel->property("geometry").toRect() : QRect(); +} + +Position DockPositioner::dockPosition() const { - return m_panel->window(); + return m_panel ? static_cast(m_panel->property("position").toInt()) : Position::Top; } void DockPositioner::setX(int x) @@ -102,7 +110,7 @@ void DockPositioner::updatePosition() { int xPosition = 0; int yPosition = 0; - switch(m_panel->position()) { + switch (dockPosition()) { case dock::Top: { xPosition = m_bounding.x(); yPosition = m_bounding.y(); @@ -131,7 +139,7 @@ void DockPositioner::updatePosition() setY(yPosition); } -DockPanelPositioner::DockPanelPositioner(DockPanel *panel, QObject *parent) +DockPanelPositioner::DockPanelPositioner(DPanel *panel, QObject *parent) : DockPositioner(panel, parent) { connect(this, &DockPanelPositioner::horizontalOffsetChanged, this, &DockPanelPositioner::update); @@ -188,12 +196,12 @@ void DockPanelPositioner::resetVertialOffset() void DockPanelPositioner::updatePosition() { - const auto dockWindowRect = window()->geometry(); + const auto dockWindowRect = dockGeometry(); int xPosition = 0; int yPosition = 0; int horizontalOffset = m_horizontalOffset == -1 ? m_bounding.width() / 2 : m_horizontalOffset; int vertialOffset = m_vertialOffset == -1 ? m_bounding.height() / 2 : m_vertialOffset; - switch(m_panel->position()) { + switch (dockPosition()) { case dock::Top: { xPosition = m_bounding.x() - horizontalOffset; yPosition = dockWindowRect.height() + 10; diff --git a/panels/dock/dockpositioner.h b/panels/dock/dockpositioner.h index 9f8503797..b60ed1521 100644 --- a/panels/dock/dockpositioner.h +++ b/panels/dock/dockpositioner.h @@ -4,13 +4,19 @@ #pragma once +#include "constants.h" +#include + #include #include #include +DS_BEGIN_NAMESPACE +class DPanel; +DS_END_NAMESPACE + namespace dock { -class DockPanel; class DockPositioner : public QObject { Q_OBJECT @@ -21,7 +27,7 @@ class DockPositioner : public QObject QML_UNCREATABLE("DockPositioner is only available via attached properties.") QML_ATTACHED(DockPositioner) public: - explicit DockPositioner(DockPanel *panel, QObject *parent = nullptr); + explicit DockPositioner(DS_NAMESPACE::DPanel *panel, QObject *parent = nullptr); virtual ~DockPositioner() override; static DockPositioner *qmlAttachedProperties(QObject *object); @@ -30,7 +36,8 @@ class DockPositioner : public QObject void setBounding(const QRect &newBounding); int x() const; int y() const; - QWindow *window() const; + QRect dockGeometry() const; + Position dockPosition() const; void setX(int x); void setY(int y); @@ -44,7 +51,7 @@ public slots: void yChanged(); protected: - DockPanel *m_panel = nullptr; + QPointer m_panel; QRect m_bounding {}; int m_x = 0; int m_y = 0; @@ -60,7 +67,7 @@ class DockPanelPositioner : public DockPositioner QML_UNCREATABLE("DockPanelPositioner is only available via attached properties.") QML_ATTACHED(DockPanelPositioner) public: - explicit DockPanelPositioner(DockPanel *panel, QObject *parent = nullptr); + explicit DockPanelPositioner(DS_NAMESPACE::DPanel *panel, QObject *parent = nullptr); virtual ~DockPanelPositioner() override; static DockPanelPositioner *qmlAttachedProperties(QObject *object);