| | |
| | | }; |
| | | |
| | | MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { |
| | | installWindowAgent(); |
| | | installWindowAgent(); |
| | | |
| | | #if 1 |
| | | auto clockWidget = new ClockWidget(); |
| | |
| | | setWindowTitle(tr("Example MainWindow")); |
| | | resize(800, 600); |
| | | |
| | | // setFixedHeight(600); |
| | | // windowAgent->centralize(); |
| | | } |
| | | |
| | |
| | | switch (event->type()) { |
| | | case QEvent::WindowActivate: { |
| | | auto menu = menuWidget(); |
| | | menu->setProperty("bar-active", true); |
| | | style()->polish(menu); |
| | | if (menu) { |
| | | menu->setProperty("bar-active", true); |
| | | style()->polish(menu); |
| | | } |
| | | break; |
| | | } |
| | | |
| | | case QEvent::WindowDeactivate: { |
| | | auto menu = menuWidget(); |
| | | menu->setProperty("bar-active", false); |
| | | style()->polish(menu); |
| | | if (menu) { |
| | | menu->setProperty("bar-active", false); |
| | | style()->polish(menu); |
| | | } |
| | | break; |
| | | } |
| | | |
| | |
| | | |
| | | // 2. Construct your title bar |
| | | auto menuBar = [this]() { |
| | | auto menuBar = new QMenuBar(); |
| | | auto menuBar = new QMenuBar(this); |
| | | |
| | | // Virtual menu |
| | | auto file = new QMenu(tr("File(&F)"), menuBar); |
| | |
| | | |
| | | #ifdef Q_OS_WIN |
| | | auto dwmBlurAction = new QAction(tr("Enable DWM blur"), menuBar); |
| | | dwmBlurAction->setData(QStringLiteral("dwm-blur")); |
| | | dwmBlurAction->setCheckable(true); |
| | | connect(dwmBlurAction, &QAction::toggled, this, [this](bool checked) { |
| | | if (!windowAgent->setWindowAttribute(QStringLiteral("dwm-blur"), checked)) { |
| | | return; |
| | | } |
| | | setProperty("custom-style", checked); |
| | | style()->polish(this); |
| | | }); |
| | | |
| | | auto acrylicAction = new QAction(tr("Enable acrylic material"), menuBar); |
| | | acrylicAction->setData(QStringLiteral("acrylic-material")); |
| | | acrylicAction->setCheckable(true); |
| | | connect(acrylicAction, &QAction::toggled, this, [this](bool checked) { |
| | | if (!windowAgent->setWindowAttribute(QStringLiteral("acrylic-material"), true)) { |
| | | return; |
| | | } |
| | | setProperty("custom-style", checked); |
| | | style()->polish(this); |
| | | }); |
| | | |
| | | auto micaAction = new QAction(tr("Enable mica"), menuBar); |
| | | micaAction->setData(QStringLiteral("mica")); |
| | | micaAction->setCheckable(true); |
| | | connect(micaAction, &QAction::toggled, this, [this](bool checked) { |
| | | if (!windowAgent->setWindowAttribute(QStringLiteral("mica"), checked)) { |
| | | return; |
| | | |
| | | auto micaAltAction = new QAction(tr("Enable mica alt"), menuBar); |
| | | micaAltAction->setData(QStringLiteral("mica-alt")); |
| | | micaAltAction->setCheckable(true); |
| | | |
| | | auto winStyleGroup = new QActionGroup(menuBar); |
| | | // At most one action can be checked at any one time. The actions can also be all unchecked. |
| | | winStyleGroup->setExclusionPolicy(QActionGroup::ExclusionPolicy::ExclusiveOptional); |
| | | winStyleGroup->addAction(dwmBlurAction); |
| | | winStyleGroup->addAction(acrylicAction); |
| | | winStyleGroup->addAction(micaAction); |
| | | winStyleGroup->addAction(micaAltAction); |
| | | connect(winStyleGroup, &QActionGroup::triggered, this, [this, winStyleGroup](QAction *action) { |
| | | // Unset all custom style attributes first, otherwise the style will not display correctly |
| | | for (auto _act : winStyleGroup->actions()) { |
| | | windowAgent->setWindowAttribute(_act->data().toString(), false); |
| | | } |
| | | setProperty("custom-style", checked); |
| | | windowAgent->setWindowAttribute(action->data().toString(), action->isChecked()); |
| | | setProperty("custom-style", action->isChecked()); |
| | | style()->polish(this); |
| | | }); |
| | | |
| | | auto micaAltAction = new QAction(tr("Enable mica alt"), menuBar); |
| | | micaAltAction->setCheckable(true); |
| | | connect(micaAltAction, &QAction::toggled, this, [this](bool checked) { |
| | | if (!windowAgent->setWindowAttribute(QStringLiteral("mica-alt"), checked)) { |
| | | return; |
| | | } |
| | | setProperty("custom-style", checked); |
| | | style()->polish(this); |
| | | }); |
| | | #elif defined(Q_OS_MAC) |
| | | auto darkBlurAction = new QAction(tr("Dark blur"), menuBar); |
| | | darkBlurAction->setCheckable(true); |
| | |
| | | windowBar->setTitleLabel(titleLabel); |
| | | windowBar->setHostWidget(this); |
| | | |
| | | windowAgent->setTitleBar(windowBar); |
| | | windowAgent->setTitleBar(windowBar); |
| | | #ifndef Q_OS_MAC |
| | | windowAgent->setSystemButton(QWK::WindowAgentBase::WindowIcon, iconButton); |
| | | windowAgent->setSystemButton(QWK::WindowAgentBase::Minimize, minButton); |
| | | windowAgent->setSystemButton(QWK::WindowAgentBase::Maximize, maxButton); |
| | | windowAgent->setSystemButton(QWK::WindowAgentBase::Close, closeButton); |
| | | windowAgent->setSystemButton(QWK::WindowAgentBase::WindowIcon, iconButton); |
| | | windowAgent->setSystemButton(QWK::WindowAgentBase::Minimize, minButton); |
| | | windowAgent->setSystemButton(QWK::WindowAgentBase::Maximize, maxButton); |
| | | windowAgent->setSystemButton(QWK::WindowAgentBase::Close, closeButton); |
| | | #endif |
| | | windowAgent->setHitTestVisible(menuBar, true); |
| | | windowAgent->setHitTestVisible(menuBar, true); |
| | | |
| | | #ifdef Q_OS_MAC |
| | | windowAgent->setSystemButtonAreaCallback([](const QSize &size) { |
| | |
| | | |
| | | setMenuWidget(windowBar); |
| | | |
| | | // 3. Adds simulated mouse events to the title bar buttons |
| | | #ifdef Q_OS_WINDOWS |
| | | // Emulate Window system menu button behaviors |
| | | connect(iconButton, &QAbstractButton::clicked, windowAgent, [this, iconButton] { |
| | | iconButton->setProperty("double-click-close", false); |
| | | |
| | | // Pick a suitable time threshold |
| | | QTimer::singleShot(75, windowAgent, [this, iconButton]() { |
| | | if (iconButton->property("double-click-close").toBool()) |
| | | return; |
| | | windowAgent->showSystemMenu(iconButton->mapToGlobal(QPoint{0, iconButton->height()})); |
| | | }); |
| | | }); |
| | | connect(iconButton, &QWK::WindowButton::doubleClicked, this, [iconButton, this]() { |
| | | iconButton->setProperty("double-click-close", true); |
| | | close(); |
| | | }); |
| | | #endif |
| | | |
| | | #ifndef Q_OS_MAC |
| | | connect(windowBar, &QWK::WindowBar::minimizeRequested, this, &QWidget::showMinimized); |