From 7a7c86e63c660a5f2c00a202424113ba9ee0c0a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=A4rkl?= Date: Wed, 25 Sep 2019 13:36:54 +0200 Subject: [PATCH] Use Qt MacExtras on macOS --- gui/CMakeLists.txt | 7 +++++ gui/include/mainwindow.h | 2 ++ gui/res/discover-off-24px.svg | 1 + gui/res/resources.qrc | 1 + gui/src/mainwindow.cpp | 48 +++++++++++++++++++++++++++++++---- 5 files changed, 54 insertions(+), 5 deletions(-) create mode 100644 gui/res/discover-off-24px.svg diff --git a/gui/CMakeLists.txt b/gui/CMakeLists.txt index b303324..98aa3a3 100644 --- a/gui/CMakeLists.txt +++ b/gui/CMakeLists.txt @@ -3,6 +3,9 @@ set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) find_package(Qt5 REQUIRED COMPONENTS Core Widgets Gui Multimedia OpenGL Svg) +if(APPLE) + find_package(Qt5 REQUIRED COMPONENTS MacExtras) +endif() if(CHIAKI_GUI_ENABLE_QT_GAMEPAD AND CHIAKI_GUI_ENABLE_SDL_GAMECONTROLLER) message(FATAL_ERROR "Only one input method may be enabled. Disable either CHIAKI_GUI_ENABLE_SDL_GAMECONTROLLER or CHIAKI_GUI_ENABLE_QT_GAMEPAD.") endif() @@ -76,6 +79,10 @@ endif() target_link_libraries(chiaki FFMPEG::avcodec FFMPEG::avutil) target_link_libraries(chiaki Qt5::Core Qt5::Widgets Qt5::Gui Qt5::Multimedia Qt5::OpenGL Qt5::Svg) +if(APPLE) + target_link_libraries(chiaki Qt5::MacExtras) + target_compile_definitions(chiaki PRIVATE CHIAKI_GUI_ENABLE_QT_MACEXTRAS) +endif() if(CHIAKI_GUI_ENABLE_QT_GAMEPAD) target_link_libraries(chiaki Qt5::Gamepad) target_compile_definitions(chiaki PRIVATE CHIAKI_GUI_ENABLE_QT_GAMEPAD) diff --git a/gui/include/mainwindow.h b/gui/include/mainwindow.h index a91c3c5..cb287b2 100644 --- a/gui/include/mainwindow.h +++ b/gui/include/mainwindow.h @@ -46,6 +46,8 @@ class MainWindow : public QMainWindow private: Settings *settings; + QIcon discover_action_icon; + QIcon discover_action_off_icon; QAction *discover_action; DynamicGridWidget *grid_widget; diff --git a/gui/res/discover-off-24px.svg b/gui/res/discover-off-24px.svg new file mode 100644 index 0000000..4a0e970 --- /dev/null +++ b/gui/res/discover-off-24px.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/gui/res/resources.qrc b/gui/res/resources.qrc index 2570b1c..bf7efd5 100644 --- a/gui/res/resources.qrc +++ b/gui/res/resources.qrc @@ -3,6 +3,7 @@ settings-20px.svg add-24px.svg discover-24px.svg + discover-off-24px.svg chiaki.svg diff --git a/gui/src/mainwindow.cpp b/gui/src/mainwindow.cpp index a672be2..c5fcc48 100644 --- a/gui/src/mainwindow.cpp +++ b/gui/src/mainwindow.cpp @@ -36,6 +36,10 @@ #include #include +#ifdef CHIAKI_GUI_ENABLE_QT_MACEXTRAS +#include +#endif + class IconEngine : public QIconEngine { private: @@ -99,25 +103,54 @@ MainWindow::MainWindow(Settings *settings, QWidget *parent) return QIcon(new IconEngine(filename)); }; +#ifdef CHIAKI_GUI_ENABLE_QT_MACEXTRAS + auto tool_bar = new QMacToolBar(this); +#else auto tool_bar = new QToolBar(this); tool_bar->setMovable(false); addToolBar(tool_bar); setUnifiedTitleAndToolBarOnMac(true); +#endif - discover_action = new QAction(tr("Automatically Search for Consoles"), this); - discover_action->setIcon(LoadIcon(":/icons/discover-24px.svg")); + auto AddToolBarAction = [&](QAction *action) { +#ifdef CHIAKI_GUI_ENABLE_QT_MACEXTRAS + auto item = tool_bar->addItem(action->icon(), action->text()); + connect(item, &QMacToolBarItem::activated, action, &QAction::trigger); + if(action->isCheckable()) + { + connect(action, &QAction::toggled, item, [action, item]() { + item->setIcon(action->icon()); + }); + } +#else + tool_bar->addAction(action); +#endif + }; + + discover_action = new QAction(tr("Search for Consoles"), this); + discover_action_icon = LoadIcon(":/icons/discover-24px.svg"); + discover_action_off_icon = LoadIcon(":/icons/discover-off-24px.svg"); discover_action->setCheckable(true); discover_action->setChecked(settings->GetDiscoveryEnabled()); - tool_bar->addAction(discover_action); + auto UpdateDiscoverActionIcon = [this]() { + discover_action->setIcon(discover_action->isChecked() ? discover_action_icon : discover_action_off_icon); + }; + UpdateDiscoverActionIcon(); + connect(discover_action, &QAction::toggled, this, UpdateDiscoverActionIcon); + AddToolBarAction(discover_action); connect(discover_action, &QAction::triggered, this, &MainWindow::UpdateDiscoveryEnabled); auto tool_bar_spacer = new QWidget(); tool_bar_spacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Ignored); +#ifdef CHIAKI_GUI_ENABLE_QT_MACEXTRAS + tool_bar->addStandardItem(QMacToolBarItem::StandardItem::FlexibleSpace); +#else tool_bar->addWidget(tool_bar_spacer); +#endif auto add_manual_action = new QAction(tr("Add Console manually"), this); add_manual_action->setIcon(LoadIcon(":/icons/add-24px.svg")); - tool_bar->addAction(add_manual_action); + AddToolBarAction(add_manual_action); connect(add_manual_action, &QAction::triggered, this, [this]() { ManualHostDialog dialog(this->settings, -1, this); dialog.exec(); @@ -125,7 +158,7 @@ MainWindow::MainWindow(Settings *settings, QWidget *parent) auto settings_action = new QAction(tr("Settings"), this); settings_action->setIcon(LoadIcon(":/icons/settings-20px.svg")); - tool_bar->addAction(settings_action); + AddToolBarAction(settings_action); connect(settings_action, &QAction::triggered, this, &MainWindow::ShowSettings); auto scroll_area = new QScrollArea(this); @@ -138,6 +171,11 @@ MainWindow::MainWindow(Settings *settings, QWidget *parent) scroll_content_widget->setLayout(scroll_content_layout); scroll_area->setWidget(scroll_content_widget); +#ifdef CHIAKI_GUI_ENABLE_QT_MACEXTRAS + this->window()->winId(); + tool_bar->attachToWindow(this->window()->windowHandle()); +#endif + grid_widget = new DynamicGridWidget(200, scroll_content_widget); scroll_content_layout->addWidget(grid_widget); scroll_content_layout->addStretch(0);