QtCanpool 3.3.0
载入中...
搜索中...
未找到
dockfloatingtitlebar.cpp
浏览该文件的文档.
1
7#include "docklabel.h"
8#include "dockutils.h"
9
10#include <QToolButton>
11#include <QBoxLayout>
12#include <QStyle>
13
15
16class DockFloatingTitleBarPrivate
17{
18public:
20public:
21 DockFloatingTitleBarPrivate();
22
23 void init();
24public:
25 DockFloatingContainer *m_floatingWidget = nullptr;
26 DockLabel *m_titleLabel;
27 QToolButton *m_closeButton = nullptr;
28 QToolButton *m_maximizeButton = nullptr;
30 QIcon m_maximizeIcon;
31 QIcon m_normalIcon;
32 bool m_maximized = false;
33};
34
35DockFloatingTitleBarPrivate::DockFloatingTitleBarPrivate()
36{
37}
38
39void DockFloatingTitleBarPrivate::init()
40{
42
43 m_titleLabel = new DockLabel();
44 m_titleLabel->setElideMode(Qt::ElideRight);
45 m_titleLabel->setText("DockWidget->windowTitle()");
46 m_titleLabel->setObjectName("dockFloatingTitleLabel");
47 m_titleLabel->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
48
49 m_closeButton = new QToolButton();
50 m_closeButton->setObjectName("dockFloatingTitleCloseButton");
51 m_closeButton->setAutoRaise(true);
52
53 m_maximizeButton = new QToolButton();
54 m_maximizeButton->setObjectName("dockFloatingTitleMaximizeButton");
55 m_maximizeButton->setAutoRaise(true);
56
57 // The standard icons do does not look good on high DPI screens
58 QIcon closeIcon;
59 QPixmap normalPixmap = q->style()->standardPixmap(QStyle::SP_TitleBarCloseButton, 0, m_closeButton);
60 closeIcon.addPixmap(normalPixmap, QIcon::Normal);
61 closeIcon.addPixmap(internal::createTransparentPixmap(normalPixmap, 0.25), QIcon::Disabled);
62 m_closeButton->setIcon(q->style()->standardIcon(QStyle::SP_TitleBarCloseButton));
63 m_closeButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
64 m_closeButton->setVisible(true);
65 m_closeButton->setFocusPolicy(Qt::NoFocus);
66 q->connect(m_closeButton, SIGNAL(clicked()), SIGNAL(closeRequested()));
67
68 q->setMaximizedIcon(false);
69 m_maximizeButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
70 m_maximizeButton->setVisible(true);
71 m_maximizeButton->setFocusPolicy(Qt::NoFocus);
72 q->connect(m_maximizeButton, &QToolButton::clicked, q, &DockFloatingTitleBar::maximizeRequested);
73
74 QFontMetrics fm(m_titleLabel->font());
75 int spacing = qRound(fm.height() / 4.0);
76
77 // Fill the layout
78 QBoxLayout *lay = new QBoxLayout(QBoxLayout::LeftToRight);
79 lay->setContentsMargins(6, 0, 0, 0);
80 lay->setSpacing(0);
81 q->setLayout(lay);
82 lay->addWidget(m_titleLabel, 1);
83 lay->addSpacing(spacing);
84 lay->addWidget(m_maximizeButton);
85 lay->addWidget(m_closeButton);
86 lay->setAlignment(Qt::AlignCenter);
87
88 m_titleLabel->setVisible(true);
89}
90
91DockFloatingTitleBar::DockFloatingTitleBar(DockFloatingContainer *parent)
92 : QFrame(parent)
93{
96
97 d->m_floatingWidget = parent;
98 d->init();
99
100 auto normalPixmap = this->style()->standardPixmap(QStyle::SP_TitleBarNormalButton, nullptr, d->m_maximizeButton);
101 d->m_normalIcon.addPixmap(normalPixmap, QIcon::Normal);
102 d->m_normalIcon.addPixmap(internal::createTransparentPixmap(normalPixmap, 0.25), QIcon::Disabled);
103
104 auto maxPixmap = this->style()->standardPixmap(QStyle::SP_TitleBarMaxButton, nullptr, d->m_maximizeButton);
105 d->m_maximizeIcon.addPixmap(maxPixmap, QIcon::Normal);
106 d->m_maximizeIcon.addPixmap(internal::createTransparentPixmap(maxPixmap, 0.25), QIcon::Disabled);
107 setMaximizedIcon(d->m_maximized);
108}
109
114
116{
118 d->m_closeButton->setEnabled(enable);
119}
120
122{
124 d->m_titleLabel->setText(text);
125}
126
128{
129 internal::repolishStyle(this, internal::RepolishDirectChildren);
130}
131
133{
135 d->m_maximized = maximized;
136 if (maximized) {
137 d->m_maximizeButton->setIcon(d->m_normalIcon);
138 } else {
139 d->m_maximizeButton->setIcon(d->m_maximizeIcon);
140 }
141}
142
144{
145 Q_D(const DockFloatingTitleBar);
146 return d->m_maximizeIcon;
147}
148
150{
152 d->m_maximizeIcon = icon;
153 if (d->m_maximized) {
154 setMaximizedIcon(d->m_maximized);
155 }
156}
157
159{
160 Q_D(const DockFloatingTitleBar);
161 return d->m_normalIcon;
162}
163
165{
167 d->m_normalIcon = icon;
168 if (!d->m_maximized) {
169 setMaximizedIcon(d->m_maximized);
170 }
171}
172
174{
176 if (e->button() == Qt::LeftButton) {
177 d->m_dragState = Qx::DockDraggingFloatingWidget;
178 d->m_floatingWidget->startFloating(e->pos(), d->m_floatingWidget->size(), Qx::DockDraggingFloatingWidget, this);
179 return;
180 }
181 Super::mousePressEvent(e);
182}
183
185{
187 d->m_dragState = Qx::DockDraggingInactive;
188 if (d->m_floatingWidget) {
189 d->m_floatingWidget->finishDragging();
190 }
191 Super::mouseReleaseEvent(e);
192}
193
195{
197 if (!(e->buttons() & Qt::LeftButton) || Qx::DockDraggingInactive == d->m_dragState) {
198 d->m_dragState = Qx::DockDraggingInactive;
199 Super::mouseMoveEvent(e);
200 return;
201 }
202
203 // move floating window
204 if (Qx::DockDraggingFloatingWidget == d->m_dragState) {
205 if (d->m_floatingWidget->isMaximized()) {
206 d->m_floatingWidget->showNormal(true);
207 }
208 d->m_floatingWidget->moveFloating();
209 Super::mouseMoveEvent(e);
210 return;
211 }
212 Super::mouseMoveEvent(e);
213}
214
216{
217 if (e->buttons() & Qt::LeftButton) {
218 Q_EMIT maximizeRequested();
219 e->accept();
220 } else {
221 QWidget::mouseDoubleClickEvent(e);
222 }
223}
224
void setNormalIcon(const QIcon &icon)
void enableCloseButton(bool enable)
void setMaximizeIcon(const QIcon &icon)
DockFloatingTitleBar(DockFloatingContainer *parent=nullptr)
virtual void mouseDoubleClickEvent(QMouseEvent *e) override
void setMaximizedIcon(bool maximized)
virtual void mouseReleaseEvent(QMouseEvent *e) override
virtual void mouseMoveEvent(QMouseEvent *e) override
virtual void mousePressEvent(QMouseEvent *e) override
void setTitle(const QString &text)
DockDragState
@ DockDraggingFloatingWidget
@ DockDraggingInactive
#define QX_INIT_PRIVATE(Class)
#define QX_DECLARE_PUBLIC(Class)
#define QX_FINI_PRIVATE()
#define QX_DOCK_END_NAMESPACE
#define QX_DOCK_BEGIN_NAMESPACE
QColor text