/**************************************************************************** ** ** Qtitan Library by Developer Machines (Microsoft-Ribbon implementation for Qt.C++) ** ** Copyright (c) 2009-2015 Developer Machines (http://www.devmachines.com) ** ALL RIGHTS RESERVED ** ** The entire contents of this file is protected by copyright law and ** international treaties. Unauthorized reproduction, reverse-engineering ** and distribution of all or any portion of the code contained in this ** file is strictly prohibited and may result in severe civil and ** criminal penalties and will be prosecuted to the maximum extent ** possible under the law. ** ** RESTRICTIONS ** ** THE SOURCE CODE CONTAINED WITHIN THIS FILE AND ALL RELATED ** FILES OR ANY PORTION OF ITS CONTENTS SHALL AT NO TIME BE ** COPIED, TRANSFERRED, SOLD, DISTRIBUTED, OR OTHERWISE MADE ** AVAILABLE TO OTHER INDIVIDUALS WITHOUT WRITTEN CONSENT ** AND PERMISSION FROM DEVELOPER MACHINES ** ** CONSULT THE END USER LICENSE AGREEMENT FOR INFORMATION ON ** ADDITIONAL RESTRICTIONS. ** ****************************************************************************/ #include #include #include #include #include #include #include #include #include "QtnRibbonCustomizePage.h" #include "QtnRibbonCustomizeDialogPrivate.h" #include "QtnRibbonCustomizeManager.h" #include "QtnRibbonCustomizeManagerPrivate.h" #include "QtnRibbonQuickAccessBar.h" #include "QtnRibbonBar.h" #include "QtnRibbonPrivate.h" #include "QtnRibbonPage.h" #include "QtnRibbonGroup.h" #include "QtnRibbonButtonPrivate.h" #include "QtnStyleHelpers.h" #include "ui_QtnRibbonRenameDialog.h" #include "QtnOfficeStylePrivate.h" #include "QtnRibbonDef.h" #ifdef DEBUG_MEMORY_ENABLED #include "QtitanMSVSDebug.h" #endif QTITAN_USE_NAMESPACE static const QColor clrTransparent = QColor(255, 0, 255); /* RibbonCustomizeStyledItemDelegate */ RibbonCustomizeStyledItemDelegate::RibbonCustomizeStyledItemDelegate(QListWidget* listWidget) : QStyledItemDelegate(listWidget) , m_listWidget(listWidget) { } RibbonCustomizeStyledItemDelegate::~RibbonCustomizeStyledItemDelegate() {} void RibbonCustomizeStyledItemDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const { Q_ASSERT(index.isValid()); #if (QT_VERSION < QT_VERSION_CHECK(5, 7, 0)) QStyleOptionViewItem opt = option; #else QStyleOptionViewItem opt = option; #endif initStyleOption(&opt, index); const QWidget* widget = m_listWidget; QStyle* style = widget ? widget->style() : QApplication::style(); painter->save(); painter->setClipRect(opt.rect); QRect iconRect = style->subElementRect(QStyle::SE_ItemViewItemDecoration, &opt, widget); iconRect.setLeft(3); iconRect.setRight(19); QRect textRect = style->subElementRect(QStyle::SE_ItemViewItemText, &opt, widget); int offset = iconRect.width() + 3; textRect.translate(offset - textRect.x(), 0); // draw the background style->proxy()->drawPrimitive(QStyle::PE_PanelItemViewItem, &opt, painter, widget); // draw the icon QIcon::Mode mode = QIcon::Normal; if (!(opt.state & QStyle::State_Enabled)) mode = QIcon::Disabled; else if (opt.state & QStyle::State_Selected) mode = QIcon::Selected; QIcon::State state = opt.state & QStyle::State_Open ? QIcon::On : QIcon::Off; opt.icon.paint(painter, iconRect, opt.decorationAlignment, mode, state); // draw the text if (!opt.text.isEmpty()) { QPalette::ColorGroup cg = opt.state & QStyle::State_Enabled ? QPalette::Normal : QPalette::Disabled; if (cg == QPalette::Normal && !(opt.state & QStyle::State_Active)) cg = QPalette::Inactive; if (opt.state & QStyle::State_Selected) painter->setPen(opt.palette.color(cg, QPalette::HighlightedText)); else painter->setPen(opt.palette.color(cg, QPalette::Text)); if (opt.state & QStyle::State_Editing) { painter->setPen(opt.palette.color(cg, QPalette::Text)); painter->drawRect(textRect.adjusted(0, 0, -1, -1)); } const int textMargin = style->pixelMetric(QStyle::PM_FocusFrameHMargin, 0, widget) + 1; textRect = textRect.adjusted(textMargin, 0, -textMargin, 0); // remove width padding painter->setFont(opt.font); style->drawItemText(painter, textRect, QStyle::visualAlignment(opt.direction, opt.displayAlignment), opt.palette, true /*enabled*/, opt.text /*, QPalette::ColorRole textRole = QPalette::NoRole*/); } // draw the focus rect if (opt.state & QStyle::State_HasFocus) { QStyleOptionFocusRect o; o.QStyleOption::operator=(opt); o.rect = style->proxy()->subElementRect(QStyle::SE_ItemViewItemFocusRect, &opt, widget); o.state |= QStyle::State_KeyboardFocusChange; o.state |= QStyle::State_Item; QPalette::ColorGroup cg = (opt.state & QStyle::State_Enabled) ? QPalette::Normal : QPalette::Disabled; o.backgroundColor = opt.palette.color(cg, (opt.state & QStyle::State_Selected) ? QPalette::Highlight : QPalette::Window); style->proxy()->drawPrimitive(QStyle::PE_FrameFocusRect, &o, painter, widget); } painter->restore(); } /* RibbonQuickAccessBarCustomizePagePrivate */ RibbonQuickAccessBarCustomizePagePrivate::RibbonQuickAccessBarCustomizePagePrivate() { m_ribbonBar = Q_NULL; m_separator = Q_NULL; m_currentAction = Q_NULL; m_separatorText = RibbonBar::tr_compatible(QtnRibbonSeparatorString); m_heightRowItem = 16; m_widthColIconItem = 20; m_widthColViewItem = 35; m_wasDisplayed = false; } RibbonQuickAccessBarCustomizePagePrivate::~RibbonQuickAccessBarCustomizePagePrivate() { delete m_separator; } void RibbonQuickAccessBarCustomizePagePrivate::init() { QTN_P(RibbonQuickAccessBarCustomizePage) Q_ASSERT(m_ribbonBar != Q_NULL); m_pageUI.setupUi(&p); QAbstractItemDelegate* itemDelegate = m_pageUI.commandsList->itemDelegate(); m_pageUI.commandsList->setItemDelegate(new RibbonCustomizeStyledItemDelegate(m_pageUI.commandsList)); delete itemDelegate; QPixmap imagesSrc; imagesSrc = QPixmap(":/images/icons/menuimg-pro24.png"); #if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)) QImage img = imagesSrc.toImage(); img.setAlphaChannel(img.createMaskFromColor(clrTransparent.rgb(), Qt::MaskOutColor)); imagesSrc = QPixmap::fromImage(img); #else imagesSrc.setAlphaChannel(imagesSrc.createMaskFromColor(clrTransparent, Qt::MaskOutColor)); #endif QSize sz = QSize(9, 9); QPixmap m_imagesUpSrc = imagesSrc.copy(QRect(QPoint((int)OfficePaintManager2013::Icon_ArowUpLarge * sz.width(), 0), sz)); QPixmap m_imagesDownSrc = imagesSrc.copy(QRect(QPoint((int)OfficePaintManager2013::Icon_ArowDownLarge * sz.width(), 0), sz)); m_pageUI.upButton->setText(""); m_pageUI.upButton->setIcon(m_imagesUpSrc); m_pageUI.downButton->setText(""); m_pageUI.downButton->setIcon(m_imagesDownSrc); m_separator = new QAction(m_separatorText, Q_NULL); m_separator->setSeparator(true); initListWidgetCommands(); #if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)) connect(m_pageUI.comboBoxSourceCategory, SIGNAL(currentTextChanged(const QString&)), this, SLOT(setCurrentCategoryText(const QString&))); #else connect(m_pageUI.comboBoxSourceCategory, SIGNAL(currentIndexChanged(const QString&)), this, SLOT(setCurrentCategoryText(const QString&))); #endif connect(m_pageUI.addButton, SIGNAL(released()), this, SLOT(addClicked())); connect(m_pageUI.removeButton, SIGNAL(released()), this, SLOT(removeClicked())); connect(m_pageUI.pushButtonReset, SIGNAL(released()), this, SLOT(resetClicked())); connect(m_pageUI.upButton, SIGNAL(released()), this, SLOT(upClicked())); connect(m_pageUI.downButton, SIGNAL(released()), this, SLOT(downClicked())); connect( m_pageUI.commandsList, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), this, SLOT(currentCommandChanged(QListWidgetItem*))); connect(m_pageUI.quickAccessBarList, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), this, SLOT(currentQTCommandChanged(QListWidgetItem*))); m_pageUI.checkBoxQATOn->setChecked(m_ribbonBar->quickAccessBarPosition() != RibbonBar::QATopPosition); } void RibbonQuickAccessBarCustomizePagePrivate::setupPage() { Q_ASSERT(m_ribbonBar != Q_NULL); RibbonCustomizeManager* manager = m_ribbonBar->customizeManager(); manager->setEditMode(true); fillActions(); fillStateCommands(); setButtons(); } QIcon RibbonQuickAccessBarCustomizePagePrivate::createIconStyleWidget(QWidget* widget) { return DrawHelpers::createIconStyleWidget(widget); } QPixmap RibbonQuickAccessBarCustomizePagePrivate::createIconExStyleWidget(QWidget* widget, bool& iconView) { return DrawHelpers::createIconExStyleWidget(widget, m_widthColViewItem, m_heightRowItem, iconView); } void RibbonQuickAccessBarCustomizePagePrivate::initListWidgetCommands() { QStyleOption opt; opt.initFrom(m_pageUI.commandsList); QString str = QString("XX"); int width = opt.fontMetrics.boundingRect(str).width(); m_heightRowItem = qMax(m_heightRowItem, width); } void RibbonQuickAccessBarCustomizePagePrivate::fillActions() { m_pageUI.comboBoxSourceCategory->clear(); m_pageUI.comboBoxSourceCategory->addItems(m_sourceCategories); } void RibbonQuickAccessBarCustomizePagePrivate::fillStateCommands() { RibbonCustomizeManager* manager = m_ribbonBar->customizeManager(); Q_ASSERT(manager != NULL); m_pageUI.quickAccessBarList->clear(); setButtons(); QListIterator itAction(manager->actions(m_ribbonBar->quickAccessBar())); QListWidgetItem* first = Q_NULL; while (itAction.hasNext()) { QAction* action = itAction.next(); QString actionName = m_separatorText; if (action) actionName = action->text(); actionName.remove(QChar::fromLatin1('&')); if (!actionName.isEmpty()) { QListWidgetItem* item = new QListWidgetItem(actionName, m_pageUI.quickAccessBarList); if (action) { item->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter); QIcon icon = action->property("icon").value(); item->setIcon(icon); } if (!first) first = item; } } if (first) m_pageUI.quickAccessBarList->setCurrentItem(first); } void RibbonQuickAccessBarCustomizePagePrivate::fillListCategorieCommads(const QList& actions) { m_pageUI.commandsList->clear(); m_actionToItem.clear(); m_itemToAction.clear(); QListWidgetItem* item = new QListWidgetItem(m_separatorText, m_pageUI.commandsList); m_pageUI.commandsList->setCurrentItem(item); m_currentAction = item; m_actionToItem.insert(0, item); m_itemToAction.insert(item, 0); QListIterator itAction(actions); while (itAction.hasNext()) { if (QAction* action = itAction.next()) { QString actionName = action->text(); actionName.remove(QChar::fromLatin1('&')); item = new QListWidgetItem(actionName, m_pageUI.commandsList); item->setIcon(action->icon()); item->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter); m_actionToItem.insert(action, item); m_itemToAction.insert(item, action); } } m_pageUI.commandsList->setCurrentItem(m_currentAction); } void RibbonQuickAccessBarCustomizePagePrivate::setButtons() { RibbonCustomizeManager* manager = m_ribbonBar->customizeManager(); Q_ASSERT(manager != NULL); bool addEnabled = false; bool removeEnabled = false; QListWidgetItem* itemCommand = m_pageUI.commandsList->currentItem(); QListWidgetItem* itemCommandQT = m_pageUI.quickAccessBarList->currentItem(); if (itemCommand && (itemCommandQT || m_pageUI.quickAccessBarList->count() == 0)) { if (itemCommand->text() != m_separatorText) { QAction* action = m_itemToAction.value(itemCommand); if (action && !manager->containsAction(m_ribbonBar->quickAccessBar(), action)) addEnabled = true; } else addEnabled = true; removeEnabled = true; } m_pageUI.addButton->setEnabled(addEnabled); m_pageUI.removeButton->setEnabled(removeEnabled); int indexRow = m_pageUI.quickAccessBarList->currentRow(); m_pageUI.upButton->setEnabled(indexRow != 0); m_pageUI.downButton->setEnabled(indexRow < m_pageUI.quickAccessBarList->count() - 1); } void RibbonQuickAccessBarCustomizePagePrivate::applyClicked() { RibbonCustomizeManager* manager = m_ribbonBar->customizeManager(); Q_ASSERT(manager != NULL); manager->commit(); if (m_ribbonBar->isQuickAccessVisible()) m_ribbonBar->setQuickAccessBarPosition(m_pageUI.checkBoxQATOn->isChecked() ? RibbonBar::QABottomPosition : RibbonBar::QATopPosition); } void RibbonQuickAccessBarCustomizePagePrivate::setCurrentCategoryText(const QString& strCategory) { if (strCategory.isEmpty()) return; if (m_strSeparator == strCategory) { #if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)) m_pageUI.comboBoxSourceCategory->setCurrentText(m_currentSourceCategory); #else int index = m_pageUI.comboBoxSourceCategory->findText(m_currentSourceCategory); if (index != -1) m_pageUI.comboBoxSourceCategory->setCurrentIndex(index); #endif return; } RibbonCustomizeManager* manager = m_ribbonBar->customizeManager(); Q_ASSERT(manager != Q_NULL); QList actions = manager->actionsByCategory(strCategory); fillListCategorieCommads(actions); m_currentSourceCategory = strCategory; } void RibbonQuickAccessBarCustomizePagePrivate::currentCommandChanged(QListWidgetItem* current) { if (m_itemToAction.contains(current)) m_currentAction = current; else m_currentAction = Q_NULL; setButtons(); } void RibbonQuickAccessBarCustomizePagePrivate::currentQTCommandChanged(QListWidgetItem* current) { Q_UNUSED(current); setButtons(); } void RibbonQuickAccessBarCustomizePagePrivate::addClicked() { RibbonCustomizeManager* manager = m_ribbonBar->customizeManager(); Q_ASSERT(manager != NULL); if (!m_currentAction) return; QListWidgetItem* currentToolBarAction = m_pageUI.quickAccessBarList->currentItem(); QAction* action = m_itemToAction.value(m_currentAction); QListWidgetItem* item = Q_NULL; if (action) { if (manager->containsAction(m_ribbonBar->quickAccessBar(), action)) { item = m_actionToCurrentItem.value(action); if (item == currentToolBarAction) return; int row = m_pageUI.quickAccessBarList->row(item); m_pageUI.quickAccessBarList->takeItem(row); manager->removeActionAt(m_ribbonBar->quickAccessBar(), row); } else { QString actionName = action->text(); actionName.remove(QChar::fromLatin1('&')); item = new QListWidgetItem(actionName); item->setIcon(action->icon()); item->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter); m_currentItemToAction.insert(item, action); m_actionToCurrentItem.insert(action, item); } } else { item = new QListWidgetItem(m_separatorText); m_currentItemToAction.insert(item, 0); } int row = m_pageUI.quickAccessBarList->count(); if (currentToolBarAction) row = m_pageUI.quickAccessBarList->row(currentToolBarAction) + 1; m_pageUI.quickAccessBarList->insertItem(row, item); manager->insertAction(m_ribbonBar->quickAccessBar(), action, row); QListWidgetItem* itemCommand = m_pageUI.commandsList->currentItem(); int index = m_pageUI.commandsList->row(itemCommand) + 1; m_pageUI.commandsList->setCurrentRow(index); m_pageUI.quickAccessBarList->setCurrentItem(item); setButtons(); } void RibbonQuickAccessBarCustomizePagePrivate::removeClicked() { RibbonCustomizeManager* manager = m_ribbonBar->customizeManager(); Q_ASSERT(manager != NULL); QListWidgetItem* currentToolBarAction = m_pageUI.quickAccessBarList->currentItem(); if (!currentToolBarAction) return; int row = m_pageUI.quickAccessBarList->row(currentToolBarAction); manager->removeActionAt(m_ribbonBar->quickAccessBar(), row); QAction* action = m_currentItemToAction.value(currentToolBarAction); if (action) m_actionToCurrentItem.remove(action); m_currentItemToAction.remove(currentToolBarAction); delete currentToolBarAction; if (row == m_pageUI.quickAccessBarList->count()) row--; if (row >= 0) { QListWidgetItem* item = m_pageUI.quickAccessBarList->item(row); m_pageUI.quickAccessBarList->setCurrentItem(item); } setButtons(); } void RibbonQuickAccessBarCustomizePagePrivate::resetClicked() { if (m_ribbonBar->getQuickAccessBar()) { RibbonCustomizeManager* manager = m_ribbonBar->customizeManager(); Q_ASSERT(manager != Q_NULL); manager->reset(m_ribbonBar->getQuickAccessBar()); fillStateCommands(); } } void RibbonQuickAccessBarCustomizePagePrivate::upClicked() { RibbonCustomizeManager* manager = m_ribbonBar->customizeManager(); Q_ASSERT(manager != Q_NULL); QListWidgetItem* currentToolBarAction = m_pageUI.quickAccessBarList->currentItem(); if (!currentToolBarAction) return; int row = m_pageUI.quickAccessBarList->row(currentToolBarAction); if (row == 0) return; m_pageUI.quickAccessBarList->takeItem(row); int newRow = row - 1; m_pageUI.quickAccessBarList->insertItem(newRow, currentToolBarAction); QAction* action = manager->actions(m_ribbonBar->quickAccessBar()).at(row); manager->removeActionAt(m_ribbonBar->quickAccessBar(), row); manager->insertAction(m_ribbonBar->quickAccessBar(), action, newRow); m_pageUI.quickAccessBarList->setCurrentItem(currentToolBarAction); setButtons(); } void RibbonQuickAccessBarCustomizePagePrivate::downClicked() { RibbonCustomizeManager* manager = m_ribbonBar->customizeManager(); Q_ASSERT(manager != Q_NULL); QListWidgetItem* currentToolBarAction = m_pageUI.quickAccessBarList->currentItem(); if (!currentToolBarAction) return; int row = m_pageUI.quickAccessBarList->row(currentToolBarAction); if (row == m_pageUI.quickAccessBarList->count() - 1) return; m_pageUI.quickAccessBarList->takeItem(row); int newRow = row + 1; m_pageUI.quickAccessBarList->insertItem(newRow, currentToolBarAction); QAction* action = manager->actions(m_ribbonBar->quickAccessBar()).at(row); manager->removeActionAt(m_ribbonBar->quickAccessBar(), row); manager->insertAction(m_ribbonBar->quickAccessBar(), action, newRow); m_pageUI.quickAccessBarList->setCurrentItem(currentToolBarAction); setButtons(); } /*RibbonQuickAccessBarCustomizePage*/ RibbonQuickAccessBarCustomizePage::RibbonQuickAccessBarCustomizePage(RibbonBar* ribbonBar) : QWidget(Q_NULL) { QTN_INIT_PRIVATE(RibbonQuickAccessBarCustomizePage); QTN_D(RibbonQuickAccessBarCustomizePage) d.m_ribbonBar = ribbonBar; d.init(); } RibbonQuickAccessBarCustomizePage::~RibbonQuickAccessBarCustomizePage() { QTN_FINI_PRIVATE(); } RibbonBar* RibbonQuickAccessBarCustomizePage::ribbonBar() const { QTN_D(const RibbonQuickAccessBarCustomizePage) return d.m_ribbonBar; } void RibbonQuickAccessBarCustomizePage::addCustomCategory(const QString& strCategory) { QTN_D(RibbonQuickAccessBarCustomizePage) QString str = strCategory; str.remove(QChar::fromLatin1('&')); d.m_sourceCategories.append(str); } void RibbonQuickAccessBarCustomizePage::addSeparatorCategory(const QString& strCategory) { QTN_D(RibbonQuickAccessBarCustomizePage) QString separator = strCategory; if (separator.isEmpty()) separator = QString("----------"); d.m_strSeparator = separator; d.m_sourceCategories.append(separator); } void RibbonQuickAccessBarCustomizePage::accepted() { QTN_D(RibbonQuickAccessBarCustomizePage) if (d.m_wasDisplayed) d.applyClicked(); } void RibbonQuickAccessBarCustomizePage::showEvent(QShowEvent* event) { QWidget::showEvent(event); QTN_D(RibbonQuickAccessBarCustomizePage) d.m_wasDisplayed = true; d.setupPage(); } /////////////////////////////////////////////////////////////////////////////// /* RibbonBarCustomizePagePrivate */ RibbonBarCustomizePagePrivate::RibbonBarCustomizePagePrivate() { m_ribbonBar = Q_NULL; m_currentSourceItemPage = Q_NULL; m_currentSourceItemGroup = Q_NULL; m_currentSourceAction = Q_NULL; m_currentItemPage = Q_NULL; m_currentItemGroup = Q_NULL; m_currentItemAction = Q_NULL; m_sufNameCustom = QString(" (Custom)"); m_wasDisplayed = false; } RibbonBarCustomizePagePrivate::~RibbonBarCustomizePagePrivate() {} /* RibbonCustomizeRibbonStyledItemDelegate */ class RibbonCustomizeRibbonStyledItemDelegate : public QStyledItemDelegate { public: explicit RibbonCustomizeRibbonStyledItemDelegate(QObject* parent = Q_NULL) : QStyledItemDelegate(parent) { } virtual ~RibbonCustomizeRibbonStyledItemDelegate() {} void addCaption(const QString& strCategory) { Q_ASSERT(!strCategory.isEmpty()); m_lstCaption.append(strCategory); } void clearCaptions() { m_lstCaption.clear(); } protected: virtual void initStyleOption(QStyleOptionViewItem* option, const QModelIndex& index) const { QStyledItemDelegate::initStyleOption(option, index); #if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)) if (m_lstCaption.contains(option->text)) option->rect.setLeft(0); #else if (const QStyleOptionViewItem* vopt = qstyleoption_cast(option)) if (m_lstCaption.contains(vopt->text)) option->rect.setLeft(0); #endif // QT_VERSION_CHECK(4, 0, 0) } protected: QList m_lstCaption; }; void RibbonBarCustomizePagePrivate::init() { QTN_P(RibbonBarCustomizePage) Q_ASSERT(m_ribbonBar != Q_NULL); m_pageUI.setupUi(&p); QPixmap imagesSrc; imagesSrc = QPixmap(":/images/icons/menuimg-pro24.png"); #if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)) QImage img = imagesSrc.toImage(); img.setAlphaChannel(img.createMaskFromColor(clrTransparent.rgb(), Qt::MaskOutColor)); imagesSrc = QPixmap::fromImage(img); #else imagesSrc.setAlphaChannel(imagesSrc.createMaskFromColor(clrTransparent, Qt::MaskOutColor)); #endif // QT_VERSION_CHECK(4, 0, 0) m_pageUI.treeCommands->setItemDelegate(new RibbonCustomizeRibbonStyledItemDelegate(m_pageUI.treeCommands)); m_pageUI.treeRibbon->setItemDelegate(new RibbonCustomizeRibbonStyledItemDelegate(m_pageUI.treeRibbon)); m_pageUI.switchTabsBox->setVisible(false); QSize sz = QSize(9, 9); QPixmap m_imagesUpSrc = imagesSrc.copy(QRect(QPoint((int)OfficePaintManager2013::Icon_ArowUpLarge * sz.width(), 0), sz)); QPixmap m_imagesDownSrc = imagesSrc.copy(QRect(QPoint((int)OfficePaintManager2013::Icon_ArowDownLarge * sz.width(), 0), sz)); m_pageUI.upButton->setText(""); m_pageUI.upButton->setIcon(m_imagesUpSrc); m_pageUI.downButton->setText(""); m_pageUI.downButton->setIcon(m_imagesDownSrc); connect(m_pageUI.addButton, SIGNAL(released()), this, SLOT(addClicked())); connect(m_pageUI.newTabButton, SIGNAL(released()), this, SLOT(newTabClicked())); connect(m_pageUI.newGroupButton, SIGNAL(released()), this, SLOT(newGroupClicked())); connect(m_pageUI.removeButton, SIGNAL(released()), this, SLOT(removeClicked())); connect(m_pageUI.resetButton, SIGNAL(released()), this, SLOT(resetClicked())); connect(m_pageUI.upButton, SIGNAL(released()), this, SLOT(upClicked())); connect(m_pageUI.downButton, SIGNAL(released()), this, SLOT(downClicked())); connect(m_pageUI.renameButton, SIGNAL(released()), this, SLOT(renameClicked())); #if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)) connect(m_pageUI.comboBoxSourceCategory, SIGNAL(currentTextChanged(const QString&)), this, SLOT(setCurrentCategoryText(const QString&))); #else connect(m_pageUI.comboBoxSourceCategory, SIGNAL(currentIndexChanged(const QString&)), this, SLOT(setCurrentCategoryText(const QString&))); #endif connect( m_pageUI.treeCommands, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)), this, SLOT(currentSourceChanged(QTreeWidgetItem*))); connect(m_pageUI.treeRibbon, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)), this, SLOT(currentPageChanged(QTreeWidgetItem*))); connect(m_pageUI.treeRibbon, SIGNAL(itemChanged(QTreeWidgetItem*, int)), this, SLOT(itemPageChanged(QTreeWidgetItem*, int))); } void RibbonBarCustomizePagePrivate::setupPage() { Q_ASSERT(m_ribbonBar != Q_NULL); RibbonCustomizeManager* manager = m_ribbonBar->customizeManager(); if (!manager->isEditMode()) manager->setEditMode(); fillSourceCategories(); setCurrentTabsText(QString()); fillStateCategories(); } void RibbonBarCustomizePagePrivate::setCategoryCaptionTree(QTreeWidget* tree, const QString& strCategory) { QTN_P(RibbonBarCustomizePage) if (!strCategory.isEmpty()) { QTreeWidgetItem* item = new QTreeWidgetItem(tree, QStringList(strCategory)); item->setDisabled(true); QFont font = p.font(); font.setBold(true); item->setFont(0, font); item->setBackground(0, QColor(238, 238, 238)); RibbonCustomizeRibbonStyledItemDelegate* ribbonStyledItemDelegate = dynamic_cast(tree->itemDelegate()); Q_ASSERT(ribbonStyledItemDelegate != Q_NULL); ribbonStyledItemDelegate->addCaption(strCategory); } } void RibbonBarCustomizePagePrivate::clearCategoryCaptionTree(QTreeWidget* tree) { RibbonCustomizeRibbonStyledItemDelegate* ribbonStyledItemDelegate = dynamic_cast(tree->itemDelegate()); Q_ASSERT(ribbonStyledItemDelegate != Q_NULL); ribbonStyledItemDelegate->clearCaptions(); } void RibbonBarCustomizePagePrivate::fillSourceCategories() { m_pageUI.comboBoxSourceCategory->clear(); m_pageUI.comboBoxSourceCategory->addItems(m_sourceCategories); if (m_sourceCategories.size() > 0) m_pageUI.comboBoxSourceCategory->setCurrentIndex(0); } void RibbonBarCustomizePagePrivate::fillSourceActions(QList& actions, QTreeWidgetItem* parentItem) { QListIterator itAction(actions); QTreeWidgetItem* first = Q_NULL; while (itAction.hasNext()) { QAction* action = itAction.next(); if (action == Q_NULL) continue; QString actionName = action->text(); actionName.remove(QChar::fromLatin1('&')); if (!actionName.isEmpty()) { QTreeWidgetItem* item = Q_NULL; if (parentItem) item = new QTreeWidgetItem(parentItem, QStringList(actionName)); else item = new QTreeWidgetItem(m_pageUI.treeCommands, QStringList(actionName)); item->setTextAlignment(0, Qt::AlignLeft | Qt::AlignVCenter); QIcon icon = action->property("icon").value(); item->setIcon(0, icon); m_currentSourceItemToAction.insert(item, action); if (!first) first = item; } } if (first) m_pageUI.treeCommands->setCurrentItem(first); } void RibbonBarCustomizePagePrivate::fillSourcePages(QList& pages, const QString& strCategory) { Q_UNUSED(strCategory); RibbonCustomizeManager* manager = m_ribbonBar->customizeManager(); Q_ASSERT(manager != NULL); QListIterator itPage(pages); while (itPage.hasNext()) { RibbonPage* page = itPage.next(); if (!manager->qtn_d().m_ribbonManager->pageDefaultName(page).isEmpty()) { QString title = manager->qtn_d().m_ribbonManager->pageDefaultName(page); title.remove(QChar::fromLatin1('&')); QTreeWidgetItem* item = new QTreeWidgetItem(m_pageUI.treeCommands, QStringList(title)); fillSourceGroups(page, item); m_currentSourceItemToPage.insert(item, page); } } } void RibbonBarCustomizePagePrivate::fillSourceGroups(RibbonPage* page, QTreeWidgetItem* parentItem) { Q_ASSERT(page != Q_NULL); RibbonCustomizeManager* manager = m_ribbonBar->customizeManager(); Q_ASSERT(manager != NULL); QList listGroup = manager->qtn_d().m_ribbonManager->pageDefaultGroups(page); for (int i = 0, count = listGroup.count(); count > i; ++i) { QString groupTitle = manager->qtn_d().m_ribbonManager->groupDefaultName(listGroup[i]); groupTitle.remove(QChar::fromLatin1('&')); if (!groupTitle.isEmpty()) { QTreeWidgetItem* newItem = new QTreeWidgetItem(parentItem, QStringList(groupTitle)); fillSourceGroupActions(listGroup[i], newItem); m_currentSourceItemToGroup.insert(newItem, listGroup[i]); } } } void RibbonBarCustomizePagePrivate::fillSourceGroupActions(RibbonGroup* group, QTreeWidgetItem* parentItem) { Q_ASSERT(group != Q_NULL); RibbonCustomizeManager* manager = m_ribbonBar->customizeManager(); Q_ASSERT(manager != NULL); QListIterator itAction(manager->actionsGroup(group)); while (itAction.hasNext()) { QAction* action = itAction.next(); QString actionName = action->text(); actionName.remove(QChar::fromLatin1('&')); if (!actionName.isEmpty()) { QTreeWidgetItem* item = new QTreeWidgetItem(parentItem, QStringList(actionName)); item->setTextAlignment(0, Qt::AlignLeft | Qt::AlignVCenter); QIcon icon = action->property("icon").value(); item->setIcon(0, icon); m_currentSourceItemToAction.insert(item, action); } } } void RibbonBarCustomizePagePrivate::fillStateCategories() { RibbonCustomizeManager* manager = m_ribbonBar->customizeManager(); QStringList listCommands = manager->categories(); QListIterator itAction(listCommands); QStringList list; while (itAction.hasNext()) { QString str = itAction.next(); str.remove(QChar::fromLatin1('&')); list << str; } m_pageUI.switchTabsBox->addItems(list); if (listCommands.size() > 0) m_pageUI.switchTabsBox->setCurrentIndex(0); } void RibbonBarCustomizePagePrivate::fillStateRibbon(const QString& strCategory) { Q_UNUSED(strCategory); RibbonCustomizeManager* manager = m_ribbonBar->customizeManager(); Q_ASSERT(manager != Q_NULL); m_pageUI.treeRibbon->clear(); m_pageToCurrentItem.clear(); m_currentItemToPage.clear(); m_currentItemToGroup.clear(); QList pages = manager->pages(); QListIterator itPages(pages); QTreeWidgetItem* first = Q_NULL; while (itPages.hasNext()) { if (RibbonPage* page = itPages.next()) { QString pageTitle = !manager->pageName(page).isEmpty() ? manager->pageName(page) : page->title(); pageTitle.remove(QChar::fromLatin1('&')); if (!pageTitle.isEmpty()) { if (page->property(__qtn_Widget_Custom).toString() == QLatin1String("__qtn_Page_Custom")) pageTitle += m_sufNameCustom; QStringList stringsPage; stringsPage.append(pageTitle); QTreeWidgetItem* item = new QTreeWidgetItem(m_pageUI.treeRibbon, stringsPage); if (manager->isPageHidden(page)) item->setCheckState(0, Qt::Unchecked); else item->setCheckState(0, Qt::Checked); m_pageToCurrentItem.insert(page, item); m_currentItemToPage.insert(item, page); fillStateGroups(page, item); if (!first) first = item; } } } if (first) { m_pageUI.treeRibbon->setCurrentItem(first); m_pageUI.treeRibbon->expandItem(first); } } void RibbonBarCustomizePagePrivate::fillStateGroups(RibbonPage* page, QTreeWidgetItem* itemParent) { RibbonCustomizeManager* manager = m_ribbonBar->customizeManager(); Q_ASSERT(manager != Q_NULL); QList groups = manager->pageGroups(page); QListIterator itGroups(groups); while (itGroups.hasNext()) { RibbonGroup* group = itGroups.next(); QString groupTitle = !manager->groupName(group).isEmpty() ? manager->groupName(group) : group->title(); groupTitle.remove(QChar::fromLatin1('&')); if (!groupTitle.isEmpty()) { if (group->property(__qtn_Widget_Custom).toString() == QLatin1String("__qtn_Group_Custom")) groupTitle += m_sufNameCustom; QStringList stringsGroup; stringsGroup.append(groupTitle); QTreeWidgetItem* item = new QTreeWidgetItem(itemParent, stringsGroup); m_currentItemToGroup.insert(item, group); fillStateActions(group, item, false); } } } void RibbonBarCustomizePagePrivate::fillStateActions(RibbonGroup* group, QTreeWidgetItem* itemParent, bool newGroup) { Q_ASSERT(group != Q_NULL); RibbonCustomizeManager* manager = m_ribbonBar->customizeManager(); Q_ASSERT(manager != Q_NULL); for (int i = itemParent->childCount() - 1; i >= 0; --i) { QTreeWidgetItem* item = itemParent->takeChild(i); QAction* action = m_currentItemToAction.value(item); m_currentItemToAction.remove(item); m_actionToCurrentItem.remove(action); delete item; } bool isCustomGroup = group->property(__qtn_Widget_Custom).toString() == QLatin1String("__qtn_Group_Custom"); QListIterator itAction(newGroup ? group->actions() : manager->actionsGroup(group)); while (itAction.hasNext()) { QAction* action = itAction.next(); QString actionName = action->text(); actionName.remove(QChar::fromLatin1('&')); if (!actionName.isEmpty()) { QTreeWidgetItem* item = new QTreeWidgetItem(itemParent, QStringList(actionName)); if (!isCustomGroup) item->setForeground(0, QBrush(QColor(Qt::gray))); item->setTextAlignment(0, Qt::AlignLeft | Qt::AlignVCenter); QIcon icon = action->property("icon").value(); QPixmap px = icon.pixmap(QSize(16, 16), isCustomGroup ? QIcon::Normal : QIcon::Disabled); item->setIcon(0, QIcon(px)); if (isCustomGroup) { m_currentItemToAction.insert(item, action); m_actionToCurrentItem.insert(action, item); } } } if (isCustomGroup) manager->appendActions(group, manager->actionsGroup(group)); } RibbonPage* RibbonBarCustomizePagePrivate::addPageCustom(RibbonPage* srcPage) { RibbonCustomizeManager* manager = m_ribbonBar->customizeManager(); Q_ASSERT(manager != Q_NULL); QString strNewPage(RibbonBar::tr_compatible(QtnRibbonNewPageString)); if (srcPage) { strNewPage = srcPage->title(); strNewPage.remove('&'); } RibbonPage* findPage = m_currentItemToPage.value(m_currentItemPage); int index = manager->pageIndex(findPage) + 1; RibbonPage* newPage = manager->createPage(strNewPage, index); QTreeWidgetItem* item = new QTreeWidgetItem(m_pageUI.treeRibbon, m_currentItemPage); item->setCheckState(0, Qt::Checked); strNewPage += m_sufNameCustom; item->setText(0, strNewPage); m_pageToCurrentItem.insert(newPage, item); m_currentItemToPage.insert(item, newPage); m_pageUI.treeRibbon->setCurrentItem(item); return newPage; } void RibbonBarCustomizePagePrivate::addGroupCopy(RibbonPage* srcPage, RibbonPage* copyPage) { if (!m_currentItemPage) return; RibbonCustomizeManager* manager = m_ribbonBar->customizeManager(); Q_ASSERT(manager != Q_NULL); QList srcGroups = srcPage->groups(); for (int i = 0, count = srcGroups.count(); count > i; ++i) { RibbonGroup* srcGroup = srcGroups.at(i); if (srcGroup->property(__qtn_Widget_Copy).toString() != QLatin1String("__qtn_Group_Copy")) { QString titleGroup(srcGroup->title()); RibbonGroup* newGroup = manager->createGroup(copyPage, titleGroup, i); newGroup->setIcon(srcGroup->icon()); newGroup->setProperty(__qtn_Widget_Copy, QLatin1String("__qtn_Group_Copy")); titleGroup.remove(QChar::fromLatin1('&')); QTreeWidgetItem* item = new QTreeWidgetItem(QStringList(titleGroup)); m_currentItemPage->insertChild(i, item); m_currentItemToGroup.insert(item, newGroup); QListIterator itAction(srcGroup->actions()); while (itAction.hasNext()) { QAction* action = itAction.next(); newGroup->addAction(action); } fillStateActions(newGroup, item, true); } } } void RibbonBarCustomizePagePrivate::addActionGroupCustom(RibbonGroup* group, QAction* action, int index) { RibbonCustomizeManager* manager = m_ribbonBar->customizeManager(); Q_ASSERT(manager != Q_NULL); QString actionName = action->text(); actionName.remove(QChar::fromLatin1('&')); if (!actionName.isEmpty()) { QTreeWidgetItem* item = Q_NULL; if (index == -1) item = new QTreeWidgetItem(m_currentItemGroup, QStringList(actionName)); else { item = new QTreeWidgetItem(QStringList(actionName)); m_currentItemGroup->insertChild(index, item); } item->setTextAlignment(0, Qt::AlignLeft | Qt::AlignVCenter); QIcon icon = action->property("icon").value(); QPixmap px = icon.pixmap(QSize(16, 16), QIcon::Normal); item->setIcon(0, QIcon(px)); m_currentItemToAction.insert(item, action); m_actionToCurrentItem.insert(action, item); manager->insertAction(group, action, index); } } void RibbonBarCustomizePagePrivate::setButtons() { bool addEnabled = false; bool removeEnabled = false; bool renameEnabled = false; RibbonCustomizeManager* manager = m_ribbonBar->customizeManager(); Q_ASSERT(manager != Q_NULL); if (m_currentSourceAction) { if (RibbonGroup* group = m_currentItemToGroup.value(m_currentItemGroup)) { if (QAction* action = m_currentSourceItemToAction.value(m_currentSourceAction)) addEnabled = !manager->containsAction(group, action); } } else if (!m_currentSourceItemGroup) addEnabled = true; else if (m_currentSourceItemGroup) { RibbonPage* currentSourcePage = m_currentSourceItemToPage.value(m_currentSourceItemPage); RibbonPage* currentPage = m_currentItemToPage.value(m_currentItemPage); if (currentSourcePage && currentPage) { if (currentSourcePage != currentPage) { RibbonGroup* group = m_currentSourceItemToGroup.value(m_currentSourceItemGroup); QList listActions = manager->actionsGroup(group); // group->actions(); QList listGroup = manager->pageGroups(currentPage); QListIterator itGroup(listGroup); bool find = false; while (itGroup.hasNext()) { RibbonGroup* currentGroup = itGroup.next(); QList currentListActions = currentGroup->actions(); if (listActions == currentListActions) { find = true; break; } } if (!find) addEnabled = true; } } } if (m_currentItemAction && m_currentItemGroup) { RibbonGroup* group = m_currentItemToGroup.value(m_currentItemGroup); if (group && group->property(__qtn_Widget_Custom).toString() == QLatin1String("__qtn_Group_Custom")) removeEnabled = true; } else if (m_currentItemGroup) { renameEnabled = true; removeEnabled = true; } else if (m_currentItemPage) { renameEnabled = true; RibbonPage* currentPage = m_currentItemToPage.value(m_currentItemPage); if (currentPage && currentPage->property(__qtn_Widget_Custom).toString() == QLatin1String("__qtn_Page_Custom")) removeEnabled = true; } m_pageUI.addButton->setEnabled(addEnabled); m_pageUI.removeButton->setEnabled(removeEnabled); m_pageUI.renameButton->setEnabled(renameEnabled); bool upEnabled = false; bool downEnabled = false; if (m_currentItemPage && m_currentItemGroup) { RibbonPage* currentPage = m_currentItemToPage.value(m_currentItemPage); Q_ASSERT(currentPage != Q_NULL); RibbonGroup* currentGroup = m_currentItemToGroup.value(m_currentItemGroup); Q_ASSERT(currentGroup != Q_NULL); QList groups = manager->pageGroups(currentPage); int index = groups.indexOf(currentGroup); upEnabled = index != 0; downEnabled = index < (groups.size() - 1); if (m_currentItemAction) { if (QAction* action = m_currentItemToAction.value(m_currentItemAction)) { QList actions = manager->actionsGroup(currentGroup); index = actions.indexOf(action); upEnabled = index != 0; downEnabled = index < (actions.size() - 1); } } } else if (m_currentItemPage && !m_currentItemGroup) { int index = m_pageUI.treeRibbon->indexOfTopLevelItem(m_pageUI.treeRibbon->currentItem()); upEnabled = index != 0; downEnabled = index < m_pageUI.treeRibbon->topLevelItemCount() - 1; } m_pageUI.upButton->setEnabled(upEnabled); m_pageUI.downButton->setEnabled(downEnabled); } void RibbonBarCustomizePagePrivate::applyClicked() { RibbonCustomizeManager* manager = m_ribbonBar->customizeManager(); Q_ASSERT(manager != NULL); manager->commit(); } void RibbonBarCustomizePagePrivate::cancelClicked() { m_ribbonBar->customizeManager()->cancel(); } void RibbonBarCustomizePagePrivate::addClicked() { QTN_P(RibbonBarCustomizePage) if (m_currentSourceAction && m_currentItemGroup) { RibbonGroup* group = m_currentItemToGroup.value(m_currentItemGroup); if (group && group->property(__qtn_Widget_Custom).toString() == QLatin1String("__qtn_Group_Custom")) { if (QAction* action = m_currentSourceItemToAction.value(m_currentSourceAction)) { int index = m_currentItemGroup->indexOfChild(m_currentItemAction); addActionGroupCustom(group, action, index + 1); m_currentItemAction = m_currentItemGroup->child(index + 1); if (m_currentItemAction) m_pageUI.treeRibbon->setCurrentItem(m_currentItemAction); else { QTreeWidgetItem* currentItem = m_currentItemGroup->child(m_currentItemGroup->childCount() - 1); m_pageUI.treeRibbon->setCurrentItem(currentItem); } if (m_currentSourceItemGroup && m_currentSourceAction) { int indexNext = m_currentSourceItemGroup->indexOfChild(m_currentSourceAction) + 1; QTreeWidgetItem* nextItem = m_currentSourceItemGroup->child(indexNext); nextItem = nextItem ? nextItem : m_currentSourceAction; m_pageUI.treeCommands->setCurrentItem(nextItem); } else if (m_currentSourceAction) { int index = m_pageUI.treeCommands->indexOfTopLevelItem(m_currentSourceAction); QTreeWidgetItem* item = m_pageUI.treeCommands->topLevelItem(index + 1); item = item ? item : m_currentSourceAction; m_pageUI.treeCommands->setCurrentItem(item); } m_pageUI.treeRibbon->expandItem(m_currentItemGroup); } } else { QMessageBox::warning(&p, p.windowTitle(), RibbonBar::tr_compatible(QtnRibbonAddCommandWarningString)); } } else if (!m_currentSourceItemGroup) { if (RibbonPage* page = m_currentSourceItemToPage.value(m_currentSourceItemPage)) { int index = m_pageUI.treeCommands->indexOfTopLevelItem(m_currentSourceItemPage); QTreeWidgetItem* item = m_pageUI.treeCommands->topLevelItem(index + 1); item = item ? item : m_currentSourceItemPage; m_pageUI.treeCommands->setCurrentItem(item); RibbonPage* newPage = addPageCustom(page); if (newPage) addGroupCopy(page, newPage); } } else if (m_currentSourceItemGroup) { RibbonCustomizeManager* manager = m_ribbonBar->customizeManager(); Q_ASSERT(manager != Q_NULL); RibbonGroup* group = m_currentSourceItemToGroup.value(m_currentSourceItemGroup); RibbonPage* page = m_currentItemToPage.value(m_currentItemPage); if (group != Q_NULL && page != Q_NULL) { QTreeWidgetItem* itemParent = m_currentItemPage; int index = itemParent->childCount(); QString titleGroup(group->title()); RibbonGroup* newGroup = manager->createGroup(page, titleGroup, index); newGroup->setIcon(group->icon()); newGroup->setProperty(__qtn_Widget_Copy, QLatin1String("__qtn_Group_Copy")); titleGroup.remove(QChar::fromLatin1('&')); QTreeWidgetItem* item = new QTreeWidgetItem(QStringList(titleGroup)); m_currentItemPage->insertChild(index, item); m_currentItemToGroup.insert(item, newGroup); QListIterator itAction(manager->actionsGroup(group)); while (itAction.hasNext()) { QAction* action = itAction.next(); newGroup->addAction(action); } fillStateActions(newGroup, item, true); int indexNext = m_currentSourceItemPage->indexOfChild(m_currentSourceItemGroup) + 1; QTreeWidgetItem* nextItem = m_currentSourceItemPage->child(indexNext); nextItem = nextItem ? nextItem : m_currentSourceItemGroup; m_pageUI.treeCommands->setCurrentItem(nextItem); m_pageUI.treeRibbon->setCurrentItem(item); } } setButtons(); } void RibbonBarCustomizePagePrivate::newTabClicked() { if (!m_currentItemPage) return; addPageCustom(Q_NULL); newGroupClicked(); setButtons(); } void RibbonBarCustomizePagePrivate::newGroupClicked() { if (!m_currentItemPage) return; RibbonCustomizeManager* manager = m_ribbonBar->customizeManager(); Q_ASSERT(manager != Q_NULL); QString strNewGroup(RibbonBar::tr_compatible(QtnRibbonNewGroupString)); RibbonPage* currentPage = m_currentItemToPage.value(m_currentItemPage); Q_ASSERT(currentPage != Q_NULL); int index = 0; if (m_currentItemGroup) { RibbonGroup* currentGroup = m_currentItemToGroup.value(m_currentItemGroup); Q_ASSERT(currentGroup != Q_NULL); QList groups = manager->pageGroups(currentPage); index = groups.indexOf(currentGroup) + 1; } RibbonGroup* newGroup = manager->createGroup(currentPage, strNewGroup, index); QStringList stringsGroup; strNewGroup += m_sufNameCustom; stringsGroup.append(strNewGroup); QTreeWidgetItem* item = new QTreeWidgetItem(stringsGroup); m_currentItemPage->insertChild(index, item); newGroup->setProperty(__qtn_Widget_Custom, QLatin1String("__qtn_Group_Custom")); m_currentItemToGroup.insert(item, newGroup); m_pageUI.treeRibbon->setCurrentItem(item); setButtons(); } void RibbonBarCustomizePagePrivate::removeClicked() { QTreeWidgetItem* currentItem = m_pageUI.treeRibbon->currentItem(); if (!currentItem) return; RibbonCustomizeManager* manager = m_ribbonBar->customizeManager(); Q_ASSERT(manager != Q_NULL); if (m_currentItemGroup && m_currentItemAction) { if (RibbonGroup* group = m_currentItemToGroup.value(m_currentItemGroup)) { if (group && group->property(__qtn_Widget_Custom).toString() == QLatin1String("__qtn_Group_Custom")) { QTreeWidgetItem* currentParent = currentItem->parent(); int index = currentParent->indexOfChild(currentItem); if (index == -1) return; if (QAction* action = m_currentItemToAction.value(m_currentItemAction)) { m_actionToCurrentItem.remove(action); m_currentItemToAction.remove(currentItem); manager->removeActionAt(group, index); } delete currentItem; } } } else if (RibbonGroup* group = m_currentItemToGroup.value(m_currentItemGroup)) { QTreeWidgetItem* currentParent = currentItem->parent(); int index = currentParent->indexOfChild(currentItem); if (index == -1) return; RibbonPage* page = m_currentItemToPage.value(m_currentItemPage); Q_ASSERT(page != Q_NULL); manager->clearActions(group); manager->deleteGroup(page, index); m_currentItemToGroup.remove(currentItem); delete currentItem; } else if (RibbonPage* page = m_currentItemToPage.value(m_currentItemPage)) { int index = m_pageUI.treeRibbon->indexOfTopLevelItem(currentItem); // manager->removePage(page); manager->deletePage(page); m_pageToCurrentItem.remove(page); QListIterator itGroup(manager->pageGroups(page)); while (itGroup.hasNext()) manager->clearActions(itGroup.next()); m_currentItemToPage.remove(currentItem); delete currentItem; if (index == m_pageUI.treeRibbon->topLevelItemCount()) index--; if (index >= 0) { QTreeWidgetItem* item = m_pageUI.treeRibbon->topLevelItem(index); m_pageUI.treeRibbon->setCurrentItem(item); } } setButtons(); } void RibbonBarCustomizePagePrivate::resetClicked() { if (m_ribbonBar) { RibbonCustomizeManager* manager = m_ribbonBar->customizeManager(); Q_ASSERT(manager != NULL); manager->reset(); fillStateRibbon(m_pageUI.switchTabsBox->currentText()); } } template QTreeWidgetItem* currentItem(const QMap& currentItemToObject, QTreeWidgetItem* current) { if (current == Q_NULL) return Q_NULL; if (currentItemToObject.contains(current)) return current; return currentItem(currentItemToObject, current->parent()); } void RibbonBarCustomizePagePrivate::upClicked() { QTreeWidgetItem* currentItem = m_pageUI.treeRibbon->currentItem(); if (!currentItem) return; RibbonCustomizeManager* manager = m_ribbonBar->customizeManager(); Q_ASSERT(manager != NULL); if (m_currentItemGroup && m_currentItemAction) { QTreeWidgetItem* currentParent = currentItem->parent(); int index = currentParent->indexOfChild(currentItem); if (!(index == -1 || index == 0)) { currentParent->takeChild(index); int newIndex = index - 1; currentParent->insertChild(newIndex, currentItem); Q_ASSERT(m_currentItemPage != Q_NULL); QAction* action = m_currentItemToAction.value(currentItem); Q_ASSERT(action != Q_NULL); RibbonGroup* group = m_currentItemToGroup.value(m_currentItemGroup); Q_ASSERT(group != Q_NULL); manager->removeActionAt(group, index); manager->insertAction(group, action, newIndex); m_pageUI.treeRibbon->setCurrentItem(currentItem); } } else if (m_currentItemToPage.contains(currentItem)) { int index = m_pageUI.treeRibbon->indexOfTopLevelItem(currentItem); if (index != -1) { m_pageUI.treeRibbon->takeTopLevelItem(index); int newIndex = index - 1; m_pageUI.treeRibbon->insertTopLevelItem(newIndex, currentItem); manager->movePage(index, newIndex); m_pageUI.treeRibbon->setCurrentItem(currentItem); } } else if (m_currentItemToGroup.contains(currentItem)) { QTreeWidgetItem* currentParent = currentItem->parent(); int index = currentParent->indexOfChild(currentItem); if (!(index == -1 || index == 0)) { currentParent->takeChild(index); int newIndex = index - 1; currentParent->insertChild(newIndex, currentItem); Q_ASSERT(m_currentItemPage != Q_NULL); RibbonPage* page = m_currentItemToPage.value(m_currentItemPage); Q_ASSERT(page != Q_NULL); manager->moveGroup(page, index, newIndex); m_pageUI.treeRibbon->setCurrentItem(currentItem); } } setButtons(); } void RibbonBarCustomizePagePrivate::downClicked() { QTreeWidgetItem* currentItem = m_pageUI.treeRibbon->currentItem(); if (!currentItem) return; RibbonCustomizeManager* manager = m_ribbonBar->customizeManager(); Q_ASSERT(manager != NULL); if (m_currentItemGroup && m_currentItemAction) { QTreeWidgetItem* currentParent = currentItem->parent(); int index = currentParent->indexOfChild(currentItem); if (index != currentParent->childCount() - 1) { currentParent->takeChild(index); int newIndex = index + 1; currentParent->insertChild(newIndex, currentItem); Q_ASSERT(m_currentItemPage != Q_NULL); QAction* action = m_currentItemToAction.value(currentItem); Q_ASSERT(action != Q_NULL); RibbonGroup* group = m_currentItemToGroup.value(m_currentItemGroup); Q_ASSERT(group != Q_NULL); manager->removeActionAt(group, index); manager->insertAction(group, action, newIndex); } } else if (m_currentItemToPage.contains(currentItem)) { int index = m_pageUI.treeRibbon->indexOfTopLevelItem(currentItem); if (index != m_pageUI.treeRibbon->topLevelItemCount() - 1) { m_pageUI.treeRibbon->takeTopLevelItem(index); int newIndex = index + 1; m_pageUI.treeRibbon->insertTopLevelItem(newIndex, currentItem); manager->movePage(index, newIndex); } } else if (m_currentItemToGroup.contains(currentItem)) { QTreeWidgetItem* currentParent = currentItem->parent(); int index = currentParent->indexOfChild(currentItem); if (index != currentParent->childCount() - 1) { currentParent->takeChild(index); int newIndex = index + 1; currentParent->insertChild(newIndex, currentItem); Q_ASSERT(m_currentItemPage != Q_NULL); RibbonPage* page = m_currentItemToPage.value(m_currentItemPage); Q_ASSERT(page != Q_NULL); manager->moveGroup(page, index, newIndex); } } m_pageUI.treeRibbon->setCurrentItem(currentItem); setButtons(); } void RibbonBarCustomizePagePrivate::renameClicked() { QTN_P(RibbonBarCustomizePage); class RenameDialog : public QDialog { public: RenameDialog(QWidget* parent, const QString& currentName) : QDialog(parent) { setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); m_renameDialogUI.setupUi(this); m_renameDialogUI.lineEditName->setText(currentName); } QString currentName() const { return m_renameDialogUI.lineEditName->text(); } protected: Ui::RibbonRenameDialog m_renameDialogUI; }; RibbonCustomizeManager* manager = m_ribbonBar->customizeManager(); Q_ASSERT(manager != Q_NULL); QTreeWidgetItem* currentItem = m_pageUI.treeRibbon->currentItem(); if (!currentItem) return; QString currentName; RibbonPage* page = m_currentItemToPage.value(currentItem); RibbonGroup* group = m_currentItemToGroup.value(currentItem); if (page) { if (!manager->pageName(page).isEmpty()) currentName = manager->pageName(page); else currentName = page->title(); } else if (group) { if (!manager->groupName(group).isEmpty()) currentName = manager->groupName(group); else currentName = group->title(); } if (!currentName.isEmpty()) { RenameDialog renameDialog(&p, currentName); if (renameDialog.exec() == QDialog::Accepted) { QString currentText = renameDialog.currentName(); if (page != Q_NULL) { manager->setPageName(page, currentText); currentText.remove(QChar::fromLatin1('&')); if (page->property(__qtn_Widget_Custom).toString() == QLatin1String("__qtn_Page_Custom")) currentText += m_sufNameCustom; currentItem->setText(0, currentText); } else if (group != Q_NULL) { manager->setGroupName(group, currentText); currentText.remove(QChar::fromLatin1('&')); if (group->property(__qtn_Widget_Custom).toString() == QLatin1String("__qtn_Group_Custom")) currentText += m_sufNameCustom; currentItem->setText(0, currentText); } } } } void RibbonBarCustomizePagePrivate::setCurrentCategoryText(const QString& strCategory) { if (strCategory.isEmpty()) return; if (m_strSeparator == strCategory) { #if (QT_VERSION >= QT_VERSION_CHECK(5, 0, 0)) m_pageUI.comboBoxSourceCategory->setCurrentText(m_currentSourceCategory); #else int index = m_pageUI.comboBoxSourceCategory->findText(m_currentSourceCategory); if (index != -1) m_pageUI.comboBoxSourceCategory->setCurrentIndex(index); #endif return; } RibbonCustomizeManager* manager = m_ribbonBar->customizeManager(); Q_ASSERT(manager != NULL); m_currentSourceItemToPage.clear(); m_currentSourceItemToGroup.clear(); m_currentSourceItemToAction.clear(); m_pageUI.treeCommands->clear(); clearCategoryCaptionTree(m_pageUI.treeCommands); QList actions = manager->actionsByCategory(strCategory); if (actions.size() > 0) { m_pageUI.treeCommands->setRootIsDecorated(false); fillSourceActions(actions); } else { QList pages = manager->pagesByCategory(strCategory); if (pages.size() > 0) { m_pageUI.treeCommands->setRootIsDecorated(true); fillSourcePages(pages, strCategory); } } m_currentSourceCategory = strCategory; setButtons(); } void RibbonBarCustomizePagePrivate::setCurrentTabsText(const QString& strCategory) { // if (strCategory.isEmpty()) // return; fillStateRibbon(strCategory); } void RibbonBarCustomizePagePrivate::currentSourceChanged(QTreeWidgetItem* current) { m_currentSourceItemPage = ::currentItem(m_currentSourceItemToPage, current); m_currentSourceItemGroup = ::currentItem(m_currentSourceItemToGroup, current); m_currentSourceAction = ::currentItem(m_currentSourceItemToAction, current); setButtons(); } void RibbonBarCustomizePagePrivate::currentPageChanged(QTreeWidgetItem* current) { m_currentItemPage = ::currentItem(m_currentItemToPage, current); m_currentItemGroup = ::currentItem(m_currentItemToGroup, current); m_currentItemAction = (m_currentItemGroup && m_currentItemGroup != current) ? current : Q_NULL; setButtons(); } void RibbonBarCustomizePagePrivate::itemPageChanged(QTreeWidgetItem* itemPage, int column) { if (m_currentItemToPage.empty()) return; RibbonCustomizeManager* manager = m_ribbonBar->customizeManager(); Q_ASSERT(manager != Q_NULL); RibbonPage* page = m_currentItemToPage.value(itemPage); if (page == Q_NULL) return; if (itemPage->checkState(column) == Qt::Checked) { if (manager->isPageHidden(page)) m_ribbonBar->customizeManager()->setPageHidden(page, false); } else if (itemPage->checkState(column) == Qt::Unchecked) { if (!manager->isPageHidden(page)) m_ribbonBar->customizeManager()->setPageHidden(page, true); } } /* RibbonBarCustomizePage */ RibbonBarCustomizePage::RibbonBarCustomizePage(RibbonBar* ribbonBar) : QWidget(Q_NULL) { QTN_INIT_PRIVATE(RibbonBarCustomizePage); QTN_D(RibbonBarCustomizePage) d.m_ribbonBar = ribbonBar; d.init(); } RibbonBarCustomizePage::~RibbonBarCustomizePage() { QTN_FINI_PRIVATE(); } RibbonBar* RibbonBarCustomizePage::ribbonBar() const { QTN_D(const RibbonBarCustomizePage) return d.m_ribbonBar; } void RibbonBarCustomizePage::addCustomCategory(const QString& strCategory) { QTN_D(RibbonBarCustomizePage) d.m_sourceCategories.append(strCategory); } void RibbonBarCustomizePage::addSeparatorCategory(const QString& strCategory) { QTN_D(RibbonBarCustomizePage) QString separator = strCategory; if (separator.isEmpty()) separator = QString("----------"); d.m_strSeparator = separator; d.m_sourceCategories.append(separator); } void RibbonBarCustomizePage::accepted() { QTN_D(RibbonBarCustomizePage) if (d.m_wasDisplayed) d.applyClicked(); } void RibbonBarCustomizePage::rejected() { QTN_D(RibbonBarCustomizePage) d.cancelClicked(); } void RibbonBarCustomizePage::showEvent(QShowEvent* event) { QWidget::showEvent(event); QTN_D(RibbonBarCustomizePage) d.m_wasDisplayed = true; d.setupPage(); } void RibbonBarCustomizePage::hideEvent(QHideEvent* event) { QWidget::hideEvent(event); }