aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorNeil <nyamatongwe@gmail.com>2021-09-07 16:28:35 +1000
committerNeil <nyamatongwe@gmail.com>2021-09-07 16:28:35 +1000
commitdff533101fae1223831eddd66c6685573f221ba9 (patch)
tree4b6377b046228f2b6988a85d715eb5c57fda54da
parent044a2a4b7414c82030112cc1be7cc810c21d2e48 (diff)
downloadscintilla-mirror-dff533101fae1223831eddd66c6685573f221ba9.tar.gz
Move bulk of PaintMargin into PaintOneMargin which paints one margin.
This reduces nesting and indentation.
-rw-r--r--src/MarginView.cxx503
-rw-r--r--src/MarginView.h2
2 files changed, 256 insertions, 249 deletions
diff --git a/src/MarginView.cxx b/src/MarginView.cxx
index 50e3822d3..50469a401 100644
--- a/src/MarginView.cxx
+++ b/src/MarginView.cxx
@@ -172,21 +172,263 @@ static MarkerOutline SubstituteMarkerIfEmpty(MarkerOutline markerCheck, MarkerOu
return markerCheck;
}
+void MarginView::PaintOneMargin(Surface *surface, Sci::Line topLine, PRectangle rc, PRectangle rcOneMargin, size_t margin,
+ const EditModel &model, const ViewStyle &vs) {
+ const Point ptOrigin = model.GetVisibleOriginInMain();
+ const Sci::Line lineStartPaint = static_cast<Sci::Line>(rcOneMargin.top + ptOrigin.y) / vs.lineHeight;
+ Sci::Line visibleLine = model.TopLineOfMain() + lineStartPaint;
+ XYPOSITION yposScreen = lineStartPaint * vs.lineHeight - ptOrigin.y;
+ // Work out whether the top line is whitespace located after a
+ // lessening of fold level which implies a 'fold tail' but which should not
+ // be displayed until the last of a sequence of whitespace.
+ bool needWhiteClosure = false;
+ if (vs.ms[margin].ShowsFolding()) {
+ const FoldLevel level = model.pdoc->GetFoldLevel(model.pcs->DocFromDisplay(visibleLine));
+ if (LevelIsWhitespace(level)) {
+ Sci::Line lineBack = model.pcs->DocFromDisplay(visibleLine);
+ FoldLevel levelPrev = level;
+ while ((lineBack > 0) && LevelIsWhitespace(levelPrev)) {
+ lineBack--;
+ levelPrev = model.pdoc->GetFoldLevel(lineBack);
+ }
+ if (!LevelIsHeader(levelPrev)) {
+ if (LevelNumber(level) < LevelNumber(levelPrev))
+ needWhiteClosure = true;
+ }
+ }
+ if (highlightDelimiter.isEnabled) {
+ const Sci::Line lastLine = model.pcs->DocFromDisplay(topLine + model.LinesOnScreen()) + 1;
+ model.pdoc->GetHighlightDelimiters(highlightDelimiter,
+ model.pdoc->SciLineFromPosition(model.sel.MainCaret()), lastLine);
+ }
+ }
+
+ // Old code does not know about new markers needed to distinguish all cases
+ const MarkerOutline folderOpenMid = SubstituteMarkerIfEmpty(MarkerOutline::FolderOpenMid,
+ MarkerOutline::FolderOpen, vs);
+ const MarkerOutline folderEnd = SubstituteMarkerIfEmpty(MarkerOutline::FolderEnd,
+ MarkerOutline::Folder, vs);
+
+ while ((visibleLine < model.pcs->LinesDisplayed()) && yposScreen < rc.bottom) {
+
+ PLATFORM_ASSERT(visibleLine < model.pcs->LinesDisplayed());
+ const Sci::Line lineDoc = model.pcs->DocFromDisplay(visibleLine);
+ PLATFORM_ASSERT(model.pcs->GetVisible(lineDoc));
+ const Sci::Line firstVisibleLine = model.pcs->DisplayFromDoc(lineDoc);
+ const Sci::Line lastVisibleLine = model.pcs->DisplayLastFromDoc(lineDoc);
+ const bool firstSubLine = visibleLine == firstVisibleLine;
+ const bool lastSubLine = visibleLine == lastVisibleLine;
+
+ int marks = model.pdoc->GetMark(lineDoc);
+ if (!firstSubLine)
+ marks = 0;
+
+ bool headWithTail = false;
+
+ if (vs.ms[margin].ShowsFolding()) {
+ // Decide which fold indicator should be displayed
+ const FoldLevel level = model.pdoc->GetFoldLevel(lineDoc);
+ const FoldLevel levelNext = model.pdoc->GetFoldLevel(lineDoc + 1);
+ const FoldLevel levelNum = LevelNumberPart(level);
+ const FoldLevel levelNextNum = LevelNumberPart(levelNext);
+ if (LevelIsHeader(level)) {
+ if (firstSubLine) {
+ if (levelNum < levelNextNum) {
+ if (model.pcs->GetExpanded(lineDoc)) {
+ if (levelNum == FoldLevel::Base)
+ marks |= 1 << MarkerOutline::FolderOpen;
+ else
+ marks |= 1 << folderOpenMid;
+ } else {
+ if (levelNum == FoldLevel::Base)
+ marks |= 1 << MarkerOutline::Folder;
+ else
+ marks |= 1 << folderEnd;
+ }
+ } else if (levelNum > FoldLevel::Base) {
+ marks |= 1 << MarkerOutline::FolderSub;
+ }
+ } else {
+ if (levelNum < levelNextNum) {
+ if (model.pcs->GetExpanded(lineDoc)) {
+ marks |= 1 << MarkerOutline::FolderSub;
+ } else if (levelNum > FoldLevel::Base) {
+ marks |= 1 << MarkerOutline::FolderSub;
+ }
+ } else if (levelNum > FoldLevel::Base) {
+ marks |= 1 << MarkerOutline::FolderSub;
+ }
+ }
+ needWhiteClosure = false;
+ const Sci::Line firstFollowupLine = model.pcs->DocFromDisplay(model.pcs->DisplayFromDoc(lineDoc + 1));
+ const FoldLevel firstFollowupLineLevel = model.pdoc->GetFoldLevel(firstFollowupLine);
+ const FoldLevel secondFollowupLineLevelNum = LevelNumberPart(model.pdoc->GetFoldLevel(firstFollowupLine + 1));
+ if (!model.pcs->GetExpanded(lineDoc)) {
+ if (LevelIsWhitespace(firstFollowupLineLevel) &&
+ (levelNum > secondFollowupLineLevelNum))
+ needWhiteClosure = true;
+
+ if (highlightDelimiter.IsFoldBlockHighlighted(firstFollowupLine))
+ headWithTail = true;
+ }
+ } else if (LevelIsWhitespace(level)) {
+ if (needWhiteClosure) {
+ if (LevelIsWhitespace(levelNext)) {
+ marks |= 1 << MarkerOutline::FolderSub;
+ } else if (levelNextNum > FoldLevel::Base) {
+ marks |= 1 << MarkerOutline::FolderMidTail;
+ needWhiteClosure = false;
+ } else {
+ marks |= 1 << MarkerOutline::FolderTail;
+ needWhiteClosure = false;
+ }
+ } else if (levelNum > FoldLevel::Base) {
+ if (levelNextNum < levelNum) {
+ if (levelNextNum > FoldLevel::Base) {
+ marks |= 1 << MarkerOutline::FolderMidTail;
+ } else {
+ marks |= 1 << MarkerOutline::FolderTail;
+ }
+ } else {
+ marks |= 1 << MarkerOutline::FolderSub;
+ }
+ }
+ } else if (levelNum > FoldLevel::Base) {
+ if (levelNextNum < levelNum) {
+ needWhiteClosure = false;
+ if (LevelIsWhitespace(levelNext)) {
+ marks |= 1 << MarkerOutline::FolderSub;
+ needWhiteClosure = true;
+ } else if (lastSubLine) {
+ if (levelNextNum > FoldLevel::Base) {
+ marks |= 1 << MarkerOutline::FolderMidTail;
+ } else {
+ marks |= 1 << MarkerOutline::FolderTail;
+ }
+ } else {
+ marks |= 1 << MarkerOutline::FolderSub;
+ }
+ } else {
+ marks |= 1 << MarkerOutline::FolderSub;
+ }
+ }
+ }
+
+ marks &= vs.ms[margin].mask;
+
+ const PRectangle rcMarker(
+ rcOneMargin.left,
+ static_cast<XYPOSITION>(yposScreen),
+ rcOneMargin.right,
+ static_cast<XYPOSITION>(yposScreen + vs.lineHeight));
+ if (vs.ms[margin].style == MarginType::Number) {
+ if (firstSubLine) {
+ std::string sNumber;
+ if (lineDoc >= 0) {
+ sNumber = std::to_string(lineDoc + 1);
+ }
+ if (FlagSet(model.foldFlags, (FoldFlag::LevelNumbers | FoldFlag::LineState))) {
+ char number[100] = "";
+ if (FlagSet(model.foldFlags, FoldFlag::LevelNumbers)) {
+ const FoldLevel lev = model.pdoc->GetFoldLevel(lineDoc);
+ sprintf(number, "%c%c %03X %03X",
+ LevelIsHeader(lev) ? 'H' : '_',
+ LevelIsWhitespace(lev) ? 'W' : '_',
+ LevelNumber(lev),
+ static_cast<int>(lev) >> 16
+ );
+ } else {
+ const int state = model.pdoc->GetLineState(lineDoc);
+ sprintf(number, "%0X", state);
+ }
+ sNumber = number;
+ }
+ PRectangle rcNumber = rcMarker;
+ // Right justify
+ const XYPOSITION width = surface->WidthText(vs.styles[StyleLineNumber].font.get(), sNumber);
+ const XYPOSITION xpos = rcNumber.right - width - vs.marginNumberPadding;
+ rcNumber.left = xpos;
+ DrawTextNoClipPhase(surface, rcNumber, vs.styles[StyleLineNumber],
+ rcNumber.top + vs.maxAscent, sNumber, DrawPhase::all);
+ } else if (FlagSet(vs.wrap.visualFlags, WrapVisualFlag::Margin)) {
+ PRectangle rcWrapMarker = rcMarker;
+ rcWrapMarker.right -= wrapMarkerPaddingRight;
+ rcWrapMarker.left = rcWrapMarker.right - vs.styles[StyleLineNumber].aveCharWidth;
+ if (!customDrawWrapMarker) {
+ DrawWrapMarker(surface, rcWrapMarker, false, vs.styles[StyleLineNumber].fore);
+ } else {
+ customDrawWrapMarker(surface, rcWrapMarker, false, vs.styles[StyleLineNumber].fore);
+ }
+ }
+ } else if (vs.ms[margin].style == MarginType::Text || vs.ms[margin].style == MarginType::RText) {
+ const StyledText stMargin = model.pdoc->MarginStyledText(lineDoc);
+ if (stMargin.text && ValidStyledText(vs, vs.marginStyleOffset, stMargin)) {
+ if (firstSubLine) {
+ surface->FillRectangle(rcMarker,
+ vs.styles[stMargin.StyleAt(0) + vs.marginStyleOffset].back);
+ PRectangle rcText = rcMarker;
+ if (vs.ms[margin].style == MarginType::RText) {
+ const int width = WidestLineWidth(surface, vs, vs.marginStyleOffset, stMargin);
+ rcText.left = rcText.right - width - 3;
+ }
+ DrawStyledText(surface, vs, vs.marginStyleOffset, rcText,
+ stMargin, 0, stMargin.length, DrawPhase::all);
+ } else {
+ // if we're displaying annotation lines, colour the margin to match the associated document line
+ const int annotationLines = model.pdoc->AnnotationLines(lineDoc);
+ if (annotationLines && (visibleLine > lastVisibleLine - annotationLines)) {
+ surface->FillRectangle(rcMarker, vs.styles[stMargin.StyleAt(0) + vs.marginStyleOffset].back);
+ }
+ }
+ }
+ }
+
+ if (marks) {
+ for (int markBit = 0; (markBit < 32) && marks; markBit++) {
+ if (marks & 1) {
+ LineMarker::FoldPart part = LineMarker::FoldPart::undefined;
+ if (vs.ms[margin].ShowsFolding() && highlightDelimiter.IsFoldBlockHighlighted(lineDoc)) {
+ if (highlightDelimiter.IsBodyOfFoldBlock(lineDoc)) {
+ part = LineMarker::FoldPart::body;
+ } else if (highlightDelimiter.IsHeadOfFoldBlock(lineDoc)) {
+ if (firstSubLine) {
+ part = headWithTail ? LineMarker::FoldPart::headWithTail : LineMarker::FoldPart::head;
+ } else {
+ if (model.pcs->GetExpanded(lineDoc) || headWithTail) {
+ part = LineMarker::FoldPart::body;
+ } else {
+ part = LineMarker::FoldPart::undefined;
+ }
+ }
+ } else if (highlightDelimiter.IsTailOfFoldBlock(lineDoc)) {
+ part = LineMarker::FoldPart::tail;
+ }
+ }
+ vs.markers[markBit].Draw(surface, rcMarker, vs.styles[StyleLineNumber].font.get(), part, vs.ms[margin].style);
+ }
+ marks >>= 1;
+ }
+ }
+
+ visibleLine++;
+ yposScreen += vs.lineHeight;
+ }
+}
+
void MarginView::PaintMargin(Surface *surface, Sci::Line topLine, PRectangle rc, PRectangle rcMargin,
const EditModel &model, const ViewStyle &vs) {
- PRectangle rcSelMargin = rcMargin;
- rcSelMargin.right = rcMargin.left;
- if (rcSelMargin.bottom < rc.bottom)
- rcSelMargin.bottom = rc.bottom;
+ PRectangle rcOneMargin = rcMargin;
+ rcOneMargin.right = rcMargin.left;
+ if (rcOneMargin.bottom < rc.bottom)
+ rcOneMargin.bottom = rc.bottom;
const Point ptOrigin = model.GetVisibleOriginInMain();
- const Font *fontLineNumber = vs.styles[StyleLineNumber].font.get();
for (size_t margin = 0; margin < vs.ms.size(); margin++) {
if (vs.ms[margin].width > 0) {
- rcSelMargin.left = rcSelMargin.right;
- rcSelMargin.right = rcSelMargin.left + vs.ms[margin].width;
+ rcOneMargin.left = rcOneMargin.right;
+ rcOneMargin.right = rcOneMargin.left + vs.ms[margin].width;
if (vs.ms[margin].style != MarginType::Number) {
if (vs.ms[margin].ShowsFolding()) {
@@ -194,7 +436,7 @@ void MarginView::PaintMargin(Surface *surface, Sci::Line topLine, PRectangle rc,
// Ensure patterns line up when scrolling with separate margin view
// by choosing correctly aligned variant.
const bool invertPhase = static_cast<int>(ptOrigin.y) & 1;
- surface->FillRectangle(rcSelMargin,
+ surface->FillRectangle(rcOneMargin,
invertPhase ? *pixmapSelPattern : *pixmapSelPatternOffset1);
} else {
ColourRGBA colour;
@@ -212,255 +454,18 @@ void MarginView::PaintMargin(Surface *surface, Sci::Line topLine, PRectangle rc,
colour = vs.styles[StyleLineNumber].back;
break;
}
- surface->FillRectangle(rcSelMargin, colour);
+ surface->FillRectangle(rcOneMargin, colour);
}
} else {
- surface->FillRectangle(rcSelMargin, vs.styles[StyleLineNumber].back);
+ surface->FillRectangle(rcOneMargin, vs.styles[StyleLineNumber].back);
}
- const Sci::Line lineStartPaint = static_cast<Sci::Line>(rcMargin.top + ptOrigin.y) / vs.lineHeight;
- Sci::Line visibleLine = model.TopLineOfMain() + lineStartPaint;
- Sci::Position yposScreen = lineStartPaint * vs.lineHeight - static_cast<Sci::Position>(ptOrigin.y);
- // Work out whether the top line is whitespace located after a
- // lessening of fold level which implies a 'fold tail' but which should not
- // be displayed until the last of a sequence of whitespace.
- bool needWhiteClosure = false;
- if (vs.ms[margin].ShowsFolding()) {
- const FoldLevel level = model.pdoc->GetFoldLevel(model.pcs->DocFromDisplay(visibleLine));
- if (LevelIsWhitespace(level)) {
- Sci::Line lineBack = model.pcs->DocFromDisplay(visibleLine);
- FoldLevel levelPrev = level;
- while ((lineBack > 0) && LevelIsWhitespace(levelPrev)) {
- lineBack--;
- levelPrev = model.pdoc->GetFoldLevel(lineBack);
- }
- if (!LevelIsHeader(levelPrev)) {
- if (LevelNumber(level) < LevelNumber(levelPrev))
- needWhiteClosure = true;
- }
- }
- if (highlightDelimiter.isEnabled) {
- const Sci::Line lastLine = model.pcs->DocFromDisplay(topLine + model.LinesOnScreen()) + 1;
- model.pdoc->GetHighlightDelimiters(highlightDelimiter,
- model.pdoc->SciLineFromPosition(model.sel.MainCaret()), lastLine);
- }
- }
-
- // Old code does not know about new markers needed to distinguish all cases
- const MarkerOutline folderOpenMid = SubstituteMarkerIfEmpty(MarkerOutline::FolderOpenMid,
- MarkerOutline::FolderOpen, vs);
- const MarkerOutline folderEnd = SubstituteMarkerIfEmpty(MarkerOutline::FolderEnd,
- MarkerOutline::Folder, vs);
-
- while ((visibleLine < model.pcs->LinesDisplayed()) && yposScreen < rc.bottom) {
-
- PLATFORM_ASSERT(visibleLine < model.pcs->LinesDisplayed());
- const Sci::Line lineDoc = model.pcs->DocFromDisplay(visibleLine);
- PLATFORM_ASSERT(model.pcs->GetVisible(lineDoc));
- const Sci::Line firstVisibleLine = model.pcs->DisplayFromDoc(lineDoc);
- const Sci::Line lastVisibleLine = model.pcs->DisplayLastFromDoc(lineDoc);
- const bool firstSubLine = visibleLine == firstVisibleLine;
- const bool lastSubLine = visibleLine == lastVisibleLine;
-
- int marks = model.pdoc->GetMark(lineDoc);
- if (!firstSubLine)
- marks = 0;
-
- bool headWithTail = false;
-
- if (vs.ms[margin].ShowsFolding()) {
- // Decide which fold indicator should be displayed
- const FoldLevel level = model.pdoc->GetFoldLevel(lineDoc);
- const FoldLevel levelNext = model.pdoc->GetFoldLevel(lineDoc + 1);
- const FoldLevel levelNum = LevelNumberPart(level);
- const FoldLevel levelNextNum = LevelNumberPart(levelNext);
- if (LevelIsHeader(level)) {
- if (firstSubLine) {
- if (levelNum < levelNextNum) {
- if (model.pcs->GetExpanded(lineDoc)) {
- if (levelNum == FoldLevel::Base)
- marks |= 1 << MarkerOutline::FolderOpen;
- else
- marks |= 1 << folderOpenMid;
- } else {
- if (levelNum == FoldLevel::Base)
- marks |= 1 << MarkerOutline::Folder;
- else
- marks |= 1 << folderEnd;
- }
- } else if (levelNum > FoldLevel::Base) {
- marks |= 1 << MarkerOutline::FolderSub;
- }
- } else {
- if (levelNum < levelNextNum) {
- if (model.pcs->GetExpanded(lineDoc)) {
- marks |= 1 << MarkerOutline::FolderSub;
- } else if (levelNum > FoldLevel::Base) {
- marks |= 1 << MarkerOutline::FolderSub;
- }
- } else if (levelNum > FoldLevel::Base) {
- marks |= 1 << MarkerOutline::FolderSub;
- }
- }
- needWhiteClosure = false;
- const Sci::Line firstFollowupLine = model.pcs->DocFromDisplay(model.pcs->DisplayFromDoc(lineDoc + 1));
- const FoldLevel firstFollowupLineLevel = model.pdoc->GetFoldLevel(firstFollowupLine);
- const FoldLevel secondFollowupLineLevelNum = LevelNumberPart(model.pdoc->GetFoldLevel(firstFollowupLine + 1));
- if (!model.pcs->GetExpanded(lineDoc)) {
- if (LevelIsWhitespace(firstFollowupLineLevel) &&
- (levelNum > secondFollowupLineLevelNum))
- needWhiteClosure = true;
-
- if (highlightDelimiter.IsFoldBlockHighlighted(firstFollowupLine))
- headWithTail = true;
- }
- } else if (LevelIsWhitespace(level)) {
- if (needWhiteClosure) {
- if (LevelIsWhitespace(levelNext)) {
- marks |= 1 << MarkerOutline::FolderSub;
- } else if (levelNextNum > FoldLevel::Base) {
- marks |= 1 << MarkerOutline::FolderMidTail;
- needWhiteClosure = false;
- } else {
- marks |= 1 << MarkerOutline::FolderTail;
- needWhiteClosure = false;
- }
- } else if (levelNum > FoldLevel::Base) {
- if (levelNextNum < levelNum) {
- if (levelNextNum > FoldLevel::Base) {
- marks |= 1 << MarkerOutline::FolderMidTail;
- } else {
- marks |= 1 << MarkerOutline::FolderTail;
- }
- } else {
- marks |= 1 << MarkerOutline::FolderSub;
- }
- }
- } else if (levelNum > FoldLevel::Base) {
- if (levelNextNum < levelNum) {
- needWhiteClosure = false;
- if (LevelIsWhitespace(levelNext)) {
- marks |= 1 << MarkerOutline::FolderSub;
- needWhiteClosure = true;
- } else if (lastSubLine) {
- if (levelNextNum > FoldLevel::Base) {
- marks |= 1 << MarkerOutline::FolderMidTail;
- } else {
- marks |= 1 << MarkerOutline::FolderTail;
- }
- } else {
- marks |= 1 << MarkerOutline::FolderSub;
- }
- } else {
- marks |= 1 << MarkerOutline::FolderSub;
- }
- }
- }
-
- marks &= vs.ms[margin].mask;
-
- const PRectangle rcMarker(
- rcSelMargin.left,
- static_cast<XYPOSITION>(yposScreen),
- rcSelMargin.right,
- static_cast<XYPOSITION>(yposScreen + vs.lineHeight));
- if (vs.ms[margin].style == MarginType::Number) {
- if (firstSubLine) {
- std::string sNumber;
- if (lineDoc >= 0) {
- sNumber = std::to_string(lineDoc + 1);
- }
- if (FlagSet(model.foldFlags, (FoldFlag::LevelNumbers | FoldFlag::LineState))) {
- char number[100] = "";
- if (FlagSet(model.foldFlags, FoldFlag::LevelNumbers)) {
- const FoldLevel lev = model.pdoc->GetFoldLevel(lineDoc);
- sprintf(number, "%c%c %03X %03X",
- LevelIsHeader(lev) ? 'H' : '_',
- LevelIsWhitespace(lev) ? 'W' : '_',
- LevelNumber(lev),
- static_cast<int>(lev) >> 16
- );
- } else {
- const int state = model.pdoc->GetLineState(lineDoc);
- sprintf(number, "%0X", state);
- }
- sNumber = number;
- }
- PRectangle rcNumber = rcMarker;
- // Right justify
- const XYPOSITION width = surface->WidthText(fontLineNumber, sNumber);
- const XYPOSITION xpos = rcNumber.right - width - vs.marginNumberPadding;
- rcNumber.left = xpos;
- DrawTextNoClipPhase(surface, rcNumber, vs.styles[StyleLineNumber],
- rcNumber.top + vs.maxAscent, sNumber, DrawPhase::all);
- } else if (FlagSet(vs.wrap.visualFlags, WrapVisualFlag::Margin)) {
- PRectangle rcWrapMarker = rcMarker;
- rcWrapMarker.right -= wrapMarkerPaddingRight;
- rcWrapMarker.left = rcWrapMarker.right - vs.styles[StyleLineNumber].aveCharWidth;
- if (!customDrawWrapMarker) {
- DrawWrapMarker(surface, rcWrapMarker, false, vs.styles[StyleLineNumber].fore);
- } else {
- customDrawWrapMarker(surface, rcWrapMarker, false, vs.styles[StyleLineNumber].fore);
- }
- }
- } else if (vs.ms[margin].style == MarginType::Text || vs.ms[margin].style == MarginType::RText) {
- const StyledText stMargin = model.pdoc->MarginStyledText(lineDoc);
- if (stMargin.text && ValidStyledText(vs, vs.marginStyleOffset, stMargin)) {
- if (firstSubLine) {
- surface->FillRectangle(rcMarker,
- vs.styles[stMargin.StyleAt(0) + vs.marginStyleOffset].back);
- PRectangle rcText = rcMarker;
- if (vs.ms[margin].style == MarginType::RText) {
- const int width = WidestLineWidth(surface, vs, vs.marginStyleOffset, stMargin);
- rcText.left = rcText.right - width - 3;
- }
- DrawStyledText(surface, vs, vs.marginStyleOffset, rcText,
- stMargin, 0, stMargin.length, DrawPhase::all);
- } else {
- // if we're displaying annotation lines, colour the margin to match the associated document line
- const int annotationLines = model.pdoc->AnnotationLines(lineDoc);
- if (annotationLines && (visibleLine > lastVisibleLine - annotationLines)) {
- surface->FillRectangle(rcMarker, vs.styles[stMargin.StyleAt(0) + vs.marginStyleOffset].back);
- }
- }
- }
- }
-
- if (marks) {
- for (int markBit = 0; (markBit < 32) && marks; markBit++) {
- if (marks & 1) {
- LineMarker::FoldPart part = LineMarker::FoldPart::undefined;
- if (vs.ms[margin].ShowsFolding() && highlightDelimiter.IsFoldBlockHighlighted(lineDoc)) {
- if (highlightDelimiter.IsBodyOfFoldBlock(lineDoc)) {
- part = LineMarker::FoldPart::body;
- } else if (highlightDelimiter.IsHeadOfFoldBlock(lineDoc)) {
- if (firstSubLine) {
- part = headWithTail ? LineMarker::FoldPart::headWithTail : LineMarker::FoldPart::head;
- } else {
- if (model.pcs->GetExpanded(lineDoc) || headWithTail) {
- part = LineMarker::FoldPart::body;
- } else {
- part = LineMarker::FoldPart::undefined;
- }
- }
- } else if (highlightDelimiter.IsTailOfFoldBlock(lineDoc)) {
- part = LineMarker::FoldPart::tail;
- }
- }
- vs.markers[markBit].Draw(surface, rcMarker, fontLineNumber, part, vs.ms[margin].style);
- }
- marks >>= 1;
- }
- }
-
- visibleLine++;
- yposScreen += vs.lineHeight;
- }
+ PaintOneMargin(surface, topLine, rc, rcOneMargin, margin, model, vs);
}
}
PRectangle rcBlankMargin = rcMargin;
- rcBlankMargin.left = rcSelMargin.right;
+ rcBlankMargin.left = rcOneMargin.right;
surface->FillRectangle(rcBlankMargin, vs.styles[StyleDefault].back);
}
diff --git a/src/MarginView.h b/src/MarginView.h
index f73a18858..6088ed3d6 100644
--- a/src/MarginView.h
+++ b/src/MarginView.h
@@ -36,6 +36,8 @@ public:
void DropGraphics() noexcept;
void RefreshPixMaps(Surface *surfaceWindow, const ViewStyle &vsDraw);
+ void PaintOneMargin(Surface *surface, Sci::Line topLine, PRectangle rc, PRectangle rcMargin, size_t margin,
+ const EditModel &model, const ViewStyle &vs);
void PaintMargin(Surface *surface, Sci::Line topLine, PRectangle rc, PRectangle rcMargin,
const EditModel &model, const ViewStyle &vs);
};