experimental/editor: scroll on cursor movement, Editor::getLocation
Bug: skia:9020 Change-Id: Iab91402790077c969af8e553b03525e63dab44ba Reviewed-on: https://skia-review.googlesource.com/c/skia/+/230496 Auto-Submit: Hal Canary <halcanary@google.com> Commit-Queue: Ben Wagner <bungeman@google.com> Reviewed-by: Ben Wagner <bungeman@google.com>
This commit is contained in:
parent
eecc687376
commit
9ef1b771af
@ -16,6 +16,11 @@
|
|||||||
|
|
||||||
using namespace editor;
|
using namespace editor;
|
||||||
|
|
||||||
|
static inline SkRect offset(SkRect r, SkIPoint p) {
|
||||||
|
r.offset((float)p.x(), (float)p.y());
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
static constexpr SkRect kUnsetRect{-FLT_MAX, -FLT_MAX, -FLT_MAX, -FLT_MAX};
|
static constexpr SkRect kUnsetRect{-FLT_MAX, -FLT_MAX, -FLT_MAX, -FLT_MAX};
|
||||||
|
|
||||||
static SkRect selection_box(const SkFontMetrics& metrics,
|
static SkRect selection_box(const SkFontMetrics& metrics,
|
||||||
@ -237,6 +242,21 @@ static const char* prev_utf8(const char* p, const char* begin) {
|
|||||||
return p > begin ? align_utf8(p - 1, begin) : begin;
|
return p > begin ? align_utf8(p - 1, begin) : begin;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SkRect Editor::getLocation(Editor::TextPosition cursor) {
|
||||||
|
this->reshapeAll();
|
||||||
|
if (fLines.size() > 0) {
|
||||||
|
const TextLine& cLine = fLines[cursor.fParagraphIndex];
|
||||||
|
SkRect pos = fSpaceBounds;
|
||||||
|
if (cursor.fTextByteIndex < cLine.fCursorPos.size()) {
|
||||||
|
pos = cLine.fCursorPos[cursor.fTextByteIndex];
|
||||||
|
}
|
||||||
|
pos.fRight = pos.fLeft + 1;
|
||||||
|
pos.fLeft -= 1;
|
||||||
|
return offset(pos, cLine.fOrigin);
|
||||||
|
}
|
||||||
|
return SkRect{0, 0, 0, 0};
|
||||||
|
}
|
||||||
|
|
||||||
static size_t count_char(const StringSlice& string, char value) {
|
static size_t count_char(const StringSlice& string, char value) {
|
||||||
size_t count = 0;
|
size_t count = 0;
|
||||||
for (char c : string) { if (c == value) { ++count; } }
|
for (char c : string) { if (c == value) { ++count; } }
|
||||||
@ -456,11 +476,6 @@ Editor::TextPosition Editor::move(Editor::Movement move, Editor::TextPosition po
|
|||||||
return pos;
|
return pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline SkRect offset(SkRect r, SkIPoint p) {
|
|
||||||
r.offset((float)p.x(), (float)p.y());
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Editor::paint(SkCanvas* c, PaintOpts options) {
|
void Editor::paint(SkCanvas* c, PaintOpts options) {
|
||||||
this->reshapeAll();
|
this->reshapeAll();
|
||||||
if (!c) {
|
if (!c) {
|
||||||
@ -482,14 +497,7 @@ void Editor::paint(SkCanvas* c, PaintOpts options) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (fLines.size() > 0) {
|
if (fLines.size() > 0) {
|
||||||
const TextLine& cLine = fLines[options.fCursor.fParagraphIndex];
|
c->drawRect(Editor::getLocation(options.fCursor), SkPaint(options.fCursorColor));
|
||||||
SkRect pos = fSpaceBounds;
|
|
||||||
if (options.fCursor.fTextByteIndex < cLine.fCursorPos.size()) {
|
|
||||||
pos = cLine.fCursorPos[options.fCursor.fTextByteIndex];
|
|
||||||
}
|
|
||||||
pos.fRight = pos.fLeft + 1;
|
|
||||||
pos.fLeft -= 1;
|
|
||||||
c->drawRect(offset(pos, cLine.fOrigin), SkPaint(options.fCursorColor));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SkPaint foreground = SkPaint(options.fForegroundColor);
|
SkPaint foreground = SkPaint(options.fForegroundColor);
|
||||||
|
@ -72,6 +72,7 @@ public:
|
|||||||
};
|
};
|
||||||
TextPosition move(Editor::Movement move, Editor::TextPosition pos) const;
|
TextPosition move(Editor::Movement move, Editor::TextPosition pos) const;
|
||||||
TextPosition getPosition(SkIPoint);
|
TextPosition getPosition(SkIPoint);
|
||||||
|
SkRect getLocation(TextPosition);
|
||||||
// insert into current text.
|
// insert into current text.
|
||||||
TextPosition insert(TextPosition, const char* utf8Text, size_t byteLen);
|
TextPosition insert(TextPosition, const char* utf8Text, size_t byteLen);
|
||||||
// remove text between two positions
|
// remove text between two positions
|
||||||
|
@ -228,9 +228,18 @@ struct EditorLayer : public sk_app::Window::Layer {
|
|||||||
fShiftDown = shift;
|
fShiftDown = shift;
|
||||||
}
|
}
|
||||||
fTextPos = fEditor.move(m, fTextPos);
|
fTextPos = fEditor.move(m, fTextPos);
|
||||||
|
|
||||||
|
// scroll if needed.
|
||||||
|
SkIRect cursor = fEditor.getLocation(fTextPos).roundOut();
|
||||||
|
if (cursor.bottom() > fPos + fHeight) {
|
||||||
|
fPos = cursor.bottom() - fHeight + fEditor.getMargin();
|
||||||
|
} else if (cursor.top() < fPos) {
|
||||||
|
fPos = cursor.top() - fEditor.getMargin();
|
||||||
|
}
|
||||||
this->inval();
|
this->inval();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool onKey(sk_app::Window::Key key,
|
bool onKey(sk_app::Window::Key key,
|
||||||
InputState state,
|
InputState state,
|
||||||
ModifierKey modifiers) override {
|
ModifierKey modifiers) override {
|
||||||
|
Loading…
Reference in New Issue
Block a user