14#include <QtDesigner/abstractformwindow.h>
16#include <QtWidgets/qtoolbar.h>
17#include <QtWidgets/qmdisubwindow.h>
18#include <QtWidgets/qstatusbar.h>
19#include <QtWidgets/qmenu.h>
20#include <QtWidgets/qlayout.h>
21#include <QtWidgets/qdockwidget.h>
23#include <QtGui/qaction.h>
24#include <QtGui/qactiongroup.h>
25#include <QtGui/qevent.h>
27#include <QtCore/qurl.h>
28#include <QtCore/qdebug.h>
29#include <QtCore/qmimedata.h>
35using namespace Qt::StringLiterals;
37using ActionList = QList<QAction *>;
43 for (QAction *action : actions) {
44 if (action->property(QDesignerActions::defaultToolbarPropertyName).toBool())
49static QToolBar *
createToolBar(
const QString &title,
const QString &objectName,
50 const ActionList &actions)
52 auto *rc =
new QToolBar;
53 rc->setObjectName(objectName);
54 rc->setWindowTitle(title);
55 addActionsToToolBar(actions, rc);
62 QMainWindow(parent, flags)
73 QMainWindow::closeEvent(e);
76 emit closeEventReceived(e);
88 QToolBar *main = createToolBar(tr(
"Main"), u"mainToolBar"_s,
89 actions->fileActions()->actions());
95 rc.append(createToolBar(tr(
"File"), u"fileToolBar"_s,
96 actions->fileActions()->actions()));
97 rc.append(createToolBar(tr(
"Edit"), u"editToolBar"_s,
98 actions->editActions()->actions()));
99 rc.append(createToolBar(tr(
"Tools"), u"toolsToolBar"_s,
100 actions->toolActions()->actions()));
101 rc.append(createToolBar(tr(
"Form"), u"formToolBar"_s,
102 actions->formActions()->actions()));
109 return tr(
"Qt Widgets Designer");
115 const int version = QT_VERSION;
116 return (version & 0x00FF00) >> 8;
123 m_extension(extension)
125 setFrameStyle(QFrame::StyledPanel | QFrame::Sunken);
127 setAcceptDrops(
true);
128 setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
129 setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
136 if (!d->hasFormat(
"text/uri-list"_L1))
138 const auto urls = d->urls();
141 for (
const auto &url : urls) {
142 const QString fileName = url.toLocalFile();
143 if (!fileName.isEmpty() && fileName.endsWith(m_extension))
144 rc.push_back(fileName);
153 switch (event->type()) {
154 case QEvent::DragEnter: {
155 auto *e =
static_cast<QDragEnterEvent*>(event);
156 if (!uiFiles(e->mimeData()).isEmpty()) {
157 e->acceptProposedAction();
163 auto *e =
static_cast<QDropEvent*>(event);
164 const QStringList files = uiFiles(e->mimeData());
165 for (
const auto &f : files)
167 e->acceptProposedAction();
174 return QMdiArea::event(event);
181 for (QAction *action : al)
182 tbm->addAction(action, title);
189 const QList<QToolBar *> &toolbars,
190 const QList<QDesignerToolWindow *> &toolWindows) :
192 m_configureableMainWindow(configureableMainWindow),
194 m_toolBarMenu(toolBarMenu),
195 m_manager(
new QtToolBarManager(
this)),
196 m_configureAction(
new QAction(tr(
"Configure Toolbars..."),
this)),
199 m_configureAction->setMenuRole(QAction::NoRole);
200 m_configureAction->setObjectName(u"__qt_configure_tool_bars_action"_s);
201 connect(m_configureAction, &QAction::triggered,
this, &ToolBarManager::configureToolBars);
205 for (QToolBar *tb : std::as_const(m_toolbars)) {
206 const QString title = tb->windowTitle();
207 m_manager->addToolBar(tb, title);
208 addActionsToToolBarManager(tb->actions(), title, m_manager);
211 addActionsToToolBarManager(actions
->windowActions()->actions(), tr(
"Window"), m_manager);
212 addActionsToToolBarManager(actions
->helpActions()->actions(), tr(
"Help"), m_manager);
216 auto it = previewActions.begin();
217 for ( ; (*it)->isSeparator() || (*it)->data().metaType().id() == QMetaType::Int; ++it) ;
218 previewActions.erase(previewActions.begin(), it);
219 addActionsToToolBarManager(previewActions, tr(
"Style"), m_manager);
221 const QString dockTitle = tr(
"Dock views");
222 for (QDesignerToolWindow *tw : toolWindows) {
223 if (QAction *action = tw->action())
224 m_manager->addAction(action, dockTitle);
227 addActionsToToolBarManager(actions
->fileActions()->actions(), tr(
"File"), m_manager);
228 addActionsToToolBarManager(actions
->editActions()->actions(), tr(
"Edit"), m_manager);
229 addActionsToToolBarManager(actions
->toolActions()->actions(), tr(
"Tools"), m_manager);
230 addActionsToToolBarManager(actions
->formActions()->actions(), tr(
"Form"), m_manager);
232 m_manager
->addAction(m_configureAction, tr(
"Toolbars"));
240 return t1->windowTitle() < t2->windowTitle();
248 m_toolBarMenu->clear();
249 for (QToolBar *tb : std::as_const(m_toolbars))
250 m_toolBarMenu->addAction(tb->toggleViewAction());
251 m_toolBarMenu->addAction(m_configureAction);
276 const QList<QDesignerToolWindow *> &toolWindows)
278 setObjectName(u"MDIWindow"_s);
279 setWindowTitle(mainWindowTitle());
281 const QList<QToolBar *> toolbars = createToolBars(wb->actionManager(),
false);
282 for (QToolBar *tb : toolbars)
284 auto *dma =
new DockedMdiArea(wb->actionManager()->uiExtension());
285 connect(dma, &DockedMdiArea::fileDropped,
286 this, &DockedMainWindow::fileDropped);
287 connect(dma, &QMdiArea::subWindowActivated,
288 this, &DockedMainWindow::slotSubWindowActivated);
289 setCentralWidget(dma);
291 QStatusBar *sb = statusBar();
299 return static_cast<QMdiArea *>(centralWidget());
305 QWidget *widget = subWindow->widget();
306 if (
auto *fw = qobject_cast<QDesignerFormWindow*>(widget)) {
307 emit formWindowActivated(fw);
308 mdiArea()->setActiveSubWindow(subWindow);
316 QMdiSubWindow *rc =
mdiArea()->addSubWindow(fw, f);
319 if (designerCloseActionShortCut == QKeySequence(QKeySequence::Close)) {
320 const ActionList systemMenuActions = rc->systemMenu()->actions();
321 for (
auto *a : systemMenuActions) {
322 if (a->shortcut() == designerCloseActionShortCut) {
323 a->setShortcutContext(Qt::WidgetShortcut);
334 for (QDesignerToolWindow *tw : tls) {
335 auto *dockWidget =
new QDockWidget;
336 dockWidget->setObjectName(tw->objectName() +
"_dock"_L1);
337 dockWidget->setWindowTitle(tw->windowTitle());
338 addDockWidget(tw->dockWidgetAreaHint(), dockWidget);
339 dockWidget->setWidget(tw);
340 rc.push_back(dockWidget);
352 s.restoreGeometry(
this, QRect(desktopArea.topLeft(), QSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX)));
354 const QByteArray mainWindowState = s.mainWindowState(DockedMode);
355 const bool restored = !mainWindowState.isEmpty() && restoreState(mainWindowState, version);
void restoreSettings(const QDesignerSettings &s, const DockWidgetList &dws, const QRect &desktopArea)
DockedMainWindow(QDesignerWorkbench *wb, QMenu *toolBarMenu, const DesignerToolWindowList &toolWindows)
DockWidgetList addToolWindows(const DesignerToolWindowList &toolWindows)
void saveSettings(QDesignerSettings &) const
QMdiSubWindow * createMdiSubWindow(QWidget *fw, Qt::WindowFlags f, const QKeySequence &designerCloseActionShortCut)
QMdiArea * mdiArea() const
bool event(QEvent *event) override
void closeEvent(QCloseEvent *e) override
This event handler is called with the given event when Qt receives a window close request for a top-l...
static int settingsVersion()
QActionGroup * helpActions() const
QActionGroup * fileActions() const
QActionGroup * styleActions() const
QActionGroup * editActions() const
QActionGroup * formActions() const
QActionGroup * toolActions() const
QActionGroup * windowActions() const
void setToolBarsState(UIMode mode, const QByteArray &mainWindowState)
void setMainWindowState(UIMode mode, const QByteArray &mainWindowState)
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)