Merge remote-tracking branch 'origin/4.6'

Conflicts:
	src/plugins/coreplugin/helpmanager.cpp

Change-Id: I2feb60ec0afb2f22f75dc137a01c3fa217b299d8
This commit is contained in:
Eike Ziller
2018-02-23 10:56:52 +01:00
85 changed files with 1122 additions and 402 deletions

View File

@@ -289,12 +289,12 @@ DiffEditor::DiffEditor()
connect(m_viewSwitcherAction, &QAction::triggered, this, [this]() { showDiffView(nextView()); });
}
void DiffEditor::setDocument(QSharedPointer<DiffEditorDocument>(doc))
void DiffEditor::setDocument(QSharedPointer<DiffEditorDocument> doc)
{
QTC_ASSERT(m_document.isNull(), return);
QTC_ASSERT(doc, return);
m_document = QSharedPointer<DiffEditorDocument>(doc);
m_document = doc;
connect(m_descriptionWidget, &DescriptionEditorWidget::requestBranchList,
m_document.data(), &DiffEditorDocument::requestMoreInformation);

View File

@@ -25,8 +25,6 @@
#pragma once
#include "diffeditorcontroller.h"
#include <coreplugin/editormanager/ieditor.h>
#include <coreplugin/idocument.h>
#include <utils/guard.h>

View File

@@ -71,9 +71,10 @@ QString DiffEditorController::revisionFromDescription() const
return m_document->description().mid(7, 12);
}
QString DiffEditorController::makePatch(PatchOptions options) const
QString DiffEditorController::makePatch(int fileIndex, int chunkIndex,
PatchOptions options) const
{
return m_document->makePatch(m_diffFileIndex, m_chunkIndex,
return m_document->makePatch(fileIndex, chunkIndex,
options & Revert, options & AddPrefix);
}
@@ -152,11 +153,27 @@ void DiffEditorController::reloadFinished(bool success)
m_isReloading = false;
}
void DiffEditorController::requestChunkActions(QMenu *menu, int diffFileIndex, int chunkIndex)
void DiffEditorController::requestChunkActions(QMenu *menu, int fileIndex, int chunkIndex)
{
m_diffFileIndex = diffFileIndex;
m_chunkIndex = chunkIndex;
emit chunkActionsRequested(menu, diffFileIndex >= 0 && chunkIndex >= 0);
emit chunkActionsRequested(menu, fileIndex, chunkIndex);
}
bool DiffEditorController::chunkExists(int fileIndex, int chunkIndex) const
{
if (!m_document)
return false;
if (fileIndex < 0 || chunkIndex < 0)
return false;
if (fileIndex >= m_document->diffFiles().count())
return false;
const FileData fileData = m_document->diffFiles().at(fileIndex);
if (chunkIndex >= fileData.chunks.count())
return false;
return true;
}
} // namespace DiffEditor

View File

@@ -59,16 +59,18 @@ public:
AddPrefix = 2
};
Q_DECLARE_FLAGS(PatchOptions, PatchOption)
QString makePatch(PatchOptions options) const;
QString makePatch(int fileIndex, int chunkIndex, PatchOptions options) const;
static Core::IDocument *findOrCreateDocument(const QString &vcsId,
const QString &displayName);
static DiffEditorController *controller(Core::IDocument *document);
void branchesReceived(const QString &branches);
void requestChunkActions(QMenu *menu, int fileIndex, int chunkIndex);
bool chunkExists(int fileIndex, int chunkIndex) const;
signals:
void chunkActionsRequested(QMenu *menu, bool isValid);
void chunkActionsRequested(QMenu *menu, int fileIndex, int chunkIndex);
void requestInformationForCommit(const QString &revision);
protected:
@@ -87,15 +89,14 @@ protected:
private:
void requestMoreInformation();
void requestChunkActions(QMenu *menu, int diffFileIndex, int chunkIndex);
Internal::DiffEditorDocument *const m_document;
bool m_isReloading = false;
int m_diffFileIndex = -1;
int m_chunkIndex = -1;
friend class Internal::DiffEditorDocument;
};
Q_DECLARE_OPERATORS_FOR_FLAGS(DiffEditorController::PatchOptions)
} // namespace DiffEditor

View File

@@ -71,8 +71,6 @@ void DiffEditorDocument::setController(DiffEditorController *controller)
m_controller = controller;
if (m_controller) {
connect(this, &DiffEditorDocument::chunkActionsRequested,
m_controller, &DiffEditorController::requestChunkActions);
connect(this, &DiffEditorDocument::requestMoreInformation,
m_controller, &DiffEditorController::requestMoreInformation);
}

View File

@@ -90,7 +90,6 @@ signals:
void temporaryStateChanged();
void documentChanged();
void descriptionChanged();
void chunkActionsRequested(QMenu *menu, int diffFileIndex, int chunkIndex);
void requestMoreInformation();
private:

View File

@@ -25,6 +25,7 @@
#include "diffeditorwidgetcontroller.h"
#include "diffeditorconstants.h"
#include "diffeditorcontroller.h"
#include "diffeditordocument.h"
#include <coreplugin/documentmanager.h>
@@ -122,11 +123,14 @@ void DiffEditorWidgetController::hideProgress()
m_progressIndicator->hide();
}
void DiffEditorWidgetController::patch(bool revert)
void DiffEditorWidgetController::patch(bool revert, int fileIndex, int chunkIndex)
{
if (!m_document)
return;
if (!chunkExists(fileIndex, chunkIndex))
return;
const QString title = revert ? tr("Revert Chunk") : tr("Apply Chunk");
const QString question = revert
? tr("Would you like to revert the chunk?")
@@ -138,7 +142,7 @@ void DiffEditorWidgetController::patch(bool revert)
return;
}
const FileData fileData = m_contextFileData.at(m_contextMenuFileIndex);
const FileData fileData = m_contextFileData.at(fileIndex);
const QString fileName = revert
? fileData.rightFileInfo.fileName
: fileData.leftFileInfo.fileName;
@@ -154,7 +158,7 @@ void DiffEditorWidgetController::patch(bool revert)
if (patchBehaviour == DiffFileInfo::PatchFile) {
const int strip = m_document->baseDirectory().isEmpty() ? -1 : 0;
const QString patch = m_document->makePatch(m_contextMenuFileIndex, m_contextMenuChunkIndex, revert);
const QString patch = m_document->makePatch(fileIndex, chunkIndex, revert);
if (patch.isEmpty())
return;
@@ -179,8 +183,8 @@ void DiffEditorWidgetController::patch(bool revert)
const QString contentsCopyFileName = contentsCopy.fileName();
const QString contentsCopyDir = QFileInfo(contentsCopyFileName).absolutePath();
const QString patch = m_document->makePatch(m_contextMenuFileIndex,
m_contextMenuChunkIndex, revert, false, QFileInfo(contentsCopyFileName).fileName());
const QString patch = m_document->makePatch(fileIndex,
chunkIndex, revert, false, QFileInfo(contentsCopyFileName).fileName());
if (patch.isEmpty())
return;
@@ -218,64 +222,59 @@ void DiffEditorWidgetController::setFontSettings(const FontSettings &fontSetting
m_rightCharFormat = fontSettings.toTextCharFormat(C_DIFF_DEST_CHAR);
}
void DiffEditorWidgetController::addCodePasterAction(QMenu *menu)
void DiffEditorWidgetController::addCodePasterAction(QMenu *menu, int fileIndex, int chunkIndex)
{
if (ExtensionSystem::PluginManager::getObject<CodePaster::Service>()) {
// optional code pasting service
QAction *sendChunkToCodePasterAction = menu->addAction(tr("Send Chunk to CodePaster..."));
connect(sendChunkToCodePasterAction, &QAction::triggered,
this, &DiffEditorWidgetController::slotSendChunkToCodePaster);
connect(sendChunkToCodePasterAction, &QAction::triggered, [this, fileIndex, chunkIndex]() {
sendChunkToCodePaster(fileIndex, chunkIndex);
});
}
}
bool DiffEditorWidgetController::setAndVerifyIndexes(QMenu *menu,
int diffFileIndex, int chunkIndex)
bool DiffEditorWidgetController::chunkExists(int fileIndex, int chunkIndex) const
{
if (!m_document)
return false;
m_contextMenuFileIndex = diffFileIndex;
m_contextMenuChunkIndex = chunkIndex;
if (DiffEditorController *controller = m_document->controller())
return controller->chunkExists(fileIndex, chunkIndex);
if (m_contextMenuFileIndex < 0 || m_contextMenuChunkIndex < 0)
return false;
if (m_contextMenuFileIndex >= m_contextFileData.count())
return false;
const FileData fileData = m_contextFileData.at(m_contextMenuFileIndex);
if (m_contextMenuChunkIndex >= fileData.chunks.count())
return false;
m_document->chunkActionsRequested(menu, diffFileIndex, chunkIndex);
return true;
return false;
}
bool DiffEditorWidgetController::fileNamesAreDifferent() const
bool DiffEditorWidgetController::fileNamesAreDifferent(int fileIndex) const
{
const FileData fileData = m_contextFileData.at(m_contextMenuFileIndex);
const FileData fileData = m_contextFileData.at(fileIndex);
return fileData.leftFileInfo.fileName != fileData.rightFileInfo.fileName;
}
void DiffEditorWidgetController::addApplyAction(QMenu *menu, int diffFileIndex,
int chunkIndex)
void DiffEditorWidgetController::addApplyAction(QMenu *menu, int fileIndex, int chunkIndex)
{
QAction *applyAction = menu->addAction(tr("Apply Chunk..."));
connect(applyAction, &QAction::triggered, this, &DiffEditorWidgetController::slotApplyChunk);
applyAction->setEnabled(setAndVerifyIndexes(menu, diffFileIndex, chunkIndex)
&& fileNamesAreDifferent());
connect(applyAction, &QAction::triggered, [this, fileIndex, chunkIndex]() {
patch(false, fileIndex, chunkIndex);
});
applyAction->setEnabled(chunkExists(fileIndex, chunkIndex) && fileNamesAreDifferent(fileIndex));
}
void DiffEditorWidgetController::addRevertAction(QMenu *menu, int diffFileIndex,
int chunkIndex)
void DiffEditorWidgetController::addRevertAction(QMenu *menu, int fileIndex, int chunkIndex)
{
QAction *revertAction = menu->addAction(tr("Revert Chunk..."));
connect(revertAction, &QAction::triggered, this, &DiffEditorWidgetController::slotRevertChunk);
revertAction->setEnabled(setAndVerifyIndexes(menu, diffFileIndex, chunkIndex));
connect(revertAction, &QAction::triggered, [this, fileIndex, chunkIndex]() {
patch(true, fileIndex, chunkIndex);
});
revertAction->setEnabled(chunkExists(fileIndex, chunkIndex));
}
void DiffEditorWidgetController::slotSendChunkToCodePaster()
void DiffEditorWidgetController::addExtraActions(QMenu *menu, int fileIndex, int chunkIndex)
{
if (DiffEditorController *controller = m_document->controller())
controller->requestChunkActions(menu, fileIndex, chunkIndex);
}
void DiffEditorWidgetController::sendChunkToCodePaster(int fileIndex, int chunkIndex)
{
if (!m_document)
return;
@@ -284,7 +283,7 @@ void DiffEditorWidgetController::slotSendChunkToCodePaster()
auto pasteService = ExtensionSystem::PluginManager::getObject<CodePaster::Service>();
QTC_ASSERT(pasteService, return);
const QString patch = m_document->makePatch(m_contextMenuFileIndex, m_contextMenuChunkIndex, false);
const QString patch = m_document->makePatch(fileIndex, chunkIndex, false);
if (patch.isEmpty())
return;
@@ -292,15 +291,5 @@ void DiffEditorWidgetController::slotSendChunkToCodePaster()
pasteService->postText(patch, Constants::DIFF_EDITOR_MIMETYPE);
}
void DiffEditorWidgetController::slotApplyChunk()
{
patch(false);
}
void DiffEditorWidgetController::slotRevertChunk()
{
patch(true);
}
} // namespace Internal
} // namespace DiffEditor

View File

@@ -52,13 +52,13 @@ public:
void setDocument(DiffEditorDocument *document);
DiffEditorDocument *document() const;
void patch(bool revert);
void jumpToOriginalFile(const QString &fileName, int lineNumber,
int columnNumber);
void setFontSettings(const TextEditor::FontSettings &fontSettings);
void addCodePasterAction(QMenu *menu);
void addApplyAction(QMenu *menu, int diffFileIndex, int chunkIndex);
void addRevertAction(QMenu *menu, int diffFileIndex, int chunkIndex);
void addCodePasterAction(QMenu *menu, int fileIndex, int chunkIndex);
void addApplyAction(QMenu *menu, int fileIndex, int chunkIndex);
void addRevertAction(QMenu *menu, int fileIndex, int chunkIndex);
void addExtraActions(QMenu *menu, int fileIndex, int chunkIndex);
bool m_ignoreCurrentIndexChange = false;
QList<FileData> m_contextFileData; // ultimate data to be shown
@@ -71,11 +71,10 @@ public:
QTextCharFormat m_rightCharFormat;
private:
void slotSendChunkToCodePaster();
void slotApplyChunk();
void slotRevertChunk();
bool setAndVerifyIndexes(QMenu *menu, int diffFileIndex, int chunkIndex);
bool fileNamesAreDifferent() const;
void patch(bool revert, int fileIndex, int chunkIndex);
void sendChunkToCodePaster(int fileIndex, int chunkIndex);
bool chunkExists(int fileIndex, int chunkIndex) const;
bool fileNamesAreDifferent(int fileIndex) const;
void scheduleShowProgress();
void showProgress();
@@ -85,9 +84,6 @@ private:
DiffEditorDocument *m_document = nullptr;
int m_contextMenuFileIndex = -1;
int m_contextMenuChunkIndex = -1;
Utils::ProgressIndicator *m_progressIndicator = nullptr;
QTimer m_timer;
};

View File

@@ -1059,59 +1059,79 @@ void SideBySideDiffEditorWidget::slotRightJumpToOriginalFileRequested(
}
void SideBySideDiffEditorWidget::slotLeftContextMenuRequested(QMenu *menu,
int diffFileIndex,
int fileIndex,
int chunkIndex)
{
menu->addSeparator();
m_controller.addCodePasterAction(menu);
m_controller.addApplyAction(menu, diffFileIndex, chunkIndex);
m_controller.addCodePasterAction(menu, fileIndex, chunkIndex);
m_controller.addApplyAction(menu, fileIndex, chunkIndex);
m_controller.addExtraActions(menu, fileIndex, chunkIndex);
}
void SideBySideDiffEditorWidget::slotRightContextMenuRequested(QMenu *menu,
int diffFileIndex,
int fileIndex,
int chunkIndex)
{
menu->addSeparator();
m_controller.addCodePasterAction(menu);
m_controller.addRevertAction(menu, diffFileIndex, chunkIndex);
m_controller.addCodePasterAction(menu, fileIndex, chunkIndex);
m_controller.addRevertAction(menu, fileIndex, chunkIndex);
m_controller.addExtraActions(menu, fileIndex, chunkIndex);
}
void SideBySideDiffEditorWidget::leftVSliderChanged()
{
if (m_controller.m_ignoreCurrentIndexChange)
return;
m_rightEditor->verticalScrollBar()->setValue(m_leftEditor->verticalScrollBar()->value());
}
void SideBySideDiffEditorWidget::rightVSliderChanged()
{
if (m_controller.m_ignoreCurrentIndexChange)
return;
m_leftEditor->verticalScrollBar()->setValue(m_rightEditor->verticalScrollBar()->value());
}
void SideBySideDiffEditorWidget::leftHSliderChanged()
{
if (m_controller.m_ignoreCurrentIndexChange)
return;
if (m_horizontalSync)
m_rightEditor->horizontalScrollBar()->setValue(m_leftEditor->horizontalScrollBar()->value());
}
void SideBySideDiffEditorWidget::rightHSliderChanged()
{
if (m_controller.m_ignoreCurrentIndexChange)
return;
if (m_horizontalSync)
m_leftEditor->horizontalScrollBar()->setValue(m_rightEditor->horizontalScrollBar()->value());
}
void SideBySideDiffEditorWidget::leftCursorPositionChanged()
{
if (m_controller.m_ignoreCurrentIndexChange)
return;
handlePositionChange(m_leftEditor, m_rightEditor);
leftVSliderChanged();
leftHSliderChanged();
handlePositionChange(m_leftEditor, m_rightEditor);
}
void SideBySideDiffEditorWidget::rightCursorPositionChanged()
{
if (m_controller.m_ignoreCurrentIndexChange)
return;
handlePositionChange(m_rightEditor, m_leftEditor);
rightVSliderChanged();
rightHSliderChanged();
handlePositionChange(m_rightEditor, m_leftEditor);
}
void SideBySideDiffEditorWidget::handlePositionChange(SideDiffEditorWidget *source, SideDiffEditorWidget *dest)
@@ -1129,6 +1149,8 @@ void SideBySideDiffEditorWidget::handlePositionChange(SideDiffEditorWidget *sour
void SideBySideDiffEditorWidget::syncCursor(SideDiffEditorWidget *source, SideDiffEditorWidget *dest)
{
const int oldHSliderPos = dest->horizontalScrollBar()->value();
const QTextCursor sourceCursor = source->textCursor();
const int sourceLine = sourceCursor.blockNumber();
const int sourceColumn = sourceCursor.positionInBlock();
@@ -1139,6 +1161,7 @@ void SideBySideDiffEditorWidget::syncCursor(SideDiffEditorWidget *source, SideDi
destCursor.setPosition(destPosition);
dest->setTextCursor(destCursor);
dest->horizontalScrollBar()->setValue(oldHSliderPos);
}
} // namespace Internal

View File

@@ -85,9 +85,9 @@ private:
int lineNumber, int columnNumber);
void slotRightJumpToOriginalFileRequested(int diffFileIndex,
int lineNumber, int columnNumber);
void slotLeftContextMenuRequested(QMenu *menu, int diffFileIndex,
void slotLeftContextMenuRequested(QMenu *menu, int fileIndex,
int chunkIndex);
void slotRightContextMenuRequested(QMenu *menu, int diffFileIndex,
void slotRightContextMenuRequested(QMenu *menu, int fileIndex,
int chunkIndex);
void leftVSliderChanged();
void rightVSliderChanged();

View File

@@ -190,14 +190,15 @@ void UnifiedDiffEditorWidget::contextMenuEvent(QContextMenuEvent *e)
}
void UnifiedDiffEditorWidget::addContextMenuActions(QMenu *menu,
int diffFileIndex,
int fileIndex,
int chunkIndex)
{
menu->addSeparator();
m_controller.addCodePasterAction(menu);
m_controller.addApplyAction(menu, diffFileIndex, chunkIndex);
m_controller.addRevertAction(menu, diffFileIndex, chunkIndex);
m_controller.addCodePasterAction(menu, fileIndex, chunkIndex);
m_controller.addApplyAction(menu, fileIndex, chunkIndex);
m_controller.addRevertAction(menu, fileIndex, chunkIndex);
m_controller.addExtraActions(menu, fileIndex, chunkIndex);
}
void UnifiedDiffEditorWidget::clear(const QString &message)

View File

@@ -96,7 +96,7 @@ private:
int chunkIndexForBlockNumber(int blockNumber) const;
void jumpToOriginalFile(const QTextCursor &cursor);
void addContextMenuActions(QMenu *menu,
int diffFileIndex,
int fileIndex,
int chunkIndex);
// block number, visual line number.