forked from qt-creator/qt-creator
Synchronize horizontal scroll bars in diff editor
Synchronize horizontal scroll bars by default. Added corner widget to toggle synchronization off. Change-Id: I52316f1d9399b9ad21a346d65873b37ce0a9b98f Reviewed-by: Orgad Shaneh <orgads@gmail.com>
This commit is contained in:
@@ -36,6 +36,7 @@
|
|||||||
#include <QScrollBar>
|
#include <QScrollBar>
|
||||||
#include <QPainter>
|
#include <QPainter>
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
|
#include <QToolButton>
|
||||||
|
|
||||||
#include <texteditor/basetexteditor.h>
|
#include <texteditor/basetexteditor.h>
|
||||||
#include <texteditor/snippets/snippeteditor.h>
|
#include <texteditor/snippets/snippeteditor.h>
|
||||||
@@ -477,10 +478,20 @@ DiffEditorWidget::DiffEditorWidget(QWidget *parent)
|
|||||||
: QWidget(parent),
|
: QWidget(parent),
|
||||||
m_contextLinesNumber(3),
|
m_contextLinesNumber(3),
|
||||||
m_ignoreWhitespaces(true),
|
m_ignoreWhitespaces(true),
|
||||||
|
m_syncScrollBars(true),
|
||||||
m_foldingBlocker(false)
|
m_foldingBlocker(false)
|
||||||
{
|
{
|
||||||
TextEditor::TextEditorSettings *settings = TextEditorSettings::instance();
|
TextEditor::TextEditorSettings *settings = TextEditorSettings::instance();
|
||||||
|
|
||||||
|
QToolButton *toggleSync = new QToolButton();
|
||||||
|
toggleSync = new QToolButton;
|
||||||
|
toggleSync->setText(QLatin1String("S"));
|
||||||
|
toggleSync->setCheckable(true);
|
||||||
|
toggleSync->setChecked(m_syncScrollBars);
|
||||||
|
toggleSync->setToolTip(tr("Synchronize Horizontal Scroll Bars"));
|
||||||
|
toggleSync->setAutoRaise(true);
|
||||||
|
connect(toggleSync, SIGNAL(clicked(bool)), this, SLOT(toggleScrollBarSynchronization(bool)));
|
||||||
|
|
||||||
m_leftEditor = new DiffViewEditorWidget(this);
|
m_leftEditor = new DiffViewEditorWidget(this);
|
||||||
m_leftEditor->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
m_leftEditor->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||||||
m_leftEditor->setReadOnly(true);
|
m_leftEditor->setReadOnly(true);
|
||||||
@@ -490,6 +501,7 @@ DiffEditorWidget::DiffEditorWidget(QWidget *parent)
|
|||||||
m_leftEditor->setCodeStyle(settings->codeStyle());
|
m_leftEditor->setCodeStyle(settings->codeStyle());
|
||||||
|
|
||||||
m_rightEditor = new DiffViewEditorWidget(this);
|
m_rightEditor = new DiffViewEditorWidget(this);
|
||||||
|
m_rightEditor->setCornerWidget(toggleSync);
|
||||||
m_rightEditor->setReadOnly(true);
|
m_rightEditor->setReadOnly(true);
|
||||||
m_rightEditor->setHighlightCurrentLine(false);
|
m_rightEditor->setHighlightCurrentLine(false);
|
||||||
m_rightEditor->setWordWrapMode(QTextOption::NoWrap);
|
m_rightEditor->setWordWrapMode(QTextOption::NoWrap);
|
||||||
@@ -497,19 +509,36 @@ DiffEditorWidget::DiffEditorWidget(QWidget *parent)
|
|||||||
m_rightEditor->setCodeStyle(settings->codeStyle());
|
m_rightEditor->setCodeStyle(settings->codeStyle());
|
||||||
|
|
||||||
connect(m_leftEditor->verticalScrollBar(), SIGNAL(valueChanged(int)),
|
connect(m_leftEditor->verticalScrollBar(), SIGNAL(valueChanged(int)),
|
||||||
this, SLOT(leftSliderChanged()));
|
this, SLOT(leftVSliderChanged()));
|
||||||
connect(m_leftEditor->verticalScrollBar(), SIGNAL(actionTriggered(int)),
|
connect(m_leftEditor->verticalScrollBar(), SIGNAL(actionTriggered(int)),
|
||||||
this, SLOT(leftSliderChanged()));
|
this, SLOT(leftVSliderChanged()));
|
||||||
connect(m_leftEditor, SIGNAL(cursorPositionChanged()),
|
connect(m_leftEditor, SIGNAL(cursorPositionChanged()),
|
||||||
this, SLOT(leftSliderChanged()));
|
this, SLOT(leftVSliderChanged()));
|
||||||
|
|
||||||
|
connect(m_leftEditor->horizontalScrollBar(), SIGNAL(valueChanged(int)),
|
||||||
|
this, SLOT(leftHSliderChanged()));
|
||||||
|
connect(m_leftEditor->horizontalScrollBar(), SIGNAL(actionTriggered(int)),
|
||||||
|
this, SLOT(leftHSliderChanged()));
|
||||||
|
connect(m_leftEditor, SIGNAL(cursorPositionChanged()),
|
||||||
|
this, SLOT(leftHSliderChanged()));
|
||||||
|
|
||||||
connect(m_leftEditor->document()->documentLayout(), SIGNAL(documentSizeChanged(QSizeF)),
|
connect(m_leftEditor->document()->documentLayout(), SIGNAL(documentSizeChanged(QSizeF)),
|
||||||
this, SLOT(leftDocumentSizeChanged()));
|
this, SLOT(leftDocumentSizeChanged()));
|
||||||
|
|
||||||
connect(m_rightEditor->verticalScrollBar(), SIGNAL(valueChanged(int)),
|
connect(m_rightEditor->verticalScrollBar(), SIGNAL(valueChanged(int)),
|
||||||
this, SLOT(rightSliderChanged()));
|
this, SLOT(rightVSliderChanged()));
|
||||||
connect(m_rightEditor->verticalScrollBar(), SIGNAL(actionTriggered(int)),
|
connect(m_rightEditor->verticalScrollBar(), SIGNAL(actionTriggered(int)),
|
||||||
this, SLOT(rightSliderChanged()));
|
this, SLOT(rightVSliderChanged()));
|
||||||
connect(m_rightEditor, SIGNAL(cursorPositionChanged()),
|
connect(m_rightEditor, SIGNAL(cursorPositionChanged()),
|
||||||
this, SLOT(rightSliderChanged()));
|
this, SLOT(rightVSliderChanged()));
|
||||||
|
|
||||||
|
connect(m_rightEditor->horizontalScrollBar(), SIGNAL(valueChanged(int)),
|
||||||
|
this, SLOT(rightHSliderChanged()));
|
||||||
|
connect(m_rightEditor->horizontalScrollBar(), SIGNAL(actionTriggered(int)),
|
||||||
|
this, SLOT(rightHSliderChanged()));
|
||||||
|
connect(m_rightEditor, SIGNAL(cursorPositionChanged()),
|
||||||
|
this, SLOT(rightHSliderChanged()));
|
||||||
|
|
||||||
connect(m_rightEditor->document()->documentLayout(), SIGNAL(documentSizeChanged(QSizeF)),
|
connect(m_rightEditor->document()->documentLayout(), SIGNAL(documentSizeChanged(QSizeF)),
|
||||||
this, SLOT(rightDocumentSizeChanged()));
|
this, SLOT(rightDocumentSizeChanged()));
|
||||||
|
|
||||||
@@ -517,6 +546,7 @@ DiffEditorWidget::DiffEditorWidget(QWidget *parent)
|
|||||||
m_splitter->addWidget(m_leftEditor);
|
m_splitter->addWidget(m_leftEditor);
|
||||||
m_splitter->addWidget(m_rightEditor);
|
m_splitter->addWidget(m_rightEditor);
|
||||||
QVBoxLayout *l = new QVBoxLayout(this);
|
QVBoxLayout *l = new QVBoxLayout(this);
|
||||||
|
l->setMargin(0);
|
||||||
l->addWidget(m_splitter);
|
l->addWidget(m_splitter);
|
||||||
|
|
||||||
clear();
|
clear();
|
||||||
@@ -1277,16 +1307,28 @@ void DiffEditorWidget::colorDiff(const QList<FileData> &fileDataList)
|
|||||||
+ rightSelections);
|
+ rightSelections);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DiffEditorWidget::leftSliderChanged()
|
void DiffEditorWidget::leftVSliderChanged()
|
||||||
{
|
{
|
||||||
m_rightEditor->verticalScrollBar()->setValue(m_leftEditor->verticalScrollBar()->value());
|
m_rightEditor->verticalScrollBar()->setValue(m_leftEditor->verticalScrollBar()->value());
|
||||||
}
|
}
|
||||||
|
|
||||||
void DiffEditorWidget::rightSliderChanged()
|
void DiffEditorWidget::rightVSliderChanged()
|
||||||
{
|
{
|
||||||
m_leftEditor->verticalScrollBar()->setValue(m_rightEditor->verticalScrollBar()->value());
|
m_leftEditor->verticalScrollBar()->setValue(m_rightEditor->verticalScrollBar()->value());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DiffEditorWidget::leftHSliderChanged()
|
||||||
|
{
|
||||||
|
if (m_syncScrollBars)
|
||||||
|
m_rightEditor->horizontalScrollBar()->setValue(m_leftEditor->horizontalScrollBar()->value());
|
||||||
|
}
|
||||||
|
|
||||||
|
void DiffEditorWidget::rightHSliderChanged()
|
||||||
|
{
|
||||||
|
if (m_syncScrollBars)
|
||||||
|
m_leftEditor->horizontalScrollBar()->setValue(m_rightEditor->horizontalScrollBar()->value());
|
||||||
|
}
|
||||||
|
|
||||||
void DiffEditorWidget::leftDocumentSizeChanged()
|
void DiffEditorWidget::leftDocumentSizeChanged()
|
||||||
{
|
{
|
||||||
synchronizeFoldings(m_leftEditor, m_rightEditor);
|
synchronizeFoldings(m_leftEditor, m_rightEditor);
|
||||||
@@ -1297,6 +1339,11 @@ void DiffEditorWidget::rightDocumentSizeChanged()
|
|||||||
synchronizeFoldings(m_rightEditor, m_leftEditor);
|
synchronizeFoldings(m_rightEditor, m_leftEditor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DiffEditorWidget::toggleScrollBarSynchronization(bool on)
|
||||||
|
{
|
||||||
|
m_syncScrollBars = on;
|
||||||
|
}
|
||||||
|
|
||||||
/* Special version of that method (original: TextEditor::BaseTextDocumentLayout::doFoldOrUnfold())
|
/* Special version of that method (original: TextEditor::BaseTextDocumentLayout::doFoldOrUnfold())
|
||||||
The hack lies in fact, that when unfolding all direct sub-blocks are made visible,
|
The hack lies in fact, that when unfolding all direct sub-blocks are made visible,
|
||||||
while some of them need to stay invisible (i.e. unfolded chunk lines)
|
while some of them need to stay invisible (i.e. unfolded chunk lines)
|
||||||
|
|||||||
@@ -92,10 +92,13 @@ protected:
|
|||||||
TextEditor::SnippetEditorWidget *rightEditor() const;
|
TextEditor::SnippetEditorWidget *rightEditor() const;
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void leftSliderChanged();
|
void leftVSliderChanged();
|
||||||
void rightSliderChanged();
|
void rightVSliderChanged();
|
||||||
|
void leftHSliderChanged();
|
||||||
|
void rightHSliderChanged();
|
||||||
void leftDocumentSizeChanged();
|
void leftDocumentSizeChanged();
|
||||||
void rightDocumentSizeChanged();
|
void rightDocumentSizeChanged();
|
||||||
|
void toggleScrollBarSynchronization(bool on);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct DiffList {
|
struct DiffList {
|
||||||
@@ -130,6 +133,7 @@ private:
|
|||||||
QList<FileData> m_contextFileData; // ultimate data to be shown, contextLinesNumber taken into account
|
QList<FileData> m_contextFileData; // ultimate data to be shown, contextLinesNumber taken into account
|
||||||
int m_contextLinesNumber;
|
int m_contextLinesNumber;
|
||||||
bool m_ignoreWhitespaces;
|
bool m_ignoreWhitespaces;
|
||||||
|
bool m_syncScrollBars;
|
||||||
|
|
||||||
bool m_foldingBlocker;
|
bool m_foldingBlocker;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user