diff options
| author | Neil <nyamatongwe@gmail.com> | 2022-07-22 20:32:53 +1000 | 
|---|---|---|
| committer | Neil <nyamatongwe@gmail.com> | 2022-07-22 20:32:53 +1000 | 
| commit | 6d53881b6c21e7824ba3c83ac175bb233f8ff2a8 (patch) | |
| tree | d526fa4e7f5539d5abdeafe7a9af7820778af36c | |
| parent | e12f8f179666ed70d03c99039565ba63c45f7c7a (diff) | |
| download | scintilla-mirror-6d53881b6c21e7824ba3c83ac175bb233f8ff2a8.tar.gz | |
Move EditView::hideSelection to (inverted) SelectionAppearance::visible so that
it can differ between screen and print.
Add GetSelectionHidden to allow testing of HideSelection.
| -rw-r--r-- | call/ScintillaCall.cxx | 4 | ||||
| -rw-r--r-- | doc/ScintillaDoc.html | 10 | ||||
| -rw-r--r-- | include/Scintilla.h | 1 | ||||
| -rw-r--r-- | include/Scintilla.iface | 3 | ||||
| -rw-r--r-- | include/ScintillaCall.h | 1 | ||||
| -rw-r--r-- | include/ScintillaMessages.h | 1 | ||||
| -rw-r--r-- | src/EditView.cxx | 21 | ||||
| -rw-r--r-- | src/EditView.h | 1 | ||||
| -rw-r--r-- | src/Editor.cxx | 6 | ||||
| -rw-r--r-- | src/ViewStyle.h | 2 | ||||
| -rw-r--r-- | test/simpleTests.py | 7 | 
11 files changed, 40 insertions, 17 deletions
| diff --git a/call/ScintillaCall.cxx b/call/ScintillaCall.cxx index 20fb452da..e142af79d 100644 --- a/call/ScintillaCall.cxx +++ b/call/ScintillaCall.cxx @@ -1215,6 +1215,10 @@ void ScintillaCall::HideSelection(bool hide) {  	Call(Message::HideSelection, hide);  } +bool ScintillaCall::SelectionHidden() { +	return Call(Message::GetSelectionHidden); +} +  int ScintillaCall::PointXFromPosition(Position pos) {  	return static_cast<int>(Call(Message::PointXFromPosition, 0, pos));  } diff --git a/doc/ScintillaDoc.html b/doc/ScintillaDoc.html index b1d2b5e09..503984654 100644 --- a/doc/ScintillaDoc.html +++ b/doc/ScintillaDoc.html @@ -129,7 +129,7 @@      <h1>Scintilla Documentation</h1> -    <p>Last edited 15 May 2022 NH</p> +    <p>Last edited 18 July 2022 NH</p>      <p style="background:#90F0C0">Scintilla 5 has moved the lexers from Scintilla into a new      <a href="Lexilla.html">Lexilla</a> project.<br /> @@ -1382,6 +1382,7 @@ struct Sci_TextToFindFull {       <a class="message" href="#SCI_POINTXFROMPOSITION">SCI_POINTXFROMPOSITION(<unused>, position pos) → int</a><br />       <a class="message" href="#SCI_POINTYFROMPOSITION">SCI_POINTYFROMPOSITION(<unused>, position pos) → int</a><br />       <a class="message" href="#SCI_HIDESELECTION">SCI_HIDESELECTION(bool hide)</a><br /> +     <a class="message" href="#SCI_GETSELECTIONHIDDEN">SCI_GETSELECTIONHIDDEN → bool</a><br />       <a class="message" href="#SCI_GETSELTEXT">SCI_GETSELTEXT(<unused>, char *text) → position</a><br />       <a class="message" href="#SCI_GETCURLINE">SCI_GETCURLINE(position length, char *text) → position</a><br />       <a class="message" href="#SCI_SELECTIONISRECTANGLE">SCI_SELECTIONISRECTANGLE → bool</a><br /> @@ -1651,10 +1652,11 @@ struct Sci_TextToFindFull {      in the document.</p>      <p><b id="SCI_HIDESELECTION">SCI_HIDESELECTION(bool hide)</b><br /> +     <b id="SCI_GETSELECTIONHIDDEN">SCI_GETSELECTIONHIDDEN → bool</b><br />       The normal state is to make the selection visible by drawing it as set by <a class="message" -    href="#SCI_SETSELFORE"><code>SCI_SETSELFORE</code></a> and <a class="message" -    href="#SCI_SETSELBACK"><code>SCI_SETSELBACK</code></a>. However, if you hide the selection, it -    is drawn as normal text.</p> +    href="#SCI_SETSELFORE"><code>SCI_SETSELFORE</code></a>, <a class="message" +    href="#SCI_SETSELBACK"><code>SCI_SETSELBACK</code></a>, and related calls. +    However, if you hide the selection, it is drawn as normal text.</p>      <p><b id="SCI_CHOOSECARETX">SCI_CHOOSECARETX</b><br />       Scintilla remembers the x value of the last position horizontally moved to explicitly by the diff --git a/include/Scintilla.h b/include/Scintilla.h index 0a5c46933..c65cb87a3 100644 --- a/include/Scintilla.h +++ b/include/Scintilla.h @@ -491,6 +491,7 @@ typedef sptr_t (*SciFnDirectStatus)(sptr_t ptr, unsigned int iMessage, uptr_t wP  #define SCI_GETTEXTRANGE 2162  #define SCI_GETTEXTRANGEFULL 2039  #define SCI_HIDESELECTION 2163 +#define SCI_GETSELECTIONHIDDEN 2088  #define SCI_POINTXFROMPOSITION 2164  #define SCI_POINTYFROMPOSITION 2165  #define SCI_LINEFROMPOSITION 2166 diff --git a/include/Scintilla.iface b/include/Scintilla.iface index be3d78692..bfa7f5e93 100644 --- a/include/Scintilla.iface +++ b/include/Scintilla.iface @@ -1271,6 +1271,9 @@ fun position GetTextRangeFull=2039(, textrangefull tr)  # Draw the selection either highlighted or in normal (non-highlighted) style.  fun void HideSelection=2163(bool hide,) +#Is the selection visible or hidden? +get bool GetSelectionHidden=2088(,) +  # Retrieve the x value of the point in the window where a position is displayed.  fun int PointXFromPosition=2164(, position pos) diff --git a/include/ScintillaCall.h b/include/ScintillaCall.h index 40cf1e576..549c372b5 100644 --- a/include/ScintillaCall.h +++ b/include/ScintillaCall.h @@ -342,6 +342,7 @@ public:  	Position GetTextRange(void *tr);  	Position GetTextRangeFull(void *tr);  	void HideSelection(bool hide); +	bool SelectionHidden();  	int PointXFromPosition(Position pos);  	int PointYFromPosition(Position pos);  	Line LineFromPosition(Position pos); diff --git a/include/ScintillaMessages.h b/include/ScintillaMessages.h index 3b2927472..d114db78d 100644 --- a/include/ScintillaMessages.h +++ b/include/ScintillaMessages.h @@ -275,6 +275,7 @@ enum class Message {  	GetTextRange = 2162,  	GetTextRangeFull = 2039,  	HideSelection = 2163, +	GetSelectionHidden = 2088,  	PointXFromPosition = 2164,  	PointYFromPosition = 2165,  	LineFromPosition = 2166, diff --git a/src/EditView.cxx b/src/EditView.cxx index bb519350f..554582bcb 100644 --- a/src/EditView.cxx +++ b/src/EditView.cxx @@ -185,7 +185,6 @@ void Hexits(char *hexits, int ch) noexcept {  EditView::EditView() {  	tabWidthMinimumPixels = 2; // needed for calculating tab stops for fractional proportional fonts -	hideSelection = false;  	drawOverstrikeCaret = true;  	bufferedDraw = true;  	phasesDraw = PhasesDraw::Two; @@ -1076,7 +1075,7 @@ void EditView::DrawEOL(Surface *surface, const EditModel &model, const ViewStyle  		rcSegment.right = xEol + xStart + virtualSpace;  		const ColourRGBA backgroundFill = background.value_or(vsDraw.styles[ll->styles[ll->numCharsInLine]].back);  		surface->FillRectangleAligned(rcSegment, backgroundFill); -		if (!hideSelection && (vsDraw.selection.layer == Layer::Base)) { +		if (vsDraw.selection.visible && (vsDraw.selection.layer == Layer::Base)) {  			const SelectionSegment virtualSpaceRange(SelectionPosition(model.pdoc->LineEnd(line)),  				SelectionPosition(model.pdoc->LineEnd(line),  					model.sel.VirtualSpaceFor(model.pdoc->LineEnd(line)))); @@ -1098,7 +1097,7 @@ void EditView::DrawEOL(Surface *surface, const EditModel &model, const ViewStyle  	}  	InSelection eolInSelection = InSelection::inNone; -	if (!hideSelection && lastSubLine) { +	if (vsDraw.selection.visible && lastSubLine) {  		eolInSelection = model.LineEndInSelection(line);  	} @@ -1354,7 +1353,7 @@ void EditView::DrawFoldDisplayText(Surface *surface, const EditModel &model, con  	const int widthFoldDisplayText = static_cast<int>(surface->WidthText(fontText, foldDisplayText));  	InSelection eolInSelection = InSelection::inNone; -	if (!hideSelection) { +	if (vsDraw.selection.visible) {  		eolInSelection = model.LineEndInSelection(line);  	} @@ -1684,7 +1683,7 @@ void EditView::DrawCarets(Surface *surface, const EditModel &model, const ViewSt  	Sci::Line lineDoc, int xStart, PRectangle rcLine, int subLine) const {  	// When drag is active it is the only caret drawn  	const bool drawDrag = model.posDrag.IsValid(); -	if (hideSelection && !drawDrag) +	if (!vsDraw.selection.visible && !drawDrag)  		return;  	const Sci::Position posLineStart = model.pdoc->LineStart(lineDoc);  	// For each selection draw @@ -1870,7 +1869,7 @@ void EditView::DrawBackground(Surface *surface, const EditModel &model, const Vi  			if (rcSegment.right > rcLine.right)  				rcSegment.right = rcLine.right; -			InSelection inSelection = hideSelection ? InSelection::inNone : model.sel.CharacterInSelection(iDoc); +			InSelection inSelection = vsDraw.selection.visible ? model.sel.CharacterInSelection(iDoc) : InSelection::inNone;  			if (FlagSet(vsDraw.caret.style, CaretStyle::Curses) && (inSelection == InSelection::inMain))  				inSelection = CharacterInCursesSelection(iDoc, model, vsDraw);  			const bool inHotspot = model.hotspot.Valid() && model.hotspot.ContainsCharacter(iDoc); @@ -2119,7 +2118,7 @@ void EditView::DrawForeground(Surface *surface, const EditModel &model, const Vi  					}  				}  			} -			InSelection inSelection = hideSelection ? InSelection::inNone : model.sel.CharacterInSelection(iDoc); +			InSelection inSelection = vsDraw.selection.visible ? model.sel.CharacterInSelection(iDoc) : InSelection::inNone;  			if (FlagSet(vsDraw.caret.style, CaretStyle::Curses) && (inSelection == InSelection::inMain))  				inSelection = CharacterInCursesSelection(iDoc, model, vsDraw);  			const std::optional<ColourRGBA> selectionFore = SelectionForeground(model, vsDraw, inSelection); @@ -2357,7 +2356,7 @@ void EditView::DrawLine(Surface *surface, const EditModel &model, const ViewStyl  	}  	if (FlagSet(phase, DrawPhase::text)) { -		if (!hideSelection) { +		if (vsDraw.selection.visible) {  			DrawTranslucentSelection(surface, model, vsDraw, ll, line, rcLine, subLine, lineRange, xStart, tabWidthMinimumPixels, Layer::UnderText);  		}  		DrawTranslucentLineState(surface, model, vsDraw, ll, line, rcLine, subLine, Layer::UnderText); @@ -2386,7 +2385,7 @@ void EditView::DrawLine(Surface *surface, const EditModel &model, const ViewStyl  		DrawMarkUnderline(surface, model, vsDraw, line, rcLine);  	} -	if (!hideSelection && FlagSet(phase, DrawPhase::selectionTranslucent)) { +	if (vsDraw.selection.visible && FlagSet(phase, DrawPhase::selectionTranslucent)) {  		DrawTranslucentSelection(surface, model, vsDraw, ll, line, rcLine, subLine, lineRange, xStart, tabWidthMinimumPixels, Layer::OverText);  	} @@ -2523,7 +2522,7 @@ void EditView::PaintText(Surface *surfaceWindow, const EditModel &model, PRectan  				durLayout += ep.Duration(true);  #endif  				if (ll) { -					ll->containsCaret = !hideSelection && (lineDoc == lineCaret) +					ll->containsCaret = vsDraw.selection.visible && (lineDoc == lineCaret)  						&& (ll->lines == 1 || !vsDraw.caretLine.subLine || ll->InLine(caretOffset, subLine));  					PRectangle rcLine = rcTextArea; @@ -2633,7 +2632,7 @@ void EditView::PaintText(Surface *surfaceWindow, const EditModel &model, PRectan  void EditView::FillLineRemainder(Surface *surface, const EditModel &model, const ViewStyle &vsDraw, const LineLayout *ll,  	Sci::Line line, PRectangle rcArea, int subLine) const {  		InSelection eolInSelection = InSelection::inNone; -	if ((!hideSelection) && (subLine == (ll->lines - 1))) { +	if (vsDraw.selection.visible && (subLine == (ll->lines - 1))) {  		eolInSelection = model.LineEndInSelection(line);  	} diff --git a/src/EditView.h b/src/EditView.h index d65bf0736..832da9f15 100644 --- a/src/EditView.h +++ b/src/EditView.h @@ -56,7 +56,6 @@ public:  	std::unique_ptr<LineTabstops> ldTabstops;  	int tabWidthMinimumPixels; -	bool hideSelection;  	bool drawOverstrikeCaret; // used by the curses platform  	/** In bufferedDraw mode, graphics operations are drawn to a pixmap and then copied to diff --git a/src/Editor.cxx b/src/Editor.cxx index f99914ebd..5b0486be0 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -6322,10 +6322,14 @@ sptr_t Editor::WndProc(Message iMessage, uptr_t wParam, sptr_t lParam) {  		}  	case Message::HideSelection: -		view.hideSelection = wParam != 0; +		vs.selection.visible = wParam == 0;  		Redraw();  		break; +	case Message::GetSelectionHidden: +		return !vs.selection.visible; +		break; +  	case Message::FormatRange:  	case Message::FormatRangeFull:  		return FormatRange(iMessage, wParam, lParam); diff --git a/src/ViewStyle.h b/src/ViewStyle.h index ce6bd5642..c5ee232c3 100644 --- a/src/ViewStyle.h +++ b/src/ViewStyle.h @@ -46,6 +46,8 @@ inline std::optional<ColourRGBA> OptionalColour(Scintilla::uptr_t wParam, Scinti  }  struct SelectionAppearance { +	// Is the selection visible? +	bool visible = true;  	// Whether to draw on base layer or over text  	Scintilla::Layer layer = Layer::Base;  	// Draw selection past line end characters up to right border diff --git a/test/simpleTests.py b/test/simpleTests.py index 195479eaa..3ea186cf9 100644 --- a/test/simpleTests.py +++ b/test/simpleTests.py @@ -2201,6 +2201,13 @@ class TestElements(unittest.TestCase):  		self.ed.ResetElementColour(self.ed.SC_ELEMENT_HOT_SPOT_ACTIVE)  		self.ed.ResetElementColour(self.ed.SC_ELEMENT_HOT_SPOT_ACTIVE_BACK) +	def testHideSelection(self): +		self.assertEquals(self.ed.SelectionHidden, False) +		self.ed.HideSelection(True) +		self.assertEquals(self.ed.SelectionHidden, True) +		self.ed.HideSelection(False)	# Restore +		self.assertEquals(self.ed.SelectionHidden, False) +		  class TestIndices(unittest.TestCase):  	def setUp(self):  		self.xite = Xite.xiteFrame | 
