| /* |
| * Copyright 2022 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #ifndef SkottieTextEditor_DEFINED |
| #define SkottieTextEditor_DEFINED |
| |
| #include "include/core/SkPath.h" |
| #include "modules/skottie/include/SkottieProperty.h" |
| #include "tools/skui/InputState.h" |
| #include "tools/skui/ModifierKey.h" |
| |
| #include <chrono> |
| |
| // A sample WYSIWYG text editor built using the GlyphDecorator API. |
| class SkottieTextEditor final : public skottie::GlyphDecorator { |
| public: |
| explicit SkottieTextEditor(std::unique_ptr<skottie::TextPropertyHandle>&&, |
| std::vector<std::unique_ptr<skottie::TextPropertyHandle>>&&); |
| ~SkottieTextEditor() override; |
| |
| void toggleEnabled(); |
| |
| void onDecorate(SkCanvas*, const TextInfo&) override; |
| |
| bool onMouseInput(SkScalar x, SkScalar y, skui::InputState state, skui::ModifierKey); |
| |
| bool onCharInput(SkUnichar c); |
| |
| private: |
| struct GlyphData { |
| SkRect fDevBounds; // Glyph bounds mapped to device space. |
| size_t fCluster; // UTF8 cluster index. |
| }; |
| |
| std::tuple<size_t, size_t> currentSelection() const; |
| size_t closestGlyph(const SkPoint& pt) const; |
| void drawCursor(SkCanvas*, const TextInfo&) const; |
| void insertChar(SkUnichar c); |
| void deleteChars(size_t offset, size_t count); |
| bool deleteSelection(); |
| void updateDeps(const SkString&); |
| |
| const std::unique_ptr<skottie::TextPropertyHandle> fTextProp; |
| const std::vector<std::unique_ptr<skottie::TextPropertyHandle>> fDependentProps; |
| const SkPath fCursorPath; |
| const SkRect fCursorBounds; |
| |
| std::vector<GlyphData> fGlyphData; |
| std::tuple<size_t, size_t> fSelection = {0,0}; // Indices in the glyphs domain. |
| size_t fCursorIndex = 0; // Index in the UTF8 domain. |
| bool fEnabled = false; |
| bool fMouseDown = false; |
| |
| std::chrono::time_point<std::chrono::steady_clock> fTimeBase; |
| }; |
| |
| #endif // SkottieTextEditor_DEFINED |