51QTabWidgetEventFilter::QTabWidgetEventFilter(QTabWidget *parent) :
54 m_actionDeletePage(
new QAction(tr(
"Delete"),
this)),
55 m_actionInsertPage(
new QAction(tr(
"Before Current Page"),
this)),
56 m_actionInsertPageAfter(
new QAction(tr(
"After Current Page"),
this)),
57 m_pagePromotionTaskMenu(
new qdesigner_internal::PromotionTaskMenu(
nullptr, qdesigner_internal::PromotionTaskMenu::ModeSingleWidget,
this))
59 tabBar()->setAcceptDrops(
true);
60 tabBar()->installEventFilter(
this);
62 connect(m_actionInsertPage, &QAction::triggered,
this, &QTabWidgetEventFilter::addPage);
63 connect(m_actionInsertPageAfter, &QAction::triggered,
this, &QTabWidgetEventFilter::addPageAfter);
64 connect(m_actionDeletePage, &QAction::triggered,
this, &QTabWidgetEventFilter::removeCurrentPage);
111bool QTabWidgetEventFilter::eventFilter(QObject *o, QEvent *e)
113 const QEvent::Type type = e->type();
117 case QEvent::MouseButtonDblClick:
118 case QEvent::MouseButtonPress:
119 case QEvent::MouseButtonRelease:
120 case QEvent::MouseMove:
121 case QEvent::DragLeave:
122 case QEvent::DragEnter:
123 case QEvent::DragMove:
133 QDesignerFormWindowInterface *fw = formWindow();
139 case QEvent::MouseButtonDblClick:
141 case QEvent::MouseButtonPress: {
142 QMouseEvent *mev =
static_cast<QMouseEvent*>(e);
143 if (QDesignerFormWindowInterface *fw = formWindow()) {
144 fw->clearSelection();
145 fw->selectWidget(m_tabWidget,
true);
147 if (mev->button() & Qt::LeftButton) {
148 m_mousePressed =
true;
149 m_pressPoint = mev->position().toPoint();
151 QTabBar *tabbar = tabBar();
152 const int count = tabbar->count();
153 for (
int i = 0; i < count; ++i) {
154 if (tabbar->tabRect(i).contains(m_pressPoint)) {
155 if (i != tabbar->currentIndex()) {
156 qdesigner_internal::SetPropertyCommand *cmd =
new qdesigner_internal::SetPropertyCommand(fw);
157 cmd->init(m_tabWidget, u"currentIndex"_s, i);
158 fw->commandHistory()->push(cmd);
166 case QEvent::MouseButtonRelease:
167 m_mousePressed =
false;
170 case QEvent::MouseMove: {
171 QMouseEvent *mouseEvent =
static_cast<QMouseEvent*>(e);
172 if (m_mousePressed && canMove(m_pressPoint, mouseEvent)) {
173 const int index = m_tabWidget->currentIndex();
177 m_mousePressed =
false;
178 QDrag *drg =
new QDrag(m_tabWidget);
179 drg->setMimeData(
new qdesigner_internal::MyMimeData(m_tabWidget));
182 m_dragPage = m_tabWidget->currentWidget();
183 m_dragLabel = m_tabWidget->tabText(index);
184 m_dragIcon = m_tabWidget->tabIcon(index);
185 if (m_dragIcon.isNull()) {
186 QLabel *label =
new QLabel(m_dragLabel);
188 drg->setPixmap(label->grab(QRect(0, 0, -1, -1)));
189 label->deleteLater();
191 drg->setPixmap(m_dragIcon.pixmap(22, 22));
194 m_tabWidget->removeTab(m_dragIndex);
196 const Qt::DropActions dropAction = drg->exec(Qt::MoveAction);
198 if (dropAction == Qt::IgnoreAction) {
200 m_tabWidget->insertTab(m_dragIndex, m_dragPage, m_dragIcon, m_dragLabel);
201 m_tabWidget->setCurrentIndex(m_dragIndex);
205 m_dropIndicator->hide();
209 case QEvent::DragLeave: {
211 m_dropIndicator->hide();
214 case QEvent::DragEnter:
215 case QEvent::DragMove: {
216 QDragMoveEvent *de =
static_cast<QDragMoveEvent*>(e);
217 if (!qdesigner_internal::MyMimeData::fromMyTab(de->mimeData(), m_tabWidget))
220 if (de->proposedAction() == Qt::MoveAction)
221 de->acceptProposedAction();
223 de->setDropAction(Qt::MoveAction);
228 const int index = pageFromPosition(de->position().toPoint(), rect);
230 if (!m_dropIndicator) {
231 m_dropIndicator =
new QWidget(m_tabWidget);
232 QPalette p = m_dropIndicator->palette();
233 p.setColor(m_tabWidget->backgroundRole(), Qt::red);
234 m_dropIndicator->setPalette(p);
238 if (index == m_tabWidget->count())
239 pos = tabBar()->mapToParent(QPoint(rect.x() + rect.width(), rect.y()));
241 pos = tabBar()->mapToParent(QPoint(rect.x(), rect.y()));
243 m_dropIndicator->setGeometry(pos.x(), pos.y() , 3, rect.height());
244 m_dropIndicator->show();
248 QDropEvent *de =
static_cast<QDropEvent*>(e);
249 if (!qdesigner_internal::MyMimeData::fromMyTab(de->mimeData(), m_tabWidget))
251 de->acceptProposedAction();
255 const int newIndex = pageFromPosition(de->position().toPoint(), rect);
257 qdesigner_internal::MoveTabPageCommand *cmd =
new qdesigner_internal::MoveTabPageCommand(fw);
258 m_tabWidget->insertTab(m_dragIndex, m_dragPage, m_dragIcon, m_dragLabel);
259 cmd->init(m_tabWidget, m_dragPage, m_dragIcon, m_dragLabel, m_dragIndex, newIndex);
260 fw->commandHistory()->push(cmd);
329QMenu *QTabWidgetEventFilter::addContextMenuActions(QMenu *popup)
331 QMenu *pageMenu =
nullptr;
332 const int count = m_tabWidget->count();
333 m_actionDeletePage->setEnabled(count);
335 const int currentIndex = m_tabWidget->currentIndex();
336 const QString pageSubMenuLabel = tr(
"Page %1 of %2").arg(currentIndex + 1).arg(count);
337 pageMenu = popup->addMenu(pageSubMenuLabel);
338 pageMenu->addAction(m_actionDeletePage);
340 if (QWidget *page = m_tabWidget->currentWidget ()) {
341 m_pagePromotionTaskMenu->setWidget(page);
342 m_pagePromotionTaskMenu->addActions(QDesignerFormWindowInterface::findFormWindow(m_tabWidget),
343 qdesigner_internal::PromotionTaskMenu::SuppressGlobalEdit,
346 QMenu *insertPageMenu = popup->addMenu(tr(
"Insert Page"));
347 insertPageMenu->addAction(m_actionInsertPageAfter);
348 insertPageMenu->addAction(m_actionInsertPage);
350 QAction *insertPageAction = popup->addAction(tr(
"Insert Page"));
351 connect(insertPageAction, &QAction::triggered,
this, &QTabWidgetEventFilter::addPage);
353 popup->addSeparator();
366QTabWidgetPropertySheet::QTabWidgetPropertySheet(QTabWidget *object, QObject *parent) :
367 QDesignerPropertySheet(object, parent),
370 createFakeProperty(currentTabTextKey, QVariant::fromValue(qdesigner_internal::PropertySheetStringValue()));
371 createFakeProperty(currentTabNameKey, QString());
372 createFakeProperty(currentTabIconKey, QVariant::fromValue(qdesigner_internal::PropertySheetIconValue()));
373 if (formWindowBase())
374 formWindowBase()->addReloadableProperty(
this, indexOf(currentTabIconKey));
375 createFakeProperty(currentTabToolTipKey, QVariant::fromValue(qdesigner_internal::PropertySheetStringValue()));
376 createFakeProperty(currentTabWhatsThisKey, QVariant::fromValue(qdesigner_internal::PropertySheetStringValue()));
378 createFakeProperty(tabMovableKey, QVariant(
false));
393void QTabWidgetPropertySheet::setProperty(
int index,
const QVariant &value)
395 const TabWidgetProperty tabWidgetProperty = tabWidgetPropertyFromName(propertyName(index));
396 if (tabWidgetProperty == PropertyTabWidgetNone) {
397 QDesignerPropertySheet::setProperty(index, value);
402 const int currentIndex = m_tabWidget->currentIndex();
403 QWidget *currentWidget = m_tabWidget->currentWidget();
407 switch (tabWidgetProperty) {
408 case PropertyCurrentTabText:
409 m_tabWidget->setTabText(currentIndex, qvariant_cast<QString>(resolvePropertyValue(index, value)));
410 m_pageToData[currentWidget].text = qvariant_cast<qdesigner_internal::PropertySheetStringValue>(value);
412 case PropertyCurrentTabName:
413 currentWidget->setObjectName(value.toString());
415 case PropertyCurrentTabIcon:
416 m_tabWidget->setTabIcon(currentIndex, qvariant_cast<QIcon>(resolvePropertyValue(index, value)));
417 m_pageToData[currentWidget].icon = qvariant_cast<qdesigner_internal::PropertySheetIconValue>(value);
419 case PropertyCurrentTabToolTip:
420 m_tabWidget->setTabToolTip(currentIndex, qvariant_cast<QString>(resolvePropertyValue(index, value)));
421 m_pageToData[currentWidget].tooltip = qvariant_cast<qdesigner_internal::PropertySheetStringValue>(value);
423 case PropertyCurrentTabWhatsThis:
424 m_tabWidget->setTabWhatsThis(currentIndex, qvariant_cast<QString>(resolvePropertyValue(index, value)));
425 m_pageToData[currentWidget].whatsthis = qvariant_cast<qdesigner_internal::PropertySheetStringValue>(value);
427 case PropertyTabWidgetNone:
439QVariant QTabWidgetPropertySheet::property(
int index)
const
441 const TabWidgetProperty tabWidgetProperty = tabWidgetPropertyFromName(propertyName(index));
442 if (tabWidgetProperty == PropertyTabWidgetNone)
443 return QDesignerPropertySheet::property(index);
446 QWidget *currentWidget = m_tabWidget->currentWidget();
447 if (!currentWidget) {
448 if (tabWidgetProperty == PropertyCurrentTabIcon)
449 return QVariant::fromValue(qdesigner_internal::PropertySheetIconValue());
450 if (tabWidgetProperty == PropertyCurrentTabText)
451 return QVariant::fromValue(qdesigner_internal::PropertySheetStringValue());
452 if (tabWidgetProperty == PropertyCurrentTabToolTip)
453 return QVariant::fromValue(qdesigner_internal::PropertySheetStringValue());
454 if (tabWidgetProperty == PropertyCurrentTabWhatsThis)
455 return QVariant::fromValue(qdesigner_internal::PropertySheetStringValue());
456 return QVariant(QString());
460 switch (tabWidgetProperty) {
461 case PropertyCurrentTabText:
462 return QVariant::fromValue(m_pageToData.value(currentWidget).text);
463 case PropertyCurrentTabName:
464 return currentWidget->objectName();
465 case PropertyCurrentTabIcon:
466 return QVariant::fromValue(m_pageToData.value(currentWidget).icon);
467 case PropertyCurrentTabToolTip:
468 return QVariant::fromValue(m_pageToData.value(currentWidget).tooltip);
469 case PropertyCurrentTabWhatsThis:
470 return QVariant::fromValue(m_pageToData.value(currentWidget).whatsthis);
471 case PropertyTabWidgetNone:
477bool QTabWidgetPropertySheet::reset(
int index)
479 const TabWidgetProperty tabWidgetProperty = tabWidgetPropertyFromName(propertyName(index));
480 if (tabWidgetProperty == PropertyTabWidgetNone)
481 return QDesignerPropertySheet::reset(index);
484 QWidget *currentWidget = m_tabWidget->currentWidget();
489 switch (tabWidgetProperty) {
490 case PropertyCurrentTabName:
491 setProperty(index, QString());
493 case PropertyCurrentTabToolTip:
494 m_pageToData[currentWidget].tooltip = qdesigner_internal::PropertySheetStringValue();
495 setProperty(index, QString());
497 case PropertyCurrentTabWhatsThis:
498 m_pageToData[currentWidget].whatsthis = qdesigner_internal::PropertySheetStringValue();
499 setProperty(index, QString());
501 case PropertyCurrentTabText:
502 m_pageToData[currentWidget].text = qdesigner_internal::PropertySheetStringValue();
503 setProperty(index, QString());
505 case PropertyCurrentTabIcon:
506 m_pageToData[currentWidget].icon = qdesigner_internal::PropertySheetIconValue();
507 setProperty(index, QIcon());
509 case PropertyTabWidgetNone: