12#include <QtDesigner/abstractformwindow.h>
14#include <QtWidgets/qtoolbutton.h>
15#include <QtWidgets/qmenu.h>
16#include <QtWidgets/qstackedwidget.h>
18#include <QtGui/qaction.h>
19#include <QtGui/qevent.h>
21#include <QtCore/qdebug.h>
25using namespace Qt::StringLiterals;
29 QToolButton *rc =
new QToolButton();
30 rc->setAttribute(Qt::WA_NoChildEventsForParent,
true);
31 rc->setParent(parent);
32 rc->setObjectName(name);
34 rc->setAutoRaise(
true);
35 rc->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
36 rc->setFixedSize(QSize(15, 15));
41QStackedWidgetPreviewEventFilter::QStackedWidgetPreviewEventFilter(QStackedWidget *parent) :
43 m_buttonToolTipEnabled(
false),
44 m_stackedWidget(parent),
45 m_prev(createToolButton(m_stackedWidget, Qt::LeftArrow, u"__qt__passive_prev"_s)),
46 m_next(createToolButton(m_stackedWidget, Qt::RightArrow, u"__qt__passive_next"_s))
48 connect(m_prev, &QAbstractButton::clicked,
this, &QStackedWidgetPreviewEventFilter::prevPage);
49 connect(m_next, &QAbstractButton::clicked,
this, &QStackedWidgetPreviewEventFilter::nextPage);
52 m_stackedWidget->installEventFilter(
this);
53 m_prev->installEventFilter(
this);
54 m_next->installEventFilter(
this);
57void QStackedWidgetPreviewEventFilter::install(QStackedWidget *stackedWidget)
59 new QStackedWidgetPreviewEventFilter(stackedWidget);
62void QStackedWidgetPreviewEventFilter::updateButtons()
64 m_prev->move(m_stackedWidget->width() - 31, 1);
68 m_next->move(m_stackedWidget->width() - 16, 1);
73void QStackedWidgetPreviewEventFilter::prevPage()
75 if (QDesignerFormWindowInterface *fw = QDesignerFormWindowInterface::findFormWindow(stackedWidget())) {
77 fw->selectWidget(stackedWidget(),
true);
79 const int count = m_stackedWidget->count();
81 int newIndex = m_stackedWidget->currentIndex() - 1;
88void QStackedWidgetPreviewEventFilter::nextPage()
90 if (QDesignerFormWindowInterface *fw = QDesignerFormWindowInterface::findFormWindow(stackedWidget())) {
92 fw->selectWidget(stackedWidget(),
true);
94 const int count = m_stackedWidget->count();
96 gotoPage((m_stackedWidget->currentIndex() + 1) % count);
99bool QStackedWidgetPreviewEventFilter::eventFilter(QObject *watched, QEvent *event)
101 if (watched->isWidgetType()) {
102 if (watched == m_stackedWidget) {
103 switch (event->type()) {
104 case QEvent::LayoutRequest:
107 case QEvent::ChildAdded:
108 case QEvent::ChildRemoved:
117 if (m_buttonToolTipEnabled && (watched == m_next || watched == m_prev)) {
118 switch (event->type()) {
119 case QEvent::ToolTip:
120 updateButtonToolTip(watched);
127 return QObject::eventFilter(watched, event);
130void QStackedWidgetPreviewEventFilter::gotoPage(
int page)
132 m_stackedWidget->setCurrentIndex(page);
138 if (
const QDesignerFormWindowInterface *fw = QDesignerFormWindowInterface::findFormWindow(w))
139 return qdesigner_internal::WidgetFactory::classNameOf(fw->core(), w);
140 return u"Stacked widget"_s;
143void QStackedWidgetPreviewEventFilter::updateButtonToolTip(QObject *o)
146 const QString msg = tr(
"Go to previous page of %1 '%2' (%3/%4).")
147 .arg(stackedClassName(m_stackedWidget), m_stackedWidget->objectName())
148 .arg(m_stackedWidget->currentIndex() + 1)
149 .arg(m_stackedWidget->count());
150 m_prev->setToolTip(msg);
153 const QString msg = tr(
"Go to next page of %1 '%2' (%3/%4).")
154 .arg(stackedClassName(m_stackedWidget), m_stackedWidget->objectName())
155 .arg(m_stackedWidget->currentIndex() + 1)
156 .arg(m_stackedWidget->count());
157 m_next->setToolTip(msg);
163QStackedWidgetEventFilter::QStackedWidgetEventFilter(QStackedWidget *parent) :
164 QStackedWidgetPreviewEventFilter(parent),
165 m_actionPreviousPage(
new QAction(tr(
"Previous Page"),
this)),
166 m_actionNextPage(
new QAction(tr(
"Next Page"),
this)),
167 m_actionDeletePage(
new QAction(tr(
"Delete"),
this)),
168 m_actionInsertPage(
new QAction(tr(
"Before Current Page"),
this)),
169 m_actionInsertPageAfter(
new QAction(tr(
"After Current Page"),
this)),
170 m_actionChangePageOrder(
new QAction(tr(
"Change Page Order..."),
this)),
171 m_pagePromotionTaskMenu(
new qdesigner_internal::PromotionTaskMenu(
nullptr, qdesigner_internal::PromotionTaskMenu::ModeSingleWidget,
this))
173 setButtonToolTipEnabled(
true);
174 connect(m_actionPreviousPage, &QAction::triggered,
this, &QStackedWidgetEventFilter::prevPage);
175 connect(m_actionNextPage, &QAction::triggered,
this, &QStackedWidgetEventFilter::nextPage);
176 connect(m_actionDeletePage, &QAction::triggered,
this, &QStackedWidgetEventFilter::removeCurrentPage);
177 connect(m_actionInsertPage, &QAction::triggered,
this, &QStackedWidgetEventFilter::addPage);
178 connect(m_actionInsertPageAfter, &QAction::triggered,
this, &QStackedWidgetEventFilter::addPageAfter);
179 connect(m_actionChangePageOrder, &QAction::triggered,
this, &QStackedWidgetEventFilter::changeOrder);
182void QStackedWidgetEventFilter::install(QStackedWidget *stackedWidget)
184 new QStackedWidgetEventFilter(stackedWidget);
187QStackedWidgetEventFilter *QStackedWidgetEventFilter::eventFilterOf(
const QStackedWidget *stackedWidget)
190 for (QObject *o : stackedWidget->children()) {
191 if (!o->isWidgetType())
192 if (QStackedWidgetEventFilter *ef = qobject_cast<QStackedWidgetEventFilter *>(o))
198QMenu *QStackedWidgetEventFilter::addStackedWidgetContextMenuActions(
const QStackedWidget *stackedWidget, QMenu *popup)
200 QStackedWidgetEventFilter *filter = eventFilterOf(stackedWidget);
203 return filter->addContextMenuActions(popup);
206void QStackedWidgetEventFilter::removeCurrentPage()
208 if (stackedWidget()->currentIndex() == -1)
211 if (QDesignerFormWindowInterface *fw = QDesignerFormWindowInterface::findFormWindow(stackedWidget())) {
212 qdesigner_internal::DeleteStackedWidgetPageCommand *cmd =
new qdesigner_internal::DeleteStackedWidgetPageCommand(fw);
213 cmd->init(stackedWidget());
214 fw->commandHistory()->push(cmd);
218void QStackedWidgetEventFilter::changeOrder()
220 QDesignerFormWindowInterface *fw = QDesignerFormWindowInterface::findFormWindow(stackedWidget());
225 const QWidgetList oldPages = qdesigner_internal::OrderDialog::pagesOfContainer(fw->core(), stackedWidget());
226 const int pageCount = oldPages.size();
230 qdesigner_internal::OrderDialog dlg(fw);
231 dlg.setPageList(oldPages);
232 if (dlg.exec() == QDialog::Rejected)
235 const QWidgetList newPages = dlg.pageList();
236 if (newPages == oldPages)
239 fw->beginCommand(tr(
"Change Page Order"));
240 for(
int i=0; i < pageCount; ++i) {
241 if (newPages.at(i) == stackedWidget()->widget(i))
243 qdesigner_internal::MoveStackedWidgetCommand *cmd =
new qdesigner_internal::MoveStackedWidgetCommand(fw);
244 cmd->init(stackedWidget(), newPages.at(i), i);
245 fw->commandHistory()->push(cmd);
250void QStackedWidgetEventFilter::addPage()
252 if (QDesignerFormWindowInterface *fw = QDesignerFormWindowInterface::findFormWindow(stackedWidget())) {
253 qdesigner_internal::AddStackedWidgetPageCommand *cmd =
new qdesigner_internal::AddStackedWidgetPageCommand(fw);
254 cmd->init(stackedWidget(), qdesigner_internal::AddStackedWidgetPageCommand::InsertBefore);
255 fw->commandHistory()->push(cmd);
259void QStackedWidgetEventFilter::addPageAfter()
261 if (QDesignerFormWindowInterface *fw = QDesignerFormWindowInterface::findFormWindow(stackedWidget())) {
262 qdesigner_internal::AddStackedWidgetPageCommand *cmd =
new qdesigner_internal::AddStackedWidgetPageCommand(fw);
263 cmd->init(stackedWidget(), qdesigner_internal::AddStackedWidgetPageCommand::InsertAfter);
264 fw->commandHistory()->push(cmd);
268void QStackedWidgetEventFilter::gotoPage(
int page) {
270 if (QDesignerFormWindowInterface *fw = QDesignerFormWindowInterface::findFormWindow(stackedWidget())) {
271 qdesigner_internal::SetPropertyCommand *cmd =
new qdesigner_internal::SetPropertyCommand(fw);
272 cmd->init(stackedWidget(), u"currentIndex"_s, page);
273 fw->commandHistory()->push(cmd);
274 fw->emitSelectionChanged();
277 QStackedWidgetPreviewEventFilter::gotoPage(page);
281QMenu *QStackedWidgetEventFilter::addContextMenuActions(QMenu *popup)
283 QMenu *pageMenu =
nullptr;
284 const int count = stackedWidget()->count();
285 const bool hasSeveralPages = count > 1;
286 m_actionDeletePage->setEnabled(count);
288 const QString pageSubMenuLabel = tr(
"Page %1 of %2").arg(stackedWidget()->currentIndex() + 1).arg(count);
289 pageMenu = popup->addMenu(pageSubMenuLabel);
290 pageMenu->addAction(m_actionDeletePage);
292 if (QWidget *page = stackedWidget()->currentWidget ()) {
293 m_pagePromotionTaskMenu->setWidget(page);
294 m_pagePromotionTaskMenu->addActions(QDesignerFormWindowInterface::findFormWindow(stackedWidget()),
295 qdesigner_internal::PromotionTaskMenu::SuppressGlobalEdit,
298 QMenu *insertPageMenu = popup->addMenu(tr(
"Insert Page"));
299 insertPageMenu->addAction(m_actionInsertPageAfter);
300 insertPageMenu->addAction(m_actionInsertPage);
302 QAction *insertPageAction = popup->addAction(tr(
"Insert Page"));
303 connect(insertPageAction, &QAction::triggered,
this, &QStackedWidgetEventFilter::addPage);
305 popup->addAction(m_actionNextPage);
306 m_actionNextPage->setEnabled(hasSeveralPages);
307 popup->addAction(m_actionPreviousPage);
308 m_actionPreviousPage->setEnabled(hasSeveralPages);
309 popup->addAction(m_actionChangePageOrder);
310 m_actionChangePageOrder->setEnabled(hasSeveralPages);
311 popup->addSeparator();
319QStackedWidgetPropertySheet::QStackedWidgetPropertySheet(QStackedWidget *object, QObject *parent) :
320 QDesignerPropertySheet(object, parent),
321 m_stackedWidget(object)
323 createFakeProperty(pagePropertyName, QString());
326bool QStackedWidgetPropertySheet::isEnabled(
int index)
const
328 if (propertyName(index) != pagePropertyName)
329 return QDesignerPropertySheet::isEnabled(index);
330 return m_stackedWidget->currentWidget() !=
nullptr;
333void QStackedWidgetPropertySheet::setProperty(
int index,
const QVariant &value)
335 if (propertyName(index) == pagePropertyName) {
336 if (QWidget *w = m_stackedWidget->currentWidget())
337 w->setObjectName(value.toString());
339 QDesignerPropertySheet::setProperty(index, value);
343QVariant QStackedWidgetPropertySheet::property(
int index)
const
345 if (propertyName(index) == pagePropertyName) {
346 if (
const QWidget *w = m_stackedWidget->currentWidget())
347 return w->objectName();
350 return QDesignerPropertySheet::property(index);
353bool QStackedWidgetPropertySheet::reset(
int index)
355 if (propertyName(index) == pagePropertyName) {
356 setProperty(index, QString());
359 return QDesignerPropertySheet::reset(index);
362bool QStackedWidgetPropertySheet::checkProperty(
const QString &propertyName)
364 return propertyName != pagePropertyName;
Combined button and popup list for selecting options.
static QString stackedClassName(QStackedWidget *w)
static constexpr auto pagePropertyName
static QToolButton * createToolButton(QWidget *parent, Qt::ArrowType at, const QString &name)