From 86bdf5af13fa60292c78cbd4c46ffd9392dbdd6e Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Tue, 10 Aug 2010 16:07:06 +0200 Subject: [PATCH] Designer: Add 'Switch Source/Form' action. Task-number: QTCREATORBUG-1666 Acked-by: aportale --- src/plugins/designer/formeditorw.cpp | 71 +++++++++++++++++++++++++++- src/plugins/designer/formeditorw.h | 3 +- 2 files changed, 72 insertions(+), 2 deletions(-) diff --git a/src/plugins/designer/formeditorw.cpp b/src/plugins/designer/formeditorw.cpp index bc769fa57a6..51d39071c40 100644 --- a/src/plugins/designer/formeditorw.cpp +++ b/src/plugins/designer/formeditorw.cpp @@ -51,9 +51,11 @@ #include #include #include +#include #include #include #include +#include #include #include @@ -153,6 +155,7 @@ FormEditorW::FormEditorW() : m_actionGroupPreviewInStyle(0), m_previewInStyleMenu(0), m_actionAboutPlugins(0), + m_actionSwitchSource(0), m_shortcutMapper(new QSignalMapper(this)), m_context(0), m_modeWidget(0), @@ -540,10 +543,21 @@ void FormEditorW::setupActions() createSeparator(this, am, m_contexts, medit, QLatin1String("FormEditor.Edit.Separator2"), Core::Constants::G_EDIT_OTHER); createSeparator(this, am, m_contexts, mformtools, QLatin1String("FormEditor.Menu.Tools.Separator3")); + + m_actionSwitchSource = new QAction(tr("Switch Source/Form"), this); + connect(m_actionSwitchSource, SIGNAL(triggered()), this, SLOT(switchSourceForm())); + + // Switch form/source in editor/design contexts. + Core::Context switchContexts = m_contexts; + switchContexts.add(Core::Constants::C_EDITORMANAGER); + addToolAction(m_actionSwitchSource, am, switchContexts, QLatin1String("FormEditor.FormSwitchSource"), mformtools, + tr("Shift+F4")); + + createSeparator(this, am, m_contexts, mformtools, QLatin1String("FormEditor.Menu.Tools.Separator4")); QAction *actionFormSettings = m_fwm->actionShowFormWindowSettingsDialog(); addToolAction(actionFormSettings, am, m_contexts, QLatin1String("FormEditor.FormSettings"), mformtools); - createSeparator(this, am, m_contexts, mformtools, QLatin1String("FormEditor.Menu.Tools.Separator4")); + createSeparator(this, am, m_contexts, mformtools, QLatin1String("FormEditor.Menu.Tools.Separator5")); m_actionAboutPlugins = new QAction(tr("About Qt Designer plugins...."), this); addToolAction(m_actionAboutPlugins, am, m_contexts, QLatin1String("FormEditor.AboutPlugins"), mformtools); @@ -837,5 +851,60 @@ void FormEditorW::print() m_core->printer()->setOrientation(oldOrientation); } +// Find out current existing editor file +static QString currentFile(const Core::EditorManager *em) +{ + if (Core::IEditor *editor = em->currentEditor()) + if (const Core::IFile *file = editor->file()) { + const QString fileName = file->fileName(); + if (!fileName.isEmpty() && QFileInfo(fileName).isFile()) + return fileName; + } + return QString(); +} + +// Switch between form ('ui') and source file ('cpp'): +// Find corresponding 'other' file, simply assuming it is in the same directory. +static QString otherFile(const Core::EditorManager *em) +{ + // Determine mime type of current file. + const QString current = currentFile(em); + if (current.isEmpty()) + return QString(); + const Core::MimeDatabase *mdb = Core::ICore::instance()->mimeDatabase(); + const Core::MimeType currentMimeType = mdb->findByFile(current); + if (!currentMimeType) + return QString(); + // Determine potential suffixes of candidate files + // 'ui' -> 'cpp', 'cpp/h' -> 'ui'. + QStringList candidateSuffixes; + if (currentMimeType.type() == QLatin1String(FORM_MIMETYPE)) { + candidateSuffixes += mdb->findByType(QLatin1String(CppTools::Constants::CPP_SOURCE_MIMETYPE)).suffixes(); + } else if (currentMimeType.type() == QLatin1String(CppTools::Constants::CPP_SOURCE_MIMETYPE) + || currentMimeType.type() == QLatin1String(CppTools::Constants::CPP_HEADER_MIMETYPE)) { + candidateSuffixes += mdb->findByType(QLatin1String(FORM_MIMETYPE)).suffixes(); + } else { + return QString(); + } + // Try to find existing file with desired suffix + const QFileInfo currentFI(current); + const QString currentBaseName = currentFI.path() + QLatin1Char('/') + + currentFI.baseName() + QLatin1Char('.'); + foreach (const QString &candidateSuffix, candidateSuffixes) { + const QFileInfo fi(currentBaseName + candidateSuffix); + if (fi.isFile()) + return fi.absoluteFilePath(); + } + return QString(); +} + +void FormEditorW::switchSourceForm() +{ + Core::EditorManager *em = Core::EditorManager::instance(); + const QString fileToOpen = otherFile(em); + if (!fileToOpen.isEmpty()) + em->openEditor(fileToOpen); +} + } // namespace Internal } // namespace Designer diff --git a/src/plugins/designer/formeditorw.h b/src/plugins/designer/formeditorw.h index 3c49c9fb127..e54ee40f90e 100644 --- a/src/plugins/designer/formeditorw.h +++ b/src/plugins/designer/formeditorw.h @@ -126,7 +126,7 @@ private slots: void toolChanged(int); void print(); void setPreviewMenuEnabled(bool e); - + void switchSourceForm(); void updateShortcut(QObject *command); void closeFormEditorsForXmlEditors(QList editors); @@ -186,6 +186,7 @@ private: QMenu *m_previewInStyleMenu; QAction *m_actionAboutPlugins; QAction *m_modeActionSeparator; + QAction *m_actionSwitchSource; QSignalMapper *m_shortcutMapper; DesignerContext *m_context;