11#include <QtDesigner/abstractformwindow.h>
13#include <QtWidgets/qtoolbutton.h>
14#include <QtWidgets/qmenu.h>
15#include <QtWidgets/qstackedwidget.h>
17#include <QtGui/qaction.h>
18#include <QtGui/qevent.h>
20#include <QtCore/qdebug.h>
24using namespace Qt::StringLiterals;
28 QToolButton *rc =
new QToolButton();
29 rc->setAttribute(Qt::WA_NoChildEventsForParent,
true);
30 rc->setParent(parent);
31 rc->setObjectName(name);
33 rc->setAutoRaise(
true);
34 rc->setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
35 rc->setFixedSize(QSize(15, 15));
40QStackedWidgetPreviewEventFilter::QStackedWidgetPreviewEventFilter(QStackedWidget *parent) :
42 m_buttonToolTipEnabled(
false),
43 m_stackedWidget(parent),
44 m_prev(createToolButton(m_stackedWidget, Qt::LeftArrow, u"__qt__passive_prev"_s)),
45 m_next(createToolButton(m_stackedWidget, Qt::RightArrow, u"__qt__passive_next"_s))
47 connect(m_prev, &QAbstractButton::clicked,
this, &QStackedWidgetPreviewEventFilter::prevPage);
48 connect(m_next, &QAbstractButton::clicked,
this, &QStackedWidgetPreviewEventFilter::nextPage);
51 m_stackedWidget->installEventFilter(
this);
52 m_prev->installEventFilter(
this);
53 m_next->installEventFilter(
this);
56void QStackedWidgetPreviewEventFilter::install(QStackedWidget *stackedWidget)
58 new QStackedWidgetPreviewEventFilter(stackedWidget);
61void QStackedWidgetPreviewEventFilter::updateButtons()
63 m_prev->move(m_stackedWidget->width() - 31, 1);
67 m_next->move(m_stackedWidget->width() - 16, 1);
72void QStackedWidgetPreviewEventFilter::prevPage()
74 if (QDesignerFormWindowInterface *fw = QDesignerFormWindowInterface::findFormWindow(stackedWidget())) {
76 fw->selectWidget(stackedWidget(),
true);
78 const int count = m_stackedWidget->count();
80 int newIndex = m_stackedWidget->currentIndex() - 1;
87void QStackedWidgetPreviewEventFilter::nextPage()
89 if (QDesignerFormWindowInterface *fw = QDesignerFormWindowInterface::findFormWindow(stackedWidget())) {
91 fw->selectWidget(stackedWidget(),
true);
93 const int count = m_stackedWidget->count();
95 gotoPage((m_stackedWidget->currentIndex() + 1) % count);
98bool QStackedWidgetPreviewEventFilter::eventFilter(QObject *watched, QEvent *event)
100 if (watched->isWidgetType()) {
101 if (watched == m_stackedWidget) {
102 switch (event->type()) {
103 case QEvent::LayoutRequest:
106 case QEvent::ChildAdded:
107 case QEvent::ChildRemoved:
116 if (m_buttonToolTipEnabled && (watched == m_next || watched == m_prev)) {
117 switch (event->type()) {
118 case QEvent::ToolTip:
119 updateButtonToolTip(watched);
126 return QObject::eventFilter(watched, event);
129void QStackedWidgetPreviewEventFilter::gotoPage(
int page)
131 m_stackedWidget->setCurrentIndex(page);
137 if (
const QDesignerFormWindowInterface *fw = QDesignerFormWindowInterface::findFormWindow(w))
138 return qdesigner_internal::WidgetFactory::classNameOf(fw->core(), w);
139 return u"Stacked widget"_s;
142void QStackedWidgetPreviewEventFilter::updateButtonToolTip(QObject *o)
145 const QString msg = tr(
"Go to previous page of %1 '%2' (%3/%4).")
146 .arg(stackedClassName(m_stackedWidget), m_stackedWidget->objectName())
147 .arg(m_stackedWidget->currentIndex() + 1)
148 .arg(m_stackedWidget->count());
149 m_prev->setToolTip(msg);
152 const QString msg = tr(
"Go to next page of %1 '%2' (%3/%4).")
153 .arg(stackedClassName(m_stackedWidget), m_stackedWidget->objectName())
154 .arg(m_stackedWidget->currentIndex() + 1)
155 .arg(m_stackedWidget->count());
156 m_next->setToolTip(msg);
162QStackedWidgetEventFilter::QStackedWidgetEventFilter(QStackedWidget *parent) :
163 QStackedWidgetPreviewEventFilter(parent),
164 m_actionPreviousPage(
new QAction(tr(
"Previous Page"),
this)),
165 m_actionNextPage(
new QAction(tr(
"Next Page"),
this)),
166 m_actionDeletePage(
new QAction(tr(
"Delete"),
this)),
167 m_actionInsertPage(
new QAction(tr(
"Before Current Page"),
this)),
168 m_actionInsertPageAfter(
new QAction(tr(
"After Current Page"),
this)),
169 m_actionChangePageOrder(
new QAction(tr(
"Change Page Order..."),
this)),
170 m_pagePromotionTaskMenu(
new qdesigner_internal::PromotionTaskMenu(
nullptr, qdesigner_internal::PromotionTaskMenu::ModeSingleWidget,
this))
172 setButtonToolTipEnabled(
true);
173 connect(m_actionPreviousPage, &QAction::triggered,
this, &QStackedWidgetEventFilter::prevPage);
174 connect(m_actionNextPage, &QAction::triggered,
this, &QStackedWidgetEventFilter::nextPage);
175 connect(m_actionDeletePage, &QAction::triggered,
this, &QStackedWidgetEventFilter::removeCurrentPage);
176 connect(m_actionInsertPage, &QAction::triggered,
this, &QStackedWidgetEventFilter::addPage);
177 connect(m_actionInsertPageAfter, &QAction::triggered,
this, &QStackedWidgetEventFilter::addPageAfter);
178 connect(m_actionChangePageOrder, &QAction::triggered,
this, &QStackedWidgetEventFilter::changeOrder);
181void QStackedWidgetEventFilter::install(QStackedWidget *stackedWidget)
183 new QStackedWidgetEventFilter(stackedWidget);
186QStackedWidgetEventFilter *QStackedWidgetEventFilter::eventFilterOf(
const QStackedWidget *stackedWidget)
189 for (QObject *o : stackedWidget->children()) {
190 if (!o->isWidgetType())
191 if (QStackedWidgetEventFilter *ef = qobject_cast<QStackedWidgetEventFilter *>(o))
197QMenu *QStackedWidgetEventFilter::addStackedWidgetContextMenuActions(
const QStackedWidget *stackedWidget, QMenu *popup)
199 QStackedWidgetEventFilter *filter = eventFilterOf(stackedWidget);
202 return filter->addContextMenuActions(popup);
205void QStackedWidgetEventFilter::removeCurrentPage()
207 if (stackedWidget()->currentIndex() == -1)
210 if (QDesignerFormWindowInterface *fw = QDesignerFormWindowInterface::findFormWindow(stackedWidget())) {
211 qdesigner_internal::DeleteStackedWidgetPageCommand *cmd =
new qdesigner_internal::DeleteStackedWidgetPageCommand(fw);
212 cmd->init(stackedWidget());
213 fw->commandHistory()->push(cmd);
217void QStackedWidgetEventFilter::changeOrder()
219 QDesignerFormWindowInterface *fw = QDesignerFormWindowInterface::findFormWindow(stackedWidget());
224 const QWidgetList oldPages = qdesigner_internal::OrderDialog::pagesOfContainer(fw->core(), stackedWidget());
225 const int pageCount = oldPages.size();
229 qdesigner_internal::OrderDialog dlg(fw);
230 dlg.setPageList(oldPages);
231 if (dlg.exec() == QDialog::Rejected)
234 const QWidgetList newPages = dlg.pageList();
235 if (newPages == oldPages)
238 fw->beginCommand(tr(
"Change Page Order"));
239 for(
int i=0; i < pageCount; ++i) {
240 if (newPages.at(i) == stackedWidget()->widget(i))
242 qdesigner_internal::MoveStackedWidgetCommand *cmd =
new qdesigner_internal::MoveStackedWidgetCommand(fw);
243 cmd->init(stackedWidget(), newPages.at(i), i);
244 fw->commandHistory()->push(cmd);
249void QStackedWidgetEventFilter::addPage()
251 if (QDesignerFormWindowInterface *fw = QDesignerFormWindowInterface::findFormWindow(stackedWidget())) {
252 qdesigner_internal::AddStackedWidgetPageCommand *cmd =
new qdesigner_internal::AddStackedWidgetPageCommand(fw);
253 cmd->init(stackedWidget(), qdesigner_internal::AddStackedWidgetPageCommand::InsertBefore);
254 fw->commandHistory()->push(cmd);
258void QStackedWidgetEventFilter::addPageAfter()
260 if (QDesignerFormWindowInterface *fw = QDesignerFormWindowInterface::findFormWindow(stackedWidget())) {
261 qdesigner_internal::AddStackedWidgetPageCommand *cmd =
new qdesigner_internal::AddStackedWidgetPageCommand(fw);
262 cmd->init(stackedWidget(), qdesigner_internal::AddStackedWidgetPageCommand::InsertAfter);
263 fw->commandHistory()->push(cmd);
267void QStackedWidgetEventFilter::gotoPage(
int page) {
269 if (QDesignerFormWindowInterface *fw = QDesignerFormWindowInterface::findFormWindow(stackedWidget())) {
270 qdesigner_internal::SetPropertyCommand *cmd =
new qdesigner_internal::SetPropertyCommand(fw);
271 cmd->init(stackedWidget(), u"currentIndex"_s, page);
272 fw->commandHistory()->push(cmd);
273 fw->emitSelectionChanged();
276 QStackedWidgetPreviewEventFilter::gotoPage(page);
280QMenu *QStackedWidgetEventFilter::addContextMenuActions(QMenu *popup)
282 QMenu *pageMenu =
nullptr;
283 const int count = stackedWidget()->count();
284 const bool hasSeveralPages = count > 1;
285 m_actionDeletePage->setEnabled(count);
287 const QString pageSubMenuLabel = tr(
"Page %1 of %2").arg(stackedWidget()->currentIndex() + 1).arg(count);
288 pageMenu = popup->addMenu(pageSubMenuLabel);
289 pageMenu->addAction(m_actionDeletePage);
291 if (QWidget *page = stackedWidget()->currentWidget ()) {
292 m_pagePromotionTaskMenu->setWidget(page);
293 m_pagePromotionTaskMenu->addActions(QDesignerFormWindowInterface::findFormWindow(stackedWidget()),
294 qdesigner_internal::PromotionTaskMenu::SuppressGlobalEdit,
297 QMenu *insertPageMenu = popup->addMenu(tr(
"Insert Page"));
298 insertPageMenu->addAction(m_actionInsertPageAfter);
299 insertPageMenu->addAction(m_actionInsertPage);
301 QAction *insertPageAction = popup->addAction(tr(
"Insert Page"));
302 connect(insertPageAction, &QAction::triggered,
this, &QStackedWidgetEventFilter::addPage);
304 popup->addAction(m_actionNextPage);
305 m_actionNextPage->setEnabled(hasSeveralPages);
306 popup->addAction(m_actionPreviousPage);
307 m_actionPreviousPage->setEnabled(hasSeveralPages);
308 popup->addAction(m_actionChangePageOrder);
309 m_actionChangePageOrder->setEnabled(hasSeveralPages);
310 popup->addSeparator();
318QStackedWidgetPropertySheet::QStackedWidgetPropertySheet(QStackedWidget *object, QObject *parent) :
319 QDesignerPropertySheet(object, parent),
320 m_stackedWidget(object)
322 createFakeProperty(pagePropertyName, QString());
325bool QStackedWidgetPropertySheet::isEnabled(
int index)
const
327 if (propertyName(index) != pagePropertyName)
328 return QDesignerPropertySheet::isEnabled(index);
329 return m_stackedWidget->currentWidget() !=
nullptr;
332void QStackedWidgetPropertySheet::setProperty(
int index,
const QVariant &value)
334 if (propertyName(index) == pagePropertyName) {
335 if (QWidget *w = m_stackedWidget->currentWidget())
336 w->setObjectName(value.toString());
338 QDesignerPropertySheet::setProperty(index, value);
342QVariant QStackedWidgetPropertySheet::property(
int index)
const
344 if (propertyName(index) == pagePropertyName) {
345 if (
const QWidget *w = m_stackedWidget->currentWidget())
346 return w->objectName();
349 return QDesignerPropertySheet::property(index);
352bool QStackedWidgetPropertySheet::reset(
int index)
354 if (propertyName(index) == pagePropertyName) {
355 setProperty(index, QString());
358 return QDesignerPropertySheet::reset(index);
361bool QStackedWidgetPropertySheet::checkProperty(
const QString &propertyName)
363 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)