diff options
author | Zufu Liu <unknown> | 2019-02-05 09:02:14 +1100 |
---|---|---|
committer | Zufu Liu <unknown> | 2019-02-05 09:02:14 +1100 |
commit | 08b7ba9c6804232efe62a7cb970013548318417f (patch) | |
tree | a4f25d217cf3fd462b862514991b6b0f130f6c86 /src | |
parent | 9cc096e3f7deb6f10512e30da3e589eed927fdd5 (diff) | |
download | scintilla-mirror-08b7ba9c6804232efe62a7cb970013548318417f.tar.gz |
Backport: Feature [feature-requests:#1217]. Change API so block just for overstrike.
Backport of changeset 7249:06b6a93d8e3f.
Diffstat (limited to 'src')
-rw-r--r-- | src/EditView.cxx | 11 | ||||
-rw-r--r-- | src/Editor.cxx | 4 | ||||
-rw-r--r-- | src/ViewStyle.cxx | 13 | ||||
-rw-r--r-- | src/ViewStyle.h | 4 |
4 files changed, 25 insertions, 7 deletions
diff --git a/src/EditView.cxx b/src/EditView.cxx index 8eaaee32c..31885ba62 100644 --- a/src/EditView.cxx +++ b/src/EditView.cxx @@ -1331,7 +1331,7 @@ void EditView::DrawCarets(Surface *surface, const EditModel &model, const ViewSt for (size_t r = 0; (r<model.sel.Count()) || drawDrag; r++) { const bool mainCaret = r == model.sel.Main(); SelectionPosition posCaret = (drawDrag ? model.posDrag : model.sel.Range(r).caret); - if ((vsDraw.caretStyle == CARETSTYLE_BLOCK || vsDraw.caretStyle == CARETSTYLE_BLOCK_ALWAYS) && !drawDrag && posCaret > model.sel.Range(r).anchor) { + if ((vsDraw.IsBlockCaretStyle() || imeCaretBlockOverride) && !drawDrag && posCaret > model.sel.Range(r).anchor) { if (posCaret.VirtualSpace() > 0) posCaret.SetVirtualSpace(posCaret.VirtualSpace() - 1); else @@ -1350,7 +1350,7 @@ void EditView::DrawCarets(Surface *surface, const EditModel &model, const ViewSt const bool caretBlinkState = (model.caret.active && model.caret.on) || (!additionalCaretsBlink && !mainCaret); const bool caretVisibleState = additionalCaretsVisible || mainCaret; if ((xposCaret >= 0) && (vsDraw.caretWidth > 0) && (vsDraw.caretStyle != CARETSTYLE_INVISIBLE) && - ((model.posDrag.IsValid()) || (caretBlinkState && caretVisibleState))) { + (drawDrag || (caretBlinkState && caretVisibleState))) { bool caretAtEOF = false; bool caretAtEOL = false; bool drawBlockCaret = false; @@ -1374,16 +1374,17 @@ void EditView::DrawCarets(Surface *surface, const EditModel &model, const ViewSt if (xposCaret > 0) caretWidthOffset = 0.51f; // Move back so overlaps both character cells. xposCaret += xStart; - if (model.posDrag.IsValid()) { + const ViewStyle::CaretShape caretShape = drawDrag ? ViewStyle::CaretShape::line : vsDraw.CaretShapeForMode(model.inOverstrike); + if (drawDrag) { /* Dragging text, use a line caret */ rcCaret.left = round(xposCaret - caretWidthOffset); rcCaret.right = rcCaret.left + vsDraw.caretWidth; - } else if ((model.inOverstrike && vsDraw.caretStyle != CARETSTYLE_BLOCK_ALWAYS) && drawOverstrikeCaret) { + } else if ((caretShape == ViewStyle::CaretShape::bar) && drawOverstrikeCaret) { /* Overstrike (insert mode), use a modified bar caret */ rcCaret.top = rcCaret.bottom - 2; rcCaret.left = xposCaret + 1; rcCaret.right = rcCaret.left + widthOverstrikeCaret - 1; - } else if ((vsDraw.caretStyle == CARETSTYLE_BLOCK || vsDraw.caretStyle == CARETSTYLE_BLOCK_ALWAYS) || imeCaretBlockOverride) { + } else if ((caretShape == ViewStyle::CaretShape::block) || imeCaretBlockOverride) { /* Block caret */ rcCaret.left = xposCaret; if (!caretAtEOL && !caretAtEOF && (ll->chars[offset] != '\t') && !(IsControlCharacter(ll->chars[offset]))) { diff --git a/src/Editor.cxx b/src/Editor.cxx index f48ba333b..e6a1637f9 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -1351,7 +1351,7 @@ Editor::XYScrollPosition Editor::XYScrollToMakeVisible(const SelectionRange &ran newXY.xOffset = static_cast<int>(pt.x + xOffset - rcClient.left) - 2; } else if (pt.x + xOffset >= rcClient.right + newXY.xOffset) { newXY.xOffset = static_cast<int>(pt.x + xOffset - rcClient.right) + 2; - if ((vs.caretStyle == CARETSTYLE_BLOCK || vs.caretStyle == CARETSTYLE_BLOCK_ALWAYS) || view.imeCaretBlockOverride) { + if (vs.IsBlockCaretStyle() || view.imeCaretBlockOverride) { // Ensure we can see a good portion of the block caret newXY.xOffset += static_cast<int>(vs.aveCharWidth); } @@ -7277,7 +7277,7 @@ sptr_t Editor::WndProc(unsigned int iMessage, uptr_t wParam, sptr_t lParam) { return vs.caretcolour.AsInteger(); case SCI_SETCARETSTYLE: - if (wParam <= CARETSTYLE_BLOCK_ALWAYS) + if (wParam <= (CARETSTYLE_BLOCK | CARETSTYLE_OVERSTRIKE_BLOCK)) vs.caretStyle = static_cast<int>(wParam); else /* Default to the line caret */ diff --git a/src/ViewStyle.cxx b/src/ViewStyle.cxx index 016855615..54f20de4b 100644 --- a/src/ViewStyle.cxx +++ b/src/ViewStyle.cxx @@ -571,6 +571,19 @@ bool ViewStyle::SetWrapIndentMode(int wrapIndentMode_) { return changed; } +bool ViewStyle::IsBlockCaretStyle() const noexcept { + return (caretStyle == CARETSTYLE_BLOCK) || (caretStyle & CARETSTYLE_OVERSTRIKE_BLOCK) != 0; +} + +ViewStyle::CaretShape ViewStyle::CaretShapeForMode(bool inOverstrike) const noexcept { + if (inOverstrike) { + return (caretStyle & CARETSTYLE_OVERSTRIKE_BLOCK) ? CaretShape::block : CaretShape::bar; + } + + const int caret = caretStyle & CARETSTYLE_INS_MASK; + return (caret <= CARETSTYLE_BLOCK) ? static_cast<CaretShape>(caret) : CaretShape::line; +} + void ViewStyle::AllocStyles(size_t sizeNew) { size_t i=styles.size(); styles.resize(sizeNew); diff --git a/src/ViewStyle.h b/src/ViewStyle.h index 800d8cb67..4ef82c393 100644 --- a/src/ViewStyle.h +++ b/src/ViewStyle.h @@ -212,6 +212,10 @@ public: bool WhiteSpaceVisible(bool inIndent) const; + enum class CaretShape { invisible, line, block, bar }; + bool IsBlockCaretStyle() const noexcept; + CaretShape CaretShapeForMode(bool inOverstrike) const noexcept; + private: void AllocStyles(size_t sizeNew); void CreateAndAddFont(const FontSpecification &fs); |