11#include <QtDesigner/abstractformwindow.h>
13#include <QtWidgets/qtoolbox.h>
14#include <QtWidgets/qmenu.h>
15#include <QtWidgets/qlayout.h>
16#include <QtWidgets/qapplication.h>
18#include <QtGui/qaction.h>
19#include <QtGui/qevent.h>
21#include <QtCore/qhash.h>
25using namespace Qt::StringLiterals;
27QToolBoxHelper::QToolBoxHelper(QToolBox *toolbox) :
30 m_actionDeletePage(
new QAction(tr(
"Delete Page"),
this)),
31 m_actionInsertPage(
new QAction(tr(
"Before Current Page"),
this)),
32 m_actionInsertPageAfter(
new QAction(tr(
"After Current Page"),
this)),
33 m_actionChangePageOrder(
new QAction(tr(
"Change Page Order..."),
this)),
34 m_pagePromotionTaskMenu(
new qdesigner_internal::PromotionTaskMenu(
nullptr, qdesigner_internal::PromotionTaskMenu::ModeSingleWidget,
this))
36 connect(m_actionDeletePage, &QAction::triggered,
this, &QToolBoxHelper::removeCurrentPage);
37 connect(m_actionInsertPage, &QAction::triggered,
this, &QToolBoxHelper::addPage);
38 connect(m_actionInsertPageAfter, &QAction::triggered,
this, &QToolBoxHelper::addPageAfter);
39 connect(m_actionChangePageOrder, &QAction::triggered,
this, &QToolBoxHelper::changeOrder);
41 m_toolbox->installEventFilter(
this);
44void QToolBoxHelper::install(QToolBox *toolbox)
46 new QToolBoxHelper(toolbox);
49bool QToolBoxHelper::eventFilter(QObject *watched, QEvent *event)
51 switch (event->type()) {
52 case QEvent::ChildPolished:
54 if (watched == m_toolbox) {
55 QChildEvent *ce =
static_cast<QChildEvent *>(event);
56 if (!qstrcmp(ce->child()->metaObject()->className(),
"QToolBoxButton"))
57 ce->child()->installEventFilter(
this);
60 case QEvent::ContextMenu:
61 if (watched != m_toolbox) {
65 QContextMenuEvent *current =
static_cast<QContextMenuEvent *>(event);
66 QContextMenuEvent *copy =
new QContextMenuEvent(current->reason(), current->pos(), current-> globalPos(), current->modifiers());
67 QApplication::postEvent(m_toolbox, copy);
72 case QEvent::MouseButtonRelease:
73 if (watched != m_toolbox)
74 if (QDesignerFormWindowInterface *fw = QDesignerFormWindowInterface::findFormWindow(m_toolbox)) {
76 fw->selectWidget(m_toolbox,
true);
82 return QObject::eventFilter(watched, event);
85QToolBoxHelper *QToolBoxHelper::helperOf(
const QToolBox *toolbox)
88 for (QObject *o : toolbox->children()) {
89 if (!o->isWidgetType())
90 if (QToolBoxHelper *h = qobject_cast<QToolBoxHelper *>(o))
96QMenu *QToolBoxHelper::addToolBoxContextMenuActions(
const QToolBox *toolbox, QMenu *popup)
98 QToolBoxHelper *helper = helperOf(toolbox);
101 return helper->addContextMenuActions(popup);
104void QToolBoxHelper::removeCurrentPage()
106 if (m_toolbox->currentIndex() == -1 || !m_toolbox->widget(m_toolbox->currentIndex()))
109 if (QDesignerFormWindowInterface *fw = QDesignerFormWindowInterface::findFormWindow(m_toolbox)) {
110 qdesigner_internal::DeleteToolBoxPageCommand *cmd =
new qdesigner_internal::DeleteToolBoxPageCommand(fw);
111 cmd->init(m_toolbox);
112 fw->commandHistory()->push(cmd);
116void QToolBoxHelper::addPage()
118 if (QDesignerFormWindowInterface *fw = QDesignerFormWindowInterface::findFormWindow(m_toolbox)) {
119 qdesigner_internal::AddToolBoxPageCommand *cmd =
new qdesigner_internal::AddToolBoxPageCommand(fw);
120 cmd->init(m_toolbox, qdesigner_internal::AddToolBoxPageCommand::InsertBefore);
121 fw->commandHistory()->push(cmd);
125void QToolBoxHelper::changeOrder()
127 QDesignerFormWindowInterface *fw = QDesignerFormWindowInterface::findFormWindow(m_toolbox);
132 const QWidgetList oldPages = qdesigner_internal::OrderDialog::pagesOfContainer(fw->core(), m_toolbox);
133 const int pageCount = oldPages.size();
137 qdesigner_internal::OrderDialog dlg(fw);
138 dlg.setPageList(oldPages);
139 if (dlg.exec() == QDialog::Rejected)
142 const QWidgetList newPages = dlg.pageList();
143 if (newPages == oldPages)
146 fw->beginCommand(tr(
"Change Page Order"));
147 for(
int i=0; i < pageCount; ++i) {
148 if (newPages.at(i) == m_toolbox->widget(i))
150 qdesigner_internal::MoveToolBoxPageCommand *cmd =
new qdesigner_internal::MoveToolBoxPageCommand(fw);
151 cmd->init(m_toolbox, newPages.at(i), i);
152 fw->commandHistory()->push(cmd);
157void QToolBoxHelper::addPageAfter()
159 if (QDesignerFormWindowInterface *fw = QDesignerFormWindowInterface::findFormWindow(m_toolbox)) {
160 qdesigner_internal::AddToolBoxPageCommand *cmd =
new qdesigner_internal::AddToolBoxPageCommand(fw);
161 cmd->init(m_toolbox, qdesigner_internal::AddToolBoxPageCommand::InsertAfter);
162 fw->commandHistory()->push(cmd);
166QPalette::ColorRole QToolBoxHelper::currentItemBackgroundRole()
const
168 const QWidget *w = m_toolbox->widget(0);
170 return QPalette::Window;
171 return w->backgroundRole();
174void QToolBoxHelper::setCurrentItemBackgroundRole(QPalette::ColorRole role)
176 const int count = m_toolbox->count();
177 for (
int i = 0; i < count; ++i) {
178 QWidget *w = m_toolbox->widget(i);
179 w->setBackgroundRole(role);
184QMenu *QToolBoxHelper::addContextMenuActions(QMenu *popup)
const
186 QMenu *pageMenu =
nullptr;
187 const int count = m_toolbox->count();
188 m_actionDeletePage->setEnabled(count > 1);
190 const QString pageSubMenuLabel = tr(
"Page %1 of %2").arg(m_toolbox->currentIndex() + 1).arg(count);
191 pageMenu = popup->addMenu(pageSubMenuLabel);
193 pageMenu->addAction(m_actionDeletePage);
195 if (QWidget *page = m_toolbox->currentWidget ()) {
196 m_pagePromotionTaskMenu->setWidget(page);
197 m_pagePromotionTaskMenu->addActions(QDesignerFormWindowInterface::findFormWindow(m_toolbox),
198 qdesigner_internal::PromotionTaskMenu::SuppressGlobalEdit,
202 QMenu *insertPageMenu = popup->addMenu(tr(
"Insert Page"));
203 insertPageMenu->addAction(m_actionInsertPageAfter);
204 insertPageMenu->addAction(m_actionInsertPage);
206 popup->addAction(m_actionChangePageOrder);
208 popup->addSeparator();
222QToolBoxWidgetPropertySheet::QToolBoxWidgetPropertySheet(QToolBox *object, QObject *parent) :
223 QDesignerPropertySheet(object, parent),
226 createFakeProperty(currentItemTextKey, QVariant::fromValue(qdesigner_internal::PropertySheetStringValue()));
227 createFakeProperty(currentItemNameKey, QString());
228 createFakeProperty(currentItemIconKey, QVariant::fromValue(qdesigner_internal::PropertySheetIconValue()));
229 if (formWindowBase())
230 formWindowBase()->addReloadableProperty(
this, indexOf(currentItemIconKey));
231 createFakeProperty(currentItemToolTipKey, QVariant::fromValue(qdesigner_internal::PropertySheetStringValue()));
232 createFakeProperty(tabSpacingKey, QVariant(tabSpacingDefault));
235QToolBoxWidgetPropertySheet::ToolBoxProperty QToolBoxWidgetPropertySheet::toolBoxPropertyFromName(
const QString &name)
237 static const QHash<QString, ToolBoxProperty> toolBoxPropertyHash = {
238 {currentItemTextKey, PropertyCurrentItemText},
239 {currentItemNameKey, PropertyCurrentItemName},
240 {currentItemIconKey, PropertyCurrentItemIcon},
241 {currentItemToolTipKey, PropertyCurrentItemToolTip},
242 {tabSpacingKey, PropertyTabSpacing}
244 return toolBoxPropertyHash.value(name, PropertyToolBoxNone);
247void QToolBoxWidgetPropertySheet::setProperty(
int index,
const QVariant &value)
249 const ToolBoxProperty toolBoxProperty = toolBoxPropertyFromName(propertyName(index));
251 switch (toolBoxProperty) {
252 case PropertyTabSpacing:
253 m_toolBox->layout()->setSpacing(value.toInt());
255 case PropertyToolBoxNone:
256 QDesignerPropertySheet::setProperty(index, value);
262 const int currentIndex = m_toolBox->currentIndex();
263 QWidget *currentWidget = m_toolBox->currentWidget();
267 switch (toolBoxProperty) {
268 case PropertyCurrentItemText:
269 m_toolBox->setItemText(currentIndex, qvariant_cast<QString>(resolvePropertyValue(index, value)));
270 m_pageToData[currentWidget].text = qvariant_cast<qdesigner_internal::PropertySheetStringValue>(value);
272 case PropertyCurrentItemName:
273 currentWidget->setObjectName(value.toString());
275 case PropertyCurrentItemIcon:
276 m_toolBox->setItemIcon(currentIndex, qvariant_cast<QIcon>(resolvePropertyValue(index, value)));
277 m_pageToData[currentWidget].icon = qvariant_cast<qdesigner_internal::PropertySheetIconValue>(value);
279 case PropertyCurrentItemToolTip:
280 m_toolBox->setItemToolTip(currentIndex, qvariant_cast<QString>(resolvePropertyValue(index, value)));
281 m_pageToData[currentWidget].tooltip = qvariant_cast<qdesigner_internal::PropertySheetStringValue>(value);
283 case PropertyTabSpacing:
284 case PropertyToolBoxNone:
289bool QToolBoxWidgetPropertySheet::isEnabled(
int index)
const
291 switch (toolBoxPropertyFromName(propertyName(index))) {
292 case PropertyToolBoxNone:
293 case PropertyTabSpacing:
294 return QDesignerPropertySheet::isEnabled(index);
298 return m_toolBox->currentIndex() != -1;
301QVariant QToolBoxWidgetPropertySheet::property(
int index)
const
303 const ToolBoxProperty toolBoxProperty = toolBoxPropertyFromName(propertyName(index));
305 switch (toolBoxProperty) {
306 case PropertyTabSpacing:
307 return m_toolBox->layout()->spacing();
308 case PropertyToolBoxNone:
309 return QDesignerPropertySheet::property(index);
314 QWidget *currentWidget = m_toolBox->currentWidget();
315 if (!currentWidget) {
316 if (toolBoxProperty == PropertyCurrentItemIcon)
317 return QVariant::fromValue(qdesigner_internal::PropertySheetIconValue());
318 if (toolBoxProperty == PropertyCurrentItemText)
319 return QVariant::fromValue(qdesigner_internal::PropertySheetStringValue());
320 if (toolBoxProperty == PropertyCurrentItemToolTip)
321 return QVariant::fromValue(qdesigner_internal::PropertySheetStringValue());
322 return QVariant(QString());
326 switch (toolBoxProperty) {
327 case PropertyCurrentItemText:
328 return QVariant::fromValue(m_pageToData.value(currentWidget).text);
329 case PropertyCurrentItemName:
330 return currentWidget->objectName();
331 case PropertyCurrentItemIcon:
332 return QVariant::fromValue(m_pageToData.value(currentWidget).icon);
333 case PropertyCurrentItemToolTip:
334 return QVariant::fromValue(m_pageToData.value(currentWidget).tooltip);
335 case PropertyTabSpacing:
336 case PropertyToolBoxNone:
342bool QToolBoxWidgetPropertySheet::reset(
int index)
344 const ToolBoxProperty toolBoxProperty = toolBoxPropertyFromName(propertyName(index));
346 switch (toolBoxProperty) {
347 case PropertyTabSpacing:
348 setProperty(index, QVariant(tabSpacingDefault));
350 case PropertyToolBoxNone:
351 return QDesignerPropertySheet::reset(index);
356 QWidget *currentWidget = m_toolBox->currentWidget();
361 switch (toolBoxProperty) {
362 case PropertyCurrentItemName:
363 setProperty(index, QString());
365 case PropertyCurrentItemToolTip:
366 m_pageToData[currentWidget].tooltip = qdesigner_internal::PropertySheetStringValue();
367 setProperty(index, QString());
369 case PropertyCurrentItemText:
370 m_pageToData[currentWidget].text = qdesigner_internal::PropertySheetStringValue();
371 setProperty(index, QString());
373 case PropertyCurrentItemIcon:
374 m_pageToData[currentWidget].icon = qdesigner_internal::PropertySheetIconValue();
375 setProperty(index, QIcon());
377 case PropertyTabSpacing:
378 case PropertyToolBoxNone:
384bool QToolBoxWidgetPropertySheet::checkProperty(
const QString &propertyName)
386 switch (toolBoxPropertyFromName(propertyName)) {
387 case PropertyCurrentItemText:
388 case PropertyCurrentItemName:
389 case PropertyCurrentItemToolTip:
390 case PropertyCurrentItemIcon:
Combined button and popup list for selecting options.