From 59332270b5e9c9cf090b59afb72fc8815a228388 Mon Sep 17 00:00:00 2001 From: fourtf Date: Thu, 5 Jul 2018 12:52:36 +0200 Subject: [PATCH] put the update button code into it's own file --- chatterino.pro | 6 ++- src/util/InitUpdateButton.cpp | 48 +++++++++++++++++++++++ src/util/InitUpdateButton.hpp | 19 +++++++++ src/widgets/Notebook.cpp | 74 ++++++++++++++++++++--------------- src/widgets/Notebook.hpp | 7 ++++ src/widgets/Window.cpp | 32 +-------------- src/widgets/Window.hpp | 2 +- 7 files changed, 123 insertions(+), 65 deletions(-) create mode 100644 src/util/InitUpdateButton.cpp create mode 100644 src/util/InitUpdateButton.hpp diff --git a/chatterino.pro b/chatterino.pro index b984da7d..05f716ae 100644 --- a/chatterino.pro +++ b/chatterino.pro @@ -226,7 +226,8 @@ SOURCES += \ src/controllers/moderationactions/ModerationActionModel.cpp \ src/widgets/settingspages/LookPage.cpp \ src/widgets/settingspages/FeelPage.cpp \ - src/widgets/dialogs/UpdatePromptDialog.cpp + src/widgets/dialogs/UpdatePromptDialog.cpp \ + src/util/InitUpdateButton.cpp HEADERS += \ src/Application.hpp \ @@ -400,7 +401,8 @@ HEADERS += \ src/controllers/moderationactions/ModerationActionModel.hpp \ src/widgets/settingspages/LookPage.hpp \ src/widgets/settingspages/FeelPage.hpp \ - src/widgets/dialogs/UpdatePromptDialog.hpp + src/widgets/dialogs/UpdatePromptDialog.hpp \ + src/util/InitUpdateButton.hpp RESOURCES += \ resources/resources.qrc \ diff --git a/src/util/InitUpdateButton.cpp b/src/util/InitUpdateButton.cpp new file mode 100644 index 00000000..42bceda4 --- /dev/null +++ b/src/util/InitUpdateButton.cpp @@ -0,0 +1,48 @@ +#include "InitUpdateButton.hpp" + +#include "widgets/dialogs/UpdatePromptDialog.hpp" +#include "widgets/helper/RippleEffectButton.hpp" + +namespace chatterino { + +void initUpdateButton(RippleEffectButton &button, std::unique_ptr &handle, + pajlada::Signals::SignalHolder &signalHolder) +{ + button.hide(); + + // show update prompt when clicking the button + QObject::connect(&button, &RippleEffectButton::clicked, [&button, &handle] { + auto dialog = new UpdatePromptDialog(); + dialog->setActionOnFocusLoss(BaseWindow::Delete); + dialog->move(button.mapToGlobal(QPoint(int(-100 * button.getScale()), button.height()))); + dialog->show(); + dialog->raise(); + + dialog->buttonClicked.connect([&button](auto buttonType) { + switch (buttonType) { + case UpdatePromptDialog::Dismiss: { + button.hide(); + } break; + } + }); + + handle.reset(dialog); + dialog->closing.connect([&handle] { handle.release(); }); + }); + + // update image when state changes + auto updateChange = [&button](auto) { + button.setVisible(Updates::getInstance().shouldShowUpdateButton()); + + auto imageUrl = Updates::getInstance().isError() ? ":/images/download_update_error.png" + : ":/images/download_update.png"; + button.setPixmap(QPixmap(imageUrl)); + }; + + updateChange(Updates::getInstance().getStatus()); + + signalHolder.managedConnect(Updates::getInstance().statusUpdated, + [updateChange](auto status) { updateChange(status); }); +} + +} // namespace chatterino diff --git a/src/util/InitUpdateButton.hpp b/src/util/InitUpdateButton.hpp new file mode 100644 index 00000000..53e96278 --- /dev/null +++ b/src/util/InitUpdateButton.hpp @@ -0,0 +1,19 @@ +#pragma once + +#include + +namespace pajlada { +namespace Signals { +class SignalHolder; +} +} // namespace pajlada + +namespace chatterino { + +class RippleEffectButton; +class UpdatePromptDialog; + +void initUpdateButton(RippleEffectButton &button, std::unique_ptr &handle, + pajlada::Signals::SignalHolder &signalHolder); + +} // namespace chatterino diff --git a/src/widgets/Notebook.cpp b/src/widgets/Notebook.cpp index 95bdeee3..3401d273 100644 --- a/src/widgets/Notebook.cpp +++ b/src/widgets/Notebook.cpp @@ -4,6 +4,7 @@ #include "debug/Log.hpp" #include "singletons/Theme.hpp" #include "singletons/WindowManager.hpp" +#include "util/InitUpdateButton.hpp" #include "widgets/Window.hpp" #include "widgets/dialogs/SettingsDialog.hpp" #include "widgets/helper/NotebookButton.hpp" @@ -416,41 +417,50 @@ SplitNotebook::SplitNotebook(Window *parent) bool customFrame = parent->hasCustomWindowFrame(); if (!customFrame) { - auto settingsBtn = this->addCustomButton(); - auto userBtn = this->addCustomButton(); - auto updateBtn = this->addCustomButton(); - updateBtn->setPixmap(QPixmap(":/images/download_update.png")); - - settingsBtn->setVisible(!app->settings->hidePreferencesButton.getValue()); - userBtn->setVisible(!app->settings->hideUserButton.getValue()); - - app->settings->hidePreferencesButton.connect( - [this, settingsBtn](bool hide, auto) { - settingsBtn->setVisible(!hide); - this->performLayout(true); - }, - this->uniqueConnections); - - app->settings->hideUserButton.connect( - [this, userBtn](bool hide, auto) { - userBtn->setVisible(!hide); - this->performLayout(true); - }, - this->uniqueConnections); - - settingsBtn->icon = NotebookButton::IconSettings; - userBtn->icon = NotebookButton::IconUser; - - QObject::connect(settingsBtn, &NotebookButton::clicked, - [] { getApp()->windows->showSettingsDialog(); }); - - QObject::connect(userBtn, &NotebookButton::clicked, [this, userBtn] { - getApp()->windows->showAccountSelectPopup( - this->mapToGlobal(userBtn->rect().bottomRight())); - }); + this->addCustomButtons(); } } +void SplitNotebook::addCustomButtons() +{ + // settings + auto settingsBtn = this->addCustomButton(); + + settingsBtn->setVisible(!getApp()->settings->hidePreferencesButton.getValue()); + + getApp()->settings->hidePreferencesButton.connect( + [this, settingsBtn](bool hide, auto) { + settingsBtn->setVisible(!hide); + this->performLayout(true); + }, + this->uniqueConnections); + + settingsBtn->icon = NotebookButton::IconSettings; + + QObject::connect(settingsBtn, &NotebookButton::clicked, + [] { getApp()->windows->showSettingsDialog(); }); + + // account + auto userBtn = this->addCustomButton(); + userBtn->setVisible(!getApp()->settings->hideUserButton.getValue()); + getApp()->settings->hideUserButton.connect( + [this, userBtn](bool hide, auto) { + userBtn->setVisible(!hide); + this->performLayout(true); + }, + this->uniqueConnections); + + userBtn->icon = NotebookButton::IconUser; + QObject::connect(userBtn, &NotebookButton::clicked, [this, userBtn] { + getApp()->windows->showAccountSelectPopup(this->mapToGlobal(userBtn->rect().bottomRight())); + }); + + // updates + auto updateBtn = this->addCustomButton(); + + initUpdateButton(*updateBtn, this->updateDialogHandle_, this->signalHolder_); +} + SplitContainer *SplitNotebook::addPage(bool select) { SplitContainer *container = new SplitContainer(this); diff --git a/src/widgets/Notebook.hpp b/src/widgets/Notebook.hpp index 757495f2..bce01f20 100644 --- a/src/widgets/Notebook.hpp +++ b/src/widgets/Notebook.hpp @@ -2,6 +2,7 @@ #include "pajlada/signals/signal.hpp" #include "widgets/BaseWidget.hpp" +#include "widgets/dialogs/UpdatePromptDialog.hpp" #include "widgets/helper/NotebookButton.hpp" #include "widgets/helper/NotebookTab.hpp" #include "widgets/splits/SplitContainer.hpp" @@ -9,6 +10,7 @@ #include #include #include +#include namespace chatterino { @@ -89,6 +91,11 @@ public: SplitContainer *getOrAddSelectedPage(); private: + void addCustomButtons(); + + pajlada::Signals::SignalHolder signalHolder_; + std::unique_ptr updateDialogHandle_; + std::vector uniqueConnections; }; diff --git a/src/widgets/Window.cpp b/src/widgets/Window.cpp index 5e733abb..16b1db7d 100644 --- a/src/widgets/Window.cpp +++ b/src/widgets/Window.cpp @@ -8,6 +8,7 @@ #include "singletons/Theme.hpp" #include "singletons/Updates.hpp" #include "singletons/WindowManager.hpp" +#include "util/InitUpdateButton.hpp" #include "widgets/AccountSwitchPopupWidget.hpp" #include "widgets/Notebook.hpp" #include "widgets/dialogs/SettingsDialog.hpp" @@ -184,37 +185,8 @@ void Window::addCustomTitlebarButtons() // updates auto update = this->addTitleBarButton(TitleBarButton::None, [] {}); - update->hide(); - QObject::connect(update, &TitleBarButton::clicked, this, [this, update] { - auto dialog = new UpdatePromptDialog(); - dialog->setActionOnFocusLoss(BaseWindow::Delete); - dialog->move(update->mapToGlobal(QPoint(int(-100 * this->getScale()), update->height()))); - dialog->show(); - dialog->raise(); - dialog->buttonClicked.connect([update](auto button) { - switch (button) { - case UpdatePromptDialog::Dismiss: { - update->hide(); - } break; - } - }); - - this->updateDialogHandle_.reset(dialog); - dialog->closing.connect([this] { this->updateDialogHandle_.release(); }); - }); - - auto updateChange = [update](auto) { - update->setVisible(Updates::getInstance().shouldShowUpdateButton()); - - auto imageUrl = Updates::getInstance().isError() ? ":/images/download_update_error.png" - : ":/images/download_update.png"; - update->setPixmap(QPixmap(imageUrl)); - }; - - updateChange(Updates::getInstance().getStatus()); - this->signalHolder.managedConnect(Updates::getInstance().statusUpdated, - [updateChange](auto status) { updateChange(status); }); + initUpdateButton(*update, this->updateDialogHandle_, this->signalHolder_); // account this->userLabel = this->addTitleBarLabel([this] { diff --git a/src/widgets/Window.hpp b/src/widgets/Window.hpp index 4a2457d2..00d8455a 100644 --- a/src/widgets/Window.hpp +++ b/src/widgets/Window.hpp @@ -53,7 +53,7 @@ private: SplitNotebook notebook; - pajlada::Signals::SignalHolder signalHolder; + pajlada::Signals::SignalHolder signalHolder_; friend class Notebook;