From 2cb3beab427df41131c3d252db3491210969bbdf Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Wed, 28 Sep 2016 15:43:13 +0200 Subject: [PATCH] Simplify Qt external editors (Linguist, Designer) Remove unneeded extra classes, and unneeded parameters. Change-Id: Ib4ceccd7d92bd8ca5de122e174f2579a2a8a9390 Reviewed-by: Tobias Hunger --- .../qmakeprojectmanager/externaleditors.cpp | 115 ++++++++---------- .../qmakeprojectmanager/externaleditors.h | 60 ++++----- .../qmakeprojectmanagerplugin.cpp | 7 +- 3 files changed, 76 insertions(+), 106 deletions(-) diff --git a/src/plugins/qmakeprojectmanager/externaleditors.cpp b/src/plugins/qmakeprojectmanager/externaleditors.cpp index ccafbe6b212..0d4791d028f 100644 --- a/src/plugins/qmakeprojectmanager/externaleditors.cpp +++ b/src/plugins/qmakeprojectmanager/externaleditors.cpp @@ -61,27 +61,32 @@ static inline QString msgAppNotFound(const QString &id) } // -- Commands and helpers -static QString linguistBinary() +static QString linguistBinary(const QtSupport::BaseQtVersion *qtVersion) { + if (qtVersion) + return qtVersion->linguistCommand(); return QLatin1String(Utils::HostOsInfo::isMacHost() ? "Linguist" : "linguist"); } -static QString designerBinary() +static QString designerBinary(const QtSupport::BaseQtVersion *qtVersion) { + if (qtVersion) + return qtVersion->designerCommand(); return QLatin1String(Utils::HostOsInfo::isMacHost() ? "Designer" : "designer"); } // Mac: Change the call 'Foo.app/Contents/MacOS/Foo ' to // 'open -a Foo.app '. doesn't support generic command line arguments -static void createMacOpenCommand(QString *binary, QStringList *arguments) +static ExternalQtEditor::LaunchData createMacOpenCommand(const ExternalQtEditor::LaunchData &data) { - const int appFolderIndex = binary->lastIndexOf(QLatin1String("/Contents/MacOS/")); + ExternalQtEditor::LaunchData openData = data; + const int appFolderIndex = data.binary.lastIndexOf(QLatin1String("/Contents/MacOS/")); if (appFolderIndex != -1) { - binary->truncate(appFolderIndex); - arguments->push_front(*binary); - arguments->push_front(QLatin1String("-a")); - *binary = QLatin1String("open"); + openData.binary = "open"; + openData.arguments = QStringList({ QString("-a"), data.binary.left(appFolderIndex) }) + + data.arguments; } + return openData; } static const char designerIdC[] = "Qt.Designer"; @@ -94,14 +99,34 @@ static const char linguistDisplayName[] = QT_TRANSLATE_NOOP("OpenWith::Editors", ExternalQtEditor::ExternalQtEditor(Core::Id id, const QString &displayName, const QString &mimetype, - QObject *parent) : - Core::IExternalEditor(parent), + const CommandForQtVersion &commandForQtVersion) : m_mimeTypes(mimetype), m_id(id), - m_displayName(displayName) + m_displayName(displayName), + m_commandForQtVersion(commandForQtVersion) { } +ExternalQtEditor *ExternalQtEditor::createLinguistEditor() +{ + return new ExternalQtEditor(linguistIdC, + QLatin1String(linguistDisplayName), + QLatin1String(ProjectExplorer::Constants::LINGUIST_MIMETYPE), + linguistBinary); +} + +ExternalQtEditor *ExternalQtEditor::createDesignerEditor() +{ + if (Utils::HostOsInfo::isMacHost()) { + return new ExternalQtEditor(designerIdC, + QLatin1String(designerDisplayName), + QLatin1String(ProjectExplorer::Constants::FORM_MIMETYPE), + designerBinary); + } else { + return new DesignerExternalEditor; + } +} + QStringList ExternalQtEditor::mimeTypes() const { return m_mimeTypes; @@ -118,41 +143,43 @@ QString ExternalQtEditor::displayName() const } bool ExternalQtEditor::getEditorLaunchData(const QString &fileName, - QtVersionCommandAccessor commandAccessor, - const QString &fallbackBinary, - const QStringList &additionalArguments, - bool useMacOpenCommand, - EditorLaunchData *data, + LaunchData *data, QString *errorMessage) const { // Get the binary either from the current Qt version of the project or Path if (Project *project = SessionManager::projectForFile(Utils::FileName::fromString(fileName))) { if (const Target *target = project->activeTarget()) { if (const QtSupport::BaseQtVersion *qtVersion = QtSupport::QtKitInformation::qtVersion(target->kit())) { - data->binary = (qtVersion->*commandAccessor)(); + data->binary = m_commandForQtVersion(qtVersion); data->workingDirectory = project->projectDirectory().toString(); } } } if (data->binary.isEmpty()) { data->workingDirectory.clear(); - data->binary = Utils::SynchronousProcess::locateBinary(fallbackBinary); + data->binary = Utils::SynchronousProcess::locateBinary(m_commandForQtVersion(nullptr)); } if (data->binary.isEmpty()) { *errorMessage = msgAppNotFound(id().toString()); return false; } // Setup binary + arguments, use Mac Open if appropriate - data->arguments = additionalArguments; data->arguments.push_back(fileName); - if (Utils::HostOsInfo::isMacHost() && useMacOpenCommand) - createMacOpenCommand(&(data->binary), &(data->arguments)); + if (Utils::HostOsInfo::isMacHost()) + *data = createMacOpenCommand(*data); if (debug) qDebug() << Q_FUNC_INFO << '\n' << data->binary << data->arguments; return true; } -bool ExternalQtEditor::startEditorProcess(const EditorLaunchData &data, QString *errorMessage) +bool ExternalQtEditor::startEditor(const QString &fileName, QString *errorMessage) +{ + LaunchData data; + return getEditorLaunchData(fileName, &data, errorMessage) + && startEditorProcess(data, errorMessage); +} + +bool ExternalQtEditor::startEditorProcess(const LaunchData &data, QString *errorMessage) { if (debug) qDebug() << Q_FUNC_INFO << '\n' << data.binary << data.arguments << data.workingDirectory; @@ -164,47 +191,12 @@ bool ExternalQtEditor::startEditorProcess(const EditorLaunchData &data, QString return true; } -// --------------- LinguistExternalEditor -LinguistExternalEditor::LinguistExternalEditor(QObject *parent) : - ExternalQtEditor(linguistIdC, - QLatin1String(linguistDisplayName), - QLatin1String(ProjectExplorer::Constants::LINGUIST_MIMETYPE), - parent) -{ -} - -bool LinguistExternalEditor::startEditor(const QString &fileName, QString *errorMessage) -{ - EditorLaunchData data; - return getEditorLaunchData(fileName, &QtSupport::BaseQtVersion::linguistCommand, - linguistBinary(), QStringList(), true, &data, errorMessage) - && startEditorProcess(data, errorMessage); -} - -// --------------- MacDesignerExternalEditor, using Mac 'open' -MacDesignerExternalEditor::MacDesignerExternalEditor(QObject *parent) : - ExternalQtEditor(designerIdC, - QLatin1String(designerDisplayName), - QLatin1String(ProjectExplorer::Constants::FORM_MIMETYPE), - parent) -{ -} - -bool MacDesignerExternalEditor::startEditor(const QString &fileName, QString *errorMessage) -{ - EditorLaunchData data; - return getEditorLaunchData(fileName, &QtSupport::BaseQtVersion::designerCommand, - designerBinary(), QStringList(), true, &data, errorMessage) - && startEditorProcess(data, errorMessage); - return false; -} - // --------------- DesignerExternalEditor with Designer Tcp remote control. -DesignerExternalEditor::DesignerExternalEditor(QObject *parent) : +DesignerExternalEditor::DesignerExternalEditor() : ExternalQtEditor(designerIdC, QLatin1String(designerDisplayName), QLatin1String(Designer::Constants::FORM_MIMETYPE), - parent) + designerBinary) { } @@ -225,10 +217,9 @@ void DesignerExternalEditor::processTerminated(const QString &binary) bool DesignerExternalEditor::startEditor(const QString &fileName, QString *errorMessage) { - EditorLaunchData data; + LaunchData data; // Find the editor binary - if (!getEditorLaunchData(fileName, &QtSupport::BaseQtVersion::designerCommand, - designerBinary(), QStringList(), false, &data, errorMessage)) { + if (!getEditorLaunchData(fileName, &data, errorMessage)) { return false; } // Known one? diff --git a/src/plugins/qmakeprojectmanager/externaleditors.h b/src/plugins/qmakeprojectmanager/externaleditors.h index f80e1c41a92..d06026f28fd 100644 --- a/src/plugins/qmakeprojectmanager/externaleditors.h +++ b/src/plugins/qmakeprojectmanager/externaleditors.h @@ -52,64 +52,46 @@ class ExternalQtEditor : public Core::IExternalEditor Q_OBJECT public: - virtual QStringList mimeTypes() const; - virtual Core::Id id() const; - virtual QString displayName() const; + static ExternalQtEditor *createLinguistEditor(); + static ExternalQtEditor *createDesignerEditor(); -protected: - // Member function pointer for a QtVersion function return a string (command) - typedef QString (QtSupport::BaseQtVersion::*QtVersionCommandAccessor)() const; + QStringList mimeTypes() const override; + Core::Id id() const override; + QString displayName() const override; + + bool startEditor(const QString &fileName, QString *errorMessage) override; // Data required to launch the editor - struct EditorLaunchData { + struct LaunchData { QString binary; QStringList arguments; QString workingDirectory; }; - explicit ExternalQtEditor(Core::Id id, - const QString &displayName, - const QString &mimetype, - QObject *parent = 0); +protected: + // Member function pointer for a QtVersion function return a string (command) + using CommandForQtVersion = std::function; + + ExternalQtEditor(Core::Id id, + const QString &displayName, + const QString &mimetype, + const CommandForQtVersion &commandForQtVersion); // Try to retrieve the binary of the editor from the Qt version, // prepare arguments accordingly (Mac "open" if desired) bool getEditorLaunchData(const QString &fileName, - QtVersionCommandAccessor commandAccessor, - const QString &fallbackBinary, - const QStringList &additionalArguments, - bool useMacOpenCommand, - EditorLaunchData *data, + LaunchData *data, QString *errorMessage) const; // Create and start a detached GUI process executing in the background. // Set the project environment if there is one. - bool startEditorProcess(const EditorLaunchData &data, QString *errorMessage); + bool startEditorProcess(const LaunchData &data, QString *errorMessage); private: const QStringList m_mimeTypes; const Core::Id m_id; const QString m_displayName; -}; - -// Qt Linguist -class LinguistExternalEditor : public ExternalQtEditor -{ - Q_OBJECT -public: - explicit LinguistExternalEditor(QObject *parent = 0); - virtual bool startEditor(const QString &fileName, QString *errorMessage); -}; - -// Qt Designer on Mac: Make use of the Mac's 'open' mechanism to -// ensure files are opened in the same (per version) instance. - -class MacDesignerExternalEditor : public ExternalQtEditor -{ - Q_OBJECT -public: - explicit MacDesignerExternalEditor(QObject *parent = 0); - virtual bool startEditor(const QString &fileName, QString *errorMessage); + const CommandForQtVersion m_commandForQtVersion; }; /* Qt Designer on the remaining platforms: Uses Designer's own @@ -120,9 +102,9 @@ class DesignerExternalEditor : public ExternalQtEditor { Q_OBJECT public: - explicit DesignerExternalEditor(QObject *parent = 0); + DesignerExternalEditor(); - virtual bool startEditor(const QString &fileName, QString *errorMessage); + bool startEditor(const QString &fileName, QString *errorMessage) override; private: void processTerminated(const QString &binary); diff --git a/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp b/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp index b3e9b0ad2b0..a1d269a1886 100644 --- a/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp @@ -111,11 +111,8 @@ bool QmakeProjectManagerPlugin::initialize(const QStringList &arguments, QString addAutoReleasedObject(new QmakeBuildConfigurationFactory); addAutoReleasedObject(new DesktopQmakeRunConfigurationFactory); - if (Utils::HostOsInfo::isMacHost()) - addAutoReleasedObject(new MacDesignerExternalEditor); - else - addAutoReleasedObject(new DesignerExternalEditor); - addAutoReleasedObject(new LinguistExternalEditor); + addAutoReleasedObject(ExternalQtEditor::createDesignerEditor()); + addAutoReleasedObject(ExternalQtEditor::createLinguistEditor()); addAutoReleasedObject(new ProFileEditorFactory);