QtCanpool 3.3.0
载入中...
搜索中...
未找到
ribboncustomizewidget.cpp
浏览该文件的文档.
1
8#include "ribbonbar.h"
10#include "ribbonwindow.h"
11#include "ribbongroup.h"
12#include "ribbongroup_p.h"
13#include "ribbongrouplayout.h"
14
15#include <QAction>
16#include <QButtonGroup>
17#include <QDateTime>
18#include <QDebug>
19#include <QFile>
20#include <QInputDialog>
21#include <QLineEdit>
22#include <QMessageBox>
23#include <QStandardItemModel>
24#include <QXmlStreamReader>
25#include <QXmlStreamWriter>
26#include <QtCore/QVariant>
27#include <QtWidgets/QApplication>
28#include <QtWidgets/QButtonGroup>
29#include <QtWidgets/QComboBox>
30#include <QtWidgets/QHBoxLayout>
31#include <QtWidgets/QHeaderView>
32#include <QtWidgets/QLabel>
33#include <QtWidgets/QLineEdit>
34#include <QtWidgets/QListView>
35#include <QtWidgets/QPushButton>
36#include <QtWidgets/QRadioButton>
37#include <QtWidgets/QSpacerItem>
38#include <QtWidgets/QTreeView>
39#include <QtWidgets/QVBoxLayout>
40#include <QtWidgets/QWidget>
41
43
44bool QxRibbonCustomizeDataSetToXml(QXmlStreamWriter *xml, const QList<RibbonCustomizeData> &cds, bool force = false)
45{
46 // 如果xml中之前记录了添加页的定制数据,当再次删除该页时,经过simplify后,cds被抵消为空
47 // 此时如果因为cds为空不写,那么xml中始终保留一份添加的定制数据,所以增加force参数,当cds为空,old数据非空时,应该强制写
48 if (cds.size() == 0 && !force) {
49 return false;
50 }
51
52 xml->writeStartElement("qx-ribbon-customize");
53 for (const RibbonCustomizeData &d : cds) {
54 xml->writeStartElement("customize-data");
55 xml->writeAttribute("type", QString::number(d.actionType()));
56 xml->writeAttribute("index", QString::number(d.indexValue));
57 xml->writeAttribute("key", d.keyValue);
58 xml->writeAttribute("page", d.pageObjNameValue);
59 xml->writeAttribute("group", d.groupObjNameValue);
60 xml->writeAttribute("row-prop", QString::number(d.actionRowProportionValue));
61
62 xml->writeEndElement();
63 }
64 xml->writeEndElement();
65 if (xml->hasError()) {
66 qWarning() << "write has error";
67 }
68 return true;
69}
70
71QList<RibbonCustomizeData> QxRibbonCustomizeDataGetFromXml(QXmlStreamReader *xml, RibbonActionsManager *mgr)
72{
73 // 先找到"qx-ribbon-customize"
74 while (!xml->atEnd()) {
75#ifdef QX_RIBBON_DEBUG
76 qDebug() << "name:" << xml->name() << " qualifiedName:" << xml->qualifiedName();
77#endif
78 if (xml->isStartElement() && (xml->name().toString() == "qx-ribbon-customize")) {
79 break;
80 }
81 xml->readNext();
82 }
83 QList<RibbonCustomizeData> res;
84
85 // 开始遍历"customize-data"
86 while (!xml->atEnd()) {
87 if (xml->isStartElement() && (xml->name().toString() == "customize-data")) {
88 // 首先读取属性type
90 QXmlStreamAttributes attrs = xml->attributes();
91 if (!attrs.hasAttribute("type")) {
92 // 说明异常,跳过这个
93 xml->readNextStartElement();
94 continue;
95 }
96 bool isOk = false;
97 int v = xml->attributes().value("type").toInt(&isOk);
98 if (!isOk) {
99 // 说明异常,跳过这个
100 xml->readNextStartElement();
101 continue;
102 }
104 // 开始读取子对象
105 if (attrs.hasAttribute("index")) {
106 v = xml->attributes().value("index").toInt(&isOk);
107 if (isOk) {
108 data.indexValue = v;
109 }
110 }
111 if (attrs.hasAttribute("key")) {
112 data.keyValue = attrs.value("key").toString();
113 }
114 if (attrs.hasAttribute("page")) {
115 data.pageObjNameValue = attrs.value("page").toString();
116 }
117 if (attrs.hasAttribute("group")) {
118 data.groupObjNameValue = attrs.value("group").toString();
119 }
120 if (attrs.hasAttribute("row-prop")) {
121 v = xml->attributes().value("row-prop").toInt(&isOk);
122 if (isOk) {
124 }
125 }
126 data.setActionsManager(mgr);
127 res.append(data);
128 }
129 xml->readNext();
130 }
131 if (xml->hasError()) {
132 qWarning() << xml->errorString();
133 }
134 return res;
135}
136
137int QxRibbonCustomizeDataApply(QList<RibbonCustomizeData> &cds, RibbonBar *bar)
138{
139 int c = 0;
140
141 for (RibbonCustomizeData &d : cds) {
142 if (d.apply(bar)) {
143 ++c;
144 }
145 }
146 return c;
147}
148
152class RibbonCustomizeWidgetUi
153{
154public:
155 QHBoxLayout *horizontalLayoutMain;
156 QVBoxLayout *verticalLayoutSelect;
157 QLabel *labelSelectAction;
158 QHBoxLayout *horizontalLayoutSearch;
159 QComboBox *comboBoxActionIndex;
160 QLineEdit *lineEditSearchAction;
161 QListView *listViewSelect;
162 QVBoxLayout *verticalLayoutMidButtons;
163 QSpacerItem *verticalSpacerUp;
164 QPushButton *pushButtonAdd;
165 QPushButton *pushButtonDelete;
166 QPushButton *pushButtonReset;
167 QSpacerItem *verticalSpacerDown;
168 QLabel *labelProportion;
169 QComboBox *comboBoxActionProportion;
170 QVBoxLayout *verticalLayoutResult;
171 QLabel *labelCustomize;
172 QHBoxLayout *horizontalLayoutPageSelect;
173 QRadioButton *radioButtonMainPage;
174 QRadioButton *radioButtonAllPage;
175 QButtonGroup *radioButtonGroup;
176 QTreeView *treeViewResult;
177 QHBoxLayout *horizontalLayoutActionOptBtns;
178 QPushButton *pushButtonNewPage;
179 QPushButton *pushButtonNewGroup;
180 QPushButton *pushButtonRename;
181 QVBoxLayout *verticalLayoutRightButtons;
182 QSpacerItem *verticalSpacerUp2;
183 QToolButton *toolButtonUp;
184 QToolButton *toolButtonDown;
185 QSpacerItem *verticalSpacerDown2;
186
187 void setupUi(QWidget *customizeWidget)
188 {
189 if (customizeWidget->objectName().isEmpty()) {
190 customizeWidget->setObjectName(QStringLiteral("RibbonCustomizeWidget"));
191 }
192 customizeWidget->resize(800, 600);
193 horizontalLayoutMain = new QHBoxLayout(customizeWidget);
194 horizontalLayoutMain->setContentsMargins(0, 0, 0, 0);
195 horizontalLayoutMain->setObjectName(QStringLiteral("horizontalLayoutMain"));
196 verticalLayoutSelect = new QVBoxLayout();
197 verticalLayoutSelect->setObjectName(QStringLiteral("verticalLayoutSelect"));
198 labelSelectAction = new QLabel(customizeWidget);
199 labelSelectAction->setObjectName(QStringLiteral("labelSelectAction"));
200
201 verticalLayoutSelect->addWidget(labelSelectAction);
202
203 horizontalLayoutSearch = new QHBoxLayout();
204 horizontalLayoutSearch->setObjectName(QStringLiteral("horizontalLayoutSearch"));
205 comboBoxActionIndex = new QComboBox(customizeWidget);
206 comboBoxActionIndex->setObjectName(QStringLiteral("comboBoxActionIndex"));
207 comboBoxActionIndex->setEditable(false);
208
209 horizontalLayoutSearch->addWidget(comboBoxActionIndex);
210
211 lineEditSearchAction = new QLineEdit(customizeWidget);
212 lineEditSearchAction->setObjectName(QStringLiteral("lineEditSearchAction"));
213
214 horizontalLayoutSearch->addWidget(lineEditSearchAction);
215
216 verticalLayoutSelect->addLayout(horizontalLayoutSearch);
217
218 listViewSelect = new QListView(customizeWidget);
219 listViewSelect->setObjectName(QStringLiteral("listViewSelect"));
220
221 verticalLayoutSelect->addWidget(listViewSelect);
222
223 horizontalLayoutMain->addLayout(verticalLayoutSelect);
224
225 verticalLayoutMidButtons = new QVBoxLayout();
226 verticalLayoutMidButtons->setObjectName(QStringLiteral("verticalLayoutMidButtons"));
227 verticalSpacerUp = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding);
228
229 verticalLayoutMidButtons->addItem(verticalSpacerUp);
230
231 pushButtonAdd = new QPushButton(customizeWidget);
232 pushButtonAdd->setObjectName(QStringLiteral("pushButtonAdd"));
233 pushButtonAdd->setEnabled(false);
234
235 verticalLayoutMidButtons->addWidget(pushButtonAdd);
236
237 pushButtonDelete = new QPushButton(customizeWidget);
238 pushButtonDelete->setObjectName(QStringLiteral("pushButtonDelete"));
239 pushButtonDelete->setEnabled(false);
240
241 verticalLayoutMidButtons->addWidget(pushButtonDelete);
242
243 verticalSpacerDown = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding);
244
245 verticalLayoutMidButtons->addItem(verticalSpacerDown);
246
247 labelProportion = new QLabel(customizeWidget);
248 labelProportion->setObjectName(QStringLiteral("labelProportion"));
249 verticalLayoutMidButtons->addWidget(labelProportion);
250
251 comboBoxActionProportion = new QComboBox(customizeWidget);
252 comboBoxActionProportion->setObjectName(QStringLiteral("comboBoxActionProportion"));
253 comboBoxActionProportion->setEditable(false);
254 verticalLayoutMidButtons->addWidget(comboBoxActionProportion);
255 horizontalLayoutMain->addLayout(verticalLayoutMidButtons);
256
257 verticalLayoutResult = new QVBoxLayout();
258 verticalLayoutResult->setObjectName(QStringLiteral("verticalLayoutResult"));
259 labelCustomize = new QLabel(customizeWidget);
260 labelCustomize->setObjectName(QStringLiteral("labelCustomize"));
261
262 verticalLayoutResult->addWidget(labelCustomize);
263
264 horizontalLayoutPageSelect = new QHBoxLayout();
265 horizontalLayoutPageSelect->setObjectName(QStringLiteral("horizontalLayoutPageSelect"));
266 radioButtonMainPage = new QRadioButton(customizeWidget);
267 radioButtonMainPage->setObjectName(QStringLiteral("radioButtonMainPage"));
268 radioButtonMainPage->setChecked(false);
269
270 horizontalLayoutPageSelect->addWidget(radioButtonMainPage);
271
272 radioButtonAllPage = new QRadioButton(customizeWidget);
273 radioButtonAllPage->setObjectName(QStringLiteral("radioButtonAllPage"));
274 radioButtonAllPage->setChecked(true);
275
276 horizontalLayoutPageSelect->addWidget(radioButtonAllPage);
277
278 radioButtonGroup = new QButtonGroup(customizeWidget);
279 radioButtonGroup->addButton(radioButtonMainPage);
280 radioButtonGroup->addButton(radioButtonAllPage);
281
282 verticalLayoutResult->addLayout(horizontalLayoutPageSelect);
283
284 treeViewResult = new QTreeView(customizeWidget);
285 treeViewResult->setObjectName(QStringLiteral("treeViewResult"));
286 treeViewResult->setHeaderHidden(true);
287 treeViewResult->setSelectionMode(QAbstractItemView::SingleSelection);
288 treeViewResult->setAnimated(true); // 支持动画
289 treeViewResult->setEditTriggers(QAbstractItemView::NoEditTriggers); // 不允许直接在item上重命名
290
291 verticalLayoutResult->addWidget(treeViewResult);
292
293 horizontalLayoutActionOptBtns = new QHBoxLayout();
294 horizontalLayoutActionOptBtns->setObjectName(QStringLiteral("horizontalLayoutActionOptBtns"));
295 pushButtonNewPage = new QPushButton(customizeWidget);
296 pushButtonNewPage->setObjectName(QStringLiteral("pushButtonNewPage"));
297
298 horizontalLayoutActionOptBtns->addWidget(pushButtonNewPage);
299
300 pushButtonNewGroup = new QPushButton(customizeWidget);
301 pushButtonNewGroup->setObjectName(QStringLiteral("pushButtonNewGroup"));
302 pushButtonNewGroup->setEnabled(false);
303
304 horizontalLayoutActionOptBtns->addWidget(pushButtonNewGroup);
305
306 pushButtonRename = new QPushButton(customizeWidget);
307 pushButtonRename->setObjectName(QStringLiteral("pushButtonRename"));
308 pushButtonRename->setEnabled(false);
309
310 horizontalLayoutActionOptBtns->addWidget(pushButtonRename);
311
312 pushButtonReset = new QPushButton(customizeWidget);
313 pushButtonReset->setObjectName(QStringLiteral("pushButtonReset"));
314 horizontalLayoutActionOptBtns->addWidget(pushButtonReset);
315
316 verticalLayoutResult->addLayout(horizontalLayoutActionOptBtns);
317
318 horizontalLayoutMain->addLayout(verticalLayoutResult);
319
320 verticalLayoutRightButtons = new QVBoxLayout();
321 verticalLayoutRightButtons->setObjectName(QStringLiteral("verticalLayoutRightButtons"));
322 verticalSpacerUp2 = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding);
323
324 verticalLayoutRightButtons->addItem(verticalSpacerUp2);
325
326 toolButtonUp = new QToolButton(customizeWidget);
327 toolButtonUp->setObjectName(QStringLiteral("pushButtonUp"));
328 toolButtonUp->setArrowType(Qt::UpArrow);
329 toolButtonUp->setAutoRaise(true);
330 toolButtonUp->setEnabled(false);
331
332 verticalLayoutRightButtons->addWidget(toolButtonUp);
333
334 toolButtonDown = new QToolButton(customizeWidget);
335 toolButtonDown->setObjectName(QStringLiteral("pushButtonDown"));
336 toolButtonDown->setArrowType(Qt::DownArrow);
337 toolButtonDown->setAutoRaise(true);
338 toolButtonDown->setEnabled(false);
339
340 verticalLayoutRightButtons->addWidget(toolButtonDown);
341
342 verticalSpacerDown2 = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding);
343
344 verticalLayoutRightButtons->addItem(verticalSpacerDown2);
345
346 horizontalLayoutMain->addLayout(verticalLayoutRightButtons);
347
348 retranslateUi(customizeWidget);
349 } // setupUi
350
351 void retranslateUi(QWidget *customizeWidget)
352 {
353 customizeWidget->setWindowTitle(
354 QApplication::translate("RibbonCustomizeWidget", "Customize Widget", Q_NULLPTR));
355 labelSelectAction->setText(
356 QApplication::translate("RibbonCustomizeWidget", "Please Select", Q_NULLPTR)); // cn:请选择
357 lineEditSearchAction->setInputMask(QString());
358 lineEditSearchAction->setText(QString());
359 lineEditSearchAction->setPlaceholderText(
360 QApplication::translate("RibbonCustomizeWidget", "Find Command", Q_NULLPTR)); // cn:查找命令
361 pushButtonAdd->setText(QApplication::translate("RibbonCustomizeWidget", "Add >>", Q_NULLPTR)); // cn:添加 >>
362 pushButtonDelete->setText(
363 QApplication::translate("RibbonCustomizeWidget", "<< Remove", Q_NULLPTR)); // cn:<< 移除
364 labelCustomize->setText(
365 QApplication::translate("RibbonCustomizeWidget", "Customize the Ribbon", Q_NULLPTR)); // cn:自定义功能区
366 radioButtonMainPage->setText(
367 QApplication::translate("RibbonCustomizeWidget", "Main Page", Q_NULLPTR)); // cn:主要页
368 radioButtonAllPage->setText(
369 QApplication::translate("RibbonCustomizeWidget", "All Page", Q_NULLPTR)); // cn:所有页
370 pushButtonNewPage->setText(
371 QApplication::translate("RibbonCustomizeWidget", "New Page", Q_NULLPTR)); // cn:新建页
372 pushButtonNewGroup->setText(
373 QApplication::translate("RibbonCustomizeWidget", "New Group", Q_NULLPTR)); // cn:新建组
374 pushButtonRename->setText(QApplication::translate("RibbonCustomizeWidget", "Rename", Q_NULLPTR)); // cn:重命名
375 pushButtonReset->setText(QApplication::translate("RibbonCustomizeWidget", "reset", Q_NULLPTR)); // cn:重置
376 labelProportion->setText(
377 QApplication::translate("RibbonCustomizeWidget", "proportion:", Q_NULLPTR)); // cn:比例
378 } // retranslateUi
379};
380
384class RibbonCustomizeWidgetPrivate
385{
386public:
387 RibbonCustomizeWidgetPrivate(RibbonCustomizeWidget *p);
388
389 void updateModel();
390
391 // 创建一个随机id,形如:pre_QDateTime::currentMSecsSinceEpoch_suf
392 static QString makeRandomObjName(const QString &pre);
393
394 int itemLevel(QStandardItem *item) const;
395
396 bool isCustomizeItem(QStandardItem *item) const;
397
398 // 把item转换为page
399 RibbonPage *itemToPage(QStandardItem *item) const;
400
401 // 把item转换为RibbonGroup
402 RibbonGroup *itemToGroup(QStandardItem *item) const;
403
404 // 获取item对应的object name
405 QString itemObjectName(QStandardItem *item) const;
406
407 // 判断是否可以自定义
408 bool isItemCanCustomize(QStandardItem *item) const;
409
410 // 从item转为action
411 QAction *itemToAction(QStandardItem *item) const;
412public:
413 RibbonCustomizeWidget *q;
414 RibbonCustomizeWidget::RibbonTreeShowType m_showType;
415 RibbonBar *m_ribbonBar;
416 RibbonActionsManager *m_actionMgr;
417 RibbonActionsManagerModel *m_acionModel;
418 QStandardItemModel *m_ribbonModel;
419 int m_customizePageCount;
420 int m_customizeGroupCount;
421
422 QList<RibbonCustomizeData> m_customizeDatas;
423 QList<RibbonCustomizeData> m_oldCustomizeDatas;
424};
425
426RibbonCustomizeWidgetPrivate::RibbonCustomizeWidgetPrivate(RibbonCustomizeWidget *p)
427 : q(p)
428 , m_showType(RibbonCustomizeWidget::ShowAllPage)
429 , m_ribbonBar(Q_NULLPTR)
430 , m_actionMgr(Q_NULLPTR)
431 , m_acionModel(new RibbonActionsManagerModel(p))
432 , m_ribbonModel(new QStandardItemModel(p))
433 , m_customizePageCount(0)
434 , m_customizeGroupCount(0)
435{
436}
437
438void RibbonCustomizeWidgetPrivate::updateModel()
439{
440 if (m_ribbonBar == Q_NULLPTR) {
441 return;
442 }
443 m_ribbonModel->clear();
444 RibbonBar *ribbonbar = m_ribbonBar;
445 QList<RibbonPage *> pages = ribbonbar->pages();
446
447 for (RibbonPage *page : std::as_const(pages)) {
448 if ((m_showType == RibbonCustomizeWidget::ShowMainPage) && page->isPageContext()) {
449 // 如果是只显示主内容,如果是上下文标签就忽略
450 continue;
451 }
452 if (page->objectName().isEmpty()) {
453 continue;
454 }
455 QStandardItem *pageSI = new QStandardItem();
456 if (page->isPageContext()) {
457 pageSI->setText(QString("[%1]").arg(page->windowTitle()));
458 } else {
459 pageSI->setText(page->windowTitle());
460 }
461 if (page->isCanCustomize() && !page->isPageContext()) {
462 // 上下文标签不做显示隐藏处理
463 pageSI->setCheckable(true);
464 pageSI->setCheckState(ribbonbar->isPageVisible(page) ? Qt::Checked : Qt::Unchecked);
465 pageSI->setData(true, RibbonCustomizeWidget::CanCustomizeRole); // 标记这个是可以自定义的
466 }
467 pageSI->setData(0, RibbonCustomizeWidget::LevelRole);
468 pageSI->setData(QVariant::fromValue<qintptr>(qintptr(page)), RibbonCustomizeWidget::PointerRole);
469 QList<RibbonGroup *> groups = page->groupList();
470 for (RibbonGroup *grp : std::as_const(groups)) {
471 if (grp->objectName().isEmpty()) {
472 continue;
473 }
474 QStandardItem *grpSI = new QStandardItem(grp->windowTitle());
475 grpSI->setData(1, RibbonCustomizeWidget::LevelRole);
476 grpSI->setData(QVariant::fromValue<qintptr>(qintptr(grp)), RibbonCustomizeWidget::PointerRole);
477 if (grp->isCanCustomize()) {
478 grpSI->setData(true, RibbonCustomizeWidget::CanCustomizeRole); // 标记这个是可以自定义的
479 }
480 pageSI->appendRow(grpSI);
481 const QList<RibbonGroupItem *> &goupItems = grp->d_ptr->ribbonGroupItems();
482 for (RibbonGroupItem *grpItem : goupItems) {
483 if (grpItem->action->isSeparator()) {
484 continue;
485 }
486 QStandardItem *stdItem = new QStandardItem();
487 if (grpItem->customWidget) {
488 // 如果是自定义窗口
489 if (grpItem->widget()->windowTitle().isEmpty() /* && grpItem->widget()->windowIcon().isNull()*/) {
490 delete stdItem;
491 continue; // 如果窗口啥也没有,就跳过
492 }
493 stdItem->setText(grpItem->widget()->windowTitle());
494 stdItem->setIcon(grpItem->widget()->windowIcon());
495 if (RibbonCustomizeData::isCanCustomize(grpItem->widget())) {
496 stdItem->setData(true, RibbonCustomizeWidget::CanCustomizeRole); // 标记这个是可以自定义的
497 }
498 } else {
499 // 不是自定义,说明是action
500 stdItem->setText(grpItem->action->text());
501 stdItem->setIcon(grpItem->action->icon());
502 if (RibbonCustomizeData::isCanCustomize(grpItem->action)) {
503 stdItem->setData(true, RibbonCustomizeWidget::CanCustomizeRole); // 标记这个是可以自定义的
504 }
505 }
506 stdItem->setData(2, RibbonCustomizeWidget::LevelRole);
507 stdItem->setData(QVariant::fromValue<qintptr>(qintptr(grpItem)), RibbonCustomizeWidget::PointerRole);
508 grpSI->appendRow(stdItem);
509 }
510 }
511 m_ribbonModel->appendRow(pageSI);
512 }
513}
514
520QString RibbonCustomizeWidgetPrivate::makeRandomObjName(const QString &pre)
521{
522 return QString("%1_%2").arg(pre).arg(QDateTime::currentMSecsSinceEpoch());
523}
524
530int RibbonCustomizeWidgetPrivate::itemLevel(QStandardItem *item) const
531{
532 return item->data(RibbonCustomizeWidget::LevelRole).toInt();
533}
534
540bool RibbonCustomizeWidgetPrivate::isCustomizeItem(QStandardItem *item) const
541{
542 if (Q_NULLPTR == item) {
543 return false;
544 }
545 return item->data(RibbonCustomizeWidget::CustomizeRole).isValid();
546}
547
553RibbonPage *RibbonCustomizeWidgetPrivate::itemToPage(QStandardItem *item) const
554{
555 int level = item->data(RibbonCustomizeWidget::LevelRole).toInt();
556
557 if (level != 0) {
558 return Q_NULLPTR;
559 }
560 qintptr p = item->data(RibbonCustomizeWidget::PointerRole).value<qintptr>();
561
562 return reinterpret_cast<RibbonPage *>(p);
563}
564
570RibbonGroup *RibbonCustomizeWidgetPrivate::itemToGroup(QStandardItem *item) const
571{
572 int level = item->data(RibbonCustomizeWidget::LevelRole).toInt();
573
574 if (level != 1) {
575 return Q_NULLPTR;
576 }
577 qintptr p = item->data(RibbonCustomizeWidget::PointerRole).value<qintptr>();
578
579 return reinterpret_cast<RibbonGroup *>(p);
580}
581
587QString RibbonCustomizeWidgetPrivate::itemObjectName(QStandardItem *item) const
588{
589 QString objName;
590
591 if (isCustomizeItem(item)) {
592 // 说明是自定义的
593 objName = item->data(RibbonCustomizeWidget::CustomizeObjNameRole).toString();
594 } else {
595 // 说明这个是非自定义的
596 int level = itemLevel(item);
597 if (0 == level) {
598 RibbonPage *page = itemToPage(item);
599 if (page) {
600 objName = page->objectName();
601 }
602 } else if (1 == level) {
603 RibbonGroup *group = itemToGroup(item);
604 if (group) {
605 objName = group->objectName();
606 }
607 }
608 }
609 return objName;
610}
611
617bool RibbonCustomizeWidgetPrivate::isItemCanCustomize(QStandardItem *item) const
618{
619 if (Q_NULLPTR == item) {
620 return false;
621 }
622 QVariant v = item->data(RibbonCustomizeWidget::CanCustomizeRole);
623
624 if (v.isValid()) {
625 return v.toBool();
626 }
627 return false;
628}
629
635QAction *RibbonCustomizeWidgetPrivate::itemToAction(QStandardItem *item) const
636{
637 if (2 != itemLevel(item)) {
638 return Q_NULLPTR;
639 }
640 // 这里要非常注意,RibbonCustomizeWidget::CustomizeRole为true时,说明这个是自定义的内容,
641 // 这时PointerRole里存放的是action指针,不是RibbonGroupItem
642 QAction *act = Q_NULLPTR;
643 if (item->data(RibbonCustomizeWidget::CustomizeRole).toBool()) {
644 act = reinterpret_cast<QAction *>(item->data(RibbonCustomizeWidget::PointerRole).value<qintptr>());
645 } else {
646 RibbonGroupItem *grpItem =
647 reinterpret_cast<RibbonGroupItem *>(item->data(RibbonCustomizeWidget::PointerRole).value<qintptr>());
648 if (grpItem) {
649 act = grpItem->action;
650 }
651 }
652 return act;
653}
654
661RibbonCustomizeWidget::RibbonCustomizeWidget(RibbonBar *ribbonBar, QWidget *parent, Qt::WindowFlags f)
662 : QWidget(parent, f)
663 , ui(new RibbonCustomizeWidgetUi)
664 , d(new RibbonCustomizeWidgetPrivate(this))
665{
666 d->m_ribbonBar = ribbonBar;
667
668 ui->setupUi(this);
669 ui->listViewSelect->setModel(d->m_acionModel);
670 ui->treeViewResult->setModel(d->m_ribbonModel);
671 initConnection();
672 updateModel();
673}
674
676{
677 delete ui;
678 delete d;
679}
680
681void RibbonCustomizeWidget::initConnection()
682{
683#if QT_VERSION >= QT_VERSION_CHECK(5, 7, 0)
684 connect(ui->comboBoxActionIndex, QOverload<int>::of(&QComboBox::currentIndexChanged), this,
686 connect(ui->radioButtonGroup, QOverload<QAbstractButton *>::of(&QButtonGroup::buttonClicked), this,
688#else
689 connect(ui->comboBoxActionIndex, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this,
691 connect(ui->radioButtonGroup, static_cast<void (QButtonGroup::*)(QAbstractButton *)>(&QButtonGroup::buttonClicked),
693#endif
694 connect(ui->pushButtonNewPage, &QPushButton::clicked, this, &RibbonCustomizeWidget::onPushButtonNewPageClicked);
695 connect(ui->pushButtonNewGroup, &QPushButton::clicked, this, &RibbonCustomizeWidget::onPushButtonNewGroupClicked);
696 connect(ui->pushButtonRename, &QPushButton::clicked, this, &RibbonCustomizeWidget::onPushButtonRenameClicked);
697 connect(ui->pushButtonAdd, &QPushButton::clicked, this, &RibbonCustomizeWidget::onPushButtonAddClicked);
698 connect(ui->pushButtonDelete, &QPushButton::clicked, this, &RibbonCustomizeWidget::onPushButtonDeleteClicked);
699 connect(ui->listViewSelect, &QAbstractItemView::clicked, this, &RibbonCustomizeWidget::onListViewSelectClicked);
700 connect(ui->treeViewResult, &QAbstractItemView::clicked, this, &RibbonCustomizeWidget::onTreeViewResultClicked);
701 connect(ui->toolButtonUp, &QToolButton::clicked, this, &RibbonCustomizeWidget::onToolButtonUpClicked);
702 connect(ui->toolButtonDown, &QToolButton::clicked, this, &RibbonCustomizeWidget::onToolButtonDownClicked);
703 connect(d->m_ribbonModel, &QStandardItemModel::itemChanged, this, &RibbonCustomizeWidget::onItemChanged);
704 connect(ui->lineEditSearchAction, &QLineEdit::textEdited, this,
706 connect(ui->pushButtonReset, &QPushButton::clicked, this, &RibbonCustomizeWidget::onPushButtonResetClicked);
707}
708
714{
715 if (mgr == Q_NULLPTR) {
716 return;
717 }
718 if (d->m_actionMgr) {
719 d->m_acionModel->uninstallActionsManager();
720 }
721 d->m_actionMgr = mgr;
722 d->m_acionModel->setupActionsManager(mgr);
723 // 更新左边复选框
724 ui->comboBoxActionIndex->clear();
725 const QList<int> tags = mgr->actionTags();
726 for (int tag : tags) {
727 ui->comboBoxActionIndex->addItem(mgr->tagName(tag), tag);
728 }
729}
730
732{
733 return (d->m_customizeDatas.size() > 0);
734}
735
740const QStandardItemModel *RibbonCustomizeWidget::model() const
741{
742 return d->m_ribbonModel;
743}
744
749{
750 updateModel(ui->radioButtonAllPage->isChecked() ? ShowAllPage : ShowMainPage);
751 if (d->m_ribbonBar) {
752 ui->comboBoxActionProportion->clear();
753 if (d->m_ribbonBar->isTwoRowStyle()) {
754 ui->comboBoxActionProportion->addItem(tr("large"), RibbonGroup::Large);
755 ui->comboBoxActionProportion->addItem(tr("small"), RibbonGroup::Small);
756 } else {
757 ui->comboBoxActionProportion->addItem(tr("large"), RibbonGroup::Large);
758 ui->comboBoxActionProportion->addItem(tr("medium"), RibbonGroup::Medium);
759 ui->comboBoxActionProportion->addItem(tr("small"), RibbonGroup::Small);
760 }
761 }
762}
763
768{
769 d->m_showType = type;
770 d->updateModel();
771}
772
788{
789 int res = QxRibbonCustomizeDataApply(d->m_customizeDatas, d->m_ribbonBar);
790 simplify();
791 return (res > 0);
792}
793
832bool RibbonCustomizeWidget::toXml(QXmlStreamWriter *xml) const
833{
834 QList<RibbonCustomizeData> res;
835
836 res = d->m_oldCustomizeDatas + d->m_customizeDatas;
838 return QxRibbonCustomizeDataSetToXml(xml, res, d->m_oldCustomizeDatas.count() > 0);
839}
840
846bool RibbonCustomizeWidget::toXml(const QString &xmlpath) const
847{
848 QFile f(xmlpath);
849 if (!f.open(QIODevice::ReadWrite | QIODevice::Truncate | QIODevice::Text)) {
850 return false;
851 }
852
853 QXmlStreamWriter xml(&f);
854 xml.setAutoFormatting(true);
855 xml.setAutoFormattingIndent(2);
856#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) // QXmlStreamWriter always encodes XML in UTF-8.
857 xml.setCodec("utf-8"); // 在writeStartDocument之前指定编码
858#endif
859 xml.writeStartDocument();
860 bool isOK = toXml(&xml);
861 xml.writeEndDocument();
862
863 f.close();
864 return isOK;
865}
866
874void RibbonCustomizeWidget::fromXml(QXmlStreamReader *xml)
875{
876 QList<RibbonCustomizeData> cds = QxRibbonCustomizeDataGetFromXml(xml, d->m_actionMgr);
877 d->m_oldCustomizeDatas = cds;
878}
879
889void RibbonCustomizeWidget::fromXml(const QString &xmlpath)
890{
891 QFile f(xmlpath);
892
893 if (!f.open(QIODevice::ReadOnly | QIODevice::Text)) {
894 return;
895 }
896 f.seek(0);
897 QXmlStreamReader xml(&f);
898
899 fromXml(&xml);
900}
901
925bool RibbonCustomizeWidget::fromXml(QXmlStreamReader *xml, RibbonBar *bar, RibbonActionsManager *mgr)
926{
927 QList<RibbonCustomizeData> cds = QxRibbonCustomizeDataGetFromXml(xml, mgr);
928 return (QxRibbonCustomizeDataApply(cds, bar) > 0);
929}
930
937{
938 d->m_customizeDatas.clear();
939}
940
945{
946 d->m_customizeDatas = RibbonCustomizeData::simplify(d->m_customizeDatas);
947}
948
954{
955 return static_cast<RibbonGroup::RowProportion>(ui->comboBoxActionProportion->currentData().toInt());
956}
957
964{
965 QItemSelectionModel *m = ui->listViewSelect->selectionModel();
966
967 if ((Q_NULLPTR == m) || !m->hasSelection()) {
968 return Q_NULLPTR;
969 }
970 QModelIndex i = m->currentIndex();
971
972 return d->m_acionModel->indexToAction(i);
973}
974
980QAction *RibbonCustomizeWidget::itemToAction(QStandardItem *item) const
981{
982 return d->itemToAction(item);
983}
984
990{
991 QItemSelectionModel *m = ui->treeViewResult->selectionModel();
992
993 if ((Q_NULLPTR == m) || !m->hasSelection()) {
994 return Q_NULLPTR;
995 }
996 QModelIndex i = m->currentIndex();
997
998 return d->m_ribbonModel->itemFromIndex(i);
999}
1000
1006{
1007 QStandardItem *item = selectedItem();
1008
1009 if (item) {
1010 return itemLevel(item);
1011 }
1012 return -1;
1013}
1014
1020int RibbonCustomizeWidget::itemLevel(QStandardItem *item) const
1021{
1022 return d->itemLevel(item);
1023}
1024
1030void RibbonCustomizeWidget::setSelectItem(QStandardItem *item, bool ensureVisible)
1031{
1032 QItemSelectionModel *m = ui->treeViewResult->selectionModel();
1033 if (Q_NULLPTR == m) {
1034 return;
1035 }
1036
1037 m->clearSelection();
1038 // 如果用select,看起来选中了,但是itemFromIndex却返回空
1039 // 比如:新建一个页,接着新建一个组,onPushButtonNewGroupClicked中的selectedItem返回空,导致无法新建组。
1040 // 备注:命令用SelectCurrent也没有用
1041 // m->select(item->index(), QItemSelectionModel::Select);
1042 m->setCurrentIndex(item->index(), QItemSelectionModel::Select);
1043
1044 if (ensureVisible) {
1045 ui->treeViewResult->scrollTo(item->index());
1046 }
1047}
1048
1054bool RibbonCustomizeWidget::isItemCanCustomize(QStandardItem *item) const
1055{
1056 return d->isItemCanCustomize(item);
1057}
1058
1063
1069bool RibbonCustomizeWidget::isCustomizeItem(QStandardItem *item) const
1070{
1071 return d->isCustomizeItem(item);
1072}
1073
1078
1079void RibbonCustomizeWidget::removeItem(QStandardItem *item)
1080{
1081 if (item->parent()) {
1082 item->parent()->removeRow(item->row());
1083 } else {
1084 d->m_ribbonModel->removeRow(item->row());
1085 }
1086}
1087
1089{
1090 int tag = ui->comboBoxActionIndex->itemData(index).toInt();
1091
1092 d->m_acionModel->setFilter(tag);
1093}
1094
1096{
1097 updateModel(b == ui->radioButtonAllPage ? ShowAllPage : ShowMainPage);
1098}
1099
1101{
1102 int row = d->m_ribbonModel->rowCount();
1103 QItemSelectionModel *m = ui->treeViewResult->selectionModel();
1104
1105 if (m && m->hasSelection()) {
1106 QModelIndex i = m->currentIndex();
1107 while (i.parent().isValid()) {
1108 i = i.parent();
1109 }
1110 // 获取选中的最顶层item
1111 row = i.row() + 1;
1112 }
1113 QStandardItem *ni = new QStandardItem(tr("new page[customize]%1").arg(++(d->m_customizePageCount)));
1114
1115 ni->setData(0, RibbonCustomizeWidget::LevelRole);
1116 d->m_ribbonModel->insertRow(row, ni);
1117 // 设置新增的为选中
1118 setSelectItem(ni);
1119 // 把动作插入动作列表中
1121 ni->text(), ni->row(), RibbonCustomizeWidgetPrivate::makeRandomObjName("page"));
1122
1123 // FIXME: 操作数据无缓冲,导致操作无法废弃,且缺少apply按钮(当前设计,添加按钮意义并不大)
1124 // DO: RibbonCustomizeWidget 不再对外提供,而是通过 RibbonCustomizeDialog 进行定制,
1125 // 如果不应用定制数据,数据会随着 RibbonCustomizeDialog 销毁而废弃,所以不需要再增加缓冲
1126 d->m_customizeDatas.append(data);
1127 ni->setData(true, RibbonCustomizeWidget::CanCustomizeRole); // 有CustomizeRole,必有CanCustomizeRole
1128 ni->setData(true, RibbonCustomizeWidget::CustomizeRole);
1130}
1131
1133{
1134 QStandardItem *item = selectedItem();
1135
1136 if (Q_NULLPTR == item) {
1137 return;
1138 }
1139 int level = selectedRibbonLevel();
1140
1141 QStandardItem *ni = new QStandardItem(tr("new group[customize]%1").arg(++(d->m_customizeGroupCount)));
1142
1143 ni->setData(1, RibbonCustomizeWidget::LevelRole);
1144
1145 if (0 == level) {
1146 // 说明是page,插入到最后
1147 item->appendRow(ni);
1148 } else if (1 == level) {
1149 // 说明选择的是group,插入到此group之后
1150 QStandardItem *pageItem = item->parent();
1151 if (Q_NULLPTR == pageItem) {
1152 return;
1153 }
1154 pageItem->insertRow(item->row() + 1, ni);
1155 } else {
1156 // 不符合就删除退出
1157 delete ni;
1158 ni = Q_NULLPTR;
1159 return;
1160 }
1161 // 查找page的object name
1162 QStandardItem *pageItem = ni->parent();
1163 QString pageObjName = "";
1164
1165 pageObjName = d->itemObjectName(pageItem);
1167 ni->text(), ni->row(), pageObjName, RibbonCustomizeWidgetPrivate::makeRandomObjName("group"));
1168
1169 // FIXME:如果有多个page的pageObjName都为空,比如:page1、page2,当分别为page1,page2添加组后,最后apply时,由于两个
1170 // pageObjName都为空,所以pageByObjectName都会返回第一个page,即page1。
1171 // 也就是说操作的时候是在两个page上,但是最终只会显示在第一个page上。
1172 // TODO:
1173 // 方案1,为每个page设置objectName,如果objectName不唯一,也会存在显示在第一个page上
1174 // 方案2,不允许操作objectName为空的page(采用)
1175 // 方案3,为每个page分配一个唯一的id,使用id来代替objectName
1176 d->m_customizeDatas.append(data);
1177 ni->setData(true, RibbonCustomizeWidget::CanCustomizeRole); // 有CustomizeRole,必有CanCustomizeRole
1178 ni->setData(true, RibbonCustomizeWidget::CustomizeRole);
1180 setSelectItem(ni);
1181}
1182
1184{
1185 QStandardItem *item = selectedItem();
1186
1187 if (Q_NULLPTR == item) {
1188 return;
1189 }
1190 bool ok;
1191 QString text = "";
1192
1193 text = QInputDialog::getText(this, tr("rename"), tr("name:"), QLineEdit::Normal, item->text(), &ok);
1194
1195 if (!ok || text.isEmpty()) {
1196 return;
1197 }
1198 int level = itemLevel(item);
1199
1200 if (0 == level) {
1201 // 改Page名
1202 QString pageObjName = d->itemObjectName(item);
1204 d->m_customizeDatas.append(data);
1205#if QX_RIBBON_DEBUG
1206 qDebug() << QString("rename page %1 from %2 to %3").arg(pageObjName, item->text(), text);
1207#endif
1208 } else if (1 == level) {
1209 QString pageObjName = d->itemObjectName(item->parent());
1210 QString groupObjName = d->itemObjectName(item);
1212 d->m_customizeDatas.append(data);
1213#if QX_RIBBON_DEBUG
1214 qDebug() << QString("rename group %1 from %2 to %3").arg(groupObjName, item->text(), text);
1215#endif
1216 } else {
1217 // action 不允许改名
1218 return;
1219 }
1220 item->setText(text);
1221}
1222
1224{
1225 QAction *act = selectedAction();
1226 QStandardItem *item = selectedItem();
1227
1228 if ((Q_NULLPTR == act) || (Q_NULLPTR == item)) {
1229 return;
1230 }
1231 int level = itemLevel(item);
1232
1233 if (0 == level) {
1234 // 选中page不进行操作
1235 return;
1236 } else if (2 == level) {
1237 // 选中action,添加到这个action之后,把item设置为group
1238 item = item->parent();
1239 }
1240 QString groupObjName = d->itemObjectName(item);
1241 QString pageObjName = d->itemObjectName(item->parent());
1242 QString key = d->m_actionMgr->key(act);
1243
1245 key, d->m_actionMgr, selectedRowProportion(), pageObjName, groupObjName);
1246
1247 d->m_customizeDatas.append(data);
1248
1249 QStandardItem *actItem = new QStandardItem(act->icon(), act->text());
1250
1251 actItem->setData(2, RibbonCustomizeWidget::LevelRole);
1252 actItem->setData(true, RibbonCustomizeWidget::CanCustomizeRole); // 有CustomizeRole,必有CanCustomizeRole
1253 actItem->setData(true, RibbonCustomizeWidget::CustomizeRole);
1254 actItem->setData(act->objectName(), RibbonCustomizeWidget::CustomizeObjNameRole);
1255 actItem->setData(qintptr(act), RibbonCustomizeWidget::PointerRole); // 把action指针传入
1256 item->appendRow(actItem);
1257}
1258
1260{
1261 QStandardItem *item = selectedItem();
1262
1263 if (Q_NULLPTR == item) {
1264 return;
1265 }
1266 if (!isItemCanCustomize(item)) {
1267 return;
1268 }
1269 int level = itemLevel(item);
1270
1271 if (0 == level) {
1272 // 删除page
1274 d->m_customizeDatas.append(data);
1275 } else if (1 == level) {
1276 // 删除group
1277 QString pageObjName = d->itemObjectName(item->parent());
1278 QString groupObjName = d->itemObjectName(item);
1280 d->m_customizeDatas.append(data);
1281 } else if (2 == level) {
1282 // 删除Action
1283 QString pageObjName = d->itemObjectName(item->parent()->parent());
1284 QString groupObjName = d->itemObjectName(item->parent());
1285 QAction *act = itemToAction(item);
1286 QString key = d->m_actionMgr->key(act);
1287 if (key.isEmpty() || pageObjName.isEmpty() || groupObjName.isEmpty()) {
1288 return;
1289 }
1290
1291 RibbonCustomizeData data =
1292 RibbonCustomizeData::makeRemoveActionCustomizeData(pageObjName, groupObjName, key, d->m_actionMgr);
1293 d->m_customizeDatas.append(data);
1294 }
1295 // 执行删除操作
1296 removeItem(item);
1297 // 删除后重新识别
1298 ui->pushButtonAdd->setEnabled(selectedAction() && isSelectedItemIsCustomize() && selectedRibbonLevel() > 0);
1299 ui->pushButtonDelete->setEnabled(isSelectedItemIsCustomize());
1300}
1301
1303{
1304 // 每次点击,判断是否可以进行操作,决定pushButtonAdd和pushButtonDelete的显示状态
1305 // 点击了listview,判断treeview的状态
1306 Q_UNUSED(index);
1307 ui->pushButtonAdd->setEnabled(isSelectedItemCanCustomize() && selectedRibbonLevel() > 0);
1308 ui->pushButtonDelete->setEnabled(isSelectedItemCanCustomize());
1309}
1310
1312{
1313 Q_UNUSED(index);
1314 // 每次点击,判断是否可以进行操作,决定pushButtonAdd和pushButtonDelete的显示状态
1315 QStandardItem *item = selectedItem();
1316
1317 if (Q_NULLPTR == item) {
1318 return;
1319 }
1320 int level = itemLevel(item);
1321
1322 ui->pushButtonAdd->setEnabled(selectedAction() && (level > 0) && isItemCanCustomize(item));
1323 ui->pushButtonDelete->setEnabled(isItemCanCustomize(item)); // 有CustomizeRole,必有CanCustomizeRole
1324 ui->pushButtonRename->setEnabled(level != 2 || isItemCanCustomize(item)); // QAction 不能改名
1325 ui->pushButtonNewGroup->setEnabled(level != 2);
1326 ui->toolButtonUp->setEnabled(item->index().row() != 0);
1327
1328 QStandardItem *parItem = item->parent();
1329 if (parItem) {
1330 ui->toolButtonDown->setEnabled(item->index().row() + 1 < parItem->rowCount());
1331 } else {
1332 ui->toolButtonDown->setEnabled(item->index().row() + 1 < ui->treeViewResult->model()->rowCount());
1333 }
1334}
1335
1337{
1338 QStandardItem *item = selectedItem();
1339
1340 if ((Q_NULLPTR == item) || (0 == item->row())) {
1341 return;
1342 }
1343 int level = itemLevel(item);
1344
1345 if (0 == level) {
1346 // 移动page
1348 d->m_customizeDatas.append(data);
1349 int r = item->row();
1350 item = d->m_ribbonModel->takeItem(r);
1351 d->m_ribbonModel->removeRow(r);
1352 d->m_ribbonModel->insertRow(r - 1, item);
1353 } else if (1 == level) {
1354 QStandardItem *paritem = item->parent();
1356 d->itemObjectName(item), -1);
1357 d->m_customizeDatas.append(data);
1358 int r = item->row();
1359 item = paritem->takeChild(r);
1360 paritem->removeRow(r);
1361 paritem->insertRow(r - 1, item);
1362 } else if (2 == level) {
1363 QStandardItem *groupItem = item->parent();
1364 QStandardItem *pageItem = groupItem->parent();
1365 QAction *act = itemToAction(item);
1366 if (!act) {
1367 return;
1368 }
1369 QString key = d->m_actionMgr->key(act);
1371 d->itemObjectName(pageItem), d->itemObjectName(groupItem), key, d->m_actionMgr, -1);
1372 d->m_customizeDatas.append(data);
1373 int r = item->row();
1374 item = groupItem->takeChild(r);
1375 groupItem->removeRow(r);
1376 groupItem->insertRow(r - 1, item);
1377 }
1378}
1379
1381{
1382 QStandardItem *item = selectedItem();
1383
1384 if (item == Q_NULLPTR) {
1385 return;
1386 }
1387 int count = 0;
1388
1389 if (item->parent()) {
1390 count = item->parent()->rowCount();
1391 } else {
1392 count = d->m_ribbonModel->rowCount();
1393 }
1394 if ((Q_NULLPTR == item) || ((count - 1) == item->row())) {
1395 return;
1396 }
1397 int level = itemLevel(item);
1398
1399 if (0 == level) {
1400 // 移动page
1402 d->m_customizeDatas.append(data);
1403 int r = item->row();
1404 item = d->m_ribbonModel->takeItem(item->row());
1405 d->m_ribbonModel->removeRow(r);
1406 d->m_ribbonModel->insertRow(r + 1, item);
1407 } else if (1 == level) {
1408 QStandardItem *paritem = item->parent();
1410 d->itemObjectName(item), 1);
1411 d->m_customizeDatas.append(data);
1412 int r = item->row();
1413 item = paritem->takeChild(r);
1414 paritem->removeRow(r);
1415 paritem->insertRow(r + 1, item);
1416 } else if (2 == level) {
1417 QStandardItem *groupItem = item->parent();
1418 QStandardItem *pageItem = groupItem->parent();
1419 QAction *act = itemToAction(item);
1420 if (!act) {
1421 return;
1422 }
1423 QString key = d->m_actionMgr->key(act);
1425 d->itemObjectName(pageItem), d->itemObjectName(groupItem), key, d->m_actionMgr, -1);
1426 d->m_customizeDatas.append(data);
1427 int r = item->row();
1428 item = groupItem->takeChild(r);
1429 groupItem->removeRow(r);
1430 groupItem->insertRow(r + 1, item);
1431 }
1432}
1433
1435{
1436 if (item == Q_NULLPTR) {
1437 return;
1438 }
1439 int level = itemLevel(item);
1440
1441 if (0 == level) {
1442 if (item->isCheckable()) {
1443 QString objname = d->itemObjectName(item);
1444 RibbonCustomizeData data =
1445 RibbonCustomizeData::makeVisiblePageCustomizeData(objname, item->checkState() == Qt::Checked);
1446 d->m_customizeDatas.append(data);
1447 }
1448 }
1449}
1450
1452{
1453 d->m_acionModel->search(text);
1454}
1455
1457{
1458 int btn = QMessageBox::warning(this, tr("Warning"), tr("Are you sure reset all customize setting?"),
1459 QMessageBox::Yes | QMessageBox::No, QMessageBox::No);
1460
1461 if (btn == QMessageBox::Yes) {
1462 clear();
1463 d->updateModel();
1464 }
1465}
1466
用于管理 Ribbon 的所有 Action
QString tagName(int tag) const
获取tag对应的中文名字
QList< int > actionTags() const
获取所有的标签
RibbonBar 继承 QMenuBar, 在 RibbonWindow 中直接替换了原来的 QMenuBar
Definition ribbonbar.h:99
记录所有自定义操作的数据类
static RibbonCustomizeData makeChangeGroupOrderCustomizeData(const QString &pageObjName, const QString &groupObjName, int moveIndex)
对应ChangeGroupOrderActionType
void setActionsManager(RibbonActionsManager *mgr)
int indexValue
记录顺序的参数
QString pageObjNameValue
记录pageObjName,用于定位Page
static QList< RibbonCustomizeData > simplify(const QList< RibbonCustomizeData > &csd)
对QList<RibbonCustomizeData>进行简化操作
static RibbonCustomizeData makeRemoveGroupCustomizeData(const QString &pageObjName, const QString &groupObjName)
static RibbonCustomizeData makeAddPageCustomizeData(const QString &title, int index, const QString &objName)
static RibbonCustomizeData makeAddGroupCustomizeData(const QString &title, int index, const QString &pageObjName, const QString &objName)
创建一个AddGroupActionType的RibbonCustomizeData
static RibbonCustomizeData makeVisiblePageCustomizeData(const QString &pageObjName, bool isShow)
RibbonCustomizeData::makeVisiblePageCustomizeData
static RibbonCustomizeData makeRemovePageCustomizeData(const QString &pageObjName)
QString keyValue
记录标题、索引等参数
static RibbonCustomizeData makeRenamePageCustomizeData(const QString &newName, const QString &pageObjName)
static RibbonCustomizeData makeRenameGroupCustomizeData(const QString &newName, const QString &pageObjName, const QString &groupObjName)
static RibbonCustomizeData makeRemoveActionCustomizeData(const QString &pageObjName, const QString &groupObjName, const QString &key, RibbonActionsManager *mgr)
对应RemoveActionActionType
static RibbonCustomizeData makeChangeActionOrderCustomizeData(const QString &pageObjName, const QString &groupObjName, const QString &key, RibbonActionsManager *mgr, int moveIndex)
对应ChangeActionOrderActionType
QString groupObjNameValue
记录groupObjName,ribbon的Customize索引大部分基于objname
static RibbonCustomizeData makeChangePageOrderCustomizeData(const QString &pageObjName, int moveIndex)
对应ChangePageOrderActionType
static RibbonCustomizeData makeAddActionCustomizeData(const QString &key, RibbonActionsManager *mgr, RibbonGroup::RowProportion rp, const QString &pageObjName, const QString &groupObjName)
添加action
RibbonGroup::RowProportion actionRowProportionValue
void setActionType(ActionType a)
设置CustomizeData的action type
bool isCustomizeItem(QStandardItem *item) const
判断itemn能否改动,可以改动返回true
QAction * itemToAction(QStandardItem *item) const
把item转换为action
void onLineEditSearchActionTextEdited(const QString &text)
RibbonGroup::RowProportion selectedRowProportion() const
获取当前界面选中的行属性
const QStandardItemModel * model() const
获取model
int selectedRibbonLevel() const
获取选中的ribbon tree 的level
void onRadioButtonGroupButtonClicked(QAbstractButton *b)
void onListViewSelectClicked(const QModelIndex &index)
void updateModel()
根据当前的radiobutton选项来更新model
QStandardItem * selectedItem() const
获取ribbon tree选中的item
void onTreeViewResultClicked(const QModelIndex &index)
bool toXml(QXmlStreamWriter *xml) const
转换为xml
RibbonTreeShowType
定义ribbon树的显示类型
@ ShowAllPage
显示所有的页,包括上下文
@ ShowMainPage
显示主要的页,不包含上下文
QAction * selectedAction() const
获取listview中选中的action
void setupActionsManager(RibbonActionsManager *mgr)
设置action管理器
@ CustomizeObjNameRole
记录了临时的自定义内容的obj名 QString
@ CanCustomizeRole
代表个item是可以自定义的.bool
@ LevelRole
代表这是层级,有0:page 1:group 2:item
@ PointerRole
代表这是存放指针。根据LevelRole来进行转
@ CustomizeRole
代表这个是自定义的item,bool,主要用于那些自己添加的标签和group,有此角色必有CanCustomizeRole
void setSelectItem(QStandardItem *item, bool ensureVisible=true)
设置某个item被选中
int itemLevel(QStandardItem *item) const
获取StandardItem 的level
void fromXml(QXmlStreamReader *xml)
从xml中加载QList<RibbonCustomizeData>
bool isItemCanCustomize(QStandardItem *item) const
判断itemn能否改动,可以改动返回true
@ Medium
中占比,在 RibbonGroup::groupLayoutMode 为 RibbonGroup::ThreeRowMode 时才会起作用, 且要同一列里两个都是 Medium 时,会在三行中占据两行
Definition ribbongroup.h:42
@ Small
小占比,占RibbonGroup的一行,Medium在不满足条件时也会变为Small,但不会变为Large
Definition ribbongroup.h:44
@ Large
大占比,一个widget的高度会充满整个group
Definition ribbongroup.h:41
int QxRibbonCustomizeDataApply(QList< RibbonCustomizeData > &cds, RibbonBar *bar)
应用QList<RibbonCustomizeData>
bool QxRibbonCustomizeDataSetToXml(QXmlStreamWriter *xml, const QList< RibbonCustomizeData > &cds, bool force=false)
QList< RibbonCustomizeData > QxRibbonCustomizeDataGetFromXml(QXmlStreamReader *xml, RibbonActionsManager *mgr)
#define Q_NULLPTR
Copyleft (C) 2025 maminjie canpool@163.com SPDX-License-Identifier: MulanPSL-2.0
#define QX_RIBBON_END_NAMESPACE
#define QX_RIBBON_BEGIN_NAMESPACE
QColor text