Pencil2D Animation
Download Community News Docs Contribute
  • Overview
  • Articles
  • Code
  •  
  • Class List
  • Class Index
  • Class Hierarchy
  • Class Members
  • File List
Loading...
Searching...
No Matches
  • app
  • src
titlebarwidget.cpp
1/*
2
3Pencil2D - Traditional Animation Software
4Copyright (C) 2005-2007 Patrick Corrieri & Pascal Naidon
5Copyright (C) 2012-2020 Matthew Chiawen Chang
6
7This program is free software; you can redistribute it and/or
8modify it under the terms of the GNU General Public License
9as published by the Free Software Foundation; version 2 of the License.
10
11This program is distributed in the hope that it will be useful,
12but WITHOUT ANY WARRANTY; without even the implied warranty of
13MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14GNU General Public License for more details.
15
16*/
17#include "titlebarwidget.h"
18
19#include <QHBoxLayout>
20#include <QVBoxLayout>
21#include <QLabel>
22#include <QIcon>
23#include <QToolButton>
24#include <QResizeEvent>
25#include <QStyle>
26#include <QPainter>
27#include <QDebug>
28
29#include "platformhandler.h"
30#include "buttonappearancewatcher.h"
31
32TitleBarWidget::TitleBarWidget(QWidget* parent)
33 : QWidget(parent)
34{
35
36 QVBoxLayout* vLayout = new QVBoxLayout();
37
38 vLayout->setContentsMargins(3,4,3,4);
39 vLayout->setSpacing(0);
40
41 vLayout->addWidget(createCustomTitleBarWidget(this));
42
43 setLayout(vLayout);
44}
45
46TitleBarWidget::~TitleBarWidget()
47{
48}
49
50QWidget* TitleBarWidget::createCustomTitleBarWidget(QWidget* parent)
51{
52 bool isDarkmode = PlatformHandler::isDarkMode();
53 QWidget* containerWidget = new QWidget(parent);
54
55 QHBoxLayout* containerLayout = new QHBoxLayout(parent);
56
57 mCloseButton = new QToolButton(parent);
58
59 mCloseButton->setStyleSheet(flatButtonStylesheet());
60
61 QSize iconSize = QSize(14,14);
62 QSize padding = QSize(2,2);
63
64 IconResource closeButtonRes;
65 closeButtonRes.lightMode = QIcon("://icons/themes/playful/window/window-close-button-normal.svg");
66 closeButtonRes.darkMode = QIcon("://icons/themes/playful/window/window-close-button-normal-darkm.svg");
67
68 QIcon closeIcon = closeButtonRes.iconForMode(isDarkmode);
69
70 IconResource closeHoverButtonRes;
71 closeHoverButtonRes.lightMode = QIcon("://icons/themes/playful/window/window-close-button-active.svg");
72 closeHoverButtonRes.darkMode = closeHoverButtonRes.lightMode;
73
74 mCloseButton->setIcon(closeIcon);
75 mCloseButton->setIconSize(iconSize);
76 mCloseButton->setFixedSize(iconSize + padding);
77 mCloseButton->installEventFilter(new ButtonAppearanceWatcher(closeButtonRes,
78 closeHoverButtonRes,
79 this));
80
81 connect(mCloseButton, &QToolButton::clicked, this, &TitleBarWidget::closeButtonPressed);
82
83 IconResource dockButtonRes;
84 dockButtonRes.lightMode = QIcon("://icons/themes/playful/window/window-float-button-normal.svg");
85 dockButtonRes.darkMode = QIcon("://icons/themes/playful/window/window-float-button-normal-darkm.svg");
86
87 IconResource dockHoverButtonRes;
88 dockHoverButtonRes.lightMode = QIcon("://icons/themes/playful/window/window-float-button-active.svg");
89 dockHoverButtonRes.darkMode = dockHoverButtonRes.lightMode;
90
91 mDockButton = new QToolButton(parent);
92
93 QIcon dockIcon = dockButtonRes.iconForMode(isDarkmode);
94 mDockButton->setIcon(dockIcon);
95 mDockButton->setStyleSheet(flatButtonStylesheet());
96
97 mDockButton->setIconSize(iconSize);
98 mDockButton->setFixedSize(iconSize + padding);
99 mDockButton->installEventFilter(new ButtonAppearanceWatcher(dockButtonRes, dockHoverButtonRes, this));
100
101 connect(mDockButton, &QToolButton::clicked, this, &TitleBarWidget::undockButtonPressed);
102
103 mTitleLabel = new QLabel(parent);
104 mTitleLabel->setAlignment(Qt::AlignVCenter);
105
106#ifdef __APPLE__
107 containerLayout->addWidget(mCloseButton);
108 containerLayout->addWidget(mDockButton);
109 containerLayout->addWidget(mTitleLabel);
110#else
111 containerLayout->addWidget(mTitleLabel);
112 containerLayout->addWidget(mDockButton);
113 containerLayout->addWidget(mCloseButton);
114#endif
115
116 containerLayout->setSpacing(3);
117 containerLayout->setContentsMargins(0,0,0,0);
118
119 containerWidget->setLayout(containerLayout);
120 containerWidget->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
121 containerWidget->setMinimumSize(QSize(1,1));
122
123 return containerWidget;
124}
125
126QString TitleBarWidget::flatButtonStylesheet() const
127{
128 return "QToolButton { border: 0; }";
129}
130
131void TitleBarWidget::setTitle(const QString &title)
132{
133 mTitleLabel->setText(title);
134}
135
136void TitleBarWidget::hideButtons(bool hide)
137{
138 mCloseButton->setHidden(hide);
139 mDockButton->setHidden(hide);
140}
141
142void TitleBarWidget::resizeEvent(QResizeEvent *resizeEvent)
143{
144 QWidget::resizeEvent(resizeEvent);
145
146 hideButtonsIfNeeded(resizeEvent->size().width());
147}
148
149void TitleBarWidget::hideButtonsIfNeeded(int width)
150{
151 if (width <= mWidthOfFullLayout) {
152 hideButtons(true);
153 } else {
154 hideButtons(false);
155 }
156}
157
158void TitleBarWidget::showEvent(QShowEvent* event)
159{
160 QWidget::showEvent(event);
161
162 // This is to ensure that after the titlebar has been hidden with buttons hidden
163 // the layout width is smaller, so we enable them again briefly to get the correct width.
164 hideButtons(false);
165
166 mWidthOfFullLayout = layout()->sizeHint().width();
167 hideButtonsIfNeeded(size().width());
168}
169
170void TitleBarWidget::paintEvent(QPaintEvent *)
171{
172 QPainter painter(this);
173
174 painter.save();
175 painter.setBrush(palette().color(QPalette::Midlight));
176 painter.setPen(Qt::NoPen);
177 painter.drawRect(this->rect());
178
179 QPen pen(palette().color(QPalette::Mid));
180 int penWidth = 1;
181 pen.setWidth(penWidth);
182 painter.setPen(pen);
183 painter.drawLine(QPoint(this->rect().x(),
184 this->rect().height()-penWidth),
185 QPoint(this->rect().width(),
186 this->rect().height()-penWidth));
187 painter.restore();
188}
ButtonAppearanceWatcher
Definition: buttonappearancewatcher.h:32
QAbstractButton::clicked
void clicked(bool checked)
QAbstractButton::setIcon
void setIcon(const QIcon &icon)
QAbstractButton::setIconSize
void setIconSize(const QSize &size)
QBoxLayout::addWidget
void addWidget(QWidget *widget, int stretch, Qt::Alignment alignment)
QBoxLayout::setSpacing
void setSpacing(int spacing)
QHBoxLayout
QIcon
QLabel
QLabel::setAlignment
void setAlignment(Qt::Alignment)
QLabel::setText
void setText(const QString &)
QLayout::setContentsMargins
void setContentsMargins(int left, int top, int right, int bottom)
QLayoutItem::sizeHint
virtual QSize sizeHint() const const=0
QObject::connect
QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QObject::installEventFilter
void installEventFilter(QObject *filterObj)
QObject::parent
QObject * parent() const const
QPainter
QPaintEvent
QPalette::Midlight
Midlight
QPen
QPoint
QResizeEvent
QResizeEvent::size
const QSize & size() const const
QShowEvent
QSize
QSize::width
int width() const const
QSizePolicy::Minimum
Minimum
QString
Qt::AlignVCenter
AlignVCenter
Qt::NoPen
NoPen
QToolButton
QVBoxLayout
QWidget
QWidget::event
virtual bool event(QEvent *event) override
QWidget::height
height
QWidget::hide
void hide()
QWidget::layout
QLayout * layout() const const
QWidget::setMinimumSize
void setMinimumSize(const QSize &)
QWidget::palette
palette
QWidget::rect
rect
QWidget::resizeEvent
virtual void resizeEvent(QResizeEvent *event)
QWidget::setFixedSize
void setFixedSize(const QSize &s)
QWidget::setHidden
void setHidden(bool hidden)
QWidget::setLayout
void setLayout(QLayout *layout)
QWidget::showEvent
virtual void showEvent(QShowEvent *event)
QWidget::size
size
QWidget::setSizePolicy
void setSizePolicy(QSizePolicy)
QWidget::setStyleSheet
void setStyleSheet(const QString &styleSheet)
QWidget::width
width
QWidget::x
x
IconResource
Definition: appearance.h:24
Generated on Thu Jun 5 2025 14:06:43 for Pencil2D by doxygen 1.9.6 based on revision 4c63407997b2c03e5048716586dec6fbbb755173