RabbitCommon v2.3.3
Loading...
Searching...
No Matches
TitleBar.cpp
1// Copyright Copyright (c) Kang Lin studio, All Rights Reserved
2// Author Kang Lin <kl222@126.com>
3
4#include "TitleBar.h"
5#include <QHBoxLayout>
6#include <QDockWidget>
7#include <QMargins>
8
9namespace RabbitCommon {
10
11QPushButton* CTitleBar::CreateSmallPushButton(QIcon icon, QWidget *parent) {
12 QPushButton *button = new QPushButton(icon, "", parent);
13 if(!button) return button;
14
15 button->setObjectName("TitleBarButton");
16 button->setFlat(true);
17
18 // avoid keyboard focus, this looks bad
19 button->setFocusPolicy(Qt::NoFocus);
20
21 return button;
22}
23
24CTitleBar::CTitleBar(QWidget *parent)
25 : QWidget{parent},
26 m_pTitle(nullptr),
27 m_pIcon(nullptr),
28 m_pCloseButton(nullptr),
29 m_pFloatButton(nullptr),
30 m_pMaxButton(nullptr),
31 m_pMinButton(nullptr)
32{
33 bool check = false;
34
35 // Muse set parent
36 Q_ASSERT(parent);
37
38 // Title bar horizontal layout
39 QHBoxLayout *layout = new QHBoxLayout(this);
40 setLayout(layout);
41 // ugly platform dependent layout fix:
42 // this should be solved by the style sheet
43 layout->setContentsMargins(10, 3, 10, 3); // left, top, right, bottom
44 #ifdef __APPLE__
45 layout->setSpacing(10);
46 #else
47 layout->setSpacing(0);
48 #endif
49
50 m_pIcon = new QLabel(this);
51 Q_ASSERT(m_pIcon);
52 m_pIcon->setWindowIcon(parent->windowIcon());
53 check = connect(parent, &QWidget::windowIconChanged,
54 this, [&](const QIcon &icon){
55 do {
56 if(icon.isNull())
57 break;
58 auto sizeList = icon.availableSizes();
59 if(sizeList.isEmpty())
60 break;
61 QPixmap p = icon.pixmap(*sizeList.begin());
62 if(p.isNull())
63 break;
64 QMargins cm = m_pIcon->contentsMargins();
65 int w = m_pIcon->height() - cm.top() - cm.bottom();
66 p = p.scaled(w, w, Qt::KeepAspectRatio, Qt::SmoothTransformation);
67 m_pIcon->setPixmap(p);
68 //m_pIcon->setScaledContents(true);
69 return;
70 }while(0);
71 m_pIcon->setPixmap(QPixmap());
72 });
73 Q_ASSERT(check);
74 layout->addWidget(m_pIcon);
75 m_pIcon->show();
76
77 m_pTitle = new QLabel(this);
78 Q_ASSERT(m_pTitle);
79 m_pTitle->setText(parent->windowTitle());
80 check = connect(parent, SIGNAL(windowTitleChanged(const QString&)),
81 m_pTitle, SLOT(setText(const QString&)));
82 Q_ASSERT(check);
83 m_pTitle->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
84 layout->addWidget(m_pTitle);
85
86 m_pMinButton = CreateSmallPushButton(QIcon::fromTheme("window-minimize"), this);
87 Q_ASSERT(m_pMinButton);
88 m_pMinButton->setToolTip(tr("Minimize"));
89 layout->addWidget(m_pMinButton);
90 check = connect(m_pMinButton, SIGNAL(clicked()),
91 this, SLOT(slotMinimize()));
92 Q_ASSERT(check);
93
94 m_pMaxButton = CreateSmallPushButton(QIcon::fromTheme("window-maximize"), this);
95 Q_ASSERT(m_pMaxButton);
96 m_pMaxButton->setToolTip(tr("Maximize"));
97 layout->addWidget(m_pMaxButton);
98 check = connect(m_pMaxButton, SIGNAL(clicked()),
99 this, SLOT(slotMaximize()));
100 Q_ASSERT(check);
101
102 m_pFloatButton = CreateSmallPushButton(QIcon::fromTheme("floating"), this);
103 Q_ASSERT(m_pFloatButton);
104 m_pFloatButton->setToolTip(tr("Floating"));
105 layout->addWidget(m_pFloatButton);
106 check = connect(m_pFloatButton, SIGNAL(clicked()),
107 this, SLOT(slotFloat()));
108 Q_ASSERT(check);
109
110 m_pCloseButton = CreateSmallPushButton(
111 QIcon::fromTheme("window-close"), this);
112 Q_ASSERT(m_pCloseButton);
113 m_pCloseButton->setToolTip(tr("Close"));
114 layout->addWidget(m_pCloseButton);
115 check = connect(m_pCloseButton, SIGNAL(clicked()),
116 parent, SLOT(close()));
117 Q_ASSERT(check);
118
119 QDockWidget* pParent = qobject_cast<QDockWidget*>(parent);
120 if(pParent) {
121 QDockWidget::DockWidgetFeatures features = pParent->features();
122 VisibleCloseButton(QDockWidget::DockWidgetClosable & features);
123 VisibleFloatButton(QDockWidget::DockWidgetFloatable & features);
124 bool bFloating = pParent->isFloating();
125 if(m_pFloatButton) {
126 if(bFloating)
127 m_pFloatButton->setIcon(QIcon::fromTheme("unfloating"));
128 else
129 m_pFloatButton->setIcon(QIcon::fromTheme("floating"));
130 }
131 bool check = connect(parent, SIGNAL(topLevelChanged(bool)),
132 this, SLOT(slotTopLevelChanged(bool)));
133 Q_ASSERT(check);
134 if(!pParent->isFloating())
135 {
136 VisibleMaximizeButton(false);
137 VisibleMinimizeButton(false);
138 }
139 } else {
140 VisibleFloatButton(false);
141 }
142}
143
144int CTitleBar::AddWidgets(QList<QWidget*> pLstWidget)
145{
146 QHBoxLayout *layout = qobject_cast<QHBoxLayout*>(this->layout());
147 foreach (auto w, pLstWidget) {
148 if(layout)
149 layout->insertWidget(2, w);
150 }
151 return 0;
152}
153
154int CTitleBar::VisibleIconButton(bool bVisible)
155{
156 if(m_pIcon)
157 m_pIcon->setVisible(bVisible);
158 return 0;
159}
160
161int CTitleBar::VisibleTitleButton(bool bVisible)
162{
163 if(m_pTitle)
164 m_pTitle->setVisible(bVisible);
165 return 0;
166}
167
168int CTitleBar::VisibleMaximizeButton(bool bVisible)
169{
170 if(m_pMaxButton)
171 m_pMaxButton->setVisible(bVisible);
172 return 0;
173}
174
175int CTitleBar::VisibleMinimizeButton(bool bVisible)
176{
177 if(m_pMaxButton)
178 m_pMinButton->setVisible(bVisible);
179 return 0;
180}
181
182int CTitleBar::VisibleFloatButton(bool bVisible)
183{
184 if(m_pFloatButton)
185 m_pFloatButton->setVisible(bVisible);
186 return 0;
187}
188
189int CTitleBar::VisibleCloseButton(bool bVisible)
190{
191 if(m_pCloseButton)
192 m_pCloseButton->setVisible(bVisible);
193 return 0;
194}
195
196void CTitleBar::slotMinimize()
197{
198 QWidget* pParent = qobject_cast<QWidget*>(parent());
199 if(!pParent) return;
200 if(pParent->isMinimized())
201 pParent->showNormal();
202 else
203 pParent->showMinimized();
204}
205
206void CTitleBar::slotMaximize()
207{
208 QWidget* pParent = qobject_cast<QWidget*>(parent());
209 if(!pParent) return;
210 if(pParent->isMaximized())
211 pParent->showNormal();
212 else
213 pParent->showMaximized();
214}
215
216void CTitleBar::slotFloat()
217{
218 QDockWidget* pParent = qobject_cast<QDockWidget*>(parent());
219 if(pParent) {
220 pParent->setFloating(!pParent->isFloating());
221 }
222}
223
224void CTitleBar::slotTopLevelChanged(bool topLevel)
225{
226 if(m_pFloatButton) {
227 if(topLevel) {
228#if !defined(Q_OS_UNIX)
229 VisibleMaximizeButton(true);
230 //VisibleMinimizeButton(true);
231#endif
232 m_pFloatButton->setIcon(QIcon::fromTheme("unfloating"));
233 } else {
234 m_pFloatButton->setIcon(QIcon::fromTheme("floating"));
235 VisibleMaximizeButton(false);
236 VisibleMinimizeButton(false);
237 }
238 }
239}
240
241} // namespace RabbitCommon