diff options
author | Eike Ziller <eike.ziller@digia.com> | 2014-08-15 14:42:30 +0200 |
---|---|---|
committer | Eike Ziller <eike.ziller@digia.com> | 2014-08-15 16:14:34 +0200 |
commit | d9d0aba1c4870eaddd9ec3be1561ed0a39bcc74d (patch) | |
tree | d2d40ffee8d17ae3193064d861894a5661908dd0 /src/plugins | |
parent | 23536e9b426aba67880a9ef19e9c67517e642df0 (diff) | |
parent | 8c133689be164cfdb8f77078a97dce3c97397afe (diff) | |
download | qt-creator-d9d0aba1c4870eaddd9ec3be1561ed0a39bcc74d.tar.gz |
Merge remote-tracking branch 'origin/3.2'
Conflicts:
qtcreator.pri
qtcreator.qbs
src/plugins/coreplugin/editormanager/editormanager.cpp
src/plugins/projectexplorer/editorconfiguration.cpp
src/plugins/projectexplorer/projectfilewizardextension.cpp
src/plugins/qmakeandroidsupport/createandroidmanifestwizard.cpp
Change-Id: I8de0f6fcdd8d214fbc14e79f74cb0206e6e2c6c1
Diffstat (limited to 'src/plugins')
67 files changed, 738 insertions, 353 deletions
diff --git a/src/plugins/android/androidrunner.cpp b/src/plugins/android/androidrunner.cpp index 51c9af54a3..e484e0e094 100644 --- a/src/plugins/android/androidrunner.cpp +++ b/src/plugins/android/androidrunner.cpp @@ -37,8 +37,10 @@ #include <debugger/debuggerrunconfigurationaspect.h> #include <projectexplorer/target.h> +#include <qtsupport/qtkitinformation.h> #include <utils/qtcassert.h> +#include <QDir> #include <QTime> #include <QtConcurrentRun> #include <QTemporaryFile> @@ -93,6 +95,10 @@ AndroidRunner::AndroidRunner(QObject *parent, m_pongFile = _("/data/local/tmp/qt/debug-pong-") + m_packageName; m_gdbserverSocket = packageDir + _("/debug-socket"); m_gdbserverPath = packageDir + _("/lib/gdbserver"); + const QtSupport::BaseQtVersion *version = QtSupport::QtKitInformation::qtVersion(target->kit()); + if (version && version->qtVersion() >= QtSupport::QtVersionNumber(5, 4, 0)) + m_gdbserverPath += _(".so"); + m_gdbserverCommand = m_gdbserverPath + _(" --multi +") + m_gdbserverSocket; // Detect busybox, as we need to pass -w to ps to get wide output. QProcess psProc; @@ -292,7 +298,7 @@ void AndroidRunner::asyncStart() // Handling ping. for (int i = 0; ; ++i) { - QTemporaryFile tmp(_("pingpong")); + QTemporaryFile tmp(QDir::tempPath() + _("/pingpong")); tmp.open(); tmp.close(); @@ -324,7 +330,7 @@ void AndroidRunner::asyncStart() void AndroidRunner::handleRemoteDebuggerRunning() { if (m_useCppDebugger) { - QTemporaryFile tmp(_("pingpong")); + QTemporaryFile tmp(QDir::tempPath() + _("/pingpong")); tmp.open(); QProcess process; diff --git a/src/plugins/android/androidsettingswidget.cpp b/src/plugins/android/androidsettingswidget.cpp index 7243f99de5..d50f91006d 100644 --- a/src/plugins/android/androidsettingswidget.cpp +++ b/src/plugins/android/androidsettingswidget.cpp @@ -592,8 +592,8 @@ void AndroidSettingsWidget::showGdbWarningDialog() tr("Unsupported GDB"), tr("The GDB inside this NDK seems to not support Python. " "The Qt Project offers fixed GDB builds at: " - "<a href=\"http://download.qt-project.org/official_releases/gdb/osx/\">" - "http://download.qt-project.org/official_releases/gdb/osx/</a>")); + "<a href=\"http://download.qt-project.org/official_releases/gdb/\">" + "http://download.qt-project.org/official_releases/gdb/</a>")); } void AndroidSettingsWidget::manageAVD() diff --git a/src/plugins/coreplugin/editormanager/editormanager.cpp b/src/plugins/coreplugin/editormanager/editormanager.cpp index 9e5d7715ef..f42d8bf837 100644 --- a/src/plugins/coreplugin/editormanager/editormanager.cpp +++ b/src/plugins/coreplugin/editormanager/editormanager.cpp @@ -1629,6 +1629,8 @@ bool EditorManagerPrivate::saveDocumentAs(IDocument *document) const QString filter = MimeDatabase::allFiltersString(); QString selectedFilter = MimeDatabase::findByFile(QFileInfo(document->filePath())).filterString(); + if (selectedFilter.isEmpty()) + selectedFilter = MimeDatabase::findByType(document->mimeType()).filterString(); const QString &absoluteFilePath = DocumentManager::getSaveAsFileName(document, filter, &selectedFilter); diff --git a/src/plugins/diffeditor/diffeditor.cpp b/src/plugins/diffeditor/diffeditor.cpp index 3f34e60beb..ddd064a663 100644 --- a/src/plugins/diffeditor/diffeditor.cpp +++ b/src/plugins/diffeditor/diffeditor.cpp @@ -611,6 +611,7 @@ void DiffEditor::showDiffEditor(QWidget *newEditor) writeCurrentDiffEditorSetting(m_currentEditor); updateDiffEditorSwitcher(); + widget()->setFocusProxy(m_currentEditor); } QWidget *DiffEditor::readLegacyCurrentDiffEditorSetting() diff --git a/src/plugins/diffeditor/diffeditorcontroller.cpp b/src/plugins/diffeditor/diffeditorcontroller.cpp index 7ff6a98348..c07adfc787 100644 --- a/src/plugins/diffeditor/diffeditorcontroller.cpp +++ b/src/plugins/diffeditor/diffeditorcontroller.cpp @@ -272,4 +272,14 @@ void DiffEditorController::requestChunkActions(QMenu *menu, emit chunkActionsRequested(menu, diffFileIndex, chunkIndex); } +void DiffEditorController::requestSaveState() +{ + emit saveStateRequested(); +} + +void DiffEditorController::requestRestoreState() +{ + emit restoreStateRequested(); +} + } // namespace DiffEditor diff --git a/src/plugins/diffeditor/diffeditorcontroller.h b/src/plugins/diffeditor/diffeditorcontroller.h index 8314e1bda2..4505d5f5b9 100644 --- a/src/plugins/diffeditor/diffeditorcontroller.h +++ b/src/plugins/diffeditor/diffeditorcontroller.h @@ -73,6 +73,8 @@ public slots: void requestChunkActions(QMenu *menu, int diffFileIndex, int chunkIndex); + void requestSaveState(); + void requestRestoreState(); void branchesForCommitReceived(const QString &output); void expandBranchesRequested(); @@ -87,6 +89,8 @@ signals: void chunkActionsRequested(QMenu *menu, int diffFileIndex, int chunkIndex); + void saveStateRequested(); + void restoreStateRequested(); void expandBranchesRequested(const QString &revision); void reloaderChanged(DiffEditorReloader *reloader); diff --git a/src/plugins/diffeditor/diffeditordocument.cpp b/src/plugins/diffeditor/diffeditordocument.cpp index 817f0d946c..b65be0c10f 100644 --- a/src/plugins/diffeditor/diffeditordocument.cpp +++ b/src/plugins/diffeditor/diffeditordocument.cpp @@ -46,6 +46,7 @@ DiffEditorDocument::DiffEditorDocument() : m_controller(new DiffEditorController(this)) { setId(Constants::DIFF_EDITOR_ID); + setMimeType(QLatin1String(Constants::DIFF_EDITOR_MIMETYPE)); setTemporary(true); } diff --git a/src/plugins/diffeditor/diffeditorplugin.cpp b/src/plugins/diffeditor/diffeditorplugin.cpp index 6c6346998a..63a29d985e 100644 --- a/src/plugins/diffeditor/diffeditorplugin.cpp +++ b/src/plugins/diffeditor/diffeditorplugin.cpp @@ -132,7 +132,9 @@ void SimpleDiffEditorReloader::reload() QList<FileData> fileDataList; fileDataList << fileData; + controller()->requestSaveState(); controller()->setDiffFiles(fileDataList); + controller()->requestRestoreState(); reloadFinished(); } @@ -299,6 +301,25 @@ void DiffEditor::Internal::DiffEditorPlugin::testMakePatch_data() rows.clear(); rows << RowData(_("ABCD")); + rows << RowData(_(""), TextLineData::Separator); + rows << RowData(_(""), TextLineData::Separator); + chunk.rows = rows; + patchText = header + _("@@ -1,2 +1,1 @@\n" + "-ABCD\n" + "-\n" + "+ABCD\n" + "\\ No newline at end of file\n"); + + QTest::newRow("Two last EOLs removed") << chunk + << fileName + << fileName + << true + << patchText; + + /////////// + + rows.clear(); + rows << RowData(_("ABCD")); rows << RowData(TextLineData::Separator, _("")); chunk.rows = rows; patchText = header + _("@@ -1,1 +1,1 @@\n" @@ -418,6 +439,26 @@ void DiffEditor::Internal::DiffEditorPlugin::testMakePatch_data() << fileName << false << patchText; + + /////////// + + rows.clear(); + rows << RowData(_("ABCD")); + rows << RowData(TextLineData::Separator, _("")); + rows << RowData(_(""), _("EFGH")); + chunk.rows = rows; + patchText = header + _("@@ -1,1 +1,3 @@\n" + " ABCD\n" + "+\n" + "+EFGH\n" + "\\ No newline at end of file\n"); + + QTest::newRow("Blank line followed by No newline") + << chunk + << fileName + << fileName + << true + << patchText; } void DiffEditor::Internal::DiffEditorPlugin::testMakePatch() @@ -748,6 +789,37 @@ void DiffEditor::Internal::DiffEditorPlugin::testReadPatch_data() QTest::newRow("2 chunks - first ends with blank line") << patch << fileDataList4; + + ////////////// + + patch = _("diff --git a/file foo.txt b/file foo.txt\n" + "index 1234567..9876543 100644\n" + "--- a/file foo.txt\n" + "+++ b/file foo.txt\n" + "@@ -1,1 +1,3 @@ void DiffEditor::ctor()\n" + " ABCD\n" + "+\n" + "+EFGH\n" + "\\ No newline at end of file\n"); + + fileData1.leftFileInfo = DiffFileInfo(_("file foo.txt"), _("1234567")); + fileData1.rightFileInfo = DiffFileInfo(_("file foo.txt"), _("9876543")); + fileData1.fileOperation = FileData::ChangeFile; + chunkData1.leftStartingLineNumber = 0; + chunkData1.rightStartingLineNumber = 0; + rows1.clear(); + rows1 << RowData(_("ABCD")); + rows1 << RowData(TextLineData::Separator, _("")); + rows1 << RowData(_(""), _("EFGH")); + chunkData1.rows = rows1; + fileData1.chunks.clear(); + fileData1.chunks << chunkData1; + + QList<FileData> fileDataList5; + fileDataList5 << fileData1; + + QTest::newRow("Blank line followed by No newline") << patch + << fileDataList5; } void DiffEditor::Internal::DiffEditorPlugin::testReadPatch() diff --git a/src/plugins/diffeditor/diffutils.cpp b/src/plugins/diffeditor/diffutils.cpp index c483eb3b89..a51e4182b8 100644 --- a/src/plugins/diffeditor/diffutils.cpp +++ b/src/plugins/diffeditor/diffutils.cpp @@ -362,15 +362,33 @@ QString DiffUtils::makePatch(const ChunkData &chunkData, int rightLineCount = 0; QList<TextLineData> leftBuffer, rightBuffer; - int lastEqualRow = -1; + int rowToBeSplit = -1; + if (lastChunk) { - for (int i = chunkData.rows.count(); i > 0; i--) { - if (chunkData.rows.at(i - 1).equal) { - if (i != chunkData.rows.count()) - lastEqualRow = i - 1; + // Detect the case when the last equal line is followed by + // only separators on left or on right. In that case + // the last equal line needs to be split. + const int rowCount = chunkData.rows.count(); + int i = 0; + for (i = rowCount; i > 0; i--) { + const RowData &rowData = chunkData.rows.at(i - 1); + if (rowData.leftLine.textLineType != TextLineData::Separator + || rowData.rightLine.textLineType != TextLineData::TextLine) break; - } } + const int leftSeparator = i; + for (i = rowCount; i > 0; i--) { + const RowData &rowData = chunkData.rows.at(i - 1); + if (rowData.rightLine.textLineType != TextLineData::Separator + || rowData.leftLine.textLineType != TextLineData::TextLine) + break; + } + const int rightSeparator = i; + const int commonSeparator = qMin(leftSeparator, rightSeparator); + if (commonSeparator > 0 + && commonSeparator < rowCount + && chunkData.rows.at(commonSeparator - 1).equal) + rowToBeSplit = commonSeparator - 1; } for (int i = 0; i <= chunkData.rows.count(); i++) { @@ -379,7 +397,7 @@ QString DiffUtils::makePatch(const ChunkData &chunkData, : RowData(TextLineData(TextLineData::Separator)); // dummy, // ensure we process buffers to the end. // rowData will be equal - if (rowData.equal && i != lastEqualRow) { + if (rowData.equal && i != rowToBeSplit) { if (leftBuffer.count()) { for (int j = 0; j < leftBuffer.count(); j++) { const QString line = makePatchLine(QLatin1Char('-'), @@ -439,7 +457,9 @@ QString DiffUtils::makePatch(const ChunkData &chunkData, + QString::number(chunkData.rightStartingLineNumber + 1) + QLatin1Char(',') + QString::number(rightLineCount) - + QLatin1String(" @@\n"); + + QLatin1String(" @@") + + chunkData.contextInfo + + QLatin1Char('\n'); diffText.prepend(chunkLine); @@ -530,8 +550,6 @@ static QList<RowData> readLines(const QString &patch, Diff &last = diffList.last(); if (last.text.isEmpty()) break; - if (last.text.at(0) == newLine) // there is a new line - break; if (last.command == Diff::Equal) { if (noNewLineInEqual >= 0) @@ -690,7 +708,7 @@ static QList<ChunkData> readChunks(const QString &patch, // @@ -leftPos[,leftCount] +rightPos[,rightCount] @@ "@@ -(\\d+)(?:,\\d+)? \\+(\\d+)(?:,\\d+)? @@" // optional hint (e.g. function name) - "(?:\\ +[^\\n]*)?" + "(\\ +[^\\n]*)?" // end of line (need to be followed by text line) "(?:\\n))")); @@ -706,6 +724,7 @@ static QList<ChunkData> readChunks(const QString &patch, const QString captured = capturedTexts.at(1); const int leftStartingPos = capturedTexts.at(2).toInt(); const int rightStartingPos = capturedTexts.at(3).toInt(); + const QString contextInfo = capturedTexts.at(4); if (endOfLastChunk > 0) { const QString lines = patch.mid(endOfLastChunk, pos - endOfLastChunk); @@ -722,6 +741,7 @@ static QList<ChunkData> readChunks(const QString &patch, ChunkData chunkData; chunkData.leftStartingLineNumber = leftStartingPos - 1; chunkData.rightStartingLineNumber = rightStartingPos - 1; + chunkData.contextInfo = contextInfo; chunkDataList.append(chunkData); } while ((pos = chunkRegExp.indexIn(patch, pos)) != -1); diff --git a/src/plugins/diffeditor/diffutils.h b/src/plugins/diffeditor/diffutils.h index b649538026..407e6e1551 100644 --- a/src/plugins/diffeditor/diffutils.h +++ b/src/plugins/diffeditor/diffutils.h @@ -95,6 +95,7 @@ public: bool contextChunk; int leftStartingLineNumber; int rightStartingLineNumber; + QString contextInfo; }; class DIFFEDITOR_EXPORT FileData { diff --git a/src/plugins/diffeditor/sidebysidediffeditorwidget.cpp b/src/plugins/diffeditor/sidebysidediffeditorwidget.cpp index 9e530f15c2..7a895e9ac8 100644 --- a/src/plugins/diffeditor/sidebysidediffeditorwidget.cpp +++ b/src/plugins/diffeditor/sidebysidediffeditorwidget.cpp @@ -154,6 +154,8 @@ public: public slots: void setDisplaySettings(const DisplaySettings &ds); + void saveStateRequested(); + void restoreStateRequested(); signals: void jumpToOriginalFileRequested(int diffFileIndex, @@ -205,6 +207,7 @@ private: QColor m_fileLineForeground; QColor m_chunkLineForeground; QColor m_textForeground; + QByteArray m_state; // MultiHighlighter *m_highlighter; }; @@ -338,6 +341,23 @@ SideDiffEditorWidget::SideDiffEditorWidget(QWidget *parent) // baseTextDocument()->setSyntaxHighlighter(m_highlighter); } +void SideDiffEditorWidget::saveStateRequested() +{ + if (!m_state.isNull()) + return; + + m_state = saveState(); +} + +void SideDiffEditorWidget::restoreStateRequested() +{ + if (m_state.isNull()) + return; + + restoreState(m_state); + m_state.clear(); +} + void SideDiffEditorWidget::setDisplaySettings(const DisplaySettings &ds) { DisplaySettings settings = displaySettings(); @@ -836,6 +856,7 @@ SideBySideDiffEditorWidget::SideBySideDiffEditorWidget(QWidget *parent) QVBoxLayout *l = new QVBoxLayout(this); l->setMargin(0); l->addWidget(m_splitter); + setFocusProxy(m_rightEditor); clear(tr("No controller")); } @@ -856,6 +877,14 @@ void SideBySideDiffEditorWidget::setDiffEditorGuiController( this, SLOT(clearAll(QString))); disconnect(m_controller, SIGNAL(diffFilesChanged(QList<FileData>,QString)), this, SLOT(setDiff(QList<FileData>,QString))); + disconnect(m_controller, SIGNAL(saveStateRequested()), + m_leftEditor, SLOT(saveStateRequested())); + disconnect(m_controller, SIGNAL(saveStateRequested()), + m_rightEditor, SLOT(saveStateRequested())); + disconnect(m_controller, SIGNAL(restoreStateRequested()), + m_leftEditor, SLOT(restoreStateRequested())); + disconnect(m_controller, SIGNAL(restoreStateRequested()), + m_rightEditor, SLOT(restoreStateRequested())); disconnect(m_guiController, SIGNAL(currentDiffFileIndexChanged(int)), this, SLOT(setCurrentDiffFileIndex(int))); @@ -871,6 +900,14 @@ void SideBySideDiffEditorWidget::setDiffEditorGuiController( this, SLOT(clearAll(QString))); connect(m_controller, SIGNAL(diffFilesChanged(QList<FileData>,QString)), this, SLOT(setDiff(QList<FileData>,QString))); + connect(m_controller, SIGNAL(saveStateRequested()), + m_leftEditor, SLOT(saveStateRequested())); + connect(m_controller, SIGNAL(saveStateRequested()), + m_rightEditor, SLOT(saveStateRequested())); + connect(m_controller, SIGNAL(restoreStateRequested()), + m_leftEditor, SLOT(restoreStateRequested())); + connect(m_controller, SIGNAL(restoreStateRequested()), + m_rightEditor, SLOT(restoreStateRequested())); connect(m_guiController, SIGNAL(currentDiffFileIndexChanged(int)), this, SLOT(setCurrentDiffFileIndex(int))); @@ -936,11 +973,6 @@ void SideBySideDiffEditorWidget::setCurrentDiffFileIndex(int diffFileIndex) void SideBySideDiffEditorWidget::showDiff() { - // TODO: remember the line number of the line in the middle - const int verticalValue = m_leftEditor->verticalScrollBar()->value(); - const int leftHorizontalValue = m_leftEditor->horizontalScrollBar()->value(); - const int rightHorizontalValue = m_rightEditor->horizontalScrollBar()->value(); - clear(tr("No difference")); QMap<int, QList<DiffSelection> > leftFormats; @@ -1151,11 +1183,6 @@ void SideBySideDiffEditorWidget::showDiff() } m_foldingBlocker = false; */ - m_leftEditor->verticalScrollBar()->setValue(verticalValue); - m_rightEditor->verticalScrollBar()->setValue(verticalValue); - m_leftEditor->horizontalScrollBar()->setValue(leftHorizontalValue); - m_rightEditor->horizontalScrollBar()->setValue(rightHorizontalValue); - // m_leftEditor->updateFoldingHighlight(QPoint(-1, -1)); // m_rightEditor->updateFoldingHighlight(QPoint(-1, -1)); } diff --git a/src/plugins/diffeditor/unifieddiffeditorwidget.cpp b/src/plugins/diffeditor/unifieddiffeditorwidget.cpp index 063160c854..be7a4f7782 100644 --- a/src/plugins/diffeditor/unifieddiffeditorwidget.cpp +++ b/src/plugins/diffeditor/unifieddiffeditorwidget.cpp @@ -134,6 +134,10 @@ void UnifiedDiffEditorWidget::setDiffEditorGuiController( this, SLOT(clearAll(QString))); disconnect(m_controller, SIGNAL(diffFilesChanged(QList<FileData>,QString)), this, SLOT(setDiff(QList<FileData>,QString))); + disconnect(m_controller, SIGNAL(saveStateRequested()), + this, SLOT(saveStateRequested())); + disconnect(m_controller, SIGNAL(restoreStateRequested()), + this, SLOT(restoreStateRequested())); disconnect(m_guiController, SIGNAL(currentDiffFileIndexChanged(int)), this, SLOT(setCurrentDiffFileIndex(int))); @@ -149,6 +153,10 @@ void UnifiedDiffEditorWidget::setDiffEditorGuiController( this, SLOT(clearAll(QString))); connect(m_controller, SIGNAL(diffFilesChanged(QList<FileData>,QString)), this, SLOT(setDiff(QList<FileData>,QString))); + connect(m_controller, SIGNAL(saveStateRequested()), + this, SLOT(saveStateRequested())); + connect(m_controller, SIGNAL(restoreStateRequested()), + this, SLOT(restoreStateRequested())); connect(m_guiController, SIGNAL(currentDiffFileIndexChanged(int)), this, SLOT(setCurrentDiffFileIndex(int))); @@ -158,6 +166,23 @@ void UnifiedDiffEditorWidget::setDiffEditorGuiController( } } +void UnifiedDiffEditorWidget::saveStateRequested() +{ + if (!m_state.isNull()) + return; + + m_state = saveState(); +} + +void UnifiedDiffEditorWidget::restoreStateRequested() +{ + if (m_state.isNull()) + return; + + restoreState(m_state); + m_state.clear(); +} + DiffEditorGuiController *UnifiedDiffEditorWidget::diffEditorGuiController() const { return m_guiController; @@ -613,7 +638,9 @@ QString UnifiedDiffEditorWidget::showChunk(const ChunkData &chunkData, + QString::number(chunkData.rightStartingLineNumber+ 1) + QLatin1Char(',') + QString::number(rightLineCount) - + QLatin1String(" @@\n"); + + QLatin1String(" @@") + + chunkData.contextInfo + + QLatin1Char('\n'); diffText.prepend(chunkLine); diff --git a/src/plugins/diffeditor/unifieddiffeditorwidget.h b/src/plugins/diffeditor/unifieddiffeditorwidget.h index dc94d22660..69ffb65823 100644 --- a/src/plugins/diffeditor/unifieddiffeditorwidget.h +++ b/src/plugins/diffeditor/unifieddiffeditorwidget.h @@ -87,6 +87,8 @@ private slots: void slotSendChunkToCodePaster(); void slotApplyChunk(); void slotRevertChunk(); + void saveStateRequested(); + void restoreStateRequested(); private: void setLeftLineNumber(int blockNumber, int lineNumber); @@ -139,6 +141,7 @@ private: QTextCharFormat m_rightLineFormat; QTextCharFormat m_leftCharFormat; QTextCharFormat m_rightCharFormat; + QByteArray m_state; }; } // namespace DiffEditor diff --git a/src/plugins/git/gerrit/gerritpushdialog.cpp b/src/plugins/git/gerrit/gerritpushdialog.cpp index 13a5eb9a4d..a09938d876 100644 --- a/src/plugins/git/gerrit/gerritpushdialog.cpp +++ b/src/plugins/git/gerrit/gerritpushdialog.cpp @@ -160,9 +160,10 @@ GerritPushDialog::GerritPushDialog(const QString &workingDir, const QString &rev updateCommits(m_ui->localBranchComboBox->currentIndex()); setRemoteBranches(); + QRegExpValidator *noSpaceValidator = new QRegExpValidator(QRegExp(QLatin1String("^\\S+$")), this); m_ui->reviewersLineEdit->setText(reviewerList); - - m_ui->topicLineEdit->setValidator(new QRegExpValidator(QRegExp(QLatin1String("^\\S+$")), this)); + m_ui->reviewersLineEdit->setValidator(noSpaceValidator); + m_ui->topicLineEdit->setValidator(noSpaceValidator); m_valid = true; } diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index e5576ed57e..714c792927 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -124,13 +124,19 @@ public: private slots: void slotShowDescriptionReceived(const QString &data); - void slotDiffOutputReceived(const QString &contents); + void slotTextualDiffOutputReceived(const QString &contents); private: void postCollectShowDescription(const QString &id); - void postCollectDiffOutput(const QStringList &arguments); - void postCollectDiffOutput(const QList<QStringList> &argumentsList); - void addJob(VcsBase::Command *command, const QStringList &arguments); + void postCollectTextualDiffOutputUsingDiffCommand(const QStringList &arguments); + void postCollectTextualDiffOutputUsingDiffCommand(const QList<QStringList> &argumentsList); + void postCollectTextualDiffOutputUsingShowCommand(const QStringList &arguments); + void postCollectTextualDiffOutput(const QString &gitCommand, + const QList<QStringList> &argumentsList); + void addJob(VcsBase::Command *command, + const QString &gitCommand, + const QStringList &arguments); + QStringList addHeadWhenCommandInProgress() const; int timeout() const; QProcessEnvironment processEnvironment() const; Utils::FileName gitPath() const; @@ -154,7 +160,9 @@ GitDiffHandler::GitDiffHandler(DiffEditor::DiffEditorController *controller, void GitDiffHandler::diffFile(const QString &fileName) { - postCollectDiffOutput(QStringList() << QLatin1String("--") << fileName); + postCollectTextualDiffOutputUsingDiffCommand(addHeadWhenCommandInProgress() + << QLatin1String("--") + << fileName); } void GitDiffHandler::diffFiles(const QStringList &stagedFileNames, @@ -169,28 +177,31 @@ void GitDiffHandler::diffFiles(const QStringList &stagedFileNames, arguments << stagedArguments; if (!unstagedFileNames.isEmpty()) { - QStringList unstagedArguments; + QStringList unstagedArguments = addHeadWhenCommandInProgress(); unstagedArguments << QLatin1String("--"); unstagedArguments << unstagedFileNames; arguments << unstagedArguments; } - postCollectDiffOutput(arguments); + postCollectTextualDiffOutputUsingDiffCommand(arguments); } void GitDiffHandler::diffProjects(const QStringList &projectPaths) { - postCollectDiffOutput(QStringList() << QLatin1String("--") << projectPaths); + postCollectTextualDiffOutputUsingDiffCommand(addHeadWhenCommandInProgress() + << QLatin1String("--") + << projectPaths); } void GitDiffHandler::diffRepository() { - postCollectDiffOutput(QStringList()); + postCollectTextualDiffOutputUsingDiffCommand(addHeadWhenCommandInProgress()); } void GitDiffHandler::diffBranch(const QString &branchName) { - postCollectDiffOutput(QStringList() << branchName); + postCollectTextualDiffOutputUsingDiffCommand(addHeadWhenCommandInProgress() + << branchName); } void GitDiffHandler::show(const QString &id) @@ -206,6 +217,7 @@ void GitDiffHandler::postCollectShowDescription(const QString &id) return; } + m_controller->requestSaveState(); m_controller->clear(m_waitMessage); VcsBase::Command *command = new VcsBase::Command(gitPath(), m_workingDirectory, @@ -231,7 +243,11 @@ void GitDiffHandler::slotShowDescriptionReceived(const QString &description) return; } - postCollectDiffOutput(QStringList() << m_id + QLatin1Char('^') << m_id); + postCollectTextualDiffOutputUsingShowCommand(QStringList() + << QLatin1String("--format=format:") // omit header, already generated + << QLatin1String(noColorOption) + << QLatin1String(decorateOption) + << m_id); // need to be called after postCollectDiffOutput(), since it clears the description m_controller->setDescription( @@ -239,10 +255,14 @@ void GitDiffHandler::slotShowDescriptionReceived(const QString &description) description)); } -void GitDiffHandler::addJob(VcsBase::Command *command, const QStringList &arguments) +void GitDiffHandler::addJob(VcsBase::Command *command, + const QString &gitCommand, + const QStringList &arguments) { QStringList args; - args << QLatin1String("diff"); + args << gitCommand; + args << QLatin1String("-m"); // show diff agains parents instead of merge commits + args << QLatin1String("--first-parent"); // show only first parent if (m_controller->isIgnoreWhitespace()) args << QLatin1String("--ignore-space-change"); args << QLatin1String("--unified=") + QString::number( @@ -251,34 +271,57 @@ void GitDiffHandler::addJob(VcsBase::Command *command, const QStringList &argume command->addJob(args, timeout()); } -void GitDiffHandler::postCollectDiffOutput(const QStringList &arguments) +QStringList GitDiffHandler::addHeadWhenCommandInProgress() const { - postCollectDiffOutput(QList<QStringList>() << arguments); + QStringList args; + // This is workaround for lack of support for merge commits and resolving conflicts, + // we compare the current state of working tree to the HEAD of current branch + // instead of showing unsupported combined diff format. + GitClient::CommandInProgress commandInProgress = m_gitClient->checkCommandInProgress(m_workingDirectory); + if (commandInProgress != GitClient::NoCommand) + args << QLatin1String(HEAD); + return args; } -void GitDiffHandler::postCollectDiffOutput(const QList<QStringList> &argumentsList) +void GitDiffHandler::postCollectTextualDiffOutputUsingDiffCommand(const QStringList &arguments) +{ + postCollectTextualDiffOutputUsingDiffCommand(QList<QStringList>() << arguments); +} + +void GitDiffHandler::postCollectTextualDiffOutputUsingDiffCommand(const QList<QStringList> &argumentsList) +{ + postCollectTextualDiffOutput(QLatin1String("diff"), argumentsList); +} + +void GitDiffHandler::postCollectTextualDiffOutputUsingShowCommand(const QStringList &arguments) +{ + postCollectTextualDiffOutput(QLatin1String("show"), QList<QStringList>() << arguments); +} + +void GitDiffHandler::postCollectTextualDiffOutput(const QString &gitCommand, const QList<QStringList> &argumentsList) { if (m_controller.isNull()) { deleteLater(); return; } + m_controller->requestSaveState(); m_controller->clear(m_waitMessage); VcsBase::Command *command = new VcsBase::Command(gitPath(), m_workingDirectory, processEnvironment()); command->setCodec(EditorManager::defaultTextCodec()); connect(command, SIGNAL(output(QString)), - this, SLOT(slotDiffOutputReceived(QString))); + this, SLOT(slotTextualDiffOutputReceived(QString))); command->addFlags(diffExecutionFlags()); for (int i = 0; i < argumentsList.count(); i++) - addJob(command, argumentsList.at(i)); + addJob(command, gitCommand, argumentsList.at(i)); command->execute(); } -void GitDiffHandler::slotDiffOutputReceived(const QString &contents) +void GitDiffHandler::slotTextualDiffOutputReceived(const QString &contents) { if (m_controller.isNull()) { deleteLater(); @@ -290,6 +333,7 @@ void GitDiffHandler::slotDiffOutputReceived(const QString &contents) = DiffEditor::DiffUtils::readPatch( contents, m_controller->isIgnoreWhitespace(), &ok); m_controller->setDiffFiles(fileDataList, m_workingDirectory); + m_controller->requestRestoreState(); deleteLater(); } @@ -713,7 +757,7 @@ GitClient::~GitClient() { } -QString GitClient::findRepositoryForDirectory(const QString &dir) +QString GitClient::findRepositoryForDirectory(const QString &dir) const { if (dir.isEmpty() || dir.endsWith(QLatin1String("/.git")) || dir.contains(QLatin1String("/.git/"))) { @@ -937,7 +981,7 @@ VcsBase::VcsBaseEditorWidget *GitClient::createVcsEditor( void GitClient::diff(const QString &workingDirectory, const QStringList &unstagedFileNames, - const QStringList &stagedFileNames) + const QStringList &stagedFileNames) const { GitDiffEditorReloader::DiffType diffType = GitDiffEditorReloader::DiffProjectList; @@ -968,19 +1012,24 @@ void GitClient::diff(const QString &workingDirectory, controller->setReloader(reloader); reloader->setWorkingDirectory(workingDirectory); - reloader->setDiffType(diffType); - if (diffType == GitDiffEditorReloader::DiffFileList) - reloader->setFileList(stagedFileNames, unstagedFileNames); - else if (diffType == GitDiffEditorReloader::DiffProjectList) - reloader->setProjectList(unstagedFileNames); } + DiffEditor::DiffEditorController *controller = diffEditorDocument->controller(); + GitDiffEditorReloader *reloader = static_cast<GitDiffEditorReloader *>(controller->reloader()); + reloader->setDiffType(diffType); + // we force setFileList, since the lists can be different + // e.g. when double click for the second time on different file inside commit editor + if (diffType == GitDiffEditorReloader::DiffFileList) + reloader->setFileList(stagedFileNames, unstagedFileNames); + else if (diffType == GitDiffEditorReloader::DiffProjectList) // the same when unstaged file was clicked + reloader->setProjectList(unstagedFileNames); + diffEditorDocument->controller()->requestReload(); EditorManager::activateEditorForDocument(diffEditorDocument); } -void GitClient::diff(const QString &workingDirectory, const QString &fileName) +void GitClient::diff(const QString &workingDirectory, const QString &fileName) const { const QString title = tr("Git Diff \"%1\"").arg(fileName); const QString sourceFile = VcsBase::VcsBaseEditorWidget::getSource( @@ -1006,7 +1055,7 @@ void GitClient::diff(const QString &workingDirectory, const QString &fileName) } void GitClient::diffBranch(const QString &workingDirectory, - const QString &branchName) + const QString &branchName) const { const QString title = tr("Git Diff Branch \"%1\"").arg(branchName); const QString documentId = QLatin1String("Branch:") + branchName; @@ -1521,7 +1570,7 @@ static inline bool splitCommitParents(const QString &line, } bool GitClient::synchronousRevListCmd(const QString &workingDirectory, const QStringList &arguments, - QString *output, QString *errorMessage) + QString *output, QString *errorMessage) const { QByteArray outputTextData; QByteArray errorText; @@ -1545,7 +1594,7 @@ bool GitClient::synchronousParentRevisions(const QString &workingDirectory, const QStringList &files /* = QStringList() */, const QString &revision, QStringList *parents, - QString *errorMessage) + QString *errorMessage) const { QString outputText; QString errorText; @@ -1578,7 +1627,7 @@ bool GitClient::synchronousParentRevisions(const QString &workingDirectory, static const char defaultShortLogFormatC[] = "%h (%an \"%s"; static const int maxShortLogLength = 120; -QString GitClient::synchronousShortDescription(const QString &workingDirectory, const QString &revision) +QString GitClient::synchronousShortDescription(const QString &workingDirectory, const QString &revision) const { // Short SHA 1, author, subject QString output = synchronousShortDescription(workingDirectory, revision, @@ -1593,7 +1642,7 @@ QString GitClient::synchronousShortDescription(const QString &workingDirectory, return output; } -QString GitClient::synchronousCurrentLocalBranch(const QString &workingDirectory) +QString GitClient::synchronousCurrentLocalBranch(const QString &workingDirectory) const { QByteArray outputTextData; QStringList arguments; @@ -1611,7 +1660,7 @@ QString GitClient::synchronousCurrentLocalBranch(const QString &workingDirectory } bool GitClient::synchronousHeadRefs(const QString &workingDirectory, QStringList *output, - QString *errorMessage) + QString *errorMessage) const { QStringList args; args << QLatin1String("show-ref") << QLatin1String("--head") @@ -1643,7 +1692,7 @@ bool GitClient::synchronousHeadRefs(const QString &workingDirectory, QStringList } // Retrieve topic (branch, tag or HEAD hash) -QString GitClient::synchronousTopic(const QString &workingDirectory) +QString GitClient::synchronousTopic(const QString &workingDirectory) const { // First try to find branch QString branch = synchronousCurrentLocalBranch(workingDirectory); @@ -1711,7 +1760,7 @@ QString GitClient::synchronousTopRevision(const QString &workingDirectory, QStri } void GitClient::synchronousTagsForCommit(const QString &workingDirectory, const QString &revision, - QString &precedes, QString &follows) + QString &precedes, QString &follows) const { QByteArray pr; QStringList arguments; @@ -1789,7 +1838,7 @@ bool GitClient::isFastForwardMerge(const QString &workingDirectory, const QStrin // Format an entry in a one-liner for selection list using git log. QString GitClient::synchronousShortDescription(const QString &workingDirectory, const QString &revision, - const QString &format) + const QString &format) const { QString description; QByteArray outputTextData; @@ -1831,7 +1880,7 @@ static inline QString creatorStashMessage(const QString &keyword = QString()) * StashIgnoreUnchanged: Be quiet about unchanged repositories (used for IVersionControl's snapshots). */ QString GitClient::synchronousStash(const QString &workingDirectory, const QString &messageKeyword, - unsigned flags, bool *unchanged) + unsigned flags, bool *unchanged) const { if (unchanged) *unchanged = false; @@ -1874,7 +1923,7 @@ QString GitClient::synchronousStash(const QString &workingDirectory, const QStri bool GitClient::executeSynchronousStash(const QString &workingDirectory, const QString &message, - QString *errorMessage) + QString *errorMessage) const { QByteArray outputText; QByteArray errorText; @@ -1893,7 +1942,7 @@ bool GitClient::executeSynchronousStash(const QString &workingDirectory, // Resolve a stash name from message bool GitClient::stashNameFromMessage(const QString &workingDirectory, const QString &message, QString *name, - QString *errorMessage) + QString *errorMessage) const { // All happy if (message.startsWith(QLatin1String(stashNamePrefix))) { @@ -1917,7 +1966,7 @@ bool GitClient::stashNameFromMessage(const QString &workingDirectory, } bool GitClient::synchronousBranchCmd(const QString &workingDirectory, QStringList branchArgs, - QString *output, QString *errorMessage) + QString *output, QString *errorMessage) const { branchArgs.push_front(QLatin1String("branch")); QByteArray outputText; @@ -1931,7 +1980,7 @@ bool GitClient::synchronousBranchCmd(const QString &workingDirectory, QStringLis } bool GitClient::synchronousTagCmd(const QString &workingDirectory, QStringList tagArgs, - QString *output, QString *errorMessage) + QString *output, QString *errorMessage) const { tagArgs.push_front(QLatin1String("tag")); QByteArray outputText; @@ -1945,7 +1994,7 @@ bool GitClient::synchronousTagCmd(const QString &workingDirectory, QStringList t } bool GitClient::synchronousForEachRefCmd(const QString &workingDirectory, QStringList args, - QString *output, QString *errorMessage) + QString *output, QString *errorMessage) const { args.push_front(QLatin1String("for-each-ref")); QByteArray outputText; @@ -1960,7 +2009,7 @@ bool GitClient::synchronousForEachRefCmd(const QString &workingDirectory, QStrin } bool GitClient::synchronousRemoteCmd(const QString &workingDirectory, QStringList remoteArgs, - QString *output, QString *errorMessage, bool silent) + QString *output, QString *errorMessage, bool silent) const { remoteArgs.push_front(QLatin1String("remote")); QByteArray outputText; @@ -1975,7 +2024,7 @@ bool GitClient::synchronousRemoteCmd(const QString &workingDirectory, QStringLis } QMap<QString,QString> GitClient::synchronousRemotesList(const QString &workingDirectory, - QString *errorMessage) + QString *errorMessage) const { QMap<QString,QString> result; QString output; @@ -2001,7 +2050,7 @@ QMap<QString,QString> GitClient::synchronousRemotesList(const QString &workingDi } QStringList GitClient::synchronousSubmoduleStatus(const QString &workingDirectory, - QString *errorMessage) + QString *errorMessage) const { QByteArray outputTextData; QByteArray errorText; @@ -2018,7 +2067,7 @@ QStringList GitClient::synchronousSubmoduleStatus(const QString &workingDirector return commandOutputLinesFromLocal8Bit(outputTextData); } -SubmoduleDataMap GitClient::submoduleList(const QString &workingDirectory) +SubmoduleDataMap GitClient::submoduleList(const QString &workingDirectory) const { SubmoduleDataMap result; QString gitmodulesFileName = workingDirectory + QLatin1String("/.gitmodules"); @@ -2076,7 +2125,7 @@ SubmoduleDataMap GitClient::submoduleList(const QString &workingDirectory) } bool GitClient::synchronousShow(const QString &workingDirectory, const QString &id, - QString *output, QString *errorMessage) + QString *output, QString *errorMessage) const { if (!canShow(id)) { *errorMessage = msgCannotShow(id); @@ -2253,7 +2302,7 @@ bool GitClient::isValidRevision(const QString &revision) const Utils::SynchronousProcessResponse GitClient::synchronousGit(const QString &workingDirectory, const QStringList &gitArguments, unsigned flags, - QTextCodec *outputCodec) + QTextCodec *outputCodec) const { return VcsBasePlugin::runVcs(workingDirectory, gitExecutable(), gitArguments, settings()->intValue(GitSettings::timeoutKey) * 1000, @@ -2339,7 +2388,7 @@ void GitClient::fetchFinished(const QVariant &cookie) } GitClient::StatusResult GitClient::gitStatus(const QString &workingDirectory, StatusMode mode, - QString *output, QString *errorMessage) + QString *output, QString *errorMessage) const { // Run 'status'. Note that git returns exitcode 1 if there are no added files. QByteArray outputText; @@ -2378,7 +2427,7 @@ GitClient::StatusResult GitClient::gitStatus(const QString &workingDirectory, St return StatusUnchanged; } -QString GitClient::commandInProgressDescription(const QString &workingDirectory) +QString GitClient::commandInProgressDescription(const QString &workingDirectory) const { switch (checkCommandInProgress(workingDirectory)) { case NoCommand: @@ -2396,7 +2445,7 @@ QString GitClient::commandInProgressDescription(const QString &workingDirectory) return QString(); } -GitClient::CommandInProgress GitClient::checkCommandInProgress(const QString &workingDirectory) +GitClient::CommandInProgress GitClient::checkCommandInProgress(const QString &workingDirectory) const { const QString gitDir = findGitDirForRepository(workingDirectory); if (QFile::exists(gitDir + QLatin1String("/MERGE_HEAD"))) @@ -2490,7 +2539,7 @@ void GitClient::continuePreviousGitCommand(const QString &workingDirectory, } } -QString GitClient::extendedShowDescription(const QString &workingDirectory, const QString &text) +QString GitClient::extendedShowDescription(const QString &workingDirectory, const QString &text) const { if (!text.startsWith(QLatin1String("commit "))) return text; @@ -2509,7 +2558,7 @@ QString GitClient::extendedShowDescription(const QString &workingDirectory, cons // Quietly retrieve branch list of remote repository URL // // The branch HEAD is pointing to is always returned first. -QStringList GitClient::synchronousRepositoryBranches(const QString &repositoryURL) +QStringList GitClient::synchronousRepositoryBranches(const QString &repositoryURL) const { QStringList arguments(QLatin1String("ls-remote")); arguments << repositoryURL << QLatin1String(HEAD) << QLatin1String("refs/heads/*"); @@ -3071,7 +3120,7 @@ void GitClient::fetch(const QString &workingDirectory, const QString &remote) bool GitClient::executeAndHandleConflicts(const QString &workingDirectory, const QStringList &arguments, - const QString &abortCommand) + const QString &abortCommand) const { // Disable UNIX terminals to suppress SSH prompting. const unsigned flags = VcsBasePlugin::SshPasswordPrompt @@ -3374,7 +3423,7 @@ void GitClient::stashPop(const QString &workingDirectory) bool GitClient::synchronousStashRestore(const QString &workingDirectory, const QString &stash, bool pop, - const QString &branch /* = QString()*/) + const QString &branch /* = QString()*/) const { QStringList arguments(QLatin1String("stash")); if (branch.isEmpty()) @@ -3386,7 +3435,7 @@ bool GitClient::synchronousStashRestore(const QString &workingDirectory, bool GitClient::synchronousStashRemove(const QString &workingDirectory, const QString &stash /* = QString() */, - QString *errorMessage /* = 0 */) + QString *errorMessage /* = 0 */) const { QStringList arguments(QLatin1String("stash")); if (stash.isEmpty()) @@ -3408,7 +3457,7 @@ bool GitClient::synchronousStashRemove(const QString &workingDirectory, bool GitClient::synchronousStashList(const QString &workingDirectory, QList<Stash> *stashes, - QString *errorMessage /* = 0 */) + QString *errorMessage /* = 0 */) const { stashes->clear(); QStringList arguments(QLatin1String("stash")); diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h index 2c2cfb141e..07af9a0a48 100644 --- a/src/plugins/git/gitclient.h +++ b/src/plugins/git/gitclient.h @@ -139,16 +139,16 @@ public: Utils::FileName gitExecutable(bool *ok = 0, QString *errorMessage = 0) const; unsigned gitVersion(QString *errorMessage = 0) const; - QString findRepositoryForDirectory(const QString &dir); + QString findRepositoryForDirectory(const QString &dir) const; QString findGitDirForRepository(const QString &repositoryDir) const; bool managesFile(const QString &workingDirectory, const QString &fileName) const; - void diff(const QString &workingDirectory, const QString &fileName); + void diff(const QString &workingDirectory, const QString &fileName) const; void diff(const QString &workingDirectory, const QStringList &unstagedFileNames, - const QStringList &stagedFileNames = QStringList()); + const QStringList &stagedFileNames = QStringList()) const; void diffBranch(const QString &workingDirectory, - const QString &branchName); + const QString &branchName) const; void merge(const QString &workingDirectory, const QStringList &unmergedFileNames = QStringList()); void status(const QString &workingDirectory); @@ -193,57 +193,57 @@ public: enum { StashPromptDescription = 0x1, StashImmediateRestore = 0x2, StashIgnoreUnchanged = 0x4 }; QString synchronousStash(const QString &workingDirectory, const QString &messageKeyword = QString(), - unsigned flags = 0, bool *unchanged = 0); + unsigned flags = 0, bool *unchanged = 0) const; bool executeSynchronousStash(const QString &workingDirectory, const QString &message = QString(), - QString *errorMessage = 0); + QString *errorMessage = 0) const; bool synchronousStashRestore(const QString &workingDirectory, const QString &stash, bool pop = false, - const QString &branch = QString()); + const QString &branch = QString()) const; bool synchronousStashRemove(const QString &workingDirectory, const QString &stash = QString(), - QString *errorMessage = 0); + QString *errorMessage = 0) const; bool synchronousBranchCmd(const QString &workingDirectory, QStringList branchArgs, - QString *output, QString *errorMessage); + QString *output, QString *errorMessage) const; bool synchronousTagCmd(const QString &workingDirectory, QStringList tagArgs, - QString *output, QString *errorMessage); + QString *output, QString *errorMessage) const; bool synchronousForEachRefCmd(const QString &workingDirectory, QStringList args, - QString *output, QString *errorMessage = 0); + QString *output, QString *errorMessage = 0) const; bool synchronousRemoteCmd(const QString &workingDirectory, QStringList remoteArgs, - QString *output, QString *errorMessage, bool silent = false); + QString *output, QString *errorMessage, bool silent = false) const; QMap<QString,QString> synchronousRemotesList(const QString &workingDirectory, - QString *errorMessage = 0); + QString *errorMessage = 0) const; QStringList synchronousSubmoduleStatus(const QString &workingDirectory, - QString *errorMessage = 0); - SubmoduleDataMap submoduleList(const QString &workingDirectory); + QString *errorMessage = 0) const; + SubmoduleDataMap submoduleList(const QString &workingDirectory) const; bool synchronousShow(const QString &workingDirectory, const QString &id, - QString *output, QString *errorMessage); + QString *output, QString *errorMessage) const; bool synchronousRevListCmd(const QString &workingDirectory, const QStringList &arguments, - QString *output, QString *errorMessage = 0); + QString *output, QString *errorMessage = 0) const; bool synchronousParentRevisions(const QString &workingDirectory, const QStringList &files /* = QStringList() */, const QString &revision, QStringList *parents, - QString *errorMessage); - QString synchronousShortDescription(const QString &workingDirectory, const QString &revision); + QString *errorMessage) const; + QString synchronousShortDescription(const QString &workingDirectory, const QString &revision) const; QString synchronousShortDescription(const QString &workingDirectory, const QString &revision, - const QString &format); + const QString &format) const; - QString synchronousCurrentLocalBranch(const QString &workingDirectory); + QString synchronousCurrentLocalBranch(const QString &workingDirectory) const; bool synchronousHeadRefs(const QString &workingDirectory, QStringList *output, - QString *errorMessage = 0); - QString synchronousTopic(const QString &workingDirectory); + QString *errorMessage = 0) const; + QString synchronousTopic(const QString &workingDirectory) const; bool synchronousRevParseCmd(const QString &workingDirectory, const QString &ref, QString *output, QString *errorMessage = 0) const; QString synchronousTopRevision(const QString &workingDirectory, QString *errorMessage = 0); void synchronousTagsForCommit(const QString &workingDirectory, const QString &revision, - QString &precedes, QString &follows); + QString &precedes, QString &follows) const; bool isRemoteCommit(const QString &workingDirectory, const QString &commit); bool isFastForwardMerge(const QString &workingDirectory, const QString &branch); @@ -279,11 +279,11 @@ public: void revert(const QStringList &files, bool revertStaging); bool synchronousStashList(const QString &workingDirectory, QList<Stash> *stashes, - QString *errorMessage = 0); + QString *errorMessage = 0) const; // Resolve a stash name from message (for IVersionControl's names). bool stashNameFromMessage(const QString &workingDirectory, const QString &messge, QString *name, - QString *errorMessage = 0); + QString *errorMessage = 0) const; QString readConfigValue(const QString &workingDirectory, const QString &configVar) const; @@ -305,14 +305,14 @@ public: StatusResult gitStatus(const QString &workingDirectory, StatusMode mode, QString *output = 0, - QString *errorMessage = 0); + QString *errorMessage = 0) const; - CommandInProgress checkCommandInProgress(const QString &workingDirectory); - QString commandInProgressDescription(const QString &workingDirectory); + CommandInProgress checkCommandInProgress(const QString &workingDirectory) const; + QString commandInProgressDescription(const QString &workingDirectory) const; void continueCommandIfNeeded(const QString &workingDirectory, bool allowContinue = true); - QString extendedShowDescription(const QString &workingDirectory, const QString &text); + QString extendedShowDescription(const QString &workingDirectory, const QString &text) const; void launchGitK(const QString &workingDirectory, const QString &fileName); void launchGitK(const QString &workingDirectory) { launchGitK(workingDirectory, QString()); } @@ -321,7 +321,7 @@ public: void launchRepositoryBrowser(const QString &workingDirectory); - QStringList synchronousRepositoryBranches(const QString &repositoryURL); + QStringList synchronousRepositoryBranches(const QString &repositoryURL) const; GitSettings *settings() const; @@ -397,7 +397,7 @@ private: // log windows updating (using VcsBasePlugin::runVcs with flags). inline Utils::SynchronousProcessResponse synchronousGit(const QString &workingDirectory, const QStringList &arguments, - unsigned flags = 0, QTextCodec *outputCodec = 0); + unsigned flags = 0, QTextCodec *outputCodec = 0) const; // determine version as '(major << 16) + (minor << 8) + patch' or 0. unsigned synchronousGitVersion(QString *errorMessage = 0) const; @@ -409,7 +409,7 @@ private: bool revertStaging); void connectRepositoryChanged(const QString & repository, VcsBase::Command *cmd); bool executeAndHandleConflicts(const QString &workingDirectory, const QStringList &arguments, - const QString &abortCommand = QString()); + const QString &abortCommand = QString()) const; bool tryLauchingGitK(const QProcessEnvironment &env, const QString &workingDirectory, const QString &fileName, diff --git a/src/plugins/ios/iosprobe.cpp b/src/plugins/ios/iosprobe.cpp index 54c01975cd..8cea854e15 100644 --- a/src/plugins/ios/iosprobe.cpp +++ b/src/plugins/ios/iosprobe.cpp @@ -63,7 +63,7 @@ static int compareVersions(const QString &v1, const QString &v2) QStringList v1L = v1.split(QLatin1Char('.')); QStringList v2L = v2.split(QLatin1Char('.')); int i = 0; - while (v1.length() > i && v1.length() > i) { + while (v1L.length() > i && v2L.length() > i) { bool n1Ok, n2Ok; int n1 = v1L.value(i).toInt(&n1Ok); int n2 = v2L.value(i).toInt(&n2Ok); @@ -77,9 +77,9 @@ static int compareVersions(const QString &v1, const QString &v2) return 1; ++i; } - if (v1.length() > v2.length()) + if (v1L.length() > v2L.length()) return -1; - if (v1.length() < v2.length()) + if (v1L.length() < v2L.length()) return 1; return 0; } diff --git a/src/plugins/projectexplorer/editorconfiguration.cpp b/src/plugins/projectexplorer/editorconfiguration.cpp index 2358920a2c..6f7ef0abe1 100644 --- a/src/plugins/projectexplorer/editorconfiguration.cpp +++ b/src/plugins/projectexplorer/editorconfiguration.cpp @@ -32,8 +32,11 @@ #include "projectexplorer.h" #include "project.h" +#include <utils/algorithm.h> + #include <coreplugin/id.h> #include <coreplugin/icore.h> +#include <coreplugin/editormanager/editormanager.h> #include <texteditor/basetexteditor.h> #include <texteditor/texteditorsettings.h> #include <texteditor/simplecodestylepreferences.h> @@ -82,6 +85,7 @@ struct EditorConfigurationPrivate QTextCodec *m_textCodec; QMap<Core::Id, ICodeStylePreferences *> m_languageCodeStylePreferences; + QList<BaseTextEditor *> m_editors; }; EditorConfiguration::EditorConfiguration() : d(new EditorConfigurationPrivate) @@ -116,6 +120,8 @@ EditorConfiguration::EditorConfiguration() : d(new EditorConfigurationPrivate) connect(SessionManager::instance(), SIGNAL(aboutToRemoveProject(ProjectExplorer::Project*)), this, SLOT(slotAboutToRemoveProject(ProjectExplorer::Project*))); + connect(Core::EditorManager::instance(), SIGNAL(editorsClosed(QList<Core::IEditor*>)), + this, SLOT(editorsClosed(QList<Core::IEditor*>))); } EditorConfiguration::~EditorConfiguration() @@ -256,6 +262,7 @@ void EditorConfiguration::configureEditor(BaseTextEditor *textEditor) const if (widget) switchSettings(widget); } + d->m_editors.append(textEditor); } void EditorConfiguration::deconfigureEditor(BaseTextEditor *textEditor) const @@ -264,6 +271,8 @@ void EditorConfiguration::deconfigureEditor(BaseTextEditor *textEditor) const if (widget) widget->setCodeStyle(TextEditorSettings::codeStyle(widget->languageSettingsId())); + d->m_editors.removeOne(textEditor); + // TODO: what about text codec and switching settings? } @@ -384,16 +393,15 @@ void EditorConfiguration::slotAboutToRemoveProject(ProjectExplorer::Project *pro if (project->editorConfiguration() != this) return; - foreach (Core::IEditor *editor, Core::DocumentModel::editorsForOpenedDocuments()) { - if (TextEditor::BaseTextEditor *textEditor = qobject_cast<TextEditor::BaseTextEditor*>(editor)) { - Core::IDocument *document = editor->document(); - if (document) { - Project *editorProject = SessionManager::projectForFile(document->filePath()); - if (project == editorProject) - deconfigureEditor(textEditor); - } - } - } + foreach (TextEditor::BaseTextEditor *editor, d->m_editors) + deconfigureEditor(editor); +} + +void EditorConfiguration::editorsClosed(const QList<Core::IEditor*> &closedEditors) +{ + Utils::erase(d->m_editors, [&closedEditors](Core::IEditor *editor) { + return closedEditors.contains(editor); + }); } TabSettings actualTabSettings(const QString &fileName, diff --git a/src/plugins/projectexplorer/editorconfiguration.h b/src/plugins/projectexplorer/editorconfiguration.h index 71e825df16..6631a84953 100644 --- a/src/plugins/projectexplorer/editorconfiguration.h +++ b/src/plugins/projectexplorer/editorconfiguration.h @@ -35,7 +35,10 @@ #include <QObject> #include <QVariantMap> -namespace Core { class Id; } +namespace Core { +class IEditor; +class Id; +} namespace TextEditor { class BaseTextEditor; @@ -107,6 +110,7 @@ private slots: void setTextCodec(QTextCodec *textCodec); void slotAboutToRemoveProject(ProjectExplorer::Project *project); + void editorsClosed(const QList<Core::IEditor*> &closedEditors); private: void switchSettings(TextEditor::BaseTextEditorWidget *baseTextEditor) const; diff --git a/src/plugins/projectexplorer/projectwizardpage.cpp b/src/plugins/projectexplorer/projectwizardpage.cpp index 3a37bdd500..c7b93a44e2 100644 --- a/src/plugins/projectexplorer/projectwizardpage.cpp +++ b/src/plugins/projectexplorer/projectwizardpage.cpp @@ -115,8 +115,10 @@ void BestNodeSelector::inspect(AddNewTree *tree) const int projectDirectorySize = projectDirectory.size(); if (!m_commonDirectory.startsWith(projectDirectory)) return; - bool betterMatch = projectDirectorySize > m_bestMatchLength - || (projectDirectorySize == m_bestMatchLength && tree->priority() > m_bestMatchPriority); + bool betterMatch = tree->priority() > 0 + && (projectDirectorySize > m_bestMatchLength + || (projectDirectorySize == m_bestMatchLength && tree->priority() > m_bestMatchPriority)); + if (betterMatch) { m_bestMatchPriority = tree->priority(); m_bestMatchLength = projectDirectorySize; diff --git a/src/plugins/qbsprojectmanager/defaultpropertyprovider.cpp b/src/plugins/qbsprojectmanager/defaultpropertyprovider.cpp index e5b0ac5a4d..605100e06c 100644 --- a/src/plugins/qbsprojectmanager/defaultpropertyprovider.cpp +++ b/src/plugins/qbsprojectmanager/defaultpropertyprovider.cpp @@ -163,6 +163,10 @@ QVariantMap DefaultPropertyProvider::properties(const ProjectExplorer::Kit *k, c if (!toolchainPrefix.isEmpty()) data.insert(QLatin1String(CPP_TOOLCHAINPREFIX), toolchainPrefix); data.insert(QLatin1String(CPP_COMPILERNAME), compilerName); + if (targetAbi.os() != ProjectExplorer::Abi::WindowsOS + || targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMSysFlavor) { + data.insert(QLatin1String(CPP_LINKERNAME), compilerName); + } data.insert(QLatin1String(CPP_TOOLCHAINPATH), cxxFileInfo.absolutePath()); if (targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMsvc2013Flavor) { const QLatin1String flags("/FS"); diff --git a/src/plugins/qbsprojectmanager/qbsconstants.h b/src/plugins/qbsprojectmanager/qbsconstants.h index c0af1997b0..4575e8cbd4 100644 --- a/src/plugins/qbsprojectmanager/qbsconstants.h +++ b/src/plugins/qbsprojectmanager/qbsconstants.h @@ -42,6 +42,7 @@ const char QBS_TOOLCHAIN[] = "qbs.toolchain"; const char CPP_TOOLCHAINPATH[] = "cpp.toolchainInstallPath"; const char CPP_TOOLCHAINPREFIX[] = "cpp.toolchainPrefix"; const char CPP_COMPILERNAME[] = "cpp.compilerName"; +const char CPP_LINKERNAME[] = "cpp.linkerName"; const char CPP_PLATFORMCFLAGS[] = "cpp.platformCFlags"; const char CPP_PLATFORMCXXFLAGS[] = "cpp.platformCxxFlags"; const char CPP_XCODESDKNAME[] = "cpp.xcodeSdkName"; diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp index 8e73b24a40..5a63f82cf1 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.cpp +++ b/src/plugins/qbsprojectmanager/qbsproject.cpp @@ -749,6 +749,13 @@ void QbsProject::updateApplicationTargets(const qbs::ProjectData &projectData) { ProjectExplorer::BuildTargetInfoList applications; foreach (const qbs::ProductData &productData, projectData.allProducts()) { + if (!productData.isEnabled() || !productData.isRunnable()) + continue; + if (productData.targetArtifacts().isEmpty()) { // No build yet. + applications.list << ProjectExplorer::BuildTargetInfo(Utils::FileName(), + Utils::FileName::fromString(productData.location().fileName())); + continue; + } foreach (const qbs::TargetArtifact &ta, productData.targetArtifacts()) { QTC_ASSERT(ta.isValid(), continue); if (!ta.isExecutable()) diff --git a/src/plugins/qbsprojectmanager/qbsprojectmanager.qbs b/src/plugins/qbsprojectmanager/qbsprojectmanager.qbs index bfee79593f..d026f069f3 100644 --- a/src/plugins/qbsprojectmanager/qbsprojectmanager.qbs +++ b/src/plugins/qbsprojectmanager/qbsprojectmanager.qbs @@ -76,6 +76,7 @@ QtcPlugin { "qbscleanstep.cpp", "qbscleanstep.h", "qbscleanstepconfigwidget.ui", + "qbsconstants.h", "qbsdeployconfigurationfactory.cpp", "qbsdeployconfigurationfactory.h", "qbsinstallstep.cpp", diff --git a/src/plugins/qmakeandroidsupport/createandroidmanifestwizard.cpp b/src/plugins/qmakeandroidsupport/createandroidmanifestwizard.cpp index 8e2f16239a..5c0aead33a 100644 --- a/src/plugins/qmakeandroidsupport/createandroidmanifestwizard.cpp +++ b/src/plugins/qmakeandroidsupport/createandroidmanifestwizard.cpp @@ -228,8 +228,11 @@ QString CreateAndroidManifestWizard::sourceFileName() const return srcFolder; Utils::FileName srcPath = Utils::FileName::fromString(srcFolder) - .appendPath(QLatin1String("src/android/java")); - srcPath.appendPath(QLatin1String("AndroidManifest.xml")); + .appendPath(QLatin1String("src/android")); + if (QFile::exists(srcPath.toString() + QLatin1String("/templates/AndroidManifest.xml"))) + srcPath.appendPath(QLatin1String("/templates/AndroidManifest.xml")); + else + srcPath.appendPath(QLatin1String("/java/AndroidManifest.xml")); return srcPath.toString(); } diff --git a/src/plugins/qmakeprojectmanager/librarydetailscontroller.cpp b/src/plugins/qmakeprojectmanager/librarydetailscontroller.cpp index afe18ef262..6b1a20bb05 100644 --- a/src/plugins/qmakeprojectmanager/librarydetailscontroller.cpp +++ b/src/plugins/qmakeprojectmanager/librarydetailscontroller.cpp @@ -597,7 +597,7 @@ static QString generatePreTargetDepsSnippet(AddLibraryWizard::Platforms platform generatedPlatforms |= windowsPlatforms; } else { if (windowsPlatforms & AddLibraryWizard::WindowsMSVCPlatform) { - str << "win32:!win32-g++ " << preTargetDepsSnippet << libName << ".lib\n"; + str << "win32:!win32-g++: " << preTargetDepsSnippet << libName << ".lib\n"; generatedPlatforms |= AddLibraryWizard::WindowsMSVCPlatform; // mingw will be handled with common scopes } // mingw not generated yet, will be joined with unix like diff --git a/src/plugins/qmakeprojectmanager/qmakenodes.cpp b/src/plugins/qmakeprojectmanager/qmakenodes.cpp index cb8052a5dd..76ac873a60 100644 --- a/src/plugins/qmakeprojectmanager/qmakenodes.cpp +++ b/src/plugins/qmakeprojectmanager/qmakenodes.cpp @@ -1289,10 +1289,13 @@ QStringList QmakePriFileNode::varNames(ProjectExplorer::FileType type, QtSupport break; case ProjectExplorer::QMLType: vars << QLatin1String("OTHER_FILES"); + vars << QLatin1String("DISTFILES"); break; default: vars << QLatin1String("OTHER_FILES"); + vars << QLatin1String("DISTFILES"); vars << QLatin1String("ICON"); + vars << QLatin1String("QMAKE_INFO_PLIST"); break; } return vars; @@ -1353,6 +1356,7 @@ QStringList QmakePriFileNode::varNamesForRemoving() vars << QLatin1String("SUBDIRS"); vars << QLatin1String("OTHER_FILES"); vars << QLatin1String("ICON"); + vars << QLatin1String("QMAKE_INFO_PLIST"); return vars; } diff --git a/src/plugins/qmakeprojectmanager/wizards/qtquickapp.cpp b/src/plugins/qmakeprojectmanager/wizards/qtquickapp.cpp index f64789053f..931c214ab3 100644 --- a/src/plugins/qmakeprojectmanager/wizards/qtquickapp.cpp +++ b/src/plugins/qmakeprojectmanager/wizards/qtquickapp.cpp @@ -31,6 +31,8 @@ #include <utils/qtcassert.h> #include <utils/fileutils.h> +#include <extensionsystem/pluginmanager.h> +#include <extensionsystem/pluginspec.h> #include <QDebug> #include <QDir> @@ -173,6 +175,12 @@ class TemplateInfoList public: TemplateInfoList() { + QSet<QString> availablePlugins; + foreach (ExtensionSystem::PluginSpec *s, ExtensionSystem::PluginManager::plugins()) { + if (s->state() == ExtensionSystem::PluginSpec::Running && !s->hasError()) + availablePlugins += s->name(); + } + QMultiMap<QString, TemplateInfo> multiMap; foreach (const QString &templateName, templateNames()) { const QString templatePath = templateRootDirectory() + templateName; @@ -185,7 +193,17 @@ public: info.templateName = templateName; info.templatePath = templatePath; QXmlStreamReader reader(&xmlFile); - if (parseTemplateXml(reader, &info)) + if (!parseTemplateXml(reader, &info)) + continue; + + bool ok = true; + foreach (const QString &neededPlugin, info.requiredPlugins) { + if (!availablePlugins.contains(neededPlugin)) { + ok = false; + break; + } + } + if (ok) multiMap.insert(info.priority, info); } m_templateInfoList = multiMap.values(); diff --git a/src/plugins/qmakeprojectmanager/wizards/qtquickappwizard.cpp b/src/plugins/qmakeprojectmanager/wizards/qtquickappwizard.cpp index ba56fbddb2..59b06b88e8 100644 --- a/src/plugins/qmakeprojectmanager/wizards/qtquickappwizard.cpp +++ b/src/plugins/qmakeprojectmanager/wizards/qtquickappwizard.cpp @@ -71,6 +71,8 @@ QtQuickAppWizardDialog::QtQuickAppWizardDialog(QWidget *parent, addPage(m_componentSetPage); addKitsPage(); + + setRequiredFeatures(Core::Feature(QtSupport::Constants::FEATURE_QT_QUICK)); } void QtQuickAppWizardDialog::initializePage(int id) diff --git a/src/plugins/qmakeprojectmanager/wizards/qtquickappwizardpages.cpp b/src/plugins/qmakeprojectmanager/wizards/qtquickappwizardpages.cpp index 78451eaf54..1dd36a63ef 100644 --- a/src/plugins/qmakeprojectmanager/wizards/qtquickappwizardpages.cpp +++ b/src/plugins/qmakeprojectmanager/wizards/qtquickappwizardpages.cpp @@ -30,8 +30,6 @@ #include "qtquickappwizardpages.h" #include <utils/wizard.h> -#include <extensionsystem/pluginmanager.h> -#include <extensionsystem/pluginspec.h> #include <QComboBox> #include <QLabel> @@ -58,23 +56,8 @@ QtQuickComponentSetPage::QtQuickComponentSetPage(QWidget *parent) QLabel *label = new QLabel(tr("Qt Quick component set:"), this); d->m_versionComboBox = new QComboBox(this); - QSet<QString> availablePlugins; - foreach (ExtensionSystem::PluginSpec *s, ExtensionSystem::PluginManager::plugins()) { - if (s->state() == ExtensionSystem::PluginSpec::Running && !s->hasError()) - availablePlugins += s->name(); - } - - foreach (const TemplateInfo &templateInfo, QtQuickApp::templateInfos()) { - bool ok = true; - foreach (const QString &neededPlugin, templateInfo.requiredPlugins) { - if (!availablePlugins.contains(neededPlugin)) { - ok = false; - break; - } - } - if (ok) - d->m_versionComboBox->addItem(templateInfo.displayName); - } + foreach (const TemplateInfo &templateInfo, QtQuickApp::templateInfos()) + d->m_versionComboBox->addItem(templateInfo.displayName); l->addWidget(label); l->addWidget(d->m_versionComboBox); diff --git a/src/plugins/qmldesigner/components/debugview/debugview.cpp b/src/plugins/qmldesigner/components/debugview/debugview.cpp index aeeebfdf68..4e582907b6 100644 --- a/src/plugins/qmldesigner/components/debugview/debugview.cpp +++ b/src/plugins/qmldesigner/components/debugview/debugview.cpp @@ -212,9 +212,19 @@ void DebugView::rootNodeTypeChanged(const QString &type, int majorVersion, int m } } -void DebugView::selectedNodesChanged(const QList<ModelNode> & /*selectedNodeList*/, +void DebugView::selectedNodesChanged(const QList<ModelNode> &selectedNodes /*selectedNodeList*/, const QList<ModelNode> & /*lastSelectedNodeList*/) { + foreach (const ModelNode &selectedNode, selectedNodes) { + QTextStream message; + QString string; + message.setString(&string); + message << selectedNode; + foreach (const VariantProperty &property, selectedNode.variantProperties()) { + message << property; + } + log(tr("Node selected:"), string); + } } void DebugView::scriptFunctionsChanged(const ModelNode & /*node*/, const QStringList & /*scriptFunctionList*/) diff --git a/src/plugins/qmldesigner/components/formeditor/contentnoteditableindicator.cpp b/src/plugins/qmldesigner/components/formeditor/contentnoteditableindicator.cpp index 5cba0e3565..9ef118aee0 100644 --- a/src/plugins/qmldesigner/components/formeditor/contentnoteditableindicator.cpp +++ b/src/plugins/qmldesigner/components/formeditor/contentnoteditableindicator.cpp @@ -31,6 +31,7 @@ #include "nodemetainfo.h" #include <QSet> +#include <QPen> namespace QmlDesigner { @@ -95,13 +96,14 @@ void ContentNotEditableIndicator::addAddiationEntries(const QList<FormEditorItem if (!m_entryList.contains(EntryPair(formEditorItem, 0))) { QGraphicsRectItem *indicatorShape = new QGraphicsRectItem(m_layerItem); + QPen linePen; + linePen.setColor("#a0a0a0"); + indicatorShape->setPen(linePen); QRectF boundingRectangleInSceneSpace = formEditorItem->qmlItemNode().instanceSceneTransform().mapRect(formEditorItem->qmlItemNode().instanceBoundingRect()); indicatorShape->setRect(boundingRectangleInSceneSpace); - static QBrush brush(QColor(0, 0, 0, 130), Qt::BDiagPattern); + static QBrush brush(QColor(0, 0, 0, 10), Qt::BDiagPattern); indicatorShape->setBrush(brush); - formEditorItem->blurContent(true); - m_entryList.append(EntryPair(formEditorItem, indicatorShape)); } diff --git a/src/plugins/qmldesigner/components/formeditor/dragtool.cpp b/src/plugins/qmldesigner/components/formeditor/dragtool.cpp index b7a5ff220c..a4c19fa4b1 100644 --- a/src/plugins/qmldesigner/components/formeditor/dragtool.cpp +++ b/src/plugins/qmldesigner/components/formeditor/dragtool.cpp @@ -81,7 +81,7 @@ void DragTool::keyPressEvent(QKeyEvent *event) if (event->key() == Qt::Key_Escape) { abort(); event->accept(); - m_rewriterTransaction.commit(); + commitTransaction(); view()->changeToSelectionTool(); } } @@ -232,7 +232,7 @@ void DragTool::dropEvent(const QList<QGraphicsItem*> &/*itemList*/, QGraphicsSce event->accept(); end(generateUseSnapping(event->modifiers())); - m_rewriterTransaction.commit(); + commitTransaction(); if (m_dragNode.isValid()) view()->setSelectedModelNode(m_dragNode); @@ -282,7 +282,7 @@ void DragTool::dragLeaveEvent(const QList<QGraphicsItem*> &/*itemList*/, QGraphi if (m_dragNode.isValid()) m_dragNode.destroy(); - m_rewriterTransaction.commit(); + commitTransaction(); view()->changeToSelectionTool(); } @@ -361,4 +361,13 @@ void DragTool::move(const QPointF &scenePosition, const QList<QGraphicsItem*> & } } +void DragTool::commitTransaction() +{ + try { + m_rewriterTransaction.commit(); + } catch (RewritingException &e) { + e.showException(); + } +} + } diff --git a/src/plugins/qmldesigner/components/formeditor/dragtool.h b/src/plugins/qmldesigner/components/formeditor/dragtool.h index 844c980dc8..eacef05229 100644 --- a/src/plugins/qmldesigner/components/formeditor/dragtool.h +++ b/src/plugins/qmldesigner/components/formeditor/dragtool.h @@ -91,6 +91,7 @@ protected: void end(Snapper::Snapping useSnapping); void move(const QPointF &scenePos, const QList<QGraphicsItem *> &itemList); void createDragNode(const QMimeData *mimeData, const QPointF &scenePosition, const QList<QGraphicsItem *> &itemList); + void commitTransaction(); private: MoveManipulator m_moveManipulator; diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp index 5b7cdca461..ad34739ac0 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp @@ -646,7 +646,7 @@ void FormEditorView::delayedReset() m_resizeTool->clear(); m_dragTool->clear(); m_scene->clearFormEditorItems(); - if (QmlItemNode::isValidQmlItemNode(rootModelNode())) + if (isAttached() && QmlItemNode::isValidQmlItemNode(rootModelNode())) setupFormEditorItemTree(rootModelNode()); } diff --git a/src/plugins/qmldesigner/components/importmanager/importswidget.cpp b/src/plugins/qmldesigner/components/importmanager/importswidget.cpp index e58ff77120..9768b4a997 100644 --- a/src/plugins/qmldesigner/components/importmanager/importswidget.cpp +++ b/src/plugins/qmldesigner/components/importmanager/importswidget.cpp @@ -92,6 +92,9 @@ void ImportsWidget::removeUsedImports() static bool importLess(const Import &firstImport, const Import &secondImport) { + if (firstImport.url() == secondImport.url()) + return firstImport.toString() < secondImport.toString(); + if (firstImport.url() == "QtQuick") return true; diff --git a/src/plugins/qmldesigner/components/integration/designdocument.cpp b/src/plugins/qmldesigner/components/integration/designdocument.cpp index beee3b46d5..23cf2e791e 100644 --- a/src/plugins/qmldesigner/components/integration/designdocument.cpp +++ b/src/plugins/qmldesigner/components/integration/designdocument.cpp @@ -422,6 +422,8 @@ void DesignDocument::cutSelected() static void scatterItem(const ModelNode &pastedNode, const ModelNode &targetNode, int offset = -2000) { + if (targetNode.metaInfo().isValid() && targetNode.metaInfo().isLayoutable()) + return; bool scatter = false; foreach (const ModelNode &childNode, targetNode.directSubModelNodes()) { diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp index a32f2504fa..91b2c657cd 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp @@ -50,8 +50,11 @@ #include <QtDebug> +#define DISABLE_VISIBLE_PROPERTIES + namespace QmlDesigner { +#ifndef DISABLE_VISIBLE_PROPERTIES static PropertyNameList visibleProperties(const ModelNode &node) { PropertyNameList propertyList; @@ -75,6 +78,7 @@ static PropertyNameList visibleProperties(const ModelNode &node) return propertyList; } +#endif static QList<ModelNode> acceptedModelNodeChildren(const ModelNode &parentNode) { @@ -84,7 +88,9 @@ static QList<ModelNode> acceptedModelNodeChildren(const ModelNode &parentNode) if (parentNode.metaInfo().hasDefaultProperty()) properties.append(parentNode.metaInfo().defaultPropertyName()); +#ifndef DISABLE_VISIBLE_PROPERTIES properties.append(visibleProperties(parentNode)); +#endif foreach (const PropertyName &propertyName, properties) { AbstractProperty property(parentNode.property(propertyName)); @@ -201,7 +207,9 @@ static bool computeTarget(const QModelIndex &rowModelIndex, ModelNode targetNode = navigatorTreeModel->nodeForIndex(targetItemIndex); if (!targetNode.metaInfo().hasDefaultProperty()) return false; +#ifndef DISABLE_VISIBLE_PROPERTIES *targetRowNumber -= visibleProperties(targetNode).count(); +#endif targetPropertyName = targetNode.metaInfo().defaultPropertyName(); } else { targetItemIndex = rowModelIndex.parent(); @@ -280,6 +288,7 @@ ItemRow NavigatorTreeModel::createItemRow(const ModelNode &node) visibilityItem->setCheckable(false); QMap<QString, QStandardItem *> propertyItems; +#ifndef DISABLE_VISIBLE_PROPERTIES foreach (const QString &propertyName, visibleProperties(node)) { QStandardItem *propertyItem = new QStandardItem; propertyItem->setSelectable(false); @@ -290,6 +299,7 @@ ItemRow NavigatorTreeModel::createItemRow(const ModelNode &node) propertyItems.insert(propertyName, propertyItem); idItem->appendRow(propertyItem); } +#endif # ifdef _LOCK_ITEMS_ ItemRow newRow = ItemRow(idItem, lockItem, visibilityItem, propertyItems); @@ -334,13 +344,16 @@ static void findTargetItem(const NodeListProperty &listProperty, int *newRowNumber, QStandardItem **targetItem) { + Q_UNUSED(newRowNumber); if (navigatorTreeModel->isInTree(listProperty.parentModelNode())) { ItemRow parentRow = navigatorTreeModel->itemRowForNode(listProperty.parentModelNode()); if (parentRow.propertyItems.contains(listProperty.name())) { *targetItem = parentRow.propertyItems.value(listProperty.name()); } else { // default property *targetItem = parentRow.idItem; +#ifndef DISABLE_VISIBLE_PROPERTIES newRowNumber += visibleProperties(listProperty.parentModelNode()).count(); +#endif } } else { *targetItem = currentItemRow.idItem->parent(); diff --git a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp index 6f39ae2e9f..24809188b5 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp @@ -47,9 +47,15 @@ static inline void setScenePos(const QmlDesigner::ModelNode &modelNode,const QPo { if (modelNode.hasParentProperty() && QmlDesigner::QmlItemNode::isValidQmlItemNode(modelNode.parentProperty().parentModelNode())) { QmlDesigner::QmlItemNode parentNode = modelNode.parentProperty().parentQmlObjectNode().toQmlItemNode(); - QPointF localPos = parentNode.instanceSceneTransform().inverted().map(pos); - modelNode.variantProperty("x").setValue(localPos.toPoint().x()); - modelNode.variantProperty("y").setValue(localPos.toPoint().y()); + + if (!parentNode.modelNode().metaInfo().isLayoutable()) { + QPointF localPos = parentNode.instanceSceneTransform().inverted().map(pos); + modelNode.variantProperty("x").setValue(localPos.toPoint().x()); + modelNode.variantProperty("y").setValue(localPos.toPoint().y()); + } else { //Items in Layouts do not have a position + modelNode.removeProperty("x"); + modelNode.removeProperty("y"); + } } } diff --git a/src/plugins/qmldesigner/components/propertyeditor/qmlanchorbindingproxy.cpp b/src/plugins/qmldesigner/components/propertyeditor/qmlanchorbindingproxy.cpp index 45e69b5458..eeaa338068 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/qmlanchorbindingproxy.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/qmlanchorbindingproxy.cpp @@ -114,7 +114,13 @@ void QmlAnchorBindingProxy::invalidate(const QmlItemNode &fxItemNode) m_ignoreQml = true; - m_verticalTarget = m_horizontalTarget = m_topTarget = m_bottomTarget = m_leftTarget = m_rightTarget = m_qmlItemNode.modelNode().parentProperty().parentModelNode(); + m_verticalTarget = + m_horizontalTarget = + m_topTarget = + m_bottomTarget = + m_leftTarget = + m_rightTarget = + m_qmlItemNode.modelNode().parentProperty().parentModelNode(); setupAnchorTargets(); @@ -247,6 +253,47 @@ void QmlAnchorBindingProxy::emitAnchorSignals() emit relativeAnchorTargetRightChanged(); } +void QmlAnchorBindingProxy::setDefaultRelativeTopTarget() +{ + if (m_topTarget.modelNode() == m_qmlItemNode.modelNode().parentProperty().parentModelNode()) { + m_relativeTopTarget = SameEdge; + } else { + m_relativeTopTarget = OppositeEdge; + } +} + +void QmlAnchorBindingProxy::setDefaultRelativeBottomTarget() +{ + if (m_bottomTarget.modelNode() == m_qmlItemNode.modelNode().parentProperty().parentModelNode()) { + m_relativeBottomTarget = SameEdge; + } else { + m_relativeBottomTarget = OppositeEdge; + } +} + +void QmlAnchorBindingProxy::setDefaultRelativeLeftTarget() +{ + if (m_leftTarget.modelNode() == m_qmlItemNode.modelNode().parentProperty().parentModelNode()) { + m_relativeLeftTarget = SameEdge; + } else { + m_relativeLeftTarget = OppositeEdge; + } +} + +void QmlAnchorBindingProxy::setDefaultRelativeRightTarget() +{ + if (m_rightTarget.modelNode() == m_qmlItemNode.modelNode().parentProperty().parentModelNode()) { + m_relativeRightTarget = SameEdge; + } else { + m_relativeRightTarget = OppositeEdge; + } +} + +RewriterTransaction QmlAnchorBindingProxy::beginRewriterTransaction(const QByteArray &identifier) +{ + return m_qmlItemNode.modelNode().view()->beginRewriterTransaction(identifier); +} + bool QmlAnchorBindingProxy::hasParent() { return m_qmlItemNode.isValid() && m_qmlItemNode.hasNodeParent(); @@ -254,7 +301,12 @@ bool QmlAnchorBindingProxy::hasParent() bool QmlAnchorBindingProxy::isFilled() { - return m_qmlItemNode.isValid() && hasAnchors() && topAnchored() && bottomAnchored() && leftAnchored() && rightAnchored() + return m_qmlItemNode.isValid() + && hasAnchors() + && topAnchored() + && bottomAnchored() + && leftAnchored() + && rightAnchored() && (m_qmlItemNode.instanceValue("anchors.topMargin").toInt() == 0) && (m_qmlItemNode.instanceValue("anchors.bottomMargin").toInt() == 0) && (m_qmlItemNode.instanceValue("anchors.leftMargin").toInt() == 0) @@ -301,9 +353,13 @@ void QmlAnchorBindingProxy::setTopTarget(const QString &target) if (!newTarget.isValid()) return; - RewriterTransaction transaction = m_qmlItemNode.modelNode().view()->beginRewriterTransaction(QByteArrayLiteral("QmlAnchorBindingProxy::setTopTarget")); + RewriterTransaction transaction = beginRewriterTransaction( + QByteArrayLiteral("QmlAnchorBindingProxy::setTopTarget")); m_topTarget = newTarget; + + setDefaultRelativeTopTarget(); + anchorTop(); emit topTargetChanged(); @@ -323,9 +379,11 @@ void QmlAnchorBindingProxy::setBottomTarget(const QString &target) if (!newTarget.isValid()) return; - RewriterTransaction transaction = m_qmlItemNode.modelNode().view()->beginRewriterTransaction(QByteArrayLiteral("QmlAnchorBindingProxy::setBottomTarget")); + RewriterTransaction transaction = beginRewriterTransaction( + QByteArrayLiteral("QmlAnchorBindingProxy::setBottomTarget")); m_bottomTarget = newTarget; + setDefaultRelativeBottomTarget(); anchorBottom(); emit bottomTargetChanged(); @@ -344,9 +402,11 @@ void QmlAnchorBindingProxy::setLeftTarget(const QString &target) if (!newTarget.isValid()) return; - RewriterTransaction transaction = m_qmlItemNode.modelNode().view()->beginRewriterTransaction(QByteArrayLiteral("QmlAnchorBindingProxy::setLeftTarget")); + RewriterTransaction transaction = beginRewriterTransaction( + QByteArrayLiteral("QmlAnchorBindingProxy::setLeftTarget")); m_leftTarget = newTarget; + setDefaultRelativeLeftTarget(); anchorLeft(); emit leftTargetChanged(); @@ -365,9 +425,11 @@ void QmlAnchorBindingProxy::setRightTarget(const QString &target) if (!newTarget.isValid()) return; - RewriterTransaction transaction = m_qmlItemNode.modelNode().view()->beginRewriterTransaction(QByteArrayLiteral("QmlAnchorBindingProxy::setRightTarget")); + RewriterTransaction transaction = beginRewriterTransaction( + QByteArrayLiteral("QmlAnchorBindingProxy::setRightTarget")); m_rightTarget = newTarget; + setDefaultRelativeRightTarget(); anchorRight(); emit rightTargetChanged(); @@ -386,7 +448,8 @@ void QmlAnchorBindingProxy::setVerticalTarget(const QString &target) if (!newTarget.isValid()) return; - RewriterTransaction transaction = m_qmlItemNode.modelNode().view()->beginRewriterTransaction(QByteArrayLiteral("QmlAnchorBindingProxy::setVerticalTarget")); + RewriterTransaction transaction = beginRewriterTransaction( + QByteArrayLiteral("QmlAnchorBindingProxy::setVerticalTarget")); m_verticalTarget = newTarget; anchorVertical(); @@ -407,7 +470,8 @@ void QmlAnchorBindingProxy::setHorizontalTarget(const QString &target) if (!newTarget.isValid()) return; - RewriterTransaction transaction = m_qmlItemNode.modelNode().view()->beginRewriterTransaction(QByteArrayLiteral("QmlAnchorBindingProxy::setHorizontalTarget")); + RewriterTransaction transaction = beginRewriterTransaction( + QByteArrayLiteral("QmlAnchorBindingProxy::setHorizontalTarget")); m_horizontalTarget = newTarget; anchorHorizontal(); @@ -423,7 +487,8 @@ void QmlAnchorBindingProxy::setRelativeAnchorTargetTop(QmlAnchorBindingProxy::Re if (target == m_relativeTopTarget) return; - RewriterTransaction transaction = m_qmlItemNode.modelNode().view()->beginRewriterTransaction(QByteArrayLiteral("QmlAnchorBindingProxy::setRelativeAnchorTargetTop")); + RewriterTransaction transaction = beginRewriterTransaction( + QByteArrayLiteral("QmlAnchorBindingProxy::setRelativeAnchorTargetTop")); m_relativeTopTarget = target; @@ -440,7 +505,8 @@ void QmlAnchorBindingProxy::setRelativeAnchorTargetBottom(QmlAnchorBindingProxy: if (target == m_relativeBottomTarget) return; - RewriterTransaction transaction = m_qmlItemNode.modelNode().view()->beginRewriterTransaction(QByteArrayLiteral("QmlAnchorBindingProxy::setRelativeAnchorTargetBottom")); + RewriterTransaction transaction = beginRewriterTransaction( + QByteArrayLiteral("QmlAnchorBindingProxy::setRelativeAnchorTargetBottom")); m_relativeBottomTarget = target; @@ -457,7 +523,8 @@ void QmlAnchorBindingProxy::setRelativeAnchorTargetLeft(QmlAnchorBindingProxy::R if (target == m_relativeLeftTarget) return; - RewriterTransaction transaction = m_qmlItemNode.modelNode().view()->beginRewriterTransaction(QByteArrayLiteral("QmlAnchorBindingProxy::setRelativeAnchorTargetLeft")); + RewriterTransaction transaction = beginRewriterTransaction( + QByteArrayLiteral("QmlAnchorBindingProxy::setRelativeAnchorTargetLeft")); m_relativeLeftTarget = target; @@ -474,7 +541,8 @@ void QmlAnchorBindingProxy::setRelativeAnchorTargetRight(QmlAnchorBindingProxy:: if (target == m_relativeRightTarget) return; - RewriterTransaction transaction = m_qmlItemNode.modelNode().view()->beginRewriterTransaction(QByteArrayLiteral("QmlAnchorBindingProxy::setRelativeAnchorTargetRight")); + RewriterTransaction transaction = beginRewriterTransaction( + QByteArrayLiteral("QmlAnchorBindingProxy::setRelativeAnchorTargetRight")); m_relativeRightTarget = target; @@ -492,7 +560,8 @@ void QmlAnchorBindingProxy::setRelativeAnchorTargetVertical(QmlAnchorBindingProx if (target == m_relativeVerticalTarget) return; - RewriterTransaction transaction = m_qmlItemNode.modelNode().view()->beginRewriterTransaction(QByteArrayLiteral("QmlAnchorBindingProxy::setRelativeAnchorTargetVertical")); + RewriterTransaction transaction = beginRewriterTransaction( + QByteArrayLiteral("QmlAnchorBindingProxy::setRelativeAnchorTargetVertical")); m_relativeVerticalTarget = target; @@ -509,7 +578,8 @@ void QmlAnchorBindingProxy::setRelativeAnchorTargetHorizontal(QmlAnchorBindingPr if (target == m_relativeHorizontalTarget) return; - RewriterTransaction transaction = m_qmlItemNode.modelNode().view()->beginRewriterTransaction(QByteArrayLiteral("QmlAnchorBindingProxy::setRelativeAnchorTargetHorizontal")); + RewriterTransaction transaction = beginRewriterTransaction( + QByteArrayLiteral("QmlAnchorBindingProxy::setRelativeAnchorTargetHorizontal")); m_relativeHorizontalTarget = target; @@ -559,7 +629,8 @@ int QmlAnchorBindingProxy::indexOfPossibleTargetItem(const QString &targetName) } void QmlAnchorBindingProxy::resetLayout() { - RewriterTransaction transaction = m_qmlItemNode.modelNode().view()->beginRewriterTransaction(QByteArrayLiteral("QmlAnchorBindingProxy::resetLayout")); + RewriterTransaction transaction = beginRewriterTransaction( + QByteArrayLiteral("QmlAnchorBindingProxy::resetLayout")); m_qmlItemNode.anchors().removeAnchors(); m_qmlItemNode.anchors().removeMargins(); @@ -584,18 +655,13 @@ void QmlAnchorBindingProxy::setBottomAnchor(bool anchor) if (bottomAnchored() == anchor) return; - RewriterTransaction transaction = m_qmlItemNode.modelNode().view()->beginRewriterTransaction(QByteArrayLiteral("QmlAnchorBindingProxy::setBottomAnchor")); + RewriterTransaction transaction = beginRewriterTransaction( + QByteArrayLiteral("QmlAnchorBindingProxy::setBottomAnchor")); if (!anchor) { removeBottomAnchor(); } else { - - if (m_bottomTarget.modelNode() == m_qmlItemNode.modelNode().parentProperty().parentModelNode()) { - m_relativeBottomTarget = SameEdge; - } else { - m_relativeBottomTarget = OppositeEdge; - } - + setDefaultRelativeBottomTarget(); anchorBottom(); if (topAnchored()) backupPropertyAndRemove(modelNode(), "height"); @@ -616,17 +682,13 @@ void QmlAnchorBindingProxy::setLeftAnchor(bool anchor) if (leftAnchored() == anchor) return; - RewriterTransaction transaction = m_qmlItemNode.modelNode().view()->beginRewriterTransaction(QByteArrayLiteral("QmlAnchorBindingProxy::setLeftAnchor")); + RewriterTransaction transaction = beginRewriterTransaction( + QByteArrayLiteral("QmlAnchorBindingProxy::setLeftAnchor")); if (!anchor) { removeLeftAnchor(); } else { - - if (m_leftTarget.modelNode() == m_qmlItemNode.modelNode().parentProperty().parentModelNode()) { - m_relativeLeftTarget = SameEdge; - } else { - m_relativeLeftTarget = OppositeEdge; - } + setDefaultRelativeLeftTarget(); anchorLeft(); backupPropertyAndRemove(modelNode(), "x"); @@ -648,17 +710,13 @@ void QmlAnchorBindingProxy::setRightAnchor(bool anchor) if (rightAnchored() == anchor) return; - RewriterTransaction transaction = m_qmlItemNode.modelNode().view()->beginRewriterTransaction(QByteArrayLiteral("QmlAnchorBindingProxy::setRightAnchor")); + RewriterTransaction transaction = beginRewriterTransaction( + QByteArrayLiteral("QmlAnchorBindingProxy::setRightAnchor")); if (!anchor) { removeRightAnchor(); } else { - - if (m_rightTarget.modelNode() == m_qmlItemNode.modelNode().parentProperty().parentModelNode()) { - m_relativeRightTarget = SameEdge; - } else { - m_relativeRightTarget = OppositeEdge; - } + setDefaultRelativeRightTarget(); anchorRight(); if (leftAnchored()) @@ -842,17 +900,13 @@ void QmlAnchorBindingProxy::setTopAnchor(bool anchor) if (topAnchored() == anchor) return; - RewriterTransaction transaction = m_qmlItemNode.modelNode().view()->beginRewriterTransaction(QByteArrayLiteral("QmlAnchorBindingProxy::setTopAnchor")); + RewriterTransaction transaction = beginRewriterTransaction( + QByteArrayLiteral("QmlAnchorBindingProxy::setTopAnchor")); if (!anchor) { removeTopAnchor(); } else { - - if (m_topTarget.modelNode() == m_qmlItemNode.modelNode().parentProperty().parentModelNode()) { - m_relativeTopTarget = SameEdge; - } else { - m_relativeTopTarget = OppositeEdge; - } + setDefaultRelativeTopTarget(); anchorTop(); backupPropertyAndRemove(modelNode(), "y"); @@ -867,7 +921,8 @@ void QmlAnchorBindingProxy::setTopAnchor(bool anchor) } void QmlAnchorBindingProxy::removeTopAnchor() { - RewriterTransaction transaction = m_qmlItemNode.modelNode().view()->beginRewriterTransaction(QByteArrayLiteral("QmlAnchorBindingProxy::removeTopAnchor")); + RewriterTransaction transaction = beginRewriterTransaction( + QByteArrayLiteral("QmlAnchorBindingProxy::removeTopAnchor")); m_qmlItemNode.anchors().removeAnchor(AnchorLineTop); m_qmlItemNode.anchors().removeMargin(AnchorLineTop); @@ -878,7 +933,8 @@ void QmlAnchorBindingProxy::removeTopAnchor() { } void QmlAnchorBindingProxy::removeBottomAnchor() { - RewriterTransaction transaction = m_qmlItemNode.modelNode().view()->beginRewriterTransaction(QByteArrayLiteral("QmlAnchorBindingProxy::removeBottomAnchor")); + RewriterTransaction transaction = beginRewriterTransaction( + QByteArrayLiteral("QmlAnchorBindingProxy::removeBottomAnchor")); m_qmlItemNode.anchors().removeAnchor(AnchorLineBottom); m_qmlItemNode.anchors().removeMargin(AnchorLineBottom); @@ -888,7 +944,8 @@ void QmlAnchorBindingProxy::removeBottomAnchor() { } void QmlAnchorBindingProxy::removeLeftAnchor() { - RewriterTransaction transaction = m_qmlItemNode.modelNode().view()->beginRewriterTransaction(QByteArrayLiteral("QmlAnchorBindingProxy::removeLeftAnchor")); + RewriterTransaction transaction = beginRewriterTransaction( + QByteArrayLiteral("QmlAnchorBindingProxy::removeLeftAnchor")); m_qmlItemNode.anchors().removeAnchor(AnchorLineLeft); m_qmlItemNode.anchors().removeMargin(AnchorLineLeft); @@ -898,7 +955,8 @@ void QmlAnchorBindingProxy::removeLeftAnchor() { } void QmlAnchorBindingProxy::removeRightAnchor() { - RewriterTransaction transaction = m_qmlItemNode.modelNode().view()->beginRewriterTransaction(QByteArrayLiteral("QmlAnchorBindingProxy::removeRightAnchor")); + RewriterTransaction transaction = beginRewriterTransaction( + QByteArrayLiteral("QmlAnchorBindingProxy::removeRightAnchor")); m_qmlItemNode.anchors().removeAnchor(AnchorLineRight); m_qmlItemNode.anchors().removeMargin(AnchorLineRight); @@ -916,7 +974,8 @@ void QmlAnchorBindingProxy::setVerticalCentered(bool centered) m_locked = true; - RewriterTransaction transaction = m_qmlItemNode.modelNode().view()->beginRewriterTransaction(QByteArrayLiteral("QmlAnchorBindingProxy::setVerticalCentered")); + RewriterTransaction transaction = beginRewriterTransaction( + QByteArrayLiteral("QmlAnchorBindingProxy::setVerticalCentered")); if (!centered) { m_qmlItemNode.anchors().removeAnchor(AnchorLineVerticalCenter); @@ -943,7 +1002,8 @@ void QmlAnchorBindingProxy::setHorizontalCentered(bool centered) m_locked = true; - RewriterTransaction transaction = m_qmlItemNode.modelNode().view()->beginRewriterTransaction(QByteArrayLiteral("QmlAnchorBindingProxy::setHorizontalCentered")); + RewriterTransaction transaction = beginRewriterTransaction( + QByteArrayLiteral("QmlAnchorBindingProxy::setHorizontalCentered")); if (!centered) { m_qmlItemNode.anchors().removeAnchor(AnchorLineHorizontalCenter); @@ -1033,7 +1093,8 @@ bool QmlAnchorBindingProxy::horizontalCentered() void QmlAnchorBindingProxy::fill() { - RewriterTransaction transaction = m_qmlItemNode.modelNode().view()->beginRewriterTransaction(QByteArrayLiteral("QmlAnchorBindingProxy::fill")); + RewriterTransaction transaction = beginRewriterTransaction( + QByteArrayLiteral("QmlAnchorBindingProxy::fill")); backupPropertyAndRemove(modelNode(), "x"); diff --git a/src/plugins/qmldesigner/components/propertyeditor/qmlanchorbindingproxy.h b/src/plugins/qmldesigner/components/propertyeditor/qmlanchorbindingproxy.h index a30f48e766..936b6a8187 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/qmlanchorbindingproxy.h +++ b/src/plugins/qmldesigner/components/propertyeditor/qmlanchorbindingproxy.h @@ -205,6 +205,12 @@ private: void setupAnchorTargets(); void emitAnchorSignals(); + void setDefaultRelativeTopTarget(); + void setDefaultRelativeBottomTarget(); + void setDefaultRelativeLeftTarget(); + void setDefaultRelativeRightTarget(); + + RewriterTransaction beginRewriterTransaction(const QByteArray &identifier); QmlItemNode targetIdToNode(const QString &id) const; QString idForNode(const QmlItemNode &qmlItemNode) const; diff --git a/src/plugins/qmldesigner/components/propertyeditor/quick2propertyeditorview.cpp b/src/plugins/qmldesigner/components/propertyeditor/quick2propertyeditorview.cpp index 4aa9efbf5a..2b1251bd72 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/quick2propertyeditorview.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/quick2propertyeditorview.cpp @@ -41,11 +41,8 @@ namespace QmlDesigner { void Quick2PropertyEditorView::execute() { m_view.setSource(m_source); - - if (!m_source.isEmpty()) { - m_view.setSource(m_source); + if (!m_source.isEmpty()) connect(&m_view, SIGNAL(statusChanged(QQuickView::Status)), this, SLOT(continueExecute())); - } } Quick2PropertyEditorView::Quick2PropertyEditorView(QWidget *parent) : diff --git a/src/plugins/qmldesigner/componentsplugin/Controls/ButtonSpecifics.qml b/src/plugins/qmldesigner/componentsplugin/Controls/ButtonSpecifics.qml index 5f415ff0e4..9a3bbc5d9b 100644 --- a/src/plugins/qmldesigner/componentsplugin/Controls/ButtonSpecifics.qml +++ b/src/plugins/qmldesigner/componentsplugin/Controls/ButtonSpecifics.qml @@ -50,10 +50,7 @@ Column { SecondColumnLayout { LineEdit { backendValue: backendValues.text - implicitWidth: 180 - } - ExpandingSpacer { - + Layout.fillWidth: true } } @@ -64,6 +61,7 @@ Column { SecondColumnLayout { CheckBox { + enabled: backendValues.checkable.value text: backendValues.checked.valueToString backendValue: backendValues.checked implicitWidth: 180 @@ -82,6 +80,13 @@ Column { CheckBox { text: backendValues.checkable.valueToString backendValue: backendValues.checkable + property bool backEndValueValue: backendValues.checkable.value + onTextChanged: { + if (!backendValues.checkable.value) { + backendValues.checked.resetValue() + } + } + implicitWidth: 180 } ExpandingSpacer { @@ -130,10 +135,7 @@ Column { SecondColumnLayout { LineEdit { backendValue: backendValues.tooltip - implicitWidth: 180 - } - ExpandingSpacer { - + Layout.fillWidth: true } } @@ -162,10 +164,7 @@ Column { SecondColumnLayout { LineEdit { backendValue: backendValues.iconSource - implicitWidth: 180 - } - ExpandingSpacer { - + Layout.fillWidth: true } } diff --git a/src/plugins/qmldesigner/componentsplugin/Controls/CheckBoxSpecifics.qml b/src/plugins/qmldesigner/componentsplugin/Controls/CheckBoxSpecifics.qml index d578848a03..e9c646d101 100644 --- a/src/plugins/qmldesigner/componentsplugin/Controls/CheckBoxSpecifics.qml +++ b/src/plugins/qmldesigner/componentsplugin/Controls/CheckBoxSpecifics.qml @@ -50,10 +50,7 @@ Column { SecondColumnLayout { LineEdit { backendValue: backendValues.text - implicitWidth: 180 - } - ExpandingSpacer { - + Layout.fillWidth: true } } diff --git a/src/plugins/qmldesigner/componentsplugin/Controls/RadioButtonSpecifics.qml b/src/plugins/qmldesigner/componentsplugin/Controls/RadioButtonSpecifics.qml index 785a035eb8..8318c7ddff 100644 --- a/src/plugins/qmldesigner/componentsplugin/Controls/RadioButtonSpecifics.qml +++ b/src/plugins/qmldesigner/componentsplugin/Controls/RadioButtonSpecifics.qml @@ -50,10 +50,7 @@ Column { SecondColumnLayout { LineEdit { backendValue: backendValues.text - implicitWidth: 180 - } - ExpandingSpacer { - + Layout.fillWidth: true } } diff --git a/src/plugins/qmldesigner/componentsplugin/Controls/TextAreaSpecifics.qml b/src/plugins/qmldesigner/componentsplugin/Controls/TextAreaSpecifics.qml index 190d31b199..7835bd2842 100644 --- a/src/plugins/qmldesigner/componentsplugin/Controls/TextAreaSpecifics.qml +++ b/src/plugins/qmldesigner/componentsplugin/Controls/TextAreaSpecifics.qml @@ -64,11 +64,9 @@ Column { SecondColumnLayout { LineEdit { backendValue: backendValues.text - implicitWidth: 180 + Layout.fillWidth: true } - ExpandingSpacer { - } } Label { diff --git a/src/plugins/qmldesigner/componentsplugin/Controls/TextFieldSpecifics.qml b/src/plugins/qmldesigner/componentsplugin/Controls/TextFieldSpecifics.qml index 317b08f3c1..c379e738b0 100644 --- a/src/plugins/qmldesigner/componentsplugin/Controls/TextFieldSpecifics.qml +++ b/src/plugins/qmldesigner/componentsplugin/Controls/TextFieldSpecifics.qml @@ -51,8 +51,7 @@ Column { LineEdit { backendValue: backendValues.text implicitWidth: 180 - } - ExpandingSpacer { + Layout.fillWidth: true } } @@ -65,10 +64,7 @@ Column { SecondColumnLayout { LineEdit { backendValue: backendValues.placeholderText - implicitWidth: 180 - } - ExpandingSpacer { - + Layout.fillWidth: true } } @@ -96,10 +92,7 @@ Column { SecondColumnLayout { LineEdit { backendValue: backendValues.inputMask - implicitWidth: 180 - } - ExpandingSpacer { - + Layout.fillWidth: true } } diff --git a/src/plugins/qmldesigner/componentsplugin/components.metainfo b/src/plugins/qmldesigner/componentsplugin/components.metainfo index 93410ed01e..052fe68da3 100644 --- a/src/plugins/qmldesigner/componentsplugin/components.metainfo +++ b/src/plugins/qmldesigner/componentsplugin/components.metainfo @@ -214,22 +214,6 @@ MetaInfo { } Type { - name: "QtQuick.Controls.TabView" - icon: ":/componentsplugin/images/window16.png" - - ItemLibraryEntry { - name: "Tab View" - category: "Qt Quick - Controls" - libraryIcon: ":/componentsplugin/images/window.png" - version: "1.0" - requiredImport: "QtQuick.Controls" - - Property { name: "width"; type: "int"; value: 360; } - Property { name: "height"; type: "int"; value: 300; } - } - } - - Type { name: "QtQuick.Controls.GroupBox" icon: ":/componentsplugin/images/window16.png" diff --git a/src/plugins/qmldesigner/designercore/include/modelnode.h b/src/plugins/qmldesigner/designercore/include/modelnode.h index 3f6792c179..40e8ce4e6d 100644 --- a/src/plugins/qmldesigner/designercore/include/modelnode.h +++ b/src/plugins/qmldesigner/designercore/include/modelnode.h @@ -128,7 +128,7 @@ public: NodeListProperty defaultNodeListProperty() const; NodeProperty defaultNodeProperty() const; - void removeProperty(const PropertyName &name); //### also implement in AbstractProperty + void removeProperty(const PropertyName &name) const; //### also implement in AbstractProperty QList<AbstractProperty> properties() const; QList<VariantProperty> variantProperties() const; QList<NodeAbstractProperty> nodeAbstractProperties() const; diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp index a45fbcd589..cb3e7d80ae 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp @@ -379,7 +379,7 @@ void NodeInstanceServerProxy::writeCommand(const QVariant &command) void NodeInstanceServerProxy::processFinished(int exitCode, QProcess::ExitStatus exitStatus) { - qWarning() << "Process finished:" << sender() << exitCode; + qWarning() << "Process" << (exitStatus == QProcess::CrashExit ? "crashed:" : "finished:") << sender() << "exitCode:" << exitCode; if (m_captureFileForTest.isOpen()) { m_captureFileForTest.close(); diff --git a/src/plugins/qmldesigner/designercore/instances/puppetcreator.cpp b/src/plugins/qmldesigner/designercore/instances/puppetcreator.cpp index fa98d5c97b..ff66653875 100644 --- a/src/plugins/qmldesigner/designercore/instances/puppetcreator.cpp +++ b/src/plugins/qmldesigner/designercore/instances/puppetcreator.cpp @@ -47,12 +47,13 @@ #include <coreplugin/icore.h> #include <qmldesignerwarning.h> +#include <qmldesignerplugin.h> +#include <designersettings.h> #include "puppetbuildprogressdialog.h" namespace QmlDesigner { -bool PuppetCreator::m_useOnlyFallbackPuppet = !qgetenv("USE_ONLY_FALLBACK_PUPPET").isEmpty(); QHash<Core::Id, PuppetCreator::PuppetType> PuppetCreator::m_qml1PuppetForKitPuppetHash; QHash<Core::Id, PuppetCreator::PuppetType> PuppetCreator::m_qml2PuppetForKitPuppetHash; @@ -105,6 +106,13 @@ QDateTime PuppetCreator::puppetSourceLastModified() const return lastModified; } +bool PuppetCreator::useOnlyFallbackPuppet() const +{ + DesignerSettings settings = QmlDesignerPlugin::instance()->settings(); + return settings.useOnlyFallbackPuppet + || !qgetenv("USE_ONLY_FALLBACK_PUPPET").isEmpty(); +} + PuppetCreator::PuppetCreator(ProjectExplorer::Kit *kit, const QString &qtCreatorVersion) : m_qtCreatorVersion(qtCreatorVersion), m_kit(kit), @@ -157,7 +165,7 @@ QProcess *PuppetCreator::puppetProcess(const QString &puppetPath, puppetProcess->setProcessEnvironment(processEnvironment()); QObject::connect(QCoreApplication::instance(), SIGNAL(aboutToQuit()), puppetProcess, SLOT(kill())); QObject::connect(puppetProcess, SIGNAL(finished(int,QProcess::ExitStatus)), handlerObject, finishSlot); - bool fowardQmlpuppetOutput = !qgetenv("FORWARD_QMLPUPPET_OUTPUT").isEmpty(); + bool fowardQmlpuppetOutput = !qgetenv("FORWARD_QML_PUPPET_OUTPUT").isEmpty(); if (fowardQmlpuppetOutput) { puppetProcess->setProcessChannelMode(QProcess::MergedChannels); QObject::connect(puppetProcess, SIGNAL(readyRead()), handlerObject, outputSlot); @@ -252,7 +260,7 @@ void PuppetCreator::createQml1PuppetExecutableIfMissing() { m_availablePuppetType = FallbackPuppet; - if (!m_useOnlyFallbackPuppet && m_kit) { + if (!useOnlyFallbackPuppet() && m_kit) { if (m_qml1PuppetForKitPuppetHash.contains(m_kit->id())) { m_availablePuppetType = m_qml1PuppetForKitPuppetHash.value(m_kit->id()); } else if (checkQmlpuppetIsReady()) { @@ -274,7 +282,7 @@ void PuppetCreator::createQml2PuppetExecutableIfMissing() { m_availablePuppetType = FallbackPuppet; - if (!m_useOnlyFallbackPuppet && m_kit) { + if (!useOnlyFallbackPuppet() && m_kit) { if (m_qml2PuppetForKitPuppetHash.contains(m_kit->id())) { m_availablePuppetType = m_qml2PuppetForKitPuppetHash.value(m_kit->id()); } else if (checkQml2PuppetIsReady()) { diff --git a/src/plugins/qmldesigner/designercore/instances/puppetcreator.h b/src/plugins/qmldesigner/designercore/instances/puppetcreator.h index 4c9b8c337b..8d6612828d 100644 --- a/src/plugins/qmldesigner/designercore/instances/puppetcreator.h +++ b/src/plugins/qmldesigner/designercore/instances/puppetcreator.h @@ -110,12 +110,13 @@ protected: QDateTime qtLastModified() const; QDateTime puppetSourceLastModified() const; + bool useOnlyFallbackPuppet() const; + private: QString m_qtCreatorVersion; mutable QString m_compileLog; ProjectExplorer::Kit *m_kit; PuppetType m_availablePuppetType; - static bool m_useOnlyFallbackPuppet; static QHash<Core::Id, PuppetType> m_qml1PuppetForKitPuppetHash; static QHash<Core::Id, PuppetType> m_qml2PuppetForKitPuppetHash; }; diff --git a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp index 303376aea2..aa5d5e387d 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp @@ -31,6 +31,7 @@ #include "model.h" #include "metainfo.h" +#include <enumeration.h> #include <rewriterview.h> #include <propertyparser.h> @@ -1358,7 +1359,8 @@ QVariant NodeMetaInfo::propertyCastedValue(const PropertyName &propertyName, con const QVariant variant = value; QVariant copyVariant = variant; - if (propertyIsEnumType(propertyName)) + if (propertyIsEnumType(propertyName) + || variant.canConvert<Enumeration>()) return variant; const QString typeName = propertyTypeName(propertyName); @@ -1512,7 +1514,9 @@ bool NodeMetaInfo::isLayoutable() const if (isSubclassOf("<cpp>.QDeclarativeBasePositioner", -1, -1)) return true; //QtQuick 1 - return isSubclassOf("QtQuick.Positioner", -1, -1) || isSubclassOf("QtQuick.Layouts.Layout", -1, -1); + return isSubclassOf("QtQuick.Positioner", -1, -1) + || isSubclassOf("QtQuick.Layouts.Layout", -1, -1) + || isSubclassOf("QtQuick.Controls.SplitView", -1, -1); } bool NodeMetaInfo::isView() const diff --git a/src/plugins/qmldesigner/designercore/model/modelnode.cpp b/src/plugins/qmldesigner/designercore/model/modelnode.cpp index 88d38d083d..5016bd6ebb 100644 --- a/src/plugins/qmldesigner/designercore/model/modelnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/modelnode.cpp @@ -583,7 +583,7 @@ Does nothing if the node state does not set this property. \see addProperty property properties hasProperties */ -void ModelNode::removeProperty(const PropertyName &name) +void ModelNode::removeProperty(const PropertyName &name) const { if (!isValid()) throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); diff --git a/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp index a028bd61c7..4242214f1f 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp @@ -369,6 +369,13 @@ bool itemIsMovable(const ModelNode &modelNode) if (modelNode.metaInfo().isSubclassOf("QtQuick.Controls.Tab", -1, -1)) return false; + if (modelNode.hasParentProperty()) { + ModelNode parentModelNode = modelNode.parentProperty().parentModelNode(); + if (QmlItemNode::isValidQmlItemNode(parentModelNode) + && parentModelNode.metaInfo().isLayoutable()) + return false; + } + return true; } diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp index 64d91e80fe..7927a4f259 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp @@ -247,6 +247,11 @@ static inline QVariant convertDynamicPropertyValueToVariant(const QString &astVa } } +static bool isListElementType(const QmlDesigner::TypeName &type) +{ + return type == "ListElement" || type == "QtQuick.ListElement" || type == "Qt.ListElement"; +} + static bool isComponentType(const QmlDesigner::TypeName &type) { return type == "Component" || type == "Qt.Component" || type == "QtQuick.Component" || type == "<cpp>.QQmlComponent"; @@ -1225,7 +1230,8 @@ QmlDesigner::PropertyName TextToModelMerger::syncScriptBinding(ModelNode &modelN if (isLiteralValue(script)) { if (isPropertyChangesType(modelNode.type()) - || isConnectionsType(modelNode.type())) { + || isConnectionsType(modelNode.type()) + || isListElementType(modelNode.type())) { AbstractProperty modelProperty = modelNode.property(astPropertyName.toUtf8()); QVariant variantValue = parsePropertyScriptBinding(script); if (!variantValue.isValid()) diff --git a/src/plugins/qmldesigner/designersettings.cpp b/src/plugins/qmldesigner/designersettings.cpp index 94d30aca6f..e318ae0bf7 100644 --- a/src/plugins/qmldesigner/designersettings.cpp +++ b/src/plugins/qmldesigner/designersettings.cpp @@ -43,7 +43,8 @@ DesignerSettings::DesignerSettings() designerWarningsInEditor(false), showDebugView(false), enableDebugView(false), - alwaysSaveInCrumbleBar(false) + alwaysSaveInCrumbleBar(false), + useOnlyFallbackPuppet(false) {} void DesignerSettings::fromSettings(QSettings *settings) @@ -66,6 +67,8 @@ void DesignerSettings::fromSettings(QSettings *settings) QLatin1String(QmlDesigner::Constants::QML_ENABLE_DEBUGVIEW), QVariant(false)).toBool(); alwaysSaveInCrumbleBar = settings->value( QLatin1String(QmlDesigner::Constants::QML_ALWAYS_SAFE_IN_CRUMBLEBAR), QVariant(false)).toBool(); + useOnlyFallbackPuppet = settings->value( + QLatin1String(QmlDesigner::Constants::QML_USE_ONLY_FALLBACK_PUPPET), QVariant(false)).toBool(); settings->endGroup(); settings->endGroup(); @@ -84,6 +87,7 @@ void DesignerSettings::toSettings(QSettings *settings) const settings->setValue(QLatin1String(QmlDesigner::Constants::QML_SHOW_DEBUGVIEW), showDebugView); settings->setValue(QLatin1String(QmlDesigner::Constants::QML_ENABLE_DEBUGVIEW), enableDebugView); settings->setValue(QLatin1String(QmlDesigner::Constants::QML_ALWAYS_SAFE_IN_CRUMBLEBAR), alwaysSaveInCrumbleBar); + settings->setValue(QLatin1String(QmlDesigner::Constants::QML_USE_ONLY_FALLBACK_PUPPET), useOnlyFallbackPuppet); settings->endGroup(); settings->endGroup(); @@ -98,5 +102,6 @@ bool DesignerSettings::equals(const DesignerSettings &other) const && designerWarningsInEditor == other.designerWarningsInEditor && showDebugView == other.showDebugView && enableDebugView == other.enableDebugView - && alwaysSaveInCrumbleBar == other.alwaysSaveInCrumbleBar; + && alwaysSaveInCrumbleBar == other.alwaysSaveInCrumbleBar + && useOnlyFallbackPuppet == other.useOnlyFallbackPuppet; } diff --git a/src/plugins/qmldesigner/designersettings.h b/src/plugins/qmldesigner/designersettings.h index 829e92dc7c..78e12abc86 100644 --- a/src/plugins/qmldesigner/designersettings.h +++ b/src/plugins/qmldesigner/designersettings.h @@ -56,6 +56,7 @@ public: bool showDebugView; bool enableDebugView; bool alwaysSaveInCrumbleBar; + bool useOnlyFallbackPuppet; }; inline bool operator==(const DesignerSettings &s1, const DesignerSettings &s2) diff --git a/src/plugins/qmldesigner/qmldesignerconstants.h b/src/plugins/qmldesigner/qmldesignerconstants.h index 7a6c9c1be3..deb20fd44d 100644 --- a/src/plugins/qmldesigner/qmldesignerconstants.h +++ b/src/plugins/qmldesigner/qmldesignerconstants.h @@ -65,6 +65,7 @@ const char QML_WARNIN_FOR_DESIGNER_FEATURES_IN_EDITOR_KEY[] = "WarnAboutQtQuickD const char QML_SHOW_DEBUGVIEW[] = "ShowQtQuickDesignerDebugView"; const char QML_ENABLE_DEBUGVIEW[] = "EnableQtQuickDesignerDebugView"; const char QML_ALWAYS_SAFE_IN_CRUMBLEBAR[] = "AlwaysSafeInCrumbleBar"; +const char QML_USE_ONLY_FALLBACK_PUPPET[] = "AseOnlyFallbackPuppet"; const char QML_DESIGNER_SUBFOLDER[] = "/designer/"; diff --git a/src/plugins/qmlprofiler/qml/SelectionRange.qml b/src/plugins/qmlprofiler/qml/SelectionRange.qml index c8b55fa892..c1bab1f673 100644 --- a/src/plugins/qmlprofiler/qml/SelectionRange.qml +++ b/src/plugins/qmlprofiler/qml/SelectionRange.qml @@ -48,7 +48,7 @@ RangeMover { target: zoomControl onRangeChanged: { var oldTimePerPixel = selectionRange.viewTimePerPixel; - selectionRange.viewTimePerPixel = Math.abs(zoomControl.endTime() - zoomControl.startTime()) / flick.width; + selectionRange.viewTimePerPixel = Math.abs(zoomControl.endTime() - zoomControl.startTime()) / view.intWidth; if (creationState === 3 && oldTimePerPixel != selectionRange.viewTimePerPixel) { var newWidth = getWidth() * oldTimePerPixel / viewTimePerPixel; setLeft(getLeft() * oldTimePerPixel / viewTimePerPixel); diff --git a/src/plugins/qmlprojectmanager/qmlapplicationwizard.cpp b/src/plugins/qmlprojectmanager/qmlapplicationwizard.cpp index b5054626e9..ccaaad056e 100644 --- a/src/plugins/qmlprojectmanager/qmlapplicationwizard.cpp +++ b/src/plugins/qmlprojectmanager/qmlapplicationwizard.cpp @@ -38,6 +38,7 @@ #include <qmakeprojectmanager/qmakeproject.h> #include <qmakeprojectmanager/qmakeprojectmanagerconstants.h> #include <qtsupport/qtkitinformation.h> +#include <qtsupport/qtsupportconstants.h> #include "qmlprojectmanager.h" #include "qmlproject.h" @@ -79,6 +80,8 @@ QmlApplicationWizard::QmlApplicationWizard() QLatin1String(ProjectExplorer::Constants::QT_APPLICATION_WIZARD_CATEGORY_DISPLAY)); setDisplayName(tr("Qt Quick UI")); setDescription(tr("Creates a Qt Quick UI project.")); + setRequiredFeatures(Core::Feature(QtSupport::Constants::FEATURE_QMLPROJECT) + | Core::Feature(QtSupport::Constants::FEATURE_QT_QUICK)); } Core::BaseFileWizard *QmlApplicationWizard::create(QWidget *parent, const WizardDialogParameters ¶meters) const diff --git a/src/plugins/qtsupport/customexecutablerunconfiguration.cpp b/src/plugins/qtsupport/customexecutablerunconfiguration.cpp index e134ff83d6..a51a23c128 100644 --- a/src/plugins/qtsupport/customexecutablerunconfiguration.cpp +++ b/src/plugins/qtsupport/customexecutablerunconfiguration.cpp @@ -128,13 +128,11 @@ private: QDialogButtonBox *m_dialogButtonBox; CustomExecutableConfigurationWidget *m_widget; - CustomExecutableRunConfiguration *m_runConfiguration; }; CustomExecutableDialog::CustomExecutableDialog(CustomExecutableRunConfiguration *rc, QWidget *parent) : QDialog(parent) , m_dialogButtonBox(new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel)) - , m_runConfiguration(rc) { setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); QVBoxLayout *layout = new QVBoxLayout(this); diff --git a/src/plugins/resourceeditor/resourcenode.cpp b/src/plugins/resourceeditor/resourcenode.cpp index 552a628132..aea6099880 100644 --- a/src/plugins/resourceeditor/resourcenode.cpp +++ b/src/plugins/resourceeditor/resourcenode.cpp @@ -256,10 +256,11 @@ ProjectExplorer::FolderNode::AddNewInformation ResourceTopLevelNode::addNewInfor .arg(QFileInfo(path()).fileName()) .arg(QLatin1String("/")); - int p = 80; - if (priority(files)) { - if (context == 0 || context == this) - p = 125; + int p = -1; + if (priority(files)) { // images/* and qml/js mimetypes + p = 110; + if (context == this) + p = 120; else if (projectNode() == context) p = 150; // steal from our project node // The ResourceFolderNode '/' defers to us, as otherwise @@ -267,7 +268,7 @@ ProjectExplorer::FolderNode::AddNewInformation ResourceTopLevelNode::addNewInfor // Thus also return a high priority for it if (ResourceFolderNode *rfn = qobject_cast<ResourceFolderNode *>(context)) if (rfn->prefix() == QLatin1String("/") && rfn->parentFolderNode() == this) - p = 150; + p = 120; } return AddNewInformation(name, p); @@ -389,9 +390,10 @@ ProjectExplorer::FolderNode::AddNewInformation ResourceFolderNode::addNewInforma .arg(QFileInfo(m_topLevelNode->path()).fileName()) .arg(displayName()); - int p = 80; - if (priority(files)) { - if (context == 0 || context == this) + int p = -1; // never the default + if (priority(files)) { // image/* and qml/js mimetypes + p = 105; // prefer against .pro and .pri files + if (context == this) p = 120; } diff --git a/src/plugins/texteditor/texteditoroverlay.cpp b/src/plugins/texteditor/texteditoroverlay.cpp index acda0f70f6..812cd65463 100644 --- a/src/plugins/texteditor/texteditoroverlay.cpp +++ b/src/plugins/texteditor/texteditoroverlay.cpp @@ -250,22 +250,15 @@ QPainterPath TextEditorOverlay::createSelectionPath(const QTextCursor &begin, co points += firstSelection.topRight() + QPointF(margin+1, -margin); points += firstSelection.bottomRight() + QPointF(margin+1, 0); - const int count = selection.count(); - if (count > 2) { - const QRectF *prev = &selection.at(0); - const QRectF *current = &selection.at(1); - const QRectF *next = &selection.at(2); - for (int i = 0; i < count; ++i) { - #define MAX3(a,b,c) qMax(a, qMax(b,c)) - qreal x = MAX3(prev->right(), current->right(), next->right()) + margin; - points += QPointF(x+1, current->top()); - points += QPointF(x+1, current->bottom()); - prev = current; - current = next; - if (i < count-1) - next = &selection.at(i+1); - } + for (int i = 1; i < count-1; ++i) { +#define MAX3(a,b,c) qMax(a, qMax(b,c)) + qreal x = MAX3(selection.at(i-1).right(), + selection.at(i).right(), + selection.at(i+1).right()) + margin; + + points += QPointF(x+1, selection.at(i).top()); + points += QPointF(x+1, selection.at(i).bottom()); } const QRectF &lastSelection = selection.at(count-1); @@ -274,20 +267,14 @@ QPainterPath TextEditorOverlay::createSelectionPath(const QTextCursor &begin, co points += lastSelection.bottomLeft() + QPointF(-margin, margin+extra); points += lastSelection.topLeft() + QPointF(-margin, 0); - if (count > 2) { - const QRectF *prev = &selection.at(count-3); - const QRectF *current = &selection.at(count-2); - const QRectF *next = &selection.at(count-1); - for (int i = count-1; i >= 0; --i) { + for (int i = count-2; i > 0; --i) { #define MIN3(a,b,c) qMin(a, qMin(b,c)) - qreal x = MIN3(prev->left(), current->left(), next->left()) - margin; - points += QPointF(x, current->bottom()+extra); - points += QPointF(x, current->top()); - next = current; - current = prev; - if (i > 0) - prev = &selection.at(i); - } + qreal x = MIN3(selection.at(i-1).left(), + selection.at(i).left(), + selection.at(i+1).left()) - margin; + + points += QPointF(x, selection.at(i).bottom()+extra); + points += QPointF(x, selection.at(i).top()); } points += firstSelection.bottomLeft() + QPointF(-margin, extra); diff --git a/src/plugins/winrt/winrtdevicefactory.cpp b/src/plugins/winrt/winrtdevicefactory.cpp index 56578c2168..b3dcce7ecc 100644 --- a/src/plugins/winrt/winrtdevicefactory.cpp +++ b/src/plugins/winrt/winrtdevicefactory.cpp @@ -58,7 +58,7 @@ WinRtDeviceFactory::WinRtDeviceFactory() } else { connect(DeviceManager::instance(), &DeviceManager::devicesLoaded, this, &WinRtDeviceFactory::onPrerequisitesLoaded, Qt::QueuedConnection); - connect(static_cast<QtVersionManager *>(QtVersionManager::instance()), + connect(QtVersionManager::instance(), &QtVersionManager::qtVersionsLoaded, this, &WinRtDeviceFactory::onPrerequisitesLoaded, Qt::QueuedConnection); } @@ -125,12 +125,10 @@ void WinRtDeviceFactory::onPrerequisitesLoaded() m_initialized = true; disconnect(DeviceManager::instance(), &DeviceManager::devicesLoaded, this, &WinRtDeviceFactory::onPrerequisitesLoaded); - QtVersionManager *qtVersionManager - = static_cast<QtVersionManager *>(QtVersionManager::instance()); - disconnect(qtVersionManager, &QtVersionManager::qtVersionsLoaded, + disconnect(QtVersionManager::instance(), &QtVersionManager::qtVersionsLoaded, this, &WinRtDeviceFactory::onPrerequisitesLoaded); autoDetect(); - connect(qtVersionManager, &QtVersionManager::qtVersionsChanged, + connect(QtVersionManager::instance(), &QtVersionManager::qtVersionsChanged, this, &WinRtDeviceFactory::autoDetect); } diff --git a/src/plugins/winrt/winrtpackagedeploymentstep.cpp b/src/plugins/winrt/winrtpackagedeploymentstep.cpp index f5aa28c2e5..d342d9a752 100644 --- a/src/plugins/winrt/winrtpackagedeploymentstep.cpp +++ b/src/plugins/winrt/winrtpackagedeploymentstep.cpp @@ -28,8 +28,10 @@ ****************************************************************************/ #include "winrtpackagedeploymentstep.h" -#include "winrtpackagedeploymentstepwidget.h" + #include "winrtconstants.h" +#include "winrtpackagedeploymentstepwidget.h" +#include "winrtrunconfiguration.h" #include <projectexplorer/project.h> #include <projectexplorer/target.h> @@ -39,6 +41,7 @@ #include <projectexplorer/deploymentdata.h> #include <projectexplorer/projectexplorerconstants.h> #include <qtsupport/qtkitinformation.h> +#include <utils/qtcassert.h> #include <utils/qtcprocess.h> #include <QRegularExpression> @@ -59,19 +62,38 @@ WinRtPackageDeploymentStep::WinRtPackageDeploymentStep(BuildStepList *bsl) bool WinRtPackageDeploymentStep::init() { - Utils::FileName proFile = project()->projectFilePath(); - const QString targetPath - = target()->applicationTargets().targetForProject(proFile).toString() - + QLatin1String(".exe"); - QString targetDir = targetPath.left(targetPath.lastIndexOf(QLatin1Char('/')) + 1); - // ### Actually, targetForProject is supposed to return the file path including the file - // extension. Whenever this will eventually work, we have to remove the .exe suffix here. + WinRtRunConfiguration *rc = qobject_cast<WinRtRunConfiguration *>( + target()->activeRunConfiguration()); + QTC_ASSERT(rc, return false); + + const Utils::FileName activeProjectFilePath = Utils::FileName::fromString(rc->proFilePath()); + Utils::FileName appTargetFilePath; + foreach (const BuildTargetInfo &buildTarget, target()->applicationTargets().list) { + if (buildTarget.projectFilePath == activeProjectFilePath) { + appTargetFilePath = buildTarget.targetFilePath; + break; + } + } + + m_targetFilePath = appTargetFilePath.toString(); + if (m_targetFilePath.isEmpty()) { + // ### raise error in 3.3 + // raiseError(tr("No executable to deploy found in %1.").arg(rc->proFilePath())); + return false; + } + + // ### Ideally, the file paths in applicationTargets() should already have the .exe suffix. + // Whenever this will eventually work, we can drop appending the .exe suffix here. + if (!m_targetFilePath.endsWith(QLatin1String(".exe"), Qt::CaseInsensitive)) + m_targetFilePath.append(QLatin1String(".exe")); + + m_targetDirPath = appTargetFilePath.parentDir().toString(); const QtSupport::BaseQtVersion *qt = QtSupport::QtKitInformation::qtVersion(target()->kit()); if (!qt) return false; - QString args = QtcProcess::quoteArg(QDir::toNativeSeparators(targetPath)); + QString args = QtcProcess::quoteArg(QDir::toNativeSeparators(m_targetFilePath)); args += QLatin1Char(' ') + m_args; m_manifestFileName = QStringLiteral("AppxManifest"); @@ -84,13 +106,16 @@ bool WinRtPackageDeploymentStep::init() if (m_createMappingFile) { args += QLatin1String(" -list mapping"); - m_mappingFileContent = QLatin1String("[Files]\n\"") + QDir::toNativeSeparators(targetDir) - + m_manifestFileName + QLatin1String(".xml\" \"") + m_manifestFileName + QLatin1String(".xml\"\n"); + m_mappingFileContent = QLatin1String("[Files]\n\"") + + QDir::toNativeSeparators(m_targetDirPath) + + m_manifestFileName + QLatin1String(".xml\" \"") + m_manifestFileName + + QLatin1String(".xml\"\n"); - QDir assetDirectory(targetDir + QLatin1String("assets")); + QDir assetDirectory(m_targetDirPath + QLatin1String("assets")); if (assetDirectory.exists()) { QStringList iconsToDeploy; - const QString fullManifestPath = targetDir + m_manifestFileName + QLatin1String(".xml"); + const QString fullManifestPath = m_targetDirPath + m_manifestFileName + + QLatin1String(".xml"); if (!parseIconsAndExecutableFromManifest(fullManifestPath, &iconsToDeploy, &m_executablePathInManifest)) { raiseError(tr("Cannot parse manifest file %1.").arg(fullManifestPath)); @@ -98,7 +123,7 @@ bool WinRtPackageDeploymentStep::init() } foreach (const QString &icon, iconsToDeploy) { m_mappingFileContent += QLatin1Char('"') - + QDir::toNativeSeparators(targetDir + icon) + QLatin1String("\" \"") + + QDir::toNativeSeparators(m_targetDirPath + icon) + QLatin1String("\" \"") + QDir::toNativeSeparators(icon) + QLatin1String("\"\n"); } } @@ -115,18 +140,14 @@ bool WinRtPackageDeploymentStep::init() bool WinRtPackageDeploymentStep::processSucceeded(int exitCode, QProcess::ExitStatus status) { if (m_createMappingFile) { - Utils::FileName proFile = project()->projectFilePath(); - QString targetPath - = target()->applicationTargets().targetForProject(proFile).toString(); - QString targetDir = targetPath.left(targetPath.lastIndexOf(QLatin1Char('/')) + 1); QString targetInstallationPath; // The list holds the local file paths and the "remote" file paths QList<QPair<QString, QString> > installableFilesList; foreach (DeployableFile file, target()->deploymentData().allFiles()) { QString remoteFilePath = file.remoteFilePath(); QString localFilePath = file.localFilePath().toString(); - if (localFilePath == targetPath) { - if (!targetPath.endsWith(QLatin1String(".exe"))) { + if (localFilePath == m_targetFilePath) { + if (!m_targetFilePath.endsWith(QLatin1String(".exe"))) { remoteFilePath += QLatin1String(".exe"); localFilePath += QLatin1String(".exe"); } @@ -139,11 +160,12 @@ bool WinRtPackageDeploymentStep::processSucceeded(int exitCode, QProcess::ExitSt // and the icons referenced in there and the actual build target QString baseDir; if (targetInstallationPath.isEmpty()) { - targetPath += QLatin1String(".exe"); + m_targetFilePath += QLatin1String(".exe"); m_mappingFileContent - += QLatin1Char('"') + QDir::toNativeSeparators(targetPath) + QLatin1String("\" \"") + += QLatin1Char('"') + QDir::toNativeSeparators(m_targetFilePath) + + QLatin1String("\" \"") + QDir::toNativeSeparators(m_executablePathInManifest) + QLatin1String("\"\n"); - baseDir = targetDir; + baseDir = m_targetDirPath; } else { baseDir = targetInstallationPath.left(targetInstallationPath.lastIndexOf(QLatin1Char('/')) + 1); } @@ -161,7 +183,8 @@ bool WinRtPackageDeploymentStep::processSucceeded(int exitCode, QProcess::ExitSt + QLatin1String("\"\n"); } - const QString mappingFilePath = targetDir + m_manifestFileName + QLatin1String(".map"); + const QString mappingFilePath = m_targetDirPath + m_manifestFileName + + QLatin1String(".map"); QFile mappingFile(mappingFilePath); if (!mappingFile.open(QFile::WriteOnly | QFile::Text)) { raiseError(tr("Cannot open mapping file %1 for writing.").arg(mappingFilePath)); diff --git a/src/plugins/winrt/winrtpackagedeploymentstep.h b/src/plugins/winrt/winrtpackagedeploymentstep.h index 224f8b4676..17d597bfdc 100644 --- a/src/plugins/winrt/winrtpackagedeploymentstep.h +++ b/src/plugins/winrt/winrtpackagedeploymentstep.h @@ -58,6 +58,8 @@ private: bool parseIconsAndExecutableFromManifest(QString manifestFileName, QStringList *items, QString *executable); QString m_args; + QString m_targetFilePath; + QString m_targetDirPath; QString m_executablePathInManifest; QString m_mappingFileContent; QString m_manifestFileName; |