RabbitCommon v2.2.6
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
8namespace RabbitCommon {
9
10QPushButton* CTitleBar::CreateSmallPushButton(QIcon icon, QWidget *parent) {
11 QPushButton *button = new QPushButton(icon, "", parent);
12 if(!button) return button;
13
14 button->setObjectName("TitleBarButton");
15 button->setFlat(true);
16
17 // avoid keyboard focus, this looks bad
18 button->setFocusPolicy(Qt::NoFocus);
19
20 return button;
21}
22
23CTitleBar::CTitleBar(QWidget *parent)
24 : QWidget{parent},
25 m_pTitle(nullptr),
26 m_pCloseButton(nullptr),
27 m_pFloatButton(nullptr),
28 m_pMaxButton(nullptr),
29 m_pMinButton(nullptr)
30{
31 bool check = false;
32
33 // Muse set parent
34 Q_ASSERT(parent);
35
36 // Title bar horizontal layout
37 QHBoxLayout *layout = new QHBoxLayout(this);
38 setLayout(layout);
39 // ugly platform dependent layout fix:
40 // this should be solved by the style sheet
41 layout->setContentsMargins(10, 3, 10, 3); // left, top, right, bottom
42 #ifdef __APPLE__
43 layout->setSpacing(10);
44 #else
45 layout->setSpacing(0);
46 #endif
47
48 m_pTitle = new QLabel(this);
49 Q_ASSERT(m_pTitle);
50 m_pTitle->setText(parent->windowTitle());
51 check = connect(parent, SIGNAL(windowTitleChanged(const QString&)),
52 m_pTitle, SLOT(setText(const QString&)));
53 Q_ASSERT(check);
54 m_pTitle->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
55 layout->addWidget(m_pTitle);
56
57 m_pMinButton = CreateSmallPushButton(QIcon::fromTheme("window-minimize"), this);
58 Q_ASSERT(m_pMinButton);
59 m_pMinButton->setToolTip(tr("Minimize"));
60 layout->addWidget(m_pMinButton);
61 check = connect(m_pMinButton, SIGNAL(clicked()),
62 this, SLOT(slotMinimize()));
63 Q_ASSERT(check);
64
65 m_pMaxButton = CreateSmallPushButton(QIcon::fromTheme("window-maximize"), this);
66 Q_ASSERT(m_pMaxButton);
67 m_pMaxButton->setToolTip(tr("Maximize"));
68 layout->addWidget(m_pMaxButton);
69 check = connect(m_pMaxButton, SIGNAL(clicked()),
70 this, SLOT(slotMaximize()));
71 Q_ASSERT(check);
72
73 m_pFloatButton = CreateSmallPushButton(QIcon::fromTheme("floating"), this);
74 Q_ASSERT(m_pFloatButton);
75 m_pFloatButton->setToolTip(tr("Floating"));
76 layout->addWidget(m_pFloatButton);
77 check = connect(m_pFloatButton, SIGNAL(clicked()),
78 this, SLOT(slotFloat()));
79 Q_ASSERT(check);
80
81 m_pCloseButton = CreateSmallPushButton(
82 QIcon::fromTheme("window-close"), this);
83 Q_ASSERT(m_pCloseButton);
84 m_pCloseButton->setToolTip(tr("Close"));
85 layout->addWidget(m_pCloseButton);
86 check = connect(m_pCloseButton, SIGNAL(clicked()),
87 parent, SLOT(close()));
88 Q_ASSERT(check);
89
90 QDockWidget* pParent = qobject_cast<QDockWidget*>(parent);
91 if(pParent) {
92 QDockWidget::DockWidgetFeatures features = pParent->features();
93 VisibleCloseButton(QDockWidget::DockWidgetClosable & features);
94 VisibleFloatButton(QDockWidget::DockWidgetFloatable & features);
95 bool bFloating = pParent->isFloating();
96 if(m_pFloatButton) {
97 if(bFloating)
98 m_pFloatButton->setIcon(QIcon::fromTheme("unfloating"));
99 else
100 m_pFloatButton->setIcon(QIcon::fromTheme("floating"));
101 }
102 bool check = connect(parent, SIGNAL(topLevelChanged(bool)),
103 this, SLOT(slotTopLevelChanged(bool)));
104 Q_ASSERT(check);
105 if(!pParent->isFloating())
106 {
107 VisibleMaximizeButton(false);
108 VisibleMinimizeButton(false);
109 }
110 } else {
111 VisibleFloatButton(false);
112 }
113}
114
115int CTitleBar::AddWidgets(QList<QWidget*> pLstWidget)
116{
117 QHBoxLayout *layout = qobject_cast<QHBoxLayout*>(this->layout());
118 foreach (auto w, pLstWidget) {
119 if(layout)
120 layout->insertWidget(1, w);
121 }
122 return 0;
123}
124
125int CTitleBar::VisibleTitleButton(bool bVisible)
126{
127 if(m_pTitle)
128 m_pTitle->setVisible(bVisible);
129 return 0;
130}
131
132int CTitleBar::VisibleMaximizeButton(bool bVisible)
133{
134 if(m_pMaxButton)
135 m_pMaxButton->setVisible(bVisible);
136 return 0;
137}
138
139int CTitleBar::VisibleMinimizeButton(bool bVisible)
140{
141 if(m_pMaxButton)
142 m_pMinButton->setVisible(bVisible);
143 return 0;
144}
145
146int CTitleBar::VisibleFloatButton(bool bVisible)
147{
148 if(m_pFloatButton)
149 m_pFloatButton->setVisible(bVisible);
150 return 0;
151}
152
153int CTitleBar::VisibleCloseButton(bool bVisible)
154{
155 if(m_pCloseButton)
156 m_pCloseButton->setVisible(bVisible);
157 return 0;
158}
159
160void CTitleBar::slotMinimize()
161{
162 QWidget* pParent = qobject_cast<QWidget*>(parent());
163 if(!pParent) return;
164 if(pParent->isMinimized())
165 pParent->showNormal();
166 else
167 pParent->showMinimized();
168}
169
170void CTitleBar::slotMaximize()
171{
172 QWidget* pParent = qobject_cast<QWidget*>(parent());
173 if(!pParent) return;
174 if(pParent->isMaximized())
175 pParent->showNormal();
176 else
177 pParent->showMaximized();
178}
179
180void CTitleBar::slotFloat()
181{
182 QDockWidget* pParent = qobject_cast<QDockWidget*>(parent());
183 if(pParent) {
184 pParent->setFloating(!pParent->isFloating());
185 }
186}
187
188void CTitleBar::slotTopLevelChanged(bool topLevel)
189{
190 if(m_pFloatButton) {
191 if(topLevel) {
192#if !defined(Q_OS_UNIX)
193 VisibleMaximizeButton(true);
194 //VisibleMinimizeButton(true);
195#endif
196 m_pFloatButton->setIcon(QIcon::fromTheme("unfloating"));
197 } else {
198 m_pFloatButton->setIcon(QIcon::fromTheme("floating"));
199 VisibleMaximizeButton(false);
200 VisibleMinimizeButton(false);
201 }
202 }
203}
204
205} // namespace RabbitCommon