diff options
author | jkobus <jaroslaw.kobus@digia.com> | 2013-05-22 16:33:44 +0200 |
---|---|---|
committer | Jarek Kobus <jaroslaw.kobus@digia.com> | 2013-05-23 11:53:23 +0200 |
commit | b8acf23ec4da9bc889a0eb91401ff6d9380cb5de (patch) | |
tree | efff6c0ad65ac46852d2ef0e41574581bf3c7555 /src/plugins/diffeditor/diffeditorwidget.cpp | |
parent | f1d141b915c933de95682bf92edd7ca5b26caf5b (diff) | |
download | qt-creator-b8acf23ec4da9bc889a0eb91401ff6d9380cb5de.tar.gz |
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>
Diffstat (limited to 'src/plugins/diffeditor/diffeditorwidget.cpp')
-rw-r--r-- | src/plugins/diffeditor/diffeditorwidget.cpp | 63 |
1 files changed, 55 insertions, 8 deletions
diff --git a/src/plugins/diffeditor/diffeditorwidget.cpp b/src/plugins/diffeditor/diffeditorwidget.cpp index 2b0c7bae5e..f68381adaf 100644 --- a/src/plugins/diffeditor/diffeditorwidget.cpp +++ b/src/plugins/diffeditor/diffeditorwidget.cpp @@ -36,6 +36,7 @@ #include <QScrollBar> #include <QPainter> #include <QDir> +#include <QToolButton> #include <texteditor/basetexteditor.h> #include <texteditor/snippets/snippeteditor.h> @@ -477,10 +478,20 @@ DiffEditorWidget::DiffEditorWidget(QWidget *parent) : QWidget(parent), m_contextLinesNumber(3), m_ignoreWhitespaces(true), + m_syncScrollBars(true), m_foldingBlocker(false) { 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->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); m_leftEditor->setReadOnly(true); @@ -490,6 +501,7 @@ DiffEditorWidget::DiffEditorWidget(QWidget *parent) m_leftEditor->setCodeStyle(settings->codeStyle()); m_rightEditor = new DiffViewEditorWidget(this); + m_rightEditor->setCornerWidget(toggleSync); m_rightEditor->setReadOnly(true); m_rightEditor->setHighlightCurrentLine(false); m_rightEditor->setWordWrapMode(QTextOption::NoWrap); @@ -497,19 +509,36 @@ DiffEditorWidget::DiffEditorWidget(QWidget *parent) m_rightEditor->setCodeStyle(settings->codeStyle()); connect(m_leftEditor->verticalScrollBar(), SIGNAL(valueChanged(int)), - this, SLOT(leftSliderChanged())); + this, SLOT(leftVSliderChanged())); connect(m_leftEditor->verticalScrollBar(), SIGNAL(actionTriggered(int)), - this, SLOT(leftSliderChanged())); + this, SLOT(leftVSliderChanged())); + connect(m_leftEditor, SIGNAL(cursorPositionChanged()), + 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(leftSliderChanged())); + this, SLOT(leftHSliderChanged())); + connect(m_leftEditor->document()->documentLayout(), SIGNAL(documentSizeChanged(QSizeF)), this, SLOT(leftDocumentSizeChanged())); + connect(m_rightEditor->verticalScrollBar(), SIGNAL(valueChanged(int)), - this, SLOT(rightSliderChanged())); + this, SLOT(rightVSliderChanged())); connect(m_rightEditor->verticalScrollBar(), SIGNAL(actionTriggered(int)), - this, SLOT(rightSliderChanged())); + this, SLOT(rightVSliderChanged())); 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)), this, SLOT(rightDocumentSizeChanged())); @@ -517,6 +546,7 @@ DiffEditorWidget::DiffEditorWidget(QWidget *parent) m_splitter->addWidget(m_leftEditor); m_splitter->addWidget(m_rightEditor); QVBoxLayout *l = new QVBoxLayout(this); + l->setMargin(0); l->addWidget(m_splitter); clear(); @@ -1277,16 +1307,28 @@ void DiffEditorWidget::colorDiff(const QList<FileData> &fileDataList) + rightSelections); } -void DiffEditorWidget::leftSliderChanged() +void DiffEditorWidget::leftVSliderChanged() { m_rightEditor->verticalScrollBar()->setValue(m_leftEditor->verticalScrollBar()->value()); } -void DiffEditorWidget::rightSliderChanged() +void DiffEditorWidget::rightVSliderChanged() { 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() { synchronizeFoldings(m_leftEditor, m_rightEditor); @@ -1297,6 +1339,11 @@ void DiffEditorWidget::rightDocumentSizeChanged() synchronizeFoldings(m_rightEditor, m_leftEditor); } +void DiffEditorWidget::toggleScrollBarSynchronization(bool on) +{ + m_syncScrollBars = on; +} + /* Special version of that method (original: TextEditor::BaseTextDocumentLayout::doFoldOrUnfold()) 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) |