13#include <QtDesigner/abstractformwindow.h>
15#include <QtWidgets/qtoolbar.h>
16#include <QtWidgets/qmdisubwindow.h>
17#include <QtWidgets/qstatusbar.h>
18#include <QtWidgets/qmenu.h>
19#include <QtWidgets/qlayout.h>
20#include <QtWidgets/qdockwidget.h>
22#include <QtGui/qaction.h>
23#include <QtGui/qactiongroup.h>
24#include <QtGui/qevent.h>
26#include <QtCore/qurl.h>
27#include <QtCore/qdebug.h>
28#include <QtCore/qmimedata.h>
34using namespace Qt::StringLiterals;
36using ActionList = QList<QAction *>;
42 for (QAction *action : actions) {
43 if (action->property(QDesignerActions::defaultToolbarPropertyName).toBool())
48static QToolBar *
createToolBar(
const QString &title,
const QString &objectName,
49 const ActionList &actions)
51 QToolBar *rc =
new QToolBar;
52 rc->setObjectName(objectName);
53 rc->setWindowTitle(title);
54 addActionsToToolBar(actions, rc);
61 QMainWindow(parent, flags)
72 QMainWindow::closeEvent(e);
75 emit closeEventReceived(e);
87 QToolBar *main = createToolBar(tr(
"Main"), u"mainToolBar"_s,
88 actions->fileActions()->actions());
94 rc.append(createToolBar(tr(
"File"), u"fileToolBar"_s,
95 actions->fileActions()->actions()));
96 rc.append(createToolBar(tr(
"Edit"), u"editToolBar"_s,
97 actions->editActions()->actions()));
98 rc.append(createToolBar(tr(
"Tools"), u"toolsToolBar"_s,
99 actions->toolActions()->actions()));
100 rc.append(createToolBar(tr(
"Form"), u"formToolBar"_s,
101 actions->formActions()->actions()));
108 return tr(
"Qt Widgets Designer");
114 const int version = QT_VERSION;
115 return (version & 0x00FF00) >> 8;
122 m_extension(extension)
124 setFrameStyle(QFrame::StyledPanel | QFrame::Sunken);
126 setAcceptDrops(
true);
127 setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
128 setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
135 if (!d->hasFormat(
"text/uri-list"_L1))
137 const auto urls = d->urls();
140 for (
const auto &url : urls) {
141 const QString fileName = url.toLocalFile();
142 if (!fileName.isEmpty() && fileName.endsWith(m_extension))
143 rc.push_back(fileName);
152 switch (event->type()) {
153 case QEvent::DragEnter: {
154 QDragEnterEvent *e =
static_cast<QDragEnterEvent*>(event);
155 if (!uiFiles(e->mimeData()).isEmpty()) {
156 e->acceptProposedAction();
162 QDropEvent *e =
static_cast<QDropEvent*>(event);
163 const QStringList files = uiFiles(e->mimeData());
164 for (
const auto &f : files)
166 e->acceptProposedAction();
173 return QMdiArea::event(event);
180 for (QAction *action : al)
181 tbm->addAction(action, title);
188 const QList<QToolBar *> &toolbars,
189 const QList<QDesignerToolWindow *> &toolWindows) :
191 m_configureableMainWindow(configureableMainWindow),
193 m_toolBarMenu(toolBarMenu),
194 m_manager(
new QtToolBarManager(
this)),
195 m_configureAction(
new QAction(tr(
"Configure Toolbars..."),
this)),
198 m_configureAction->setMenuRole(QAction::NoRole);
199 m_configureAction->setObjectName(u"__qt_configure_tool_bars_action"_s);
200 connect(m_configureAction, &QAction::triggered,
this, &ToolBarManager::configureToolBars);
204 for (QToolBar *tb : std::as_const(m_toolbars)) {
205 const QString title = tb->windowTitle();
206 m_manager->addToolBar(tb, title);
207 addActionsToToolBarManager(tb->actions(), title, m_manager);
210 addActionsToToolBarManager(actions
->windowActions()->actions(), tr(
"Window"), m_manager);
211 addActionsToToolBarManager(actions
->helpActions()->actions(), tr(
"Help"), m_manager);
214 ActionList previewActions = actions->styleActions()->actions();
215 auto it = previewActions.begin();
216 for ( ; (*it)->isSeparator() || (*it)->data().metaType().id() == QMetaType::Int; ++it) ;
217 previewActions.erase(previewActions.begin(), it);
218 addActionsToToolBarManager(previewActions, tr(
"Style"), m_manager);
220 const QString dockTitle = tr(
"Dock views");
221 for (QDesignerToolWindow *tw : toolWindows) {
222 if (QAction *action = tw->action())
223 m_manager->addAction(action, dockTitle);
226 addActionsToToolBarManager(actions
->fileActions()->actions(), tr(
"File"), m_manager);
227 addActionsToToolBarManager(actions
->editActions()->actions(), tr(
"Edit"), m_manager);
228 addActionsToToolBarManager(actions
->toolActions()->actions(), tr(
"Tools"), m_manager);
229 addActionsToToolBarManager(actions
->formActions()->actions(), tr(
"Form"), m_manager);
231 m_manager->addAction(m_configureAction, tr(
"Toolbars"));
239 return t1->windowTitle() < t2->windowTitle();
245 std::stable_sort(m_toolbars.begin(), m_toolbars.end(), toolBarTitleLessThan);
247 m_toolBarMenu->clear();
248 for (QToolBar *tb : std::as_const(m_toolbars))
249 m_toolBarMenu->addAction(tb->toggleViewAction());
250 m_toolBarMenu->addAction(m_configureAction);
275 const QList<QDesignerToolWindow *> &toolWindows)
277 setObjectName(u"MDIWindow"_s);
278 setWindowTitle(mainWindowTitle());
280 const QList<QToolBar *> toolbars = createToolBars(wb->actionManager(),
false);
281 for (QToolBar *tb : toolbars)
283 DockedMdiArea *dma =
new DockedMdiArea(wb->actionManager()->uiExtension());
284 connect(dma, &DockedMdiArea::fileDropped,
285 this, &DockedMainWindow::fileDropped);
286 connect(dma, &QMdiArea::subWindowActivated,
287 this, &DockedMainWindow::slotSubWindowActivated);
288 setCentralWidget(dma);
290 QStatusBar *sb = statusBar();
298 return static_cast<QMdiArea *>(centralWidget());
304 QWidget *widget = subWindow->widget();
306 emit formWindowActivated(fw);
307 mdiArea()->setActiveSubWindow(subWindow);
313QMdiSubWindow *
DockedMainWindow::createMdiSubWindow(
QWidget *fw, Qt::WindowFlags f,
const QKeySequence &designerCloseActionShortCut)
315 QMdiSubWindow *rc =
mdiArea()->addSubWindow(fw, f);
318 if (designerCloseActionShortCut == QKeySequence(QKeySequence::Close)) {
319 const ActionList systemMenuActions = rc->systemMenu()->actions();
320 for (
auto *a : systemMenuActions) {
321 if (a->shortcut() == designerCloseActionShortCut) {
322 a->setShortcutContext(Qt::WidgetShortcut);
333 for (QDesignerToolWindow *tw : tls) {
334 QDockWidget *dockWidget =
new QDockWidget;
335 dockWidget->setObjectName(tw->objectName() +
"_dock"_L1);
336 dockWidget->setWindowTitle(tw->windowTitle());
337 addDockWidget(tw->dockWidgetAreaHint(), dockWidget);
338 dockWidget->setWidget(tw);
339 rc.push_back(dockWidget);
351 s.restoreGeometry(
this, QRect(desktopArea.topLeft(), QSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX)));
353 const QByteArray mainWindowState = s.mainWindowState(DockedMode);
354 const bool restored = !mainWindowState.isEmpty() && restoreState(mainWindowState, version);
367 s.setToolBarsState(
DockedMode, m_toolBarManager->saveState(version));
369 s.setMainWindowState(
DockedMode, saveState(version));
DockedMainWindow(QDesignerWorkbench *wb, QMenu *toolBarMenu, const DesignerToolWindowList &toolWindows)
DockWidgetList addToolWindows(const DesignerToolWindowList &toolWindows)
void saveSettings(QDesignerSettings &) const
QMdiArea * mdiArea() const
bool event(QEvent *event) override
static int settingsVersion()
QActionGroup * helpActions() const
QActionGroup * fileActions() const
QActionGroup * editActions() const
QActionGroup * formActions() const
QActionGroup * toolActions() const
QActionGroup * windowActions() const
QByteArray toolBarsState(UIMode mode) const
void saveGeometryFor(const QWidget *w)
QDesignerActions * actionManager() const
static void addActionsToToolBar(const ActionList &actions, QToolBar *t)
static void addActionsToToolBarManager(const ActionList &al, const QString &title, QtToolBarManager *tbm)
static QToolBar * createToolBar(const QString &title, const QString &objectName, const ActionList &actions)
bool toolBarTitleLessThan(const QToolBar *t1, const QToolBar *t2)