diff options
Diffstat (limited to 'src/EditView.cxx')
| -rw-r--r-- | src/EditView.cxx | 70 | 
1 files changed, 62 insertions, 8 deletions
| diff --git a/src/EditView.cxx b/src/EditView.cxx index fcd5c7ff2..4301836db 100644 --- a/src/EditView.cxx +++ b/src/EditView.cxx @@ -836,6 +836,37 @@ static void DrawTextBlob(Surface *surface, const ViewStyle &vsDraw, PRectangle r  		textBack, textFore);  } +static void DrawFrame(Surface *surface, ColourDesired colour, int alpha, PRectangle rcFrame) { +	if (alpha != SC_ALPHA_NOALPHA) +		surface->AlphaRectangle(rcFrame, 0, colour, alpha, colour, alpha, 0); +	else +		surface->FillRectangle(rcFrame, colour); +} + +static void DrawCaretLineFramed(Surface *surface, const ViewStyle &vsDraw, const LineLayout *ll, PRectangle rcLine, int subLine) { +	const int width = vsDraw.GetFrameWidth(); +	if (subLine == 0 || ll->wrapIndent == 0 || vsDraw.caretLineAlpha != SC_ALPHA_NOALPHA) { +		// Left +		DrawFrame(surface, vsDraw.caretLineBackground, vsDraw.caretLineAlpha, +			PRectangle(rcLine.left, rcLine.top, rcLine.left + width, rcLine.bottom)); +	} +	if (subLine == 0) { +		// Top +		DrawFrame(surface, vsDraw.caretLineBackground, vsDraw.caretLineAlpha, +			PRectangle(rcLine.left + width, rcLine.top, rcLine.right - width, rcLine.top + width)); +	} +	if (subLine == ll->lines - 1 || vsDraw.caretLineAlpha != SC_ALPHA_NOALPHA) { +		// Right +		DrawFrame(surface, vsDraw.caretLineBackground, vsDraw.caretLineAlpha, +			PRectangle(rcLine.right - width, rcLine.top, rcLine.right, rcLine.bottom)); +	} +	if (subLine == ll->lines - 1) { +		// Bottom +		DrawFrame(surface, vsDraw.caretLineBackground, vsDraw.caretLineAlpha, +			PRectangle(rcLine.left + width, rcLine.bottom - width, rcLine.right - width, rcLine.bottom)); +	} +} +  void EditView::DrawEOL(Surface *surface, const EditModel &model, const ViewStyle &vsDraw, const LineLayout *ll,  	PRectangle rcLine, Sci::Line line, Sci::Position lineEnd, int xStart, int subLine, XYACCUMULATOR subLineStart,  	ColourOptional background) { @@ -963,10 +994,16 @@ void EditView::DrawEOL(Surface *surface, const EditModel &model, const ViewStyle  	bool drawWrapMarkEnd = false; -	if (vsDraw.wrapVisualFlags & SC_WRAPVISUALFLAG_END) { -		if (subLine + 1 < ll->lines) { +	if (subLine + 1 < ll->lines) { +		if (vsDraw.wrapVisualFlags & SC_WRAPVISUALFLAG_END) {  			drawWrapMarkEnd = ll->LineStart(subLine + 1) != 0;  		} +		if (vsDraw.IsLineFrameOpaque(model.caret.active, ll->containsCaret)) { +			const int width = vsDraw.GetFrameWidth(); +			// Draw right of frame under marker +			DrawFrame(surface, vsDraw.caretLineBackground, vsDraw.caretLineAlpha, +				PRectangle(rcLine.right - width, rcLine.top, rcLine.right, rcLine.bottom)); +		}  	}  	if (drawWrapMarkEnd) { @@ -1373,11 +1410,19 @@ void EditView::DrawCarets(Surface *surface, const EditModel &model, const ViewSt  }  static void DrawWrapIndentAndMarker(Surface *surface, const ViewStyle &vsDraw, const LineLayout *ll, -	int xStart, PRectangle rcLine, ColourOptional background, DrawWrapMarkerFn customDrawWrapMarker) { +	int xStart, PRectangle rcLine, ColourOptional background, DrawWrapMarkerFn customDrawWrapMarker, +	bool caretActive) {  	// default bgnd here..  	surface->FillRectangle(rcLine, background.isSet ? background :  		vsDraw.styles[STYLE_DEFAULT].back); +	if (vsDraw.IsLineFrameOpaque(caretActive, ll->containsCaret)) { +		const int width = vsDraw.GetFrameWidth(); +		// Draw left of frame under marker +		DrawFrame(surface, vsDraw.caretLineBackground, vsDraw.caretLineAlpha, +			PRectangle(rcLine.left, rcLine.top, rcLine.left + width, rcLine.bottom)); +	} +  	if (vsDraw.wrapVisualFlags & SC_WRAPVISUALFLAG_START) {  		// draw continuation rect @@ -1551,9 +1596,14 @@ static void DrawTranslucentSelection(Surface *surface, const EditModel &model, c  // Draw any translucent whole line states  static void DrawTranslucentLineState(Surface *surface, const EditModel &model, const ViewStyle &vsDraw, const LineLayout *ll, -	Sci::Line line, PRectangle rcLine) { -	if ((model.caret.active || vsDraw.alwaysShowCaretLineBackground) && vsDraw.showCaretLineBackground && ll->containsCaret) { -		SimpleAlphaRectangle(surface, rcLine, vsDraw.caretLineBackground, vsDraw.caretLineAlpha); +	Sci::Line line, PRectangle rcLine, int subLine) { +	if ((model.caret.active || vsDraw.alwaysShowCaretLineBackground) && vsDraw.showCaretLineBackground && ll->containsCaret && +		vsDraw.caretLineAlpha != SC_ALPHA_NOALPHA) { +		if (vsDraw.caretLineFrame) { +			DrawCaretLineFramed(surface, vsDraw, ll, rcLine, subLine); +		} else { +			SimpleAlphaRectangle(surface, rcLine, vsDraw.caretLineBackground, vsDraw.caretLineAlpha); +		}  	}  	const int marksOfLine = model.pdoc->GetMark(line);  	int marksDrawnInText = marksOfLine & vsDraw.maskDrawInText; @@ -1842,7 +1892,7 @@ void EditView::DrawLine(Surface *surface, const EditModel &model, const ViewStyl  	if ((ll->wrapIndent != 0) && (subLine > 0)) {  		if (phase & drawBack) { -			DrawWrapIndentAndMarker(surface, vsDraw, ll, xStart, rcLine, background, customDrawWrapMarker); +			DrawWrapIndentAndMarker(surface, vsDraw, ll, xStart, rcLine, background, customDrawWrapMarker, model.caret.active);  		}  		xStart += static_cast<int>(ll->wrapIndent);  	} @@ -1855,6 +1905,8 @@ void EditView::DrawLine(Surface *surface, const EditModel &model, const ViewStyl  			phase = static_cast<DrawPhase>(phase & ~drawBack);	// Remove drawBack to not draw again in DrawFoldDisplayText  			DrawEOL(surface, model, vsDraw, ll, rcLine, line, lineRange.end,  				xStart, subLine, subLineStart, background); +			if (vsDraw.IsLineFrameOpaque(model.caret.active, ll->containsCaret)) +				DrawCaretLineFramed(surface, vsDraw, ll, rcLine, subLine);  		}  		if (phase & drawIndicatorsBack) { @@ -1882,6 +1934,8 @@ void EditView::DrawLine(Surface *surface, const EditModel &model, const ViewStyl  	if (phasesDraw == phasesOne) {  		DrawEOL(surface, model, vsDraw, ll, rcLine, line, lineRange.end,  			xStart, subLine, subLineStart, background); +		if (vsDraw.IsLineFrameOpaque(model.caret.active, ll->containsCaret)) +			DrawCaretLineFramed(surface, vsDraw, ll, rcLine, subLine);  		DrawEdgeLine(surface, vsDraw, ll, rcLine, lineRange, xStart);  		DrawMarkUnderline(surface, model, vsDraw, line, rcLine);  	} @@ -1891,7 +1945,7 @@ void EditView::DrawLine(Surface *surface, const EditModel &model, const ViewStyl  	}  	if (phase & drawLineTranslucent) { -		DrawTranslucentLineState(surface, model, vsDraw, ll, line, rcLine); +		DrawTranslucentLineState(surface, model, vsDraw, ll, line, rcLine, subLine);  	}  } | 
