QtCanpool 3.3.0
载入中...
搜索中...
未找到
ribbonquickaccessbar.cpp
浏览该文件的文档.
1
7
8#include <QToolButton>
9#include <QAction>
10#include <QStyle>
11#include <QEvent>
12#include <QActionEvent>
13#include <QActionGroup>
14#include <QLayout>
15
17
18RibbonQuickAccessButton::RibbonQuickAccessButton(QWidget *parent)
19 : QToolButton(parent)
20 , m_orientation(Qt::Horizontal)
21{
22}
23
27
29{
30 QSize sz = QToolButton::sizeHint();
31 if (m_orientation == Qt::Horizontal) {
32 return QSize(sz.width() / 2, sz.height());
33 } else {
34 return QSize(sz.width(), sz.height() / 2);
35 }
36}
37
38void RibbonQuickAccessButton::setOrientation(Qt::Orientation orientation)
39{
40 m_orientation = orientation;
41}
42
44 : m_menu(Q_NULLPTR)
45 , m_actionAccessPopup(Q_NULLPTR)
46 , m_customizeGroup(Q_NULLPTR)
47 , m_accessPopup(Q_NULLPTR)
48 , m_removingAction(false)
49 , m_takingAction(false)
50{
51}
52
56
58{
60 q->setAutoFillBackground(false);
61 q->setAttribute(Qt::WA_NoSystemBackground);
62 q->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
63
64 const int sz = q->style()->pixelMetric(QStyle::PM_SmallIconSize, Q_NULLPTR, q);
65 q->setIconSize(QSize(sz, sz));
66
68 m_accessPopup->setPopupMode(QToolButton::InstantPopup);
69 QObject::connect(q, SIGNAL(orientationChanged(Qt::Orientation)), m_accessPopup,
70 SLOT(setOrientation(Qt::Orientation)));
71 m_menu = new QMenu(q);
72 m_accessPopup->setMenu(m_menu);
73
74 m_actionAccessPopup = q->addWidget(m_accessPopup);
75
76 m_customizeGroup = new QActionGroup(q);
77 m_customizeGroup->setExclusive(false);
78 connect(m_customizeGroup, SIGNAL(triggered(QAction *)), this, SLOT(customizeAction(QAction *)));
79
80 connect(m_menu, SIGNAL(aboutToShow()), this, SLOT(aboutToShowCustomizeMenu()));
81 connect(m_menu, SIGNAL(aboutToHide()), this, SLOT(aboutToHideCustomizeMenu()));
82}
83
85{
86 foreach (QAction *a, m_actionList) {
87 QuickAccessAction *act = dynamic_cast<QuickAccessAction *>(a);
88 if (act && action == act->m_srcAction) {
89 return act;
90 }
91 }
92 return Q_NULLPTR;
93}
94
96{
97 if (QuickAccessAction *wrapper = findQuickAccessAction(action)) {
98 wrapper->update();
99 }
100}
101
102void RibbonQuickAccessBarPrivate::setActionVisible(QAction *action, bool visible)
103{
104 if (QuickAccessAction *wrapper = findQuickAccessAction(action)) {
105 if (wrapper->isChecked() == visible) {
106 return;
107 }
108 setActionVisible(wrapper, action, visible);
109 }
110}
111
112void RibbonQuickAccessBarPrivate::setActionVisible(QuickAccessAction *wrapper, QAction *action, bool visible)
113{
114 wrapper->setChecked(visible);
115 setActionShown(wrapper, action, visible);
116 wrapper->update();
117}
118
119void RibbonQuickAccessBarPrivate::setActionShown(QuickAccessAction *action, QAction *srcAction, bool visible)
120{
122 bool actionInBar = (q->widgetForAction(srcAction) != NULL);
123 bool actionIsVisible = srcAction->isVisible();
124
125 if (visible) {
126 if (actionInBar) {
127 if (actionIsVisible) {
128 return;
129 }
130 blockSignals(true);
131 srcAction->setVisible(true);
132 blockSignals(false);
133 return;
134 }
135 QAction *before = nextSrcAction(action);
136 if (before) {
137 q->insertAction(before, srcAction);
138 } else {
139 q->addAction(srcAction);
140 }
141 } else {
142 if (!actionInBar) {
143 return;
144 }
145 m_takingAction = true;
146 q->removeAction(srcAction);
147 }
148}
149
151{
153 bool flag = false;
154 foreach (QAction *act, m_actionList) {
155 if (flag) {
156 QuickAccessAction *a = dynamic_cast<QuickAccessAction *>(act);
157 // wrapper action isChecked or srcAction inBar
158 if (a->isChecked() || (q->widgetForAction(a->m_srcAction) != NULL)) {
159 return a->m_srcAction;
160 }
161 } else if (act == action) {
162 flag = true;
163 }
164 }
165 return NULL;
166}
167
169{
171 if (QuickAccessAction *act = dynamic_cast<QuickAccessAction *>(action)) {
172 setActionShown(act, act->m_srcAction, act->isChecked());
173 Q_EMIT q->customizeActionChanged();
174 }
175}
176
178{
180 m_menu->clear();
181 foreach (QAction *action, m_actionList) {
182 m_menu->addAction(action);
183 }
184 Q_EMIT q->showCustomizeMenu(m_menu);
185}
186
191
193 : QToolBar(parent)
194{
197 d->init();
198 layout()->setSizeConstraint(QLayout::SetFixedSize);
199}
200
202
204{
205 Q_D(const RibbonQuickAccessBar);
206 return d->m_actionAccessPopup;
207}
208
209void RibbonQuickAccessBar::setActionVisible(QAction *action, bool visible)
210{
212 d->setActionVisible(action, visible);
213}
214
215bool RibbonQuickAccessBar::isActionVisible(QAction *action) const
216{
217 Q_D(const RibbonQuickAccessBar);
218 if (QuickAccessAction *wrapper = d->findQuickAccessAction(action)) {
219 return wrapper->isChecked();
220 }
221 return false;
222}
223
225{
226 Q_D(const RibbonQuickAccessBar);
227 int visibleCount = 0;
228 QList<QAction *> list = d->m_customizeGroup->actions();
229 for (int i = 0, count = list.count(); i < count; ++i) {
230 if (QuickAccessAction *act = dynamic_cast<QuickAccessAction *>(list[i])) {
231 if (act->isChecked()) {
232 visibleCount++;
233 }
234 }
235 }
236 return visibleCount;
237}
238
240{
241 Q_D(const RibbonQuickAccessBar);
242 QByteArray s;
243 foreach (QAction *act, d->m_actionList) {
244 s.append(act->isChecked() ? '1' : '0');
245 }
246 return s;
247}
248
249void RibbonQuickAccessBar::setState(const QByteArray &s)
250{
251 if (s.isEmpty()) {
252 return;
253 }
255 int cnt = static_cast<int>(s.size());
256 int j = 0;
257 foreach (QAction *action, d->m_actionList) {
258 if (QuickAccessAction *act = dynamic_cast<QuickAccessAction *>(action)) {
259 if (j < cnt) {
260 if (s.at(j) == '1' && !act->isChecked()) {
261 d->setActionVisible(act, act->m_srcAction, true);
262 } else if (s.at(j) == '0' && act->isChecked()) {
263 d->setActionVisible(act, act->m_srcAction, false);
264 }
265 }
266 }
267 ++j;
268 }
269}
270
272{
273 if (parentWidget() && (event->type() == QEvent::Hide || event->type() == QEvent::Show)) {
274 adjustSize();
275 } else if (event->type() == QEvent::StyleChange) {
276 const int sz = style()->pixelMetric(QStyle::PM_SmallIconSize, Q_NULLPTR, this);
277 setIconSize(QSize(sz, sz));
278 }
279 return QToolBar::event(event);
280}
281
282void RibbonQuickAccessBar::actionEvent(QActionEvent *event)
283{
285 QToolBar::actionEvent(event);
286 if (d->m_actionAccessPopup) {
287 if (event->type() == QEvent::ActionAdded) {
288 if (!d->m_removingAction) {
289 // remove, then add back in QEvent::ActionRemoved
290 removeAction(d->m_actionAccessPopup);
291 }
292 QuickAccessAction *quickAccessAction = d->findQuickAccessAction(event->action());
293 if (event->action() != d->m_actionAccessPopup && !quickAccessAction) {
294 QuickAccessAction *act = new QuickAccessAction(this, event->action());
295 d->m_actionList.append(act);
296 d->m_customizeGroup->addAction(act);
297 adjustSize();
298 } else if (quickAccessAction) {
299 quickAccessAction->update();
300 }
301 } else if (event->type() == QEvent::ActionRemoved) {
302 if (event->action() == d->m_actionAccessPopup) {
303 d->m_removingAction = true;
304 addAction(d->m_actionAccessPopup);
305 d->m_removingAction = false;
306 } else {
307 if (d->m_takingAction) {
308 d->m_takingAction = false;
309 return;
310 }
311 QuickAccessAction *act = d->findQuickAccessAction(event->action());
312 if (act) {
313 d->m_actionList.removeOne(act);
314 d->m_customizeGroup->removeAction(act);
315 delete act;
316 }
317 }
318 } else if (event->type() == QEvent::ActionChanged) {
319 if (event->action() == d->m_actionAccessPopup) {
320 d->m_accessPopup->setDefaultAction(d->m_actionAccessPopup);
321 } else if (!dynamic_cast<QuickAccessAction *>(event->action())) {
322 d->updateAction(event->action());
323 }
324 }
325 }
326}
327
void setActionVisible(QAction *action, bool visible)
void setActionShown(QuickAccessAction *action, QAction *srcAction, bool visible)
QuickAccessAction * findQuickAccessAction(QAction *action) const
virtual bool event(QEvent *event)
virtual void actionEvent(QActionEvent *event)
void setActionVisible(QAction *action, bool visible)
RibbonQuickAccessBar(QWidget *parent=Q_NULLPTR)
bool isActionVisible(QAction *action) const
void setOrientation(Qt::Orientation orientation)
#define QX_INIT_PRIVATE(Class)
#define Q_NULLPTR
Copyleft (C) 2025 maminjie canpool@163.com SPDX-License-Identifier: MulanPSL-2.0
#define QX_FINI_PRIVATE()
#define QX_RIBBON_END_NAMESPACE
#define QX_RIBBON_BEGIN_NAMESPACE