mirror of
https://github.com/Chatterino/chatterino2.git
synced 2024-11-21 22:24:07 +01:00
added buttons to the custom window frame
This commit is contained in:
parent
8c51df31e6
commit
f4863cbccb
6 changed files with 210 additions and 41 deletions
|
@ -167,7 +167,8 @@ SOURCES += \
|
|||
src/widgets/settingspages/ignoreuserspage.cpp \
|
||||
src/widgets/settingspages/ignoremessagespage.cpp \
|
||||
src/widgets/settingspages/specialchannelspage.cpp \
|
||||
src/widgets/settingspages/keyboardsettingspage.cpp
|
||||
src/widgets/settingspages/keyboardsettingspage.cpp \
|
||||
src/widgets/helper/titlebarbutton.cpp
|
||||
|
||||
HEADERS += \
|
||||
src/precompiled_header.hpp \
|
||||
|
@ -275,7 +276,8 @@ HEADERS += \
|
|||
src/widgets/settingspages/ignoremessagespage.hpp \
|
||||
src/widgets/settingspages/specialchannelspage.hpp \
|
||||
src/widgets/settingspages/keyboardsettings.hpp \
|
||||
src/widgets/settingspages/keyboardsettingspage.hpp
|
||||
src/widgets/settingspages/keyboardsettingspage.hpp \
|
||||
src/widgets/helper/titlebarbutton.hpp
|
||||
|
||||
RESOURCES += \
|
||||
resources/resources.qrc
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
#define WM_DPICHANGED 0x02E0
|
||||
#endif
|
||||
|
||||
#include "widgets/helper/rippleeffectlabel.hpp"
|
||||
#include "widgets/helper/titlebarbutton.hpp"
|
||||
|
||||
namespace chatterino {
|
||||
namespace widgets {
|
||||
|
@ -72,38 +72,39 @@ void BaseWindow::init()
|
|||
this->titleLabel = title;
|
||||
|
||||
// buttons
|
||||
RippleEffectLabel *min = new RippleEffectLabel;
|
||||
min->getLabel().setText("min");
|
||||
min->setFixedSize(46, 30);
|
||||
RippleEffectLabel *max = new RippleEffectLabel;
|
||||
max->setFixedSize(46, 30);
|
||||
max->getLabel().setText("max");
|
||||
RippleEffectLabel *exit = new RippleEffectLabel;
|
||||
exit->setFixedSize(46, 30);
|
||||
exit->getLabel().setText("exit");
|
||||
TitleBarButton *_minButton = new TitleBarButton;
|
||||
_minButton->setFixedSize(46, 30);
|
||||
_minButton->setButtonStyle(TitleBarButton::Minimize);
|
||||
TitleBarButton *_maxButton = new TitleBarButton;
|
||||
_maxButton->setFixedSize(46, 30);
|
||||
_maxButton->setButtonStyle(TitleBarButton::Maximize);
|
||||
TitleBarButton *_exitButton = new TitleBarButton;
|
||||
_exitButton->setFixedSize(46, 30);
|
||||
_exitButton->setButtonStyle(TitleBarButton::Close);
|
||||
|
||||
QObject::connect(min, &RippleEffectLabel::clicked, this, [this] {
|
||||
QObject::connect(_minButton, &TitleBarButton::clicked, this, [this] {
|
||||
this->setWindowState(Qt::WindowMinimized | this->windowState());
|
||||
});
|
||||
QObject::connect(max, &RippleEffectLabel::clicked, this, [this] {
|
||||
QObject::connect(_maxButton, &TitleBarButton::clicked, this, [this] {
|
||||
this->setWindowState(this->windowState() == Qt::WindowMaximized
|
||||
? Qt::WindowActive
|
||||
: Qt::WindowMaximized);
|
||||
});
|
||||
QObject::connect(exit, &RippleEffectLabel::clicked, this, [this] { this->close(); });
|
||||
QObject::connect(_exitButton, &TitleBarButton::clicked, this,
|
||||
[this] { this->close(); });
|
||||
|
||||
this->minButton = min;
|
||||
this->maxButton = max;
|
||||
this->exitButton = exit;
|
||||
this->minButton = _minButton;
|
||||
this->maxButton = _maxButton;
|
||||
this->exitButton = _exitButton;
|
||||
|
||||
this->buttons.push_back(min);
|
||||
this->buttons.push_back(max);
|
||||
this->buttons.push_back(exit);
|
||||
this->buttons.push_back(_minButton);
|
||||
this->buttons.push_back(_maxButton);
|
||||
this->buttons.push_back(_exitButton);
|
||||
|
||||
buttonLayout->addStretch(1);
|
||||
buttonLayout->addWidget(min);
|
||||
buttonLayout->addWidget(max);
|
||||
buttonLayout->addWidget(exit);
|
||||
buttonLayout->addWidget(_minButton);
|
||||
buttonLayout->addWidget(_maxButton);
|
||||
buttonLayout->addWidget(_exitButton);
|
||||
buttonLayout->setSpacing(0);
|
||||
}
|
||||
this->layoutBase = new QWidget(this);
|
||||
|
@ -161,23 +162,34 @@ void BaseWindow::refreshTheme()
|
|||
palette.setColor(QPalette::Foreground, this->themeManager.windowText);
|
||||
this->setPalette(palette);
|
||||
|
||||
for (RippleEffectLabel *label : this->buttons) {
|
||||
label->setMouseEffectColor(this->themeManager.windowText);
|
||||
for (RippleEffectButton *button : this->buttons) {
|
||||
button->setMouseEffectColor(this->themeManager.windowText);
|
||||
}
|
||||
}
|
||||
|
||||
void BaseWindow::addTitleBarButton(const QString &text, std::function<void()> onClicked)
|
||||
void BaseWindow::addTitleBarButton(const TitleBarButton::Style &style,
|
||||
std::function<void()> onClicked)
|
||||
{
|
||||
RippleEffectLabel *label = new RippleEffectLabel;
|
||||
label->getLabel().setText(text);
|
||||
this->buttons.push_back(label);
|
||||
this->titlebarBox->insertWidget(2, label);
|
||||
QObject::connect(label, &RippleEffectLabel::clicked, this, [onClicked] { onClicked(); });
|
||||
TitleBarButton *button = new TitleBarButton;
|
||||
|
||||
this->buttons.push_back(button);
|
||||
this->titlebarBox->insertWidget(2, button);
|
||||
button->setButtonStyle(style);
|
||||
|
||||
QObject::connect(button, &TitleBarButton::clicked, this, [onClicked] { onClicked(); });
|
||||
}
|
||||
|
||||
void BaseWindow::changeEvent(QEvent *)
|
||||
{
|
||||
TooltipWidget::getInstance()->hide();
|
||||
|
||||
#ifdef USEWINSDK
|
||||
if (this->hasCustomWindowFrame()) {
|
||||
this->maxButton->setButtonStyle(this->windowState() & Qt::WindowMaximized
|
||||
? TitleBarButton::Unmaximize
|
||||
: TitleBarButton::Maximize);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void BaseWindow::leaveEvent(QEvent *)
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
#pragma once
|
||||
|
||||
#include "basewidget.hpp"
|
||||
#include "widgets/helper/titlebarbutton.hpp"
|
||||
|
||||
#include <functional>
|
||||
|
||||
|
@ -8,7 +9,8 @@ class QHBoxLayout;
|
|||
|
||||
namespace chatterino {
|
||||
namespace widgets {
|
||||
class RippleEffectLabel;
|
||||
class RippleEffectButton;
|
||||
class TitleBarButton;
|
||||
|
||||
class BaseWindow : public BaseWidget
|
||||
{
|
||||
|
@ -20,7 +22,7 @@ public:
|
|||
|
||||
QWidget *getLayoutContainer();
|
||||
bool hasCustomWindowFrame();
|
||||
void addTitleBarButton(const QString &text, std::function<void()> onClicked);
|
||||
void addTitleBarButton(const TitleBarButton::Style &style, std::function<void()> onClicked);
|
||||
|
||||
void setStayInScreenRect(bool value);
|
||||
bool getStayInScreenRect() const;
|
||||
|
@ -50,11 +52,11 @@ private:
|
|||
|
||||
QHBoxLayout *titlebarBox;
|
||||
QWidget *titleLabel;
|
||||
RippleEffectLabel *minButton;
|
||||
RippleEffectLabel *maxButton;
|
||||
RippleEffectLabel *exitButton;
|
||||
TitleBarButton *minButton;
|
||||
TitleBarButton *maxButton;
|
||||
TitleBarButton *exitButton;
|
||||
QWidget *layoutBase;
|
||||
std::vector<RippleEffectLabel *> buttons;
|
||||
std::vector<RippleEffectButton *> buttons;
|
||||
};
|
||||
} // namespace widgets
|
||||
} // namespace chatterino
|
||||
|
|
127
src/widgets/helper/titlebarbutton.cpp
Normal file
127
src/widgets/helper/titlebarbutton.cpp
Normal file
|
@ -0,0 +1,127 @@
|
|||
#include "titlebarbutton.hpp"
|
||||
|
||||
namespace chatterino {
|
||||
namespace widgets {
|
||||
TitleBarButton::TitleBarButton()
|
||||
: RippleEffectButton(nullptr)
|
||||
{
|
||||
}
|
||||
|
||||
TitleBarButton::Style TitleBarButton::getButtonStyle() const
|
||||
{
|
||||
return this->style;
|
||||
}
|
||||
|
||||
void TitleBarButton::setButtonStyle(Style _style)
|
||||
{
|
||||
this->style = _style;
|
||||
this->update();
|
||||
}
|
||||
|
||||
void TitleBarButton::resizeEvent(QResizeEvent *)
|
||||
{
|
||||
if (this->style & (Maximize | Minimize | Unmaximize | Close)) {
|
||||
this->setFixedWidth(this->height() * 46 / 30);
|
||||
} else {
|
||||
this->setFixedWidth(this->height());
|
||||
}
|
||||
}
|
||||
|
||||
void TitleBarButton::paintEvent(QPaintEvent *)
|
||||
{
|
||||
QPainter painter(this);
|
||||
|
||||
QColor color = "#000";
|
||||
QColor background = "#fff";
|
||||
|
||||
int xD = this->height() / 3;
|
||||
int centerX = this->width() / 2;
|
||||
|
||||
painter.setRenderHint(QPainter::Antialiasing, false);
|
||||
|
||||
switch (this->style) {
|
||||
case Minimize: {
|
||||
painter.fillRect(centerX - xD / 2, xD * 3 / 2, xD, 1, color);
|
||||
break;
|
||||
}
|
||||
case Maximize: {
|
||||
painter.setPen(color);
|
||||
painter.drawRect(centerX - xD / 2, xD, xD - 1, xD - 1);
|
||||
break;
|
||||
}
|
||||
case Unmaximize: {
|
||||
int xD2 = xD * 1 / 5;
|
||||
int xD3 = xD * 4 / 5;
|
||||
|
||||
painter.drawRect(centerX - xD / 2 + xD2, xD, xD3, xD3);
|
||||
painter.fillRect(centerX - xD / 2, xD + xD2, xD3, xD3, QColor("#fff"));
|
||||
painter.drawRect(centerX - xD / 2, xD + xD2, xD3, xD3);
|
||||
break;
|
||||
}
|
||||
case Close: {
|
||||
QRect rect(centerX - xD / 2, xD, xD - 1, xD - 1);
|
||||
painter.setPen(QPen(color, 1));
|
||||
|
||||
painter.drawLine(rect.topLeft(), rect.bottomRight());
|
||||
painter.drawLine(rect.topRight(), rect.bottomLeft());
|
||||
break;
|
||||
}
|
||||
case User: {
|
||||
color = QColor("#333");
|
||||
|
||||
painter.setRenderHint(QPainter::Antialiasing);
|
||||
painter.setRenderHint(QPainter::HighQualityAntialiasing);
|
||||
|
||||
auto a = xD / 3;
|
||||
QPainterPath path;
|
||||
|
||||
painter.save();
|
||||
painter.translate(3, 3);
|
||||
|
||||
path.arcMoveTo(a, 4 * a, 6 * a, 6 * a, 0);
|
||||
path.arcTo(a, 4 * a, 6 * a, 6 * a, 0, 180);
|
||||
|
||||
painter.fillPath(path, color);
|
||||
|
||||
painter.setBrush(background);
|
||||
painter.drawEllipse(2 * a, 1 * a, 4 * a, 4 * a);
|
||||
|
||||
painter.setBrush(color);
|
||||
painter.drawEllipse(2.5 * a, 1.5 * a, 3 * a + 1, 3 * a);
|
||||
painter.restore();
|
||||
|
||||
break;
|
||||
}
|
||||
case Settings: {
|
||||
color = QColor("#333");
|
||||
painter.setRenderHint(QPainter::Antialiasing);
|
||||
painter.setRenderHint(QPainter::HighQualityAntialiasing);
|
||||
|
||||
painter.save();
|
||||
painter.translate(3, 3);
|
||||
|
||||
auto a = xD / 3;
|
||||
QPainterPath path;
|
||||
|
||||
path.arcMoveTo(a, a, 6 * a, 6 * a, 0 - (360 / 32.0));
|
||||
|
||||
for (int i = 0; i < 8; i++) {
|
||||
path.arcTo(a, a, 6 * a, 6 * a, i * (360 / 8.0) - (360 / 32.0), (360 / 32.0));
|
||||
path.arcTo(2 * a, 2 * a, 4 * a, 4 * a, i * (360 / 8.0) + (360 / 32.0),
|
||||
(360 / 32.0));
|
||||
}
|
||||
|
||||
painter.strokePath(path, color);
|
||||
painter.fillPath(path, color);
|
||||
|
||||
painter.setBrush(background);
|
||||
painter.drawEllipse(3 * a, 3 * a, 2 * a, 2 * a);
|
||||
painter.restore();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
this->fancyPaint(painter);
|
||||
}
|
||||
} // namespace widgets
|
||||
} // namespace chatterino
|
25
src/widgets/helper/titlebarbutton.hpp
Normal file
25
src/widgets/helper/titlebarbutton.hpp
Normal file
|
@ -0,0 +1,25 @@
|
|||
#pragma once
|
||||
|
||||
#include "widgets/helper/rippleeffectbutton.hpp"
|
||||
|
||||
namespace chatterino {
|
||||
namespace widgets {
|
||||
class TitleBarButton : public RippleEffectButton
|
||||
{
|
||||
public:
|
||||
enum Style { Minimize = 1, Maximize = 2, Unmaximize = 4, Close = 8, User = 16, Settings = 32 };
|
||||
|
||||
TitleBarButton();
|
||||
|
||||
Style getButtonStyle() const;
|
||||
void setButtonStyle(Style style);
|
||||
|
||||
protected:
|
||||
virtual void paintEvent(QPaintEvent *) override;
|
||||
virtual void resizeEvent(QResizeEvent *) override;
|
||||
|
||||
private:
|
||||
Style style;
|
||||
};
|
||||
} // namespace widgets
|
||||
} // namespace chatterino
|
|
@ -37,9 +37,10 @@ Window::Window(const QString &windowName, singletons::ThemeManager &_themeManage
|
|||
});
|
||||
|
||||
if (this->hasCustomWindowFrame()) {
|
||||
this->addTitleBarButton(
|
||||
"preferences", [] { singletons::WindowManager::getInstance().showSettingsDialog(); });
|
||||
this->addTitleBarButton("user", [this] {
|
||||
this->addTitleBarButton(TitleBarButton::Settings, [] {
|
||||
singletons::WindowManager::getInstance().showSettingsDialog();
|
||||
});
|
||||
this->addTitleBarButton(TitleBarButton::User, [this] {
|
||||
singletons::WindowManager::getInstance().showAccountSelectPopup(QCursor::pos());
|
||||
});
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue