forked from qt-creator/qt-creator
Adjust mark area width to mark width.
Patch by Kevin Funk
This commit is contained in:
@@ -84,6 +84,8 @@ class DocumentMarker : public ITextMarkable
|
|||||||
public:
|
public:
|
||||||
DocumentMarker(QTextDocument *);
|
DocumentMarker(QTextDocument *);
|
||||||
|
|
||||||
|
TextMarks marks() const { return m_marksCache; }
|
||||||
|
|
||||||
// ITextMarkable
|
// ITextMarkable
|
||||||
bool addMark(ITextMark *mark, int line);
|
bool addMark(ITextMark *mark, int line);
|
||||||
TextMarks marksAt(int line) const;
|
TextMarks marksAt(int line) const;
|
||||||
@@ -92,6 +94,9 @@ public:
|
|||||||
void updateMark(ITextMark *mark);
|
void updateMark(ITextMark *mark);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
double recalculateMaxMarkWidthFactor() const;
|
||||||
|
|
||||||
|
TextMarks m_marksCache; // not owned
|
||||||
QTextDocument *document;
|
QTextDocument *document;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -104,22 +109,34 @@ bool DocumentMarker::addMark(TextEditor::ITextMark *mark, int line)
|
|||||||
{
|
{
|
||||||
QTC_ASSERT(line >= 1, return false);
|
QTC_ASSERT(line >= 1, return false);
|
||||||
int blockNumber = line - 1;
|
int blockNumber = line - 1;
|
||||||
BaseTextDocumentLayout *documentLayout = qobject_cast<BaseTextDocumentLayout*>(document->documentLayout());
|
BaseTextDocumentLayout *documentLayout =
|
||||||
|
qobject_cast<BaseTextDocumentLayout*>(document->documentLayout());
|
||||||
QTC_ASSERT(documentLayout, return false);
|
QTC_ASSERT(documentLayout, return false);
|
||||||
QTextBlock block = document->findBlockByNumber(blockNumber);
|
QTextBlock block = document->findBlockByNumber(blockNumber);
|
||||||
|
|
||||||
if (block.isValid()) {
|
if (block.isValid()) {
|
||||||
TextBlockUserData *userData = BaseTextDocumentLayout::userData(block);
|
TextBlockUserData *userData = BaseTextDocumentLayout::userData(block);
|
||||||
userData->addMark(mark);
|
userData->addMark(mark);
|
||||||
|
m_marksCache.append(mark);
|
||||||
mark->updateLineNumber(blockNumber + 1);
|
mark->updateLineNumber(blockNumber + 1);
|
||||||
mark->updateBlock(block);
|
mark->updateBlock(block);
|
||||||
documentLayout->hasMarks = true;
|
documentLayout->hasMarks = true;
|
||||||
|
documentLayout->maxMarkWidthFactor = qMax(mark->widthFactor(),
|
||||||
|
documentLayout->maxMarkWidthFactor);
|
||||||
documentLayout->requestUpdate();
|
documentLayout->requestUpdate();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double DocumentMarker::recalculateMaxMarkWidthFactor() const
|
||||||
|
{
|
||||||
|
double maxWidthFactor = 1.0;
|
||||||
|
foreach (const ITextMark *mark, marks())
|
||||||
|
maxWidthFactor = qMax(mark->widthFactor(), maxWidthFactor);
|
||||||
|
return maxWidthFactor;
|
||||||
|
}
|
||||||
|
|
||||||
TextEditor::TextMarks DocumentMarker::marksAt(int line) const
|
TextEditor::TextMarks DocumentMarker::marksAt(int line) const
|
||||||
{
|
{
|
||||||
QTC_ASSERT(line >= 1, return TextMarks());
|
QTC_ASSERT(line >= 1, return TextMarks());
|
||||||
@@ -135,6 +152,10 @@ TextEditor::TextMarks DocumentMarker::marksAt(int line) const
|
|||||||
|
|
||||||
void DocumentMarker::removeMark(TextEditor::ITextMark *mark)
|
void DocumentMarker::removeMark(TextEditor::ITextMark *mark)
|
||||||
{
|
{
|
||||||
|
BaseTextDocumentLayout *documentLayout =
|
||||||
|
qobject_cast<BaseTextDocumentLayout*>(document->documentLayout());
|
||||||
|
QTC_ASSERT(documentLayout, return)
|
||||||
|
|
||||||
bool needUpdate = false;
|
bool needUpdate = false;
|
||||||
QTextBlock block = document->begin();
|
QTextBlock block = document->begin();
|
||||||
while (block.isValid()) {
|
while (block.isValid()) {
|
||||||
@@ -143,8 +164,12 @@ void DocumentMarker::removeMark(TextEditor::ITextMark *mark)
|
|||||||
}
|
}
|
||||||
block = block.next();
|
block = block.next();
|
||||||
}
|
}
|
||||||
if (needUpdate)
|
m_marksCache.removeAll(mark);
|
||||||
|
|
||||||
|
if (needUpdate) {
|
||||||
|
documentLayout->maxMarkWidthFactor = recalculateMaxMarkWidthFactor();
|
||||||
updateMark(0);
|
updateMark(0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool DocumentMarker::hasMark(TextEditor::ITextMark *mark) const
|
bool DocumentMarker::hasMark(TextEditor::ITextMark *mark) const
|
||||||
@@ -163,7 +188,8 @@ bool DocumentMarker::hasMark(TextEditor::ITextMark *mark) const
|
|||||||
void DocumentMarker::updateMark(ITextMark *mark)
|
void DocumentMarker::updateMark(ITextMark *mark)
|
||||||
{
|
{
|
||||||
Q_UNUSED(mark)
|
Q_UNUSED(mark)
|
||||||
BaseTextDocumentLayout *documentLayout = qobject_cast<BaseTextDocumentLayout*>(document->documentLayout());
|
BaseTextDocumentLayout *documentLayout =
|
||||||
|
qobject_cast<BaseTextDocumentLayout*>(document->documentLayout());
|
||||||
QTC_ASSERT(documentLayout, return);
|
QTC_ASSERT(documentLayout, return);
|
||||||
documentLayout->requestUpdate();
|
documentLayout->requestUpdate();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -393,6 +393,7 @@ BaseTextDocumentLayout::BaseTextDocumentLayout(QTextDocument *doc)
|
|||||||
:QPlainTextDocumentLayout(doc) {
|
:QPlainTextDocumentLayout(doc) {
|
||||||
lastSaveRevision = 0;
|
lastSaveRevision = 0;
|
||||||
hasMarks = 0;
|
hasMarks = 0;
|
||||||
|
maxMarkWidthFactor = 1.0;
|
||||||
m_requiredWidth = 0;
|
m_requiredWidth = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -189,6 +189,7 @@ public:
|
|||||||
void emitDocumentSizeChanged() { emit documentSizeChanged(documentSize()); }
|
void emitDocumentSizeChanged() { emit documentSizeChanged(documentSize()); }
|
||||||
int lastSaveRevision;
|
int lastSaveRevision;
|
||||||
bool hasMarks;
|
bool hasMarks;
|
||||||
|
double maxMarkWidthFactor;
|
||||||
|
|
||||||
int m_requiredWidth;
|
int m_requiredWidth;
|
||||||
void setRequiredWidth(int width);
|
void setRequiredWidth(int width);
|
||||||
|
|||||||
@@ -3576,7 +3576,8 @@ int BaseTextEditorWidget::extraAreaWidth(int *markWidthPtr) const
|
|||||||
int markWidth = 0;
|
int markWidth = 0;
|
||||||
|
|
||||||
if (d->m_marksVisible) {
|
if (d->m_marksVisible) {
|
||||||
markWidth += fm.lineSpacing();
|
markWidth += documentLayout->maxMarkWidthFactor * fm.lineSpacing();
|
||||||
|
|
||||||
// if (documentLayout->doubleMarkCount)
|
// if (documentLayout->doubleMarkCount)
|
||||||
// markWidth += fm.lineSpacing() / 3;
|
// markWidth += fm.lineSpacing() / 3;
|
||||||
space += markWidth;
|
space += markWidth;
|
||||||
|
|||||||
Reference in New Issue
Block a user