From d680ad87b160795d2f5e8f2b682b301d0c6d6f7c Mon Sep 17 00:00:00 2001 From: Altair Wei Date: Wed, 6 Oct 2021 20:42:10 +0800 Subject: [PATCH] fix examples for Core API 2.0 --- examples/mainwindow/MainWindow.ui | 22 +++++++++++++++--- examples/mainwindow/mainwindow.cpp | 28 ++++++++++++++-------- examples/mainwindow/mainwindow.h | 3 +++ examples/minimal/flwindow.cpp | 20 ++++++++-------- examples/minimal/flwindow.h | 2 +- examples/widget/widget.cpp | 37 +++++++++++++++++++++++------- examples/widget/widget.h | 2 ++ framelesshelper_global.h | 4 ++-- utilities_linux.cpp | 3 +-- utilities_win32.cpp | 6 ++--- 10 files changed, 89 insertions(+), 38 deletions(-) diff --git a/examples/mainwindow/MainWindow.ui b/examples/mainwindow/MainWindow.ui index 638a9fe..e516d7e 100644 --- a/examples/mainwindow/MainWindow.ui +++ b/examples/mainwindow/MainWindow.ui @@ -7,7 +7,7 @@ 0 0 518 - 368 + 383 @@ -20,9 +20,16 @@ - + - PushButton + Uninstall Frameless Window + + + + + + + Install Frameless Window @@ -122,6 +129,15 @@ 25 + + true + + + Qt::NoFocus + + + true + Menu 1 diff --git a/examples/mainwindow/mainwindow.cpp b/examples/mainwindow/mainwindow.cpp index 8daa425..158748f 100644 --- a/examples/mainwindow/mainwindow.cpp +++ b/examples/mainwindow/mainwindow.cpp @@ -38,14 +38,14 @@ MainWindow::MainWindow(QWidget *parent, Qt::WindowFlags flags) : QMainWindow(par appMainWindow = new Ui::MainWindow; appMainWindow->setupUi(this); - const auto widget = new QWidget(this); + m_titleBar = new QWidget(this); titleBarWidget = new Ui::TitleBar; - titleBarWidget->setupUi(widget); + titleBarWidget->setupUi(m_titleBar); QMenuBar *mb = menuBar(); titleBarWidget->horizontalLayout->insertWidget(1, mb); - setMenuWidget(widget); + setMenuWidget(m_titleBar); connect(this, &MainWindow::windowIconChanged, titleBarWidget->iconButton, &QPushButton::setIcon); connect(this, &MainWindow::windowTitleChanged, titleBarWidget->titleLabel, &QLabel::setText); @@ -63,6 +63,13 @@ MainWindow::MainWindow(QWidget *parent, Qt::WindowFlags flags) : QMainWindow(par titleBarWidget->maximizeButton->setToolTip(isMaximized() ? tr("Restore") : tr("Maximize")); }); + connect(appMainWindow->uninstallBtn, &QPushButton::clicked, [this]() { + this->m_helper->uninstall(); + }); + connect(appMainWindow->installBtn, &QPushButton::clicked, [this]() { + this->m_helper->install(); + }); + setWindowTitle(tr("Hello, World!")); } @@ -85,12 +92,15 @@ void MainWindow::showEvent(QShowEvent *event) if (!inited) { const auto win = windowHandle(); if (win) { - FramelessWindowsManager::addWindow(win); - FramelessWindowsManager::setHitTestVisibleInChrome(win, titleBarWidget->iconButton, true); - FramelessWindowsManager::setHitTestVisibleInChrome(win, titleBarWidget->minimizeButton, true); - FramelessWindowsManager::setHitTestVisibleInChrome(win, titleBarWidget->maximizeButton, true); - FramelessWindowsManager::setHitTestVisibleInChrome(win, titleBarWidget->closeButton, true); - FramelessWindowsManager::setHitTestVisibleInChrome(win, appMainWindow->menubar, true); + m_helper = new FramelessHelper(win); + m_helper->setHitTestVisible(titleBarWidget->iconButton); + m_helper->setHitTestVisible(titleBarWidget->minimizeButton); + m_helper->setHitTestVisible(titleBarWidget->maximizeButton); + m_helper->setHitTestVisible(titleBarWidget->closeButton); + m_helper->setHitTestVisible(appMainWindow->menubar); + m_helper->setTitleBarHeight(m_titleBar->height()); + m_helper->setResizeBorderThickness(4); + m_helper->install(); setContentsMargins(1, 1, 1, 1); inited = true; } diff --git a/examples/mainwindow/mainwindow.h b/examples/mainwindow/mainwindow.h index 3da1d9b..775a0be 100644 --- a/examples/mainwindow/mainwindow.h +++ b/examples/mainwindow/mainwindow.h @@ -27,6 +27,7 @@ #include #include "ui_MainWindow.h" #include "ui_TitleBar.h" +#include "../../framelesshelper.h" class MainWindow : public QMainWindow { @@ -45,6 +46,8 @@ Q_SIGNALS: void windowStateChanged(); private: + __flh_ns::FramelessHelper *m_helper = nullptr; + QWidget *m_titleBar = nullptr; Ui::TitleBar *titleBarWidget = nullptr; Ui::MainWindow *appMainWindow = nullptr; }; diff --git a/examples/minimal/flwindow.cpp b/examples/minimal/flwindow.cpp index c98be9e..06f0880 100644 --- a/examples/minimal/flwindow.cpp +++ b/examples/minimal/flwindow.cpp @@ -23,14 +23,14 @@ FLWindow::~FLWindow() void FLWindow::initFramelessWindow() { - m_flsHelper = new FramelessHelper(windowHandle()); - m_flsHelper->setResizeBorderThickness(4); - m_flsHelper->setTitleBarHeight(m_titleBarWidget->height()); - m_flsHelper->setResizable(true); - m_flsHelper->setHitTestVisible(m_minimizeButton); - m_flsHelper->setHitTestVisible(m_maximizeButton); - m_flsHelper->setHitTestVisible(m_closeButton); - m_flsHelper->install(); + m_helper = new FramelessHelper(windowHandle()); + m_helper->setResizeBorderThickness(4); + m_helper->setTitleBarHeight(m_titleBarWidget->height()); + m_helper->setResizable(true); + m_helper->setHitTestVisible(m_minimizeButton); + m_helper->setHitTestVisible(m_maximizeButton); + m_helper->setHitTestVisible(m_closeButton); + m_helper->install(); #ifdef Q_OS_MAC m_minimizeButton->hide(); @@ -54,10 +54,10 @@ void FLWindow::showEvent(QShowEvent *event) #ifdef Q_OS_WIN bool FLWindow::nativeEvent(const QByteArray &eventType, void *message, long *result) { - if (!m_flsHelper) + if (!m_helper) return QWidget::nativeEvent(eventType, message, result); - if (m_flsHelper->handleNativeEvent(this->windowHandle(), eventType, message, result)) + if (m_helper->handleNativeEvent(this->windowHandle(), eventType, message, result)) return true; else return QWidget::nativeEvent(eventType, message, result); diff --git a/examples/minimal/flwindow.h b/examples/minimal/flwindow.h index 7d8405b..516cf09 100644 --- a/examples/minimal/flwindow.h +++ b/examples/minimal/flwindow.h @@ -23,7 +23,7 @@ private: void setupUi(); private: - __flh_ns::FramelessHelper *m_flsHelper = nullptr; + __flh_ns::FramelessHelper *m_helper = nullptr; QWidget *m_titleBarWidget = nullptr; QPushButton *m_minimizeButton = nullptr; QPushButton *m_maximizeButton = nullptr; diff --git a/examples/widget/widget.cpp b/examples/widget/widget.cpp index 9718982..1a06768 100644 --- a/examples/widget/widget.cpp +++ b/examples/widget/widget.cpp @@ -99,10 +99,15 @@ void Widget::showEvent(QShowEvent *event) qFatal("Failed to retrieve the window handle."); return; } - FramelessWindowsManager::addWindow(win); - FramelessWindowsManager::setHitTestVisibleInChrome(win, m_minimizeButton, true); - FramelessWindowsManager::setHitTestVisibleInChrome(win, m_maximizeButton, true); - FramelessWindowsManager::setHitTestVisibleInChrome(win, m_closeButton, true); + + m_helper = new FramelessHelper(win); + m_helper->setHitTestVisible(m_minimizeButton); + m_helper->setHitTestVisible(m_maximizeButton); + m_helper->setHitTestVisible(m_closeButton); + m_helper->setResizeBorderThickness(4); + m_helper->setTitleBarHeight(m_titleBarWidget->height()); + m_helper->install(); + const int margin = Utilities::getWindowVisibleFrameBorderThickness(winId()); setContentsMargins(margin, margin, margin, margin); } @@ -124,7 +129,6 @@ void Widget::changeEvent(QEvent *event) const int margin = ((isMaximized() || isFullScreen()) ? 0 : Utilities::getWindowVisibleFrameBorderThickness(winId())); setContentsMargins(margin, margin, margin, margin); updateSystemButtonIcons(); - updateTitleBarSize(); shouldUpdate = true; } else if (event->type() == QEvent::ActivationChange) { shouldUpdate = true; @@ -156,7 +160,7 @@ void Widget::paintEvent(QPaintEvent *event) }; const ColorizationArea area = Utilities::getColorizationArea(); const bool colorizedBorder = ((area == ColorizationArea::TitleBar_WindowBorder) - || (area == ColorizationArea::All)); + || (area == ColorizationArea::AllArea)); const QColor borderColor = (isActiveWindow() ? (colorizedBorder ? Utilities::getColorizationColor() : Qt::black) : Qt::darkGray); const auto borderThickness = static_cast(Utilities::getWindowVisibleFrameBorderThickness(winId())); painter.setPen({borderColor, qMax(borderThickness, devicePixelRatioF())}); @@ -170,9 +174,13 @@ void Widget::setupUi() setObjectName(QStringLiteral("MainWidget")); setWindowTitle(tr("Hello, World!")); resize(800, 600); + m_titleBarWidget = new QWidget(this); m_titleBarWidget->setObjectName(QStringLiteral("TitleBarWidget")); m_titleBarWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); + m_titleBarWidget->setFixedHeight(28); + const QSize systemButtonSize = {45, 30}; + m_windowTitleLabel = new QLabel(m_titleBarWidget); m_windowTitleLabel->setObjectName(QStringLiteral("WindowTitleLabel")); m_windowTitleLabel->setFrameShape(QFrame::NoFrame); @@ -181,11 +189,17 @@ void Widget::setupUi() m_windowTitleLabel->setFont(titleFont); m_windowTitleLabel->setText(windowTitle()); connect(this, &Widget::windowTitleChanged, m_windowTitleLabel, &QLabel::setText); + m_minimizeButton = new QPushButton(m_titleBarWidget); m_minimizeButton->setObjectName(QStringLiteral("MinimizeButton")); + m_minimizeButton->setFixedSize(systemButtonSize); + m_minimizeButton->setIconSize(systemButtonSize); connect(m_minimizeButton, &QPushButton::clicked, this, &Widget::showMinimized); + m_maximizeButton = new QPushButton(m_titleBarWidget); m_maximizeButton->setObjectName(QStringLiteral("MaximizeButton")); + m_maximizeButton->setFixedSize(systemButtonSize); + m_maximizeButton->setIconSize(systemButtonSize); connect(m_maximizeButton, &QPushButton::clicked, this, [this](){ if (isMaximized() || isFullScreen()) { showNormal(); @@ -194,11 +208,15 @@ void Widget::setupUi() } updateSystemButtonIcons(); }); + m_closeButton = new QPushButton(m_titleBarWidget); m_closeButton->setObjectName(QStringLiteral("CloseButton")); + m_closeButton->setFixedSize(systemButtonSize); + m_closeButton->setIconSize(systemButtonSize); connect(m_closeButton, &QPushButton::clicked, this, &Widget::close); + updateSystemButtonIcons(); - updateTitleBarSize(); + const auto titleBarLayout = new QHBoxLayout(m_titleBarWidget); titleBarLayout->setContentsMargins(0, 0, 0, 0); titleBarLayout->setSpacing(0); @@ -209,6 +227,7 @@ void Widget::setupUi() titleBarLayout->addWidget(m_maximizeButton); titleBarLayout->addWidget(m_closeButton); m_titleBarWidget->setLayout(titleBarLayout); + m_clockLabel = new QLabel(this); m_clockLabel->setObjectName(QStringLiteral("ClockLabel")); m_clockLabel->setFrameShape(QFrame::NoFrame); @@ -216,12 +235,14 @@ void Widget::setupUi() clockFont.setBold(true); clockFont.setPointSize(70); m_clockLabel->setFont(clockFont); + const auto contentLayout = new QHBoxLayout; contentLayout->setContentsMargins(0, 0, 0, 0); contentLayout->setSpacing(0); contentLayout->addStretch(); contentLayout->addWidget(m_clockLabel); contentLayout->addStretch(); + const auto mainLayout = new QVBoxLayout(this); mainLayout->setContentsMargins(0, 0, 0, 0); mainLayout->setSpacing(0); @@ -239,7 +260,7 @@ void Widget::updateStyleSheet() const bool dark = Utilities::shouldAppsUseDarkMode(); const ColorizationArea area = Utilities::getColorizationArea(); const bool colorizedTitleBar = ((area == ColorizationArea::TitleBar_WindowBorder) - || (area == ColorizationArea::All)); + || (area == ColorizationArea::AllArea)); const QColor colorizationColor = Utilities::getColorizationColor(); const QColor mainWidgetBackgroundColor = (dark ? systemDarkColor : systemLightColor); const QColor titleBarWidgetBackgroundColor = [active, colorizedTitleBar, &colorizationColor, dark]{ diff --git a/examples/widget/widget.h b/examples/widget/widget.h index 071c9cc..2668eb6 100644 --- a/examples/widget/widget.h +++ b/examples/widget/widget.h @@ -25,6 +25,7 @@ #pragma once #include +#include "../../framelesshelper.h" QT_BEGIN_NAMESPACE QT_FORWARD_DECLARE_CLASS(QLabel) @@ -57,6 +58,7 @@ private: void updateSystemButtonIcons(); private: + __flh_ns::FramelessHelper *m_helper = nullptr; QWidget *m_titleBarWidget = nullptr; QLabel *m_windowTitleLabel = nullptr; QPushButton *m_minimizeButton = nullptr; diff --git a/framelesshelper_global.h b/framelesshelper_global.h index aa5f7c1..28dd358 100644 --- a/framelesshelper_global.h +++ b/framelesshelper_global.h @@ -113,10 +113,10 @@ Q_ENUM_NS(SystemMetric) enum class ColorizationArea : int { - None = 0, + NoArea = 0, // ‘None’ has been defined as a macro in X11 headers. StartMenu_TaskBar_ActionCenter, TitleBar_WindowBorder, - All + AllArea }; Q_ENUM_NS(ColorizationArea) diff --git a/utilities_linux.cpp b/utilities_linux.cpp index 2903dc4..1ea360f 100644 --- a/utilities_linux.cpp +++ b/utilities_linux.cpp @@ -109,8 +109,7 @@ bool Utilities::shouldAppsUseDarkMode() ColorizationArea Utilities::getColorizationArea() { // ### TO BE IMPLEMENTED - //return ColorizationArea::None; // ‘None’ has been defined as a macro in X11 headers. - return ColorizationArea::All; + return ColorizationArea::NoArea; } bool Utilities::isThemeChanged(const void *data) diff --git a/utilities_win32.cpp b/utilities_win32.cpp index 01186b1..caccb01 100644 --- a/utilities_win32.cpp +++ b/utilities_win32.cpp @@ -358,7 +358,7 @@ bool Utilities::shouldAppsUseDarkMode() ColorizationArea Utilities::getColorizationArea() { if (!isWin10OrGreater()) { - return ColorizationArea::None; + return ColorizationArea::NoArea; } const QString keyName = QStringLiteral("ColorPrevalence"); const QSettings themeRegistry(QString::fromUtf8(kPersonalizeRegistryKey), QSettings::NativeFormat); @@ -368,13 +368,13 @@ ColorizationArea Utilities::getColorizationArea() const bool theme = (themeValue != 0); const bool dwm = (dwmValue != 0); if (theme && dwm) { - return ColorizationArea::All; + return ColorizationArea::AllArea; } else if (theme) { return ColorizationArea::StartMenu_TaskBar_ActionCenter; } else if (dwm) { return ColorizationArea::TitleBar_WindowBorder; } - return ColorizationArea::None; + return ColorizationArea::NoArea; } bool Utilities::isThemeChanged(const void *data)