From ee095ef5d545600b2508a302a15ba6220d43b9cb Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Wed, 5 Oct 2016 13:22:55 +0200 Subject: [PATCH 01/13] Implement diff for unsaved changes Task-number: QTCREATORBUG-9732 Change-Id: I7e0f1d18046451ac1bc84b8c28113d72f63642a8 Reviewed-by: Leena Miettinen Reviewed-by: Tobias Hunger --- src/plugins/diffeditor/diffeditorplugin.cpp | 302 +++++++++++++++++--- src/plugins/diffeditor/diffeditorplugin.h | 14 +- 2 files changed, 276 insertions(+), 40 deletions(-) diff --git a/src/plugins/diffeditor/diffeditorplugin.cpp b/src/plugins/diffeditor/diffeditorplugin.cpp index 9f0e42738fc..5c5a2d6da83 100644 --- a/src/plugins/diffeditor/diffeditorplugin.cpp +++ b/src/plugins/diffeditor/diffeditorplugin.cpp @@ -33,25 +33,189 @@ #include #include +#include #include #include #include #include #include +#include #include #include +#include + #include namespace DiffEditor { namespace Internal { -class FileDiffController : public DiffEditorController +class DiffFilesController : public DiffEditorController { Q_OBJECT public: - FileDiffController(Core::IDocument *document, const QString &leftFileName, + DiffFilesController(Core::IDocument *document); + +protected: + FileData diffFiles(const QString &leftContents, const QString &rightContents); +}; + +DiffFilesController::DiffFilesController(Core::IDocument *document) + : DiffEditorController(document) +{} + +FileData DiffFilesController::diffFiles(const QString &leftContents, const QString &rightContents) +{ + Differ differ; + QList diffList = differ.cleanupSemantics(differ.diff(leftContents, rightContents)); + + QList leftDiffList; + QList rightDiffList; + Differ::splitDiffList(diffList, &leftDiffList, &rightDiffList); + QList outputLeftDiffList; + QList outputRightDiffList; + + if (ignoreWhitespace()) { + const QList leftIntermediate + = Differ::moveWhitespaceIntoEqualities(leftDiffList); + const QList rightIntermediate + = Differ::moveWhitespaceIntoEqualities(rightDiffList); + Differ::ignoreWhitespaceBetweenEqualities(leftIntermediate, rightIntermediate, + &outputLeftDiffList, &outputRightDiffList); + } else { + outputLeftDiffList = leftDiffList; + outputRightDiffList = rightDiffList; + } + + const ChunkData chunkData = DiffUtils::calculateOriginalData( + outputLeftDiffList, outputRightDiffList); + FileData fileData = DiffUtils::calculateContextData(chunkData, contextLineCount(), 0); + + return fileData; +} + +class DiffCurrentFileController : public DiffFilesController +{ + Q_OBJECT +public: + DiffCurrentFileController(Core::IDocument *document, const QString &fileName); + +protected: + void reload(); + +private: + QString m_fileName; +}; + +DiffCurrentFileController::DiffCurrentFileController(Core::IDocument *document, const QString &fileName) : + DiffFilesController(document), m_fileName(fileName) +{ } + +void DiffCurrentFileController::reload() +{ + QList fileDataList; + + TextEditor::TextDocument *textDocument = qobject_cast( + Core::DocumentModel::documentForFilePath(m_fileName)); + + if (textDocument && textDocument->isModified()) { + QString errorString; + Utils::TextFileFormat format = textDocument->format(); + + QString leftText; + bool leftFileExists = true; + if (Utils::TextFileFormat::readFile(m_fileName, + format.codec, + &leftText, &format, &errorString) + != Utils::TextFileFormat::ReadSuccess) { + leftFileExists = false; + } + + const QString rightText = textDocument->plainText(); + + FileData fileData = diffFiles(leftText, rightText); + fileData.leftFileInfo.fileName = m_fileName; + fileData.rightFileInfo.fileName = m_fileName; + fileData.leftFileInfo.typeInfo = tr("Saved"); + fileData.rightFileInfo.typeInfo = tr("Modified"); + + if (!leftFileExists) + fileData.fileOperation = FileData::NewFile; + + fileDataList << fileData; + } + + setDiffFiles(fileDataList); + reloadFinished(true); +} + +///////////////// + +class DiffAllModifiedFilesController : public DiffFilesController +{ + Q_OBJECT +public: + DiffAllModifiedFilesController(Core::IDocument *document); + +protected: + void reload(); +}; + +DiffAllModifiedFilesController::DiffAllModifiedFilesController(Core::IDocument *document) : + DiffFilesController(document) +{ } + +void DiffAllModifiedFilesController::reload() +{ + QList openedDocuments = + Core::DocumentModel::openedDocuments(); + + QList fileDataList; + + foreach (Core::IDocument *doc, openedDocuments) { + TextEditor::TextDocument *textDocument = qobject_cast(doc); + + if (textDocument && textDocument->isModified()) { + QString errorString; + Utils::TextFileFormat format = textDocument->format(); + + QString leftText; + bool leftFileExists = true; + const QString fileName = textDocument->filePath().toString(); + if (Utils::TextFileFormat::readFile(fileName, + format.codec, + &leftText, &format, &errorString) + != Utils::TextFileFormat::ReadSuccess) { + leftFileExists = false; + } + + const QString rightText = textDocument->plainText(); + + FileData fileData = diffFiles(leftText, rightText); + fileData.leftFileInfo.fileName = fileName; + fileData.rightFileInfo.fileName = fileName; + fileData.leftFileInfo.typeInfo = tr("Saved"); + fileData.rightFileInfo.typeInfo = tr("Modified"); + + if (!leftFileExists) + fileData.fileOperation = FileData::NewFile; + + fileDataList << fileData; + } + } + + setDiffFiles(fileDataList); + reloadFinished(true); +} + +///////////////// + +class DiffExternalFilesController : public DiffFilesController +{ + Q_OBJECT +public: + DiffExternalFilesController(Core::IDocument *document, const QString &leftFileName, const QString &rightFileName); protected: @@ -62,12 +226,12 @@ private: QString m_rightFileName; }; -FileDiffController::FileDiffController(Core::IDocument *document, const QString &leftFileName, +DiffExternalFilesController::DiffExternalFilesController(Core::IDocument *document, const QString &leftFileName, const QString &rightFileName) : - DiffEditorController(document), m_leftFileName(leftFileName), m_rightFileName(rightFileName) + DiffFilesController(document), m_leftFileName(leftFileName), m_rightFileName(rightFileName) { } -void FileDiffController::reload() +void DiffExternalFilesController::reload() { QString errorString; Utils::TextFileFormat format; @@ -91,30 +255,7 @@ void FileDiffController::reload() rightFileExists = false; } - Differ differ; - QList diffList = differ.cleanupSemantics(differ.diff(leftText, rightText)); - - QList leftDiffList; - QList rightDiffList; - Differ::splitDiffList(diffList, &leftDiffList, &rightDiffList); - QList outputLeftDiffList; - QList outputRightDiffList; - - if (ignoreWhitespace()) { - const QList leftIntermediate - = Differ::moveWhitespaceIntoEqualities(leftDiffList); - const QList rightIntermediate - = Differ::moveWhitespaceIntoEqualities(rightDiffList); - Differ::ignoreWhitespaceBetweenEqualities(leftIntermediate, rightIntermediate, - &outputLeftDiffList, &outputRightDiffList); - } else { - outputLeftDiffList = leftDiffList; - outputRightDiffList = rightDiffList; - } - - const ChunkData chunkData = DiffUtils::calculateOriginalData( - outputLeftDiffList, outputRightDiffList); - FileData fileData = DiffUtils::calculateContextData(chunkData, contextLineCount(), 0); + FileData fileData = diffFiles(leftText, rightText); fileData.leftFileInfo.fileName = m_leftFileName; fileData.rightFileInfo.fileName = m_rightFileName; if (!leftFileExists && rightFileExists) @@ -123,7 +264,8 @@ void FileDiffController::reload() fileData.fileOperation = FileData::DeleteFile; QList fileDataList; - fileDataList << fileData; + if (leftFileExists || rightFileExists) + fileDataList << fileData; setDiffFiles(fileDataList); reloadFinished(true); @@ -140,11 +282,31 @@ bool DiffEditorPlugin::initialize(const QStringList &arguments, QString *errorMe Core::ActionContainer *toolsContainer = Core::ActionManager::actionContainer(Core::Constants::M_TOOLS); toolsContainer->insertGroup(Core::Constants::G_TOOLS_OPTIONS, Constants::G_TOOLS_DIFF); + Core::ActionContainer *diffContainer = Core::ActionManager::createMenu("Diff"); + diffContainer->menu()->setTitle(tr("&Diff")); + toolsContainer->addMenu(diffContainer, Constants::G_TOOLS_DIFF); - QAction *diffAction = new QAction(tr("Diff..."), this); - Core::Command *diffCommand = Core::ActionManager::registerAction(diffAction, "DiffEditor.Diff"); - connect(diffAction, &QAction::triggered, this, &DiffEditorPlugin::diff); - toolsContainer->addAction(diffCommand, Constants::G_TOOLS_DIFF); + m_diffCurrentFileAction = new QAction(tr("Diff Current File"), this); + Core::Command *diffCurrentFileCommand = Core::ActionManager::registerAction(m_diffCurrentFileAction, "DiffEditor.DiffCurrentFile"); + diffCurrentFileCommand->setDefaultKeySequence(QKeySequence(Core::UseMacShortcuts ? tr("Meta+H") : tr("Ctrl+H"))); + connect(m_diffCurrentFileAction, &QAction::triggered, this, &DiffEditorPlugin::diffCurrentFile); + diffContainer->addAction(diffCurrentFileCommand); + + QAction *diffAllModifiedFilesAction = new QAction(tr("Diff All Modified Files"), this); + Core::Command *diffAllModifiedFilesCommand = Core::ActionManager::registerAction(diffAllModifiedFilesAction, "DiffEditor.DiffAllModifiedFiles"); + diffAllModifiedFilesCommand->setDefaultKeySequence(QKeySequence(Core::UseMacShortcuts ? tr("Meta+Shift+H") : tr("Ctrl+Shift+H"))); + connect(diffAllModifiedFilesAction, &QAction::triggered, this, &DiffEditorPlugin::diffAllModifiedFiles); + diffContainer->addAction(diffAllModifiedFilesCommand); + + QAction *diffExternalFilesAction = new QAction(tr("Diff External Files..."), this); + Core::Command *diffExternalFilesCommand = Core::ActionManager::registerAction(diffExternalFilesAction, "DiffEditor.DiffExternalFiles"); + connect(diffExternalFilesAction, &QAction::triggered, this, &DiffEditorPlugin::diffExternalFiles); + diffContainer->addAction(diffExternalFilesCommand); + + connect(Core::EditorManager::instance(), &Core::EditorManager::currentEditorChanged, + this, &DiffEditorPlugin::updateCurrentEditor); + + updateActions(); addAutoReleasedObject(new DiffEditorFactory(this)); @@ -154,15 +316,77 @@ bool DiffEditorPlugin::initialize(const QStringList &arguments, QString *errorMe void DiffEditorPlugin::extensionsInitialized() { } -void DiffEditorPlugin::diff() +void DiffEditorPlugin::updateCurrentEditor(Core::IEditor *editor) { - QString fileName1 = QFileDialog::getOpenFileName(Core::ICore::dialogParent(), + if (m_currentTextDocument) + m_currentTextDocument->disconnect(this); + m_currentTextDocument = 0; + + if (editor) { + TextEditor::TextEditorWidget *editorWidget = qobject_cast(editor->widget()); + if (editorWidget) { + m_currentTextDocument = editorWidget->textDocument(); + connect(m_currentTextDocument, &Core::IDocument::changed, + this, &DiffEditorPlugin::updateActions); + } + } + + updateActions(); +} + +void DiffEditorPlugin::updateActions() +{ + const bool diffCurrentFileEnabled = m_currentTextDocument && m_currentTextDocument->isModified(); + m_diffCurrentFileAction->setEnabled(diffCurrentFileEnabled); +} + +void DiffEditorPlugin::diffCurrentFile() +{ + if (!m_currentTextDocument) + return; + + const QString fileName = m_currentTextDocument->filePath().toString(); + + if (fileName.isEmpty()) + return; + + const QString documentId = QLatin1String("Diff ") + fileName; + const QString title = tr("Diff \"%1\"").arg(fileName); + auto const document = qobject_cast( + DiffEditorController::findOrCreateDocument(documentId, title)); + if (!document) + return; + + if (!DiffEditorController::controller(document)) + new DiffCurrentFileController(document, fileName); + Core::EditorManager::activateEditorForDocument(document); + document->reload(); +} + +void DiffEditorPlugin::diffAllModifiedFiles() +{ + const QString documentId = QLatin1String("Diff All Modified Files"); + const QString title = tr("Diff All Modified Files"); + auto const document = qobject_cast( + DiffEditorController::findOrCreateDocument(documentId, title)); + if (!document) + return; + + if (!DiffEditorController::controller(document)) + new DiffAllModifiedFilesController(document); + Core::EditorManager::activateEditorForDocument(document); + document->reload(); +} + +void DiffEditorPlugin::diffExternalFiles() +{ + const QString fileName1 = QFileDialog::getOpenFileName(Core::ICore::dialogParent(), tr("Select First File for Diff"), QString()); if (fileName1.isNull()) return; - QString fileName2 = QFileDialog::getOpenFileName(Core::ICore::dialogParent(), + const QString fileName2 = QFileDialog::getOpenFileName(Core::ICore::dialogParent(), tr("Select Second File for Diff"), QString()); if (fileName2.isNull()) @@ -170,14 +394,14 @@ void DiffEditorPlugin::diff() const QString documentId = QLatin1String("Diff ") + fileName1 + QLatin1String(", ") + fileName2; - QString title = tr("Diff \"%1\", \"%2\"").arg(fileName1).arg(fileName2); + const QString title = tr("Diff \"%1\", \"%2\"").arg(fileName1, fileName2); auto const document = qobject_cast( DiffEditorController::findOrCreateDocument(documentId, title)); if (!document) return; if (!DiffEditorController::controller(document)) - new FileDiffController(document, fileName1, fileName2); + new DiffExternalFilesController(document, fileName1, fileName2); Core::EditorManager::activateEditorForDocument(document); document->reload(); } diff --git a/src/plugins/diffeditor/diffeditorplugin.h b/src/plugins/diffeditor/diffeditorplugin.h index 3f384255175..ba0cab24337 100644 --- a/src/plugins/diffeditor/diffeditorplugin.h +++ b/src/plugins/diffeditor/diffeditorplugin.h @@ -27,8 +27,13 @@ #include "diffeditor_global.h" +#include #include +QT_FORWARD_DECLARE_CLASS(QAction) + +namespace Core { class IEditor; } + namespace DiffEditor { namespace Internal { @@ -42,7 +47,11 @@ public: void extensionsInitialized(); private slots: - void diff(); + void updateCurrentEditor(Core::IEditor *editor); + void updateActions(); + void diffCurrentFile(); + void diffAllModifiedFiles(); + void diffExternalFiles(); #ifdef WITH_TESTS void testMakePatch_data(); @@ -50,6 +59,9 @@ private slots: void testReadPatch_data(); void testReadPatch(); #endif // WITH_TESTS +private: + QAction *m_diffCurrentFileAction; + QPointer m_currentTextDocument; }; } // namespace Internal From ad615ece169d554397bf5444b31d9126bda57f92 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Fri, 7 Oct 2016 06:47:14 +0200 Subject: [PATCH 02/13] DiffEditor: Fix compile with gcc 4.8 / Qt5.6 Broke with ee095ef5d545600b2508a302a15ba6220d43b9cb. Change-Id: Ib8cc5a0b8d79cf6ca542eb2fc9c0a4f06e885d88 Reviewed-by: Orgad Shaneh --- src/plugins/diffeditor/diffeditorplugin.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/diffeditor/diffeditorplugin.cpp b/src/plugins/diffeditor/diffeditorplugin.cpp index 5c5a2d6da83..db7936f34af 100644 --- a/src/plugins/diffeditor/diffeditorplugin.cpp +++ b/src/plugins/diffeditor/diffeditorplugin.cpp @@ -326,7 +326,7 @@ void DiffEditorPlugin::updateCurrentEditor(Core::IEditor *editor) TextEditor::TextEditorWidget *editorWidget = qobject_cast(editor->widget()); if (editorWidget) { m_currentTextDocument = editorWidget->textDocument(); - connect(m_currentTextDocument, &Core::IDocument::changed, + connect(m_currentTextDocument.data(), &Core::IDocument::changed, this, &DiffEditorPlugin::updateActions); } } From a2ec71b30a5a937699ba642a5505b0362aa2c9d0 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Fri, 7 Oct 2016 08:51:54 +0200 Subject: [PATCH 03/13] Remove some ancient, dead, test code Change-Id: Id252fbddd90c2ca3658318c3f256d3a7a0016cef Reviewed-by: Orgad Shaneh --- src/plugins/texteditor/texteditor.cpp | 23 ----------------------- src/plugins/texteditor/texteditor.h | 2 -- 2 files changed, 25 deletions(-) diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp index 126f878a2cd..db9efb356a2 100644 --- a/src/plugins/texteditor/texteditor.cpp +++ b/src/plugins/texteditor/texteditor.cpp @@ -113,8 +113,6 @@ #include #include -//#define DO_FOO - /*! \namespace TextEditor \brief The TextEditor namespace contains the base text editor and several classes which @@ -727,14 +725,6 @@ void TextEditorWidgetPrivate::ctor(const QSharedPointer &doc) QObject::connect(q, &QPlainTextEdit::selectionChanged, this, &TextEditorWidgetPrivate::slotSelectionChanged); -// (void) new QShortcut(tr("CTRL+L"), this, SLOT(centerCursor()), 0, Qt::WidgetShortcut); -// (void) new QShortcut(tr("F9"), this, SLOT(slotToggleMark()), 0, Qt::WidgetShortcut); -// (void) new QShortcut(tr("F11"), this, SLOT(slotToggleBlockVisible())); - -#ifdef DO_FOO - (void) new QShortcut(TextEditorWidget::tr("CTRL+D"), this, SLOT(doFoo())); -#endif - // parentheses matcher m_formatRange = true; m_parenthesesMatchingTimer.setSingleShot(true); @@ -7217,19 +7207,6 @@ void TextEditorWidget::setRefactorMarkers(const RefactorMarkers &markers) requestBlockUpdate(marker.cursor.block()); } -void TextEditorWidget::doFoo() -{ -#ifdef DO_FOO - qDebug() << Q_FUNC_INFO; - RefactorMarkers markers = d->m_refactorOverlay->markers(); - RefactorMarker marker; - marker.tooltip = "Hello World"; - marker.cursor = textCursor(); - markers += marker; - setRefactorMarkers(markers); -#endif -} - TextBlockSelection::TextBlockSelection(const TextBlockSelection &other) { positionBlock = other.positionBlock; diff --git a/src/plugins/texteditor/texteditor.h b/src/plugins/texteditor/texteditor.h index 7048ddb923f..60038d73ed9 100644 --- a/src/plugins/texteditor/texteditor.h +++ b/src/plugins/texteditor/texteditor.h @@ -593,8 +593,6 @@ protected slots: bool inFindScope(const QTextCursor &cursor); bool inFindScope(int selectionStart, int selectionEnd); - void doFoo(); - private: Internal::TextEditorWidgetPrivate *d; friend class BaseTextEditor; From 8281e5580428d510d0b67725af23db4bf1058497 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Thu, 6 Oct 2016 14:32:28 +0200 Subject: [PATCH 04/13] QbsProjectManager: Remove dead code Change-Id: I71a740d5a97a7d5e493bb6fa6afe124b73753e52 Reviewed-by: Jake Petroules --- src/plugins/qbsprojectmanager/qbsproject.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp index 445e4302f06..590de97ce96 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.cpp +++ b/src/plugins/qbsprojectmanager/qbsproject.cpp @@ -993,8 +993,6 @@ void QbsProject::updateDeploymentInfo() { DeploymentData deploymentData; if (m_qbsProject.isValid()) { - qbs::InstallOptions installOptions; - installOptions.setInstallRoot(QLatin1String("/")); foreach (const qbs::ArtifactData &f, m_projectData.installableArtifacts()) { deploymentData.addFile(f.filePath(), f.installData().installDir(), f.isExecutable() ? DeployableFile::TypeExecutable : DeployableFile::TypeNormal); From 313c0b1b3b92f1283f5a746b0964d11a730e9727 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Thu, 6 Oct 2016 15:59:23 +0200 Subject: [PATCH 05/13] QbsProjectManager: Fix displaying generated files We did not update the project tree after building, so newly generated files would not appear there right away. Change-Id: I76ebc213ef43833203013186b0f0b38597cb1834 Reviewed-by: Jake Petroules --- src/plugins/qbsprojectmanager/qbsproject.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp index 590de97ce96..8260547a71e 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.cpp +++ b/src/plugins/qbsprojectmanager/qbsproject.cpp @@ -622,7 +622,12 @@ void QbsProject::cancelParsing() void QbsProject::updateAfterBuild() { QTC_ASSERT(m_qbsProject.isValid(), return); - m_projectData = m_qbsProject.projectData(); + const qbs::ProjectData &projectData = m_qbsProject.projectData(); + if (projectData == m_projectData) + return; + qCDebug(qbsPmLog) << "Updating data after build"; + m_projectData = projectData; + rootProjectNode()->update(); updateBuildTargetData(); updateCppCompilerCallData(); if (m_extraCompilersPending) { From 52faf327709f660a5862fce8b4426cc05d933f7b Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Fri, 7 Oct 2016 11:35:47 +0200 Subject: [PATCH 06/13] Drop unneeded override Change-Id: Ia29517a56f23472d7015130abc8c8753b40afe33 Reviewed-by: Tobias Hunger --- src/plugins/diffeditor/diffeditordocument.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/plugins/diffeditor/diffeditordocument.h b/src/plugins/diffeditor/diffeditordocument.h index 81d98bb42d4..5b4771b0e71 100644 --- a/src/plugins/diffeditor/diffeditordocument.h +++ b/src/plugins/diffeditor/diffeditordocument.h @@ -68,7 +68,6 @@ public: QString fallbackSaveAsPath() const override; QString fallbackSaveAsFileName() const override; - bool isModified() const override { return false; } bool isSaveAsAllowed() const override { return true; } bool save(QString *errorString, const QString &fileName, bool autoSave) override; void reload(); From 572b5447ffe7edbdffa91d449010032c4a0fe5d8 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Fri, 7 Oct 2016 14:44:17 +0200 Subject: [PATCH 07/13] SynchronousProcess: Turn assertion into regular check It is not an impossible condition that a process keeps hanging. Change-Id: I87cfdb72ff8528c71b2add09e41bdf742cdfc8b6 Reviewed-by: Tobias Hunger --- src/libs/utils/synchronousprocess.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/libs/utils/synchronousprocess.cpp b/src/libs/utils/synchronousprocess.cpp index fe1b11a34f3..4596193a247 100644 --- a/src/libs/utils/synchronousprocess.cpp +++ b/src/libs/utils/synchronousprocess.cpp @@ -504,7 +504,9 @@ SynchronousProcessResponse SynchronousProcess::runBlocking(const QString &binary } } - QTC_ASSERT(d->m_process.state() == QProcess::NotRunning, return d->m_result); + if (d->m_process.state() != QProcess::NotRunning) + return d->m_result; + d->m_result.exitCode = d->m_process.exitCode(); if (d->m_result.result == SynchronousProcessResponse::StartFailed) { if (d->m_process.exitStatus() != QProcess::NormalExit) From 2e81a39b7c0997300ff87905e86a56a0972a5fc1 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Fri, 7 Oct 2016 13:50:17 +0200 Subject: [PATCH 08/13] QmlDesigner: Remove transparency from DocumentWarningWidget The ToolTipBase has alpha in some themes (e.g. Flat Dark). If the background of the DocumentWarningWidget is transparent, this looks buggy. We remove the transparency by blending the color against the background color. Change-Id: I4a25a30700b3ee1e9e8d23d0b0bad09f297f0605 Reviewed-by: Tim Jenssen --- src/plugins/qmldesigner/documentwarningwidget.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/plugins/qmldesigner/documentwarningwidget.cpp b/src/plugins/qmldesigner/documentwarningwidget.cpp index 12baccb7b18..50ea460b131 100644 --- a/src/plugins/qmldesigner/documentwarningwidget.cpp +++ b/src/plugins/qmldesigner/documentwarningwidget.cpp @@ -27,6 +27,10 @@ #include + +#include +#include + #include #include #include @@ -170,6 +174,13 @@ bool DocumentWarningWidget::eventFilter(QObject *object, QEvent *event) void DocumentWarningWidget::showEvent(QShowEvent *event) { + const QColor backgroundColor = Utils::creatorTheme()->color(Utils::Theme::QmlDesigner_BackgroundColor); + QPalette pal = palette(); + QColor color = pal.color(QPalette::ToolTipBase); + const QColor backgroundNoAlpha = Utils::StyleHelper::alphaBlendedColors(color, backgroundColor); + color.setAlpha(255); + pal.setColor(QPalette::ToolTipBase, backgroundNoAlpha); + setPalette(pal); m_gotoCodeWasClicked = false; moveToParentCenter(); refreshContent(); From 979b034dbe041ddda1a16f064f81880c18573a3f Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Fri, 7 Oct 2016 13:58:40 +0200 Subject: [PATCH 09/13] QmlDesigner: PuppetBuildProgressDialog has to be modal Otherwise the application state can get seriously messed up, when a user e.g. changes to editor mode. Task-number: QTCREATORBUG-16722 Change-Id: I752eeb788ccb3b5458afe82496a68ddecf6e6579 Reviewed-by: Tim Jenssen --- .../designercore/instances/puppetbuildprogressdialog.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/qmldesigner/designercore/instances/puppetbuildprogressdialog.cpp b/src/plugins/qmldesigner/designercore/instances/puppetbuildprogressdialog.cpp index 13f3ce8ef58..3777fa3633e 100644 --- a/src/plugins/qmldesigner/designercore/instances/puppetbuildprogressdialog.cpp +++ b/src/plugins/qmldesigner/designercore/instances/puppetbuildprogressdialog.cpp @@ -40,6 +40,7 @@ PuppetBuildProgressDialog::PuppetBuildProgressDialog() : m_useFallbackPuppet(false) { setWindowFlags(Qt::SplashScreen); + setWindowModality(Qt::ApplicationModal); ui->setupUi(this); ui->buildProgressBar->setMaximum(85); connect(ui->useFallbackPuppetPushButton, SIGNAL(clicked()), this, SLOT(setUseFallbackPuppet())); From e149c0dac94e979051cb5c357ea5993c4e0bc9d3 Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 7 Oct 2016 17:36:05 +0200 Subject: [PATCH 10/13] Debugger: Fix LLDB's field size reporting Use the field's type size if the reported field size is 0. Change-Id: I7db49507d0ea7358b6db27dfa206f2b079bbf876 Reviewed-by: Christian Stenger --- share/qtcreator/debugger/lldbbridge.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/share/qtcreator/debugger/lldbbridge.py b/share/qtcreator/debugger/lldbbridge.py index 8e8a52518d5..de5695835d8 100644 --- a/share/qtcreator/debugger/lldbbridge.py +++ b/share/qtcreator/debugger/lldbbridge.py @@ -239,8 +239,12 @@ class Dumper(DumperBase): base = nativeType.GetVirtualBaseClassAtIndex(i) virtualNames[base.GetName()] = i - fieldBits = dict((field.name, (field.GetBitfieldSizeInBits(), field.GetOffsetInBits())) - for field in nativeType.get_fields_array()) + fieldBits = dict((f.name, + ((f.GetBitfieldSizeInBits() + if f.GetBitfieldSizeInBits() else + (f.GetType().GetByteSize() * 8)), + f.GetOffsetInBits())) + for f in nativeType.get_fields_array()) #warn("BASE NAMES: %s" % baseNames) #warn("VIRTUAL NAMES: %s" % virtualNames) @@ -299,7 +303,7 @@ class Dumper(DumperBase): field.parentType = fieldParentType field.ltype = self.fromNativeType(fieldType) field.name = fieldName - field.lbitsize = 0 + field.lbitsize = field.ltype.lbitsize * 8 field.lbitpos = 0 fields.append(field) From bcdc41b42b50374d37a4dcb895bef6b9e80a7fb3 Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 10 Oct 2016 08:37:46 +0200 Subject: [PATCH 11/13] Debugger: Update L&E view when toggling dumper use through CDB Change-Id: Ic227009a83197ca25d95acee494372bb53833a96 Reviewed-by: David Schulz --- src/plugins/debugger/cdb/cdbengine.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/plugins/debugger/cdb/cdbengine.cpp b/src/plugins/debugger/cdb/cdbengine.cpp index 0e092d3a246..b6c0d1a5833 100644 --- a/src/plugins/debugger/cdb/cdbengine.cpp +++ b/src/plugins/debugger/cdb/cdbengine.cpp @@ -254,6 +254,8 @@ CdbEngine::CdbEngine(const DebuggerRunParameters &sp) : this, &CdbEngine::readyReadStandardOut); connect(&m_process, &QProcess::readyReadStandardError, this, &CdbEngine::readyReadStandardOut); + connect(action(UseDebuggingHelpers), &SavedAction::valueChanged, + this, &CdbEngine::updateLocals); } void CdbEngine::init() From fafb99d9101cdb13eff028e3e1ecbe84d7ea70ad Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Fri, 7 Oct 2016 12:15:33 +0200 Subject: [PATCH 12/13] QmlDesigner: Reformat .ui.qml files when saving The feature can be turned off using a setting, if there are serious issues with the reformating. Change-Id: If90475af2db8aaade8bc52af0fb7cd14bfa1c121 Reviewed-by: Tim Jenssen --- src/plugins/qmldesigner/designersettings.cpp | 1 + src/plugins/qmldesigner/designersettings.h | 4 ++- src/plugins/qmldesigner/shortcutmanager.cpp | 28 ++++++++++++++++++-- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/plugins/qmldesigner/designersettings.cpp b/src/plugins/qmldesigner/designersettings.cpp index 6a371a50b49..9e06deab976 100644 --- a/src/plugins/qmldesigner/designersettings.cpp +++ b/src/plugins/qmldesigner/designersettings.cpp @@ -68,6 +68,7 @@ void DesignerSettings::fromSettings(QSettings *settings) restoreValue(settings, DesignerSettingsKey::PUPPET_KILL_TIMEOUT, 3000); // this has no ui at the moment restoreValue(settings, DesignerSettingsKey::DEBUG_PUPPET, QString()); restoreValue(settings, DesignerSettingsKey::FORWARD_PUPPET_OUTPUT, QString()); + restoreValue(settings, DesignerSettingsKey::REFORMAT_UI_QML_FILES, true); settings->endGroup(); settings->endGroup(); diff --git a/src/plugins/qmldesigner/designersettings.h b/src/plugins/qmldesigner/designersettings.h index 2159230cbfd..bc53d15aca1 100644 --- a/src/plugins/qmldesigner/designersettings.h +++ b/src/plugins/qmldesigner/designersettings.h @@ -57,7 +57,9 @@ const char ENABLE_MODEL_EXCEPTION_OUTPUT[] = "WarnException"; const char PUPPET_KILL_TIMEOUT[] = "PuppetKillTimeout"; const char DEBUG_PUPPET[] = "DebugPuppet"; const char FORWARD_PUPPET_OUTPUT[] = "ForwardPuppetOutput"; - +const char REFORMAT_UI_QML_FILES[] = "ReformatUiQmlFiles"; /* This Setting is not exposed in ui. + The setting can be used to turn off the feature, + if there are serious issues */ } class DesignerSettings : public QHash diff --git a/src/plugins/qmldesigner/shortcutmanager.cpp b/src/plugins/qmldesigner/shortcutmanager.cpp index c17740c6706..d06f32c1181 100644 --- a/src/plugins/qmldesigner/shortcutmanager.cpp +++ b/src/plugins/qmldesigner/shortcutmanager.cpp @@ -25,6 +25,8 @@ #include "shortcutmanager.h" +#include "designersettings.h" + #include #include #include @@ -33,7 +35,13 @@ #include #include #include +#include +#include + #include +#include + +#include #include "qmldesignerconstants.h" #include "qmldesignerplugin.h" @@ -106,13 +114,29 @@ void ShortCutManager::registerActions(const Core::Context &qmlDesignerMainContex SLOT(toggleRightSidebar())); // Revert to saved - QObject *em = Core::EditorManager::instance(); + Core::EditorManager *em = Core::EditorManager::instance(); Core::ActionManager::registerAction(&m_revertToSavedAction,Core::Constants::REVERTTOSAVED, qmlDesignerMainContext); connect(&m_revertToSavedAction, SIGNAL(triggered()), em, SLOT(revertToSaved())); //Save Core::ActionManager::registerAction(&m_saveAction, Core::Constants::SAVE, qmlDesignerMainContext); - connect(&m_saveAction, SIGNAL(triggered()), em, SLOT(saveDocument())); + connect(&m_saveAction, &QAction::triggered, em, [em] { + DesignerSettings settings = QmlDesignerPlugin::instance()->settings(); + /* Reformat document if we have a .ui.qml file */ + if (settings.value(DesignerSettingsKey::REFORMAT_UI_QML_FILES).toBool() + && em->currentDocument()->filePath().toString().endsWith(".ui.qml")) + if (QmlJSEditor::QmlJSEditorDocument *document + = qobject_cast(em->currentDocument())) { + const QString &newText = QmlJS::reformat(document->semanticInfo().document); + QTextCursor tc(document->document()); + tc.movePosition(QTextCursor::Start); + tc.movePosition(QTextCursor::End, QTextCursor::KeepAnchor); + tc.insertText(newText); + } + em->saveDocument(); + }); + + //Save As Core::ActionManager::registerAction(&m_saveAsAction, Core::Constants::SAVEAS, qmlDesignerMainContext); From 5ead71bf81ca6e401b291c2328fd0239ac758e01 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Fri, 7 Oct 2016 13:31:42 +0200 Subject: [PATCH 13/13] QmlDesigner: Proper styling for TabWidget buttons Change-Id: I25c325920ed9a7ced87cbc1d01ad73c9e745ac71 Reviewed-by: Tim Jenssen --- .../qmldesignerextension/connectioneditor/stylesheet.css | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/stylesheet.css b/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/stylesheet.css index f7b529628ac..bf3b5d36074 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/stylesheet.css +++ b/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/stylesheet.css @@ -13,6 +13,12 @@ QTableView { } +QTabBar QToolButton { + background-color: creatorTheme.QmlDesignerBackgroundColorDarkAlternate; + border: 1px solid creatorTheme.QmlDesignerBackgroundColorDarker; + border-radius: 0px; +} + QTableView::item { border: 0px;