From a0006400a6656d729a9b0fe6a5a398a56d8d7c45 Mon Sep 17 00:00:00 2001 From: wjyrich Date: Fri, 11 Jul 2025 15:08:51 +0800 Subject: [PATCH] feat: implement custom PageButton for calendar navigation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Added new PageButton class inheriting from QFrame with hover/press visual states 2. Replaced DToolButton with PageButton for next/previous navigation in calendar 3. Implemented custom painting with rounded corners and hover effects 4. Added proper event handling for mouse interactions 5. Centralized icon positioning and styling 6. Simplified button sizing by moving fixed dimensions to PageButton class The change was made to provide more consistent and visually appealing navigation buttons in the calendar widget, with better hover/pressed state feedback compared to the standard DToolButton. The custom implementation allows for more control over the visual appearance and behavior. feat: 为日历导航实现自定义 PageButton 1. 新增继承自 QFrame 的 PageButton 类,带有悬停/按下视觉状态 2. 在日历导航中用 PageButton 替换 DToolButton 3. 实现自定义绘制,包括圆角和悬停效果 4. 添加了适当的鼠标交互事件处理 5. 集中处理图标位置和样式 6. 通过将固定尺寸移至 PageButton 类简化按钮尺寸设置 此变更为日历组件提供了更一致且视觉上更吸引人的导航按钮,相比标准 DToolButton 提供了更好的悬停/按下状态反馈。自定义实现可以更好地控制视觉 外观和行为。 Pms: BUG-321969 --- .../dde-dock/datetime/calendar/pagebutton.cpp | 109 ++++++++++++++++++ .../dde-dock/datetime/calendar/pagebutton.h | 38 ++++++ .../calendar/sidebarcalendarwidget.cpp | 13 +-- .../datetime/calendar/sidebarcalendarwidget.h | 5 +- 4 files changed, 155 insertions(+), 10 deletions(-) create mode 100644 plugins/dde-dock/datetime/calendar/pagebutton.cpp create mode 100644 plugins/dde-dock/datetime/calendar/pagebutton.h diff --git a/plugins/dde-dock/datetime/calendar/pagebutton.cpp b/plugins/dde-dock/datetime/calendar/pagebutton.cpp new file mode 100644 index 000000000..3748fd43f --- /dev/null +++ b/plugins/dde-dock/datetime/calendar/pagebutton.cpp @@ -0,0 +1,109 @@ +// SPDX-FileCopyrightText: 2019 - 2025 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: LGPL-3.0-or-later +#include "pagebutton.h" + +#include +#include +#include + +#include + +DGUI_USE_NAMESPACE +DWIDGET_USE_NAMESPACE + +PageButton::PageButton(QWidget *parent) + : QFrame(parent) + , m_hover(false) + , m_mousePress(false) + , m_iconButton(new CommonIconButton(this)) +{ + initUI(); +} + +PageButton::~PageButton() +{ +} + +void PageButton::initUI() +{ + setFixedSize(30, 30); + setForegroundRole(QPalette::BrightText); + m_iconButton->setFixedSize(12, 12); + m_iconButton->setForegroundRole(QPalette::BrightText); + + // 居中放置图标 + QHBoxLayout* hLayout = new QHBoxLayout(this); + hLayout->addWidget(m_iconButton, 0, Qt::AlignCenter); +} + +void PageButton::setIcon(const QIcon &icon) +{ + m_iconButton->setIcon(icon, Qt::black, Qt::white); +} + +bool PageButton::event(QEvent* e) +{ + switch (e->type()) { + case QEvent::Leave: + case QEvent::Enter: + m_hover = e->type() == QEvent::Enter; + update(); + break; + default: + break; + } + return QWidget::event(e); +} + +void PageButton::paintEvent(QPaintEvent* e) +{ + Q_UNUSED(e) + QPainter p(this); + QPalette palette = this->palette(); + QColor bgColor, textColor; + if (m_mousePress) { + textColor = palette.highlight().color(); + bgColor = palette.windowText().color(); + bgColor.setAlphaF(0.15); + } else if(m_hover) { + textColor = palette.windowText().color(); + bgColor = palette.windowText().color(); + bgColor.setAlphaF(0.1); + } else { + textColor = palette.windowText().color(); + bgColor = DPaletteHelper::instance()->palette(this).color(DPalette::ItemBackground); + bgColor.setAlphaF(0); + } + palette.setBrush(QPalette::BrightText, textColor); + m_iconButton->setPalette(palette); + + p.setBrush(bgColor); + p.setRenderHint(QPainter::Antialiasing); + p.setPen(Qt::NoPen); + p.drawRoundedRect(rect(), 8, 8); + return QFrame::paintEvent(e); +} + +void PageButton::mousePressEvent(QMouseEvent *event) +{ + if(m_mousePress != true) { + m_mousePress = true; + update(); + } + QWidget::mousePressEvent(event); +} + +void PageButton::mouseReleaseEvent(QMouseEvent* event) +{ + if(m_mousePress == true) { + m_mousePress = false; + update(); + } + + if (underMouse() && this->rect().contains(event->pos())) { + Q_EMIT clicked(); + } + + QWidget::mouseReleaseEvent(event); +} \ No newline at end of file diff --git a/plugins/dde-dock/datetime/calendar/pagebutton.h b/plugins/dde-dock/datetime/calendar/pagebutton.h new file mode 100644 index 000000000..cbcb55af3 --- /dev/null +++ b/plugins/dde-dock/datetime/calendar/pagebutton.h @@ -0,0 +1,38 @@ +// SPDX-FileCopyrightText: 2019 - 2025 UnionTech Software Technology Co., Ltd. +// +// SPDX-License-Identifier: LGPL-3.0-or-later +#ifndef PAGEBUTTON_H +#define PAGEBUTTON_H + +#include "commoniconbutton.h" + +#include + +class PageButton : public QFrame +{ + Q_OBJECT +public: + explicit PageButton(QWidget *parent = nullptr); + ~PageButton(); + + void setIcon(const QIcon &icon); + +signals: + void clicked(); + +protected: + bool event(QEvent* e) override; + void paintEvent(QPaintEvent* e) override; + void mousePressEvent(QMouseEvent* event) override; + void mouseReleaseEvent(QMouseEvent* event) override; + +private: + void initUI(); + +private: + bool m_hover; + bool m_mousePress; + CommonIconButton *m_iconButton; +}; + +#endif // PAGEBUTTON_H diff --git a/plugins/dde-dock/datetime/calendar/sidebarcalendarwidget.cpp b/plugins/dde-dock/datetime/calendar/sidebarcalendarwidget.cpp index 030a328c9..8e1d5051f 100644 --- a/plugins/dde-dock/datetime/calendar/sidebarcalendarwidget.cpp +++ b/plugins/dde-dock/datetime/calendar/sidebarcalendarwidget.cpp @@ -6,6 +6,7 @@ #include "constants.h" #include "units.h" #include "jumpcalendarbutton.h" +#include "pagebutton.h" #include "regionFormat.h" #include @@ -27,8 +28,8 @@ SidebarCalendarWidget::SidebarCalendarWidget(RegionFormat *regionFormat, QWidget , m_keyWidget(new QWidget(this)) , m_keyLayout(new QGridLayout) , m_dateLabel(new QLabel(this)) - , m_nextPage(new DToolButton(this)) - , m_previousPage(new DToolButton(this)) + , m_nextPage(new PageButton(this)) + , m_previousPage(new PageButton(this)) , m_firstday(Qt::Sunday) , m_dateTitleWidget(new DateTitleWidget(this)) , m_weekLabel(new DLabel(this)) @@ -85,10 +86,6 @@ void SidebarCalendarWidget::initView() DFontSizeManager::instance()->bind(m_dateLabel, DFontSizeManager::T5, 65); m_nextPage->setIcon(DStyle().standardIcon(QStyle::SP_ArrowRight)); m_previousPage->setIcon(DStyle().standardIcon(QStyle::SP_ArrowLeft)); - m_nextPage->setIconSize(QSize(12, 12)); - m_previousPage->setIconSize(QSize(12, 12)); - m_nextPage->setFixedSize(30, 30); - m_previousPage->setFixedSize(30, 30); m_nextPage->setFocusPolicy(Qt::NoFocus); m_previousPage->setFocusPolicy(Qt::NoFocus); @@ -154,8 +151,8 @@ void SidebarCalendarWidget::initView() */ void SidebarCalendarWidget::initConnection() { - connect(m_nextPage, &QPushButton::clicked, this, &SidebarCalendarWidget::onNextPageClicked); - connect(m_previousPage, &QPushButton::clicked, this, &SidebarCalendarWidget::onPreviousPageClicked); + connect(m_nextPage, &PageButton::clicked, this, &SidebarCalendarWidget::onNextPageClicked); + connect(m_previousPage, &PageButton::clicked, this, &SidebarCalendarWidget::onPreviousPageClicked); connect(m_manager, &CalendarManager::sidebarFirstDayChanged, this, &SidebarCalendarWidget::onFirstDayChanged); // connect(m_manager, &CalendarManager::dateFormatChanged, this, &SidebarCalendarWidget::onDateFormatChanged); connect(m_regionFormat, &RegionFormat::shortDateFormatChanged, this, &SidebarCalendarWidget::onShortDateFormatChanged); diff --git a/plugins/dde-dock/datetime/calendar/sidebarcalendarwidget.h b/plugins/dde-dock/datetime/calendar/sidebarcalendarwidget.h index 7c91fc3ec..e817ae71b 100644 --- a/plugins/dde-dock/datetime/calendar/sidebarcalendarwidget.h +++ b/plugins/dde-dock/datetime/calendar/sidebarcalendarwidget.h @@ -24,6 +24,7 @@ class CalendarManager; class SidebarCalendarKeyButton; class JumpCalendarButton; class RegionFormat; +class PageButton; //小日历类 class SidebarCalendarWidget : public QWidget { @@ -99,8 +100,8 @@ private slots: QWidget* m_keyWidget; //日期按钮区域控件 QGridLayout* m_keyLayout; //按钮布局 QLabel* m_dateLabel; //头部日期显示label - DToolButton* m_nextPage; //下一页切换按键 - DToolButton* m_previousPage; //上一页切换按键 + PageButton* m_nextPage; //下一页切换按键 + PageButton* m_previousPage; //上一页切换按键 QList m_keyButtonList; //所有的日期按钮控件 int m_firstday; DateTitleWidget *m_dateTitleWidget;