From 5fbf7d793160896cebcdcb466db13aa7136ca567 Mon Sep 17 00:00:00 2001 From: shenmo Date: Fri, 30 Oct 2026 20:28:22 +0800 Subject: [PATCH] =?UTF-8?q?feat(todo):=20=E5=BE=85=E5=8A=9E=E7=AA=97?= =?UTF-8?q?=E5=8F=A3=E5=8F=AF=E6=8B=96=E5=8A=A8=E5=B9=B6=E8=AE=B0=E5=BF=86?= =?UTF-8?q?=E4=BD=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 拖动标题区移动,layer-shell margins 实时更新 - 位置持久化到 todo/rightMargin、todo/topMargin --- src/todo/todowindow.cpp | 68 ++++++++++++++++++++++++++++++++++++++++- src/todo/todowindow.h | 11 +++++++ 2 files changed, 78 insertions(+), 1 deletion(-) diff --git a/src/todo/todowindow.cpp b/src/todo/todowindow.cpp index 6af1231..a29b4fd 100644 --- a/src/todo/todowindow.cpp +++ b/src/todo/todowindow.cpp @@ -5,6 +5,8 @@ #include "todomodel.h" +#include "config.h" + #include #include #include @@ -151,6 +153,9 @@ TodoWindow::TodoWindow(TodoModel *model, QWidget *parent) setBlurRectYRadius(16); setFixedWidth(kWidth); + m_rightMargin = Config::instance()->getInt(QStringLiteral("todo/rightMargin"), 16); + m_topMargin = Config::instance()->getInt(QStringLiteral("todo/topMargin"), 72); + setupWindow(); setupUi(); @@ -171,7 +176,7 @@ void TodoWindow::setupWindow() anchors |= LayerShellQt::Window::AnchorRight; anchors |= LayerShellQt::Window::AnchorTop; layer->setAnchors(anchors); - layer->setMargins(QMargins(0, 72, 16, 0)); + layer->setMargins(QMargins(0, m_topMargin, m_rightMargin, 0)); layer->setLayer(LayerShellQt::Window::LayerOverlay); layer->setKeyboardInteractivity(LayerShellQt::Window::KeyboardInteractivityNone); layer->setExclusiveZone(0); @@ -297,8 +302,69 @@ void TodoWindow::addEntry() } } +void TodoWindow::applyMargins() +{ +#ifdef GXDE_HAVE_LAYERSHELLQT + if (QGuiApplication::platformName().startsWith(QLatin1String("wayland"))) { + if (auto *layer = LayerShellQt::Window::get(windowHandle())) { + layer->setMargins(QMargins(0, m_topMargin, m_rightMargin, 0)); + return; + } + } +#endif + if (QScreen *scr = screen() ? screen() : QGuiApplication::primaryScreen()) { + const QRect available = scr->availableGeometry(); + move(available.right() - width() - m_rightMargin, available.top() + m_topMargin); + } +} + +void TodoWindow::saveMargins() +{ + Config::instance()->set(QStringLiteral("todo/rightMargin"), m_rightMargin); + Config::instance()->set(QStringLiteral("todo/topMargin"), m_topMargin); + Config::instance()->sync(); +} + +void TodoWindow::mousePressEvent(QMouseEvent *event) +{ + if (event->button() == Qt::LeftButton && event->position().y() < 48) { + m_dragging = true; + m_dragStart = event->position().toPoint(); + m_dragStartRight = m_rightMargin; + m_dragStartTop = m_topMargin; + event->accept(); + return; + } + Dtk::Widget::DBlurEffectWidget::mousePressEvent(event); +} + +void TodoWindow::mouseMoveEvent(QMouseEvent *event) +{ + if (m_dragging) { + const QPoint delta = event->position().toPoint() - m_dragStart; + m_rightMargin = qMax(0, m_dragStartRight - delta.x()); + m_topMargin = qMax(0, m_dragStartTop + delta.y()); + applyMargins(); + event->accept(); + return; + } + Dtk::Widget::DBlurEffectWidget::mouseMoveEvent(event); +} + +void TodoWindow::mouseReleaseEvent(QMouseEvent *event) +{ + if (m_dragging) { + m_dragging = false; + saveMargins(); + event->accept(); + return; + } + Dtk::Widget::DBlurEffectWidget::mouseReleaseEvent(event); +} + void TodoWindow::showEvent(QShowEvent *event) { Dtk::Widget::DBlurEffectWidget::showEvent(event); refreshLayout(); + applyMargins(); } diff --git a/src/todo/todowindow.h b/src/todo/todowindow.h index 829ea75..5699993 100644 --- a/src/todo/todowindow.h +++ b/src/todo/todowindow.h @@ -29,13 +29,24 @@ public: protected: void showEvent(QShowEvent *event) override; + void mousePressEvent(QMouseEvent *event) override; + void mouseMoveEvent(QMouseEvent *event) override; + void mouseReleaseEvent(QMouseEvent *event) override; private: void setupWindow(); void setupUi(); void addEntry(); + void applyMargins(); + void saveMargins(); TodoModel *m_model = nullptr; QListView *m_view = nullptr; QLabel *m_countLabel = nullptr; + int m_rightMargin = 16; + int m_topMargin = 72; + bool m_dragging = false; + QPoint m_dragStart; + int m_dragStartRight = 0; + int m_dragStartTop = 0; };