diff --git a/widgets/framelesswidget.cpp b/widgets/framelesswidget.cpp index 4fbf59d..57bce7f 100644 --- a/widgets/framelesswidget.cpp +++ b/widgets/framelesswidget.cpp @@ -48,26 +48,79 @@ QPushButton:pressed { } )"); -FramelessWidget::FramelessWidget(QWidget *parent) : QWidget(parent) +class FramelessWidgetPrivate : public QObject { - setAttribute(Qt::WA_DontCreateNativeAncestors); - createWinId(); - setupInitialUi(); + Q_OBJECT + Q_DECLARE_PUBLIC(FramelessWidget) + Q_DISABLE_COPY_MOVE(FramelessWidgetPrivate) + +public: + explicit FramelessWidgetPrivate(FramelessWidget *q, QObject *parent = nullptr); + ~FramelessWidgetPrivate() override; + + Q_NODISCARD bool isNormal() const; + Q_NODISCARD bool isZoomed() const; + + void setTitleBarWidget(QWidget *widget); + Q_NODISCARD QWidget *titleBarWidget() const; + + void setContentWidget(QWidget *widget); + Q_NODISCARD QWidget *contentWidget() const; + + void setHitTestVisible(QWidget *widget, const bool visible); + +private: + void setupFramelessHelperOnce(); + void createSystemTitleBar(); + void createUserContentContainer(); + void setupInitialUi(); + Q_NODISCARD bool isInTitleBarDraggableArea(const QPoint &pos) const; + Q_NODISCARD bool shouldDrawFrameBorder() const; + +private Q_SLOTS: + void updateContentsMargins(); + void updateSystemTitleBarStyleSheet(); + void updateSystemButtonsIcon(); + +private: + FramelessWidget *q_ptr = nullptr; + bool m_framelessHelperInited = false; + QWidget *m_systemTitleBarWidget = nullptr; + QLabel *m_systemWindowTitleLabel = nullptr; + QPushButton *m_systemMinimizeButton = nullptr; + QPushButton *m_systemMaximizeButton = nullptr; + QPushButton *m_systemCloseButton = nullptr; + QWidget *m_userTitleBarWidget = nullptr; + QWidget *m_userContentWidget = nullptr; + QVBoxLayout *m_mainLayout = nullptr; + QWidgetList m_hitTestVisibleWidgets = {}; + QWidget *m_userContentContainerWidget = nullptr; + QVBoxLayout *m_userContentContainerLayout = nullptr; +}; + +FramelessWidgetPrivate::FramelessWidgetPrivate(FramelessWidget *q, QObject *parent) : QObject(parent) +{ + Q_ASSERT(q); + if (q) { + q_ptr = q; + } } -FramelessWidget::~FramelessWidget() = default; +FramelessWidgetPrivate::~FramelessWidgetPrivate() = default; -bool FramelessWidget::isNormal() const +bool FramelessWidgetPrivate::isNormal() const { - return (windowState() == Qt::WindowNoState); + Q_Q(const FramelessWidget); + return (q->windowState() == Qt::WindowNoState); } -bool FramelessWidget::isZoomed() const +bool FramelessWidgetPrivate::isZoomed() const { - return (isMaximized() || isFullScreen()); + Q_Q(const FramelessWidget); + return (q->isMaximized() || q->isFullScreen()); } -void FramelessWidget::setTitleBarWidget(QWidget *widget) +void FramelessWidgetPrivate::setTitleBarWidget(QWidget *widget) { Q_ASSERT(widget); if (!widget) { @@ -85,12 +138,267 @@ void FramelessWidget::setTitleBarWidget(QWidget *widget) } m_userTitleBarWidget = widget; m_mainLayout->insertWidget(0, m_userTitleBarWidget); - Q_EMIT titleBarWidgetChanged(); + Q_Q(FramelessWidget); + Q_EMIT q->titleBarWidgetChanged(); +} + +QWidget *FramelessWidgetPrivate::titleBarWidget() const +{ + return m_userTitleBarWidget; +} + +void FramelessWidgetPrivate::setContentWidget(QWidget *widget) +{ + Q_ASSERT(widget); + if (!widget) { + return; + } + if (m_userContentWidget == widget) { + return; + } + if (m_userContentWidget) { + m_userContentContainerLayout->removeWidget(m_userContentWidget); + m_userContentWidget = nullptr; + } + m_userContentWidget = widget; + m_userContentContainerLayout->addWidget(m_userContentWidget); + Q_Q(FramelessWidget); + Q_EMIT q->contentWidgetChanged(); +} + +QWidget *FramelessWidgetPrivate::contentWidget() const +{ + return m_userContentWidget; +} + +void FramelessWidgetPrivate::setHitTestVisible(QWidget *widget, const bool visible) +{ + Q_ASSERT(widget); + if (!widget) { + return; + } + const bool exists = m_hitTestVisibleWidgets.contains(widget); + if (visible && !exists) { + m_hitTestVisibleWidgets.append(widget); + } + if (!visible && exists) { + m_hitTestVisibleWidgets.removeAll(widget); + } +} + +void FramelessWidgetPrivate::setupFramelessHelperOnce() +{ + if (m_framelessHelperInited) { + return; + } + m_framelessHelperInited = true; + Q_Q(FramelessWidget); + FramelessWindowsManager::addWindow(q->windowHandle()); + const FramelessWindowsManager * const manager = FramelessWindowsManager::instance(); + connect(manager, &FramelessWindowsManager::systemThemeChanged, this, [this, q](){ + updateSystemTitleBarStyleSheet(); + updateSystemButtonsIcon(); + Q_EMIT q->systemThemeChanged(); + }); + connect(manager, &FramelessWindowsManager::systemMenuRequested, q, &FramelessWidget::systemMenuRequested); +} + +void FramelessWidgetPrivate::createSystemTitleBar() +{ + if (m_systemTitleBarWidget) { + return; + } + static constexpr const QSize systemButtonSize = {int(qRound(qreal(kDefaultTitleBarHeight) * 1.5)), kDefaultTitleBarHeight}; + static constexpr const QSize systemButtonIconSize = {16, 16}; + Q_Q(FramelessWidget); + m_systemTitleBarWidget = new QWidget(q); + m_systemTitleBarWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); + m_systemTitleBarWidget->setFixedHeight(kDefaultTitleBarHeight); + m_systemWindowTitleLabel = new QLabel(m_systemTitleBarWidget); + m_systemWindowTitleLabel->setFrameShape(QFrame::NoFrame); + QFont windowTitleFont = q->font(); + windowTitleFont.setPointSize(11); + m_systemWindowTitleLabel->setFont(windowTitleFont); + m_systemWindowTitleLabel->setText(q->windowTitle()); + connect(q, &FramelessWidget::windowTitleChanged, m_systemWindowTitleLabel, &QLabel::setText); + m_systemMinimizeButton = new QPushButton(m_systemTitleBarWidget); + m_systemMinimizeButton->setFixedSize(systemButtonSize); + m_systemMinimizeButton->setIconSize(systemButtonIconSize); + m_systemMinimizeButton->setToolTip(tr("Minimize")); + connect(m_systemMinimizeButton, &QPushButton::clicked, q, &FramelessWidget::showMinimized); + m_systemMaximizeButton = new QPushButton(m_systemTitleBarWidget); + m_systemMaximizeButton->setFixedSize(systemButtonSize); + m_systemMaximizeButton->setIconSize(systemButtonIconSize); + m_systemMaximizeButton->setToolTip(tr("Maximize")); + connect(m_systemMaximizeButton, &QPushButton::clicked, this, [this, q](){ + if (isZoomed()) { + q->showNormal(); + } else { + q->showMaximized(); + } + updateSystemButtonsIcon(); + }); + m_systemCloseButton = new QPushButton(m_systemTitleBarWidget); + m_systemCloseButton->setFixedSize(systemButtonSize); + m_systemCloseButton->setIconSize(systemButtonIconSize); + m_systemCloseButton->setToolTip(tr("Close")); + connect(m_systemCloseButton, &QPushButton::clicked, q, &FramelessWidget::close); + updateSystemButtonsIcon(); + const auto systemTitleBarLayout = new QHBoxLayout(m_systemTitleBarWidget); + systemTitleBarLayout->setContentsMargins(0, 0, 0, 0); + systemTitleBarLayout->setSpacing(0); + systemTitleBarLayout->addSpacerItem(new QSpacerItem(10, 10)); + systemTitleBarLayout->addWidget(m_systemWindowTitleLabel); + systemTitleBarLayout->addStretch(); + systemTitleBarLayout->addWidget(m_systemMinimizeButton); + systemTitleBarLayout->addWidget(m_systemMaximizeButton); + systemTitleBarLayout->addWidget(m_systemCloseButton); + m_systemTitleBarWidget->setLayout(systemTitleBarLayout); +} + +void FramelessWidgetPrivate::createUserContentContainer() +{ + Q_Q(FramelessWidget); + m_userContentContainerWidget = new QWidget(q); + m_userContentContainerWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + m_userContentContainerLayout = new QVBoxLayout(m_userContentContainerWidget); + m_userContentContainerLayout->setContentsMargins(0, 0, 0, 0); + m_userContentContainerLayout->setSpacing(0); + m_userContentContainerWidget->setLayout(m_userContentContainerLayout); +} + +void FramelessWidgetPrivate::setupInitialUi() +{ + createSystemTitleBar(); + createUserContentContainer(); + Q_Q(FramelessWidget); + m_mainLayout = new QVBoxLayout(q); + m_mainLayout->setContentsMargins(0, 0, 0, 0); + m_mainLayout->setSpacing(0); + m_mainLayout->addWidget(m_systemTitleBarWidget); + m_mainLayout->addWidget(m_userContentContainerWidget); + q->setLayout(m_mainLayout); + updateSystemTitleBarStyleSheet(); + updateContentsMargins(); +} + +bool FramelessWidgetPrivate::isInTitleBarDraggableArea(const QPoint &pos) const +{ + const QRegion draggableRegion = [this]() -> QRegion { + if (m_userTitleBarWidget) { + QRegion region = {QRect(QPoint(0, 0), m_userTitleBarWidget->size())}; + if (!m_hitTestVisibleWidgets.isEmpty()) { + for (auto &&widget : qAsConst(m_hitTestVisibleWidgets)) { + region -= widget->geometry(); + } + } + return region; + } else { + QRegion region = {QRect(QPoint(0, 0), m_systemTitleBarWidget->size())}; + region -= m_systemMinimizeButton->geometry(); + region -= m_systemMaximizeButton->geometry(); + region -= m_systemCloseButton->geometry(); + return region; + } + }(); + return draggableRegion.contains(pos); +} + +bool FramelessWidgetPrivate::shouldDrawFrameBorder() const +{ +#ifdef Q_OS_WINDOWS + return (Utils::isWindowFrameBorderVisible() && !Utils::isWin11OrGreater() && isNormal()); +#else + return false; +#endif +} + +void FramelessWidgetPrivate::updateContentsMargins() +{ +#ifdef Q_OS_WINDOWS + Q_Q(FramelessWidget); + q->setContentsMargins(0, (shouldDrawFrameBorder() ? 1 : 0), 0, 0); +#endif +} + +void FramelessWidgetPrivate::updateSystemTitleBarStyleSheet() +{ + Q_Q(FramelessWidget); + const bool active = q->isActiveWindow(); + const bool dark = Utils::shouldAppsUseDarkMode(); + const bool colorizedTitleBar = Utils::isTitleBarColorized(); + const QColor systemTitleBarWidgetBackgroundColor = [active, colorizedTitleBar, dark]() -> QColor { + if (active) { + if (colorizedTitleBar) { + return Utils::getDwmColorizationColor(); + } else { + if (dark) { + return QColor(Qt::black); + } else { + return QColor(Qt::white); + } + } + } else { + if (dark) { + return kDefaultSystemDarkColor; + } else { + return QColor(Qt::white); + } + } + }(); + const QColor systemWindowTitleLabelTextColor = (active ? ((dark || colorizedTitleBar) ? Qt::white : Qt::black) : Qt::darkGray); + m_systemWindowTitleLabel->setStyleSheet(QStringLiteral("color: %1;").arg(systemWindowTitleLabelTextColor.name())); + m_systemMinimizeButton->setStyleSheet(kSystemButtonStyleSheet); + m_systemMaximizeButton->setStyleSheet(kSystemButtonStyleSheet); + m_systemCloseButton->setStyleSheet(kSystemButtonStyleSheet); + m_systemTitleBarWidget->setStyleSheet(QStringLiteral("background-color: %1;").arg(systemTitleBarWidgetBackgroundColor.name())); + q->update(); +} + +void FramelessWidgetPrivate::updateSystemButtonsIcon() +{ + const SystemTheme theme = ((Utils::shouldAppsUseDarkMode() || Utils::isTitleBarColorized()) ? SystemTheme::Dark : SystemTheme::Light); + m_systemMinimizeButton->setIcon(Utils::getSystemButtonIcon(SystemButtonType::Minimize, theme)); + if (isZoomed()) { + m_systemMaximizeButton->setIcon(Utils::getSystemButtonIcon(SystemButtonType::Restore, theme)); + } else { + m_systemMaximizeButton->setIcon(Utils::getSystemButtonIcon(SystemButtonType::Maximize, theme)); + } + m_systemCloseButton->setIcon(Utils::getSystemButtonIcon(SystemButtonType::Close, theme)); +} + +FramelessWidget::FramelessWidget(QWidget *parent) : QWidget(parent), d_ptr(new FramelessWidgetPrivate(this, this)) +{ + setAttribute(Qt::WA_DontCreateNativeAncestors); + createWinId(); + Q_D(FramelessWidget); + d->setupInitialUi(); +} + +FramelessWidget::~FramelessWidget() = default; + +bool FramelessWidget::isNormal() const +{ + Q_D(const FramelessWidget); + return d->isNormal(); +} + +bool FramelessWidget::isZoomed() const +{ + Q_D(const FramelessWidget); + return d->isZoomed(); +} + +void FramelessWidget::setTitleBarWidget(QWidget *widget) +{ + Q_D(FramelessWidget); + d->setTitleBarWidget(widget); } QWidget *FramelessWidget::titleBarWidget() const { - return m_userTitleBarWidget; + Q_D(const FramelessWidget); + return d->titleBarWidget(); } void FramelessWidget::setContentWidget(QWidget *widget) @@ -134,7 +442,8 @@ void FramelessWidget::setHitTestVisible(QWidget *widget, const bool visible) void FramelessWidget::showEvent(QShowEvent *event) { QWidget::showEvent(event); - setupFramelessHelperOnce(); + Q_D(FramelessWidget); + d->setupFramelessHelperOnce(); } void FramelessWidget::changeEvent(QEvent *event) @@ -161,7 +470,8 @@ void FramelessWidget::changeEvent(QEvent *event) void FramelessWidget::paintEvent(QPaintEvent *event) { QWidget::paintEvent(event); - if (shouldDrawFrameBorder()) { + Q_D(FramelessWidget); + if (d->shouldDrawFrameBorder()) { QPainter painter(this); painter.save(); QPen pen = {}; @@ -180,7 +490,8 @@ void FramelessWidget::mousePressEvent(QMouseEvent *event) if ((button != Qt::LeftButton) && (button != Qt::RightButton)) { return; } - if (isInTitleBarDraggableArea(event->pos())) { + Q_D(FramelessWidget); + if (d->isInTitleBarDraggableArea(event->pos())) { if (button == Qt::LeftButton) { Utils::startSystemMove(windowHandle()); } else { @@ -203,184 +514,10 @@ void FramelessWidget::mouseDoubleClickEvent(QMouseEvent *event) if (event->button() != Qt::LeftButton) { return; } - if (isInTitleBarDraggableArea(event->pos())) { - m_systemMaximizeButton->click(); + Q_D(FramelessWidget); + if (d->isInTitleBarDraggableArea(event->pos())) { + d->m_systemMaximizeButton->click(); } } -void FramelessWidget::setupFramelessHelperOnce() -{ - if (m_framelessHelperInited) { - return; - } - m_framelessHelperInited = true; - FramelessWindowsManager::addWindow(windowHandle()); - const FramelessWindowsManager * const manager = FramelessWindowsManager::instance(); - connect(manager, &FramelessWindowsManager::systemThemeChanged, this, [this](){ - updateSystemTitleBarStyleSheet(); - updateSystemButtonsIcon(); - Q_EMIT systemThemeChanged(); - }); - connect(manager, &FramelessWindowsManager::systemMenuRequested, this, &FramelessWidget::systemMenuRequested); -} - -void FramelessWidget::createSystemTitleBar() -{ - if (m_systemTitleBarWidget) { - return; - } - static constexpr const QSize systemButtonSize = {int(qRound(qreal(kDefaultTitleBarHeight) * 1.5)), kDefaultTitleBarHeight}; - static constexpr const QSize systemButtonIconSize = {16, 16}; - m_systemTitleBarWidget = new QWidget(this); - m_systemTitleBarWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); - m_systemTitleBarWidget->setFixedHeight(kDefaultTitleBarHeight); - m_systemWindowTitleLabel = new QLabel(m_systemTitleBarWidget); - m_systemWindowTitleLabel->setFrameShape(QFrame::NoFrame); - QFont windowTitleFont = font(); - windowTitleFont.setPointSize(11); - m_systemWindowTitleLabel->setFont(windowTitleFont); - m_systemWindowTitleLabel->setText(windowTitle()); - connect(this, &FramelessWidget::windowTitleChanged, m_systemWindowTitleLabel, &QLabel::setText); - m_systemMinimizeButton = new QPushButton(m_systemTitleBarWidget); - m_systemMinimizeButton->setFixedSize(systemButtonSize); - m_systemMinimizeButton->setIconSize(systemButtonIconSize); - m_systemMinimizeButton->setToolTip(tr("Minimize")); - connect(m_systemMinimizeButton, &QPushButton::clicked, this, &FramelessWidget::showMinimized); - m_systemMaximizeButton = new QPushButton(m_systemTitleBarWidget); - m_systemMaximizeButton->setFixedSize(systemButtonSize); - m_systemMaximizeButton->setIconSize(systemButtonIconSize); - m_systemMaximizeButton->setToolTip(tr("Maximize")); - connect(m_systemMaximizeButton, &QPushButton::clicked, this, [this](){ - if (isZoomed()) { - showNormal(); - } else { - showMaximized(); - } - updateSystemButtonsIcon(); - }); - m_systemCloseButton = new QPushButton(m_systemTitleBarWidget); - m_systemCloseButton->setFixedSize(systemButtonSize); - m_systemCloseButton->setIconSize(systemButtonIconSize); - m_systemCloseButton->setToolTip(tr("Close")); - connect(m_systemCloseButton, &QPushButton::clicked, this, &FramelessWidget::close); - updateSystemButtonsIcon(); - const auto systemTitleBarLayout = new QHBoxLayout(m_systemTitleBarWidget); - systemTitleBarLayout->setContentsMargins(0, 0, 0, 0); - systemTitleBarLayout->setSpacing(0); - systemTitleBarLayout->addSpacerItem(new QSpacerItem(10, 10)); - systemTitleBarLayout->addWidget(m_systemWindowTitleLabel); - systemTitleBarLayout->addStretch(); - systemTitleBarLayout->addWidget(m_systemMinimizeButton); - systemTitleBarLayout->addWidget(m_systemMaximizeButton); - systemTitleBarLayout->addWidget(m_systemCloseButton); - m_systemTitleBarWidget->setLayout(systemTitleBarLayout); -} - -void FramelessWidget::createUserContentContainer() -{ - m_userContentContainerWidget = new QWidget(this); - m_userContentContainerWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - m_userContentContainerLayout = new QVBoxLayout(m_userContentContainerWidget); - m_userContentContainerLayout->setContentsMargins(0, 0, 0, 0); - m_userContentContainerLayout->setSpacing(0); - m_userContentContainerWidget->setLayout(m_userContentContainerLayout); -} - -void FramelessWidget::setupInitialUi() -{ - createSystemTitleBar(); - createUserContentContainer(); - m_mainLayout = new QVBoxLayout(this); - m_mainLayout->setContentsMargins(0, 0, 0, 0); - m_mainLayout->setSpacing(0); - m_mainLayout->addWidget(m_systemTitleBarWidget); - m_mainLayout->addWidget(m_userContentContainerWidget); - setLayout(m_mainLayout); - updateSystemTitleBarStyleSheet(); - updateContentsMargins(); -} - -bool FramelessWidget::isInTitleBarDraggableArea(const QPoint &pos) const -{ - const QRegion draggableRegion = [this]() -> QRegion { - if (m_userTitleBarWidget) { - QRegion region = {QRect(QPoint(0, 0), m_userTitleBarWidget->size())}; - if (!m_hitTestVisibleWidgets.isEmpty()) { - for (auto &&widget : qAsConst(m_hitTestVisibleWidgets)) { - region -= widget->geometry(); - } - } - return region; - } else { - QRegion region = {QRect(QPoint(0, 0), m_systemTitleBarWidget->size())}; - region -= m_systemMinimizeButton->geometry(); - region -= m_systemMaximizeButton->geometry(); - region -= m_systemCloseButton->geometry(); - return region; - } - }(); - return draggableRegion.contains(pos); -} - -bool FramelessWidget::shouldDrawFrameBorder() const -{ -#ifdef Q_OS_WINDOWS - return (Utils::isWindowFrameBorderVisible() && !Utils::isWin11OrGreater() && isNormal()); -#else - return false; -#endif -} - -void FramelessWidget::updateContentsMargins() -{ -#ifdef Q_OS_WINDOWS - setContentsMargins(0, (shouldDrawFrameBorder() ? 1 : 0), 0, 0); -#endif -} - -void FramelessWidget::updateSystemTitleBarStyleSheet() -{ - const bool active = isActiveWindow(); - const bool dark = Utils::shouldAppsUseDarkMode(); - const bool colorizedTitleBar = Utils::isTitleBarColorized(); - const QColor systemTitleBarWidgetBackgroundColor = [active, colorizedTitleBar, dark]() -> QColor { - if (active) { - if (colorizedTitleBar) { - return Utils::getDwmColorizationColor(); - } else { - if (dark) { - return QColor(Qt::black); - } else { - return QColor(Qt::white); - } - } - } else { - if (dark) { - return kDefaultSystemDarkColor; - } else { - return QColor(Qt::white); - } - } - }(); - const QColor systemWindowTitleLabelTextColor = (active ? ((dark || colorizedTitleBar) ? Qt::white : Qt::black) : Qt::darkGray); - m_systemWindowTitleLabel->setStyleSheet(QStringLiteral("color: %1;").arg(systemWindowTitleLabelTextColor.name())); - m_systemMinimizeButton->setStyleSheet(kSystemButtonStyleSheet); - m_systemMaximizeButton->setStyleSheet(kSystemButtonStyleSheet); - m_systemCloseButton->setStyleSheet(kSystemButtonStyleSheet); - m_systemTitleBarWidget->setStyleSheet(QStringLiteral("background-color: %1;").arg(systemTitleBarWidgetBackgroundColor.name())); - update(); -} - -void FramelessWidget::updateSystemButtonsIcon() -{ - const SystemTheme theme = ((Utils::shouldAppsUseDarkMode() || Utils::isTitleBarColorized()) ? SystemTheme::Dark : SystemTheme::Light); - m_systemMinimizeButton->setIcon(Utils::getSystemButtonIcon(SystemButtonType::Minimize, theme)); - if (isZoomed()) { - m_systemMaximizeButton->setIcon(Utils::getSystemButtonIcon(SystemButtonType::Restore, theme)); - } else { - m_systemMaximizeButton->setIcon(Utils::getSystemButtonIcon(SystemButtonType::Maximize, theme)); - } - m_systemCloseButton->setIcon(Utils::getSystemButtonIcon(SystemButtonType::Close, theme)); -} - FRAMELESSHELPER_END_NAMESPACE diff --git a/widgets/framelesswidget.h b/widgets/framelesswidget.h index d321830..1105cfd 100644 --- a/widgets/framelesswidget.h +++ b/widgets/framelesswidget.h @@ -27,17 +27,14 @@ #include "framelesshelperwidgets_global.h" #include -QT_BEGIN_NAMESPACE -class QLabel; -class QPushButton; -class QVBoxLayout; -QT_END_NAMESPACE - FRAMELESSHELPER_BEGIN_NAMESPACE +class FramelessWidgetPrivate; + class FRAMELESSHELPER_WIDGETS_API FramelessWidget : public QWidget { Q_OBJECT + Q_DECLARE_PRIVATE(FramelessWidget) Q_DISABLE_COPY_MOVE(FramelessWidget) Q_PROPERTY(QWidget* titleBarWidget READ titleBarWidget WRITE setTitleBarWidget NOTIFY titleBarWidgetChanged FINAL) Q_PROPERTY(QWidget* contentWidget READ contentWidget WRITE setContentWidget NOTIFY contentWidgetChanged FINAL) @@ -64,19 +61,6 @@ protected: void mousePressEvent(QMouseEvent *event) override; void mouseDoubleClickEvent(QMouseEvent *event) override; -private: - void setupFramelessHelperOnce(); - void createSystemTitleBar(); - void createUserContentContainer(); - void setupInitialUi(); - Q_NODISCARD bool isInTitleBarDraggableArea(const QPoint &pos) const; - Q_NODISCARD bool shouldDrawFrameBorder() const; - -private Q_SLOTS: - void updateContentsMargins(); - void updateSystemTitleBarStyleSheet(); - void updateSystemButtonsIcon(); - Q_SIGNALS: void titleBarWidgetChanged(); void contentWidgetChanged(); @@ -84,18 +68,7 @@ Q_SIGNALS: void systemMenuRequested(const QPointF &); private: - bool m_framelessHelperInited = false; - QWidget *m_systemTitleBarWidget = nullptr; - QLabel *m_systemWindowTitleLabel = nullptr; - QPushButton *m_systemMinimizeButton = nullptr; - QPushButton *m_systemMaximizeButton = nullptr; - QPushButton *m_systemCloseButton = nullptr; - QWidget *m_userTitleBarWidget = nullptr; - QWidget *m_userContentWidget = nullptr; - QVBoxLayout *m_mainLayout = nullptr; - QWidgetList m_hitTestVisibleWidgets = {}; - QWidget *m_userContentContainerWidget = nullptr; - QVBoxLayout *m_userContentContainerLayout = nullptr; + QScopedPointer d_ptr; }; FRAMELESSHELPER_END_NAMESPACE