1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2022 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #ifndef SkottieTextEditor_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define SkottieTextEditor_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPath.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkScalar.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skottie/include/SkottieProperty.h" 16*c8dee2aaSAndroid Build Coastguard Worker 17*c8dee2aaSAndroid Build Coastguard Worker #include <chrono> 18*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef> 19*c8dee2aaSAndroid Build Coastguard Worker #include <memory> 20*c8dee2aaSAndroid Build Coastguard Worker #include <tuple> 21*c8dee2aaSAndroid Build Coastguard Worker #include <vector> 22*c8dee2aaSAndroid Build Coastguard Worker 23*c8dee2aaSAndroid Build Coastguard Worker class SkCanvas; 24*c8dee2aaSAndroid Build Coastguard Worker class SkString; 25*c8dee2aaSAndroid Build Coastguard Worker struct SkPoint; 26*c8dee2aaSAndroid Build Coastguard Worker 27*c8dee2aaSAndroid Build Coastguard Worker namespace skui { 28*c8dee2aaSAndroid Build Coastguard Worker enum class InputState; 29*c8dee2aaSAndroid Build Coastguard Worker enum class ModifierKey; 30*c8dee2aaSAndroid Build Coastguard Worker } // namespace skui 31*c8dee2aaSAndroid Build Coastguard Worker 32*c8dee2aaSAndroid Build Coastguard Worker namespace skottie_utils { 33*c8dee2aaSAndroid Build Coastguard Worker 34*c8dee2aaSAndroid Build Coastguard Worker // A sample WYSIWYG text editor built using the GlyphDecorator API. 35*c8dee2aaSAndroid Build Coastguard Worker class TextEditor final : public skottie::GlyphDecorator { 36*c8dee2aaSAndroid Build Coastguard Worker public: 37*c8dee2aaSAndroid Build Coastguard Worker TextEditor(std::unique_ptr<skottie::TextPropertyHandle>&&, 38*c8dee2aaSAndroid Build Coastguard Worker std::vector<std::unique_ptr<skottie::TextPropertyHandle>>&&); 39*c8dee2aaSAndroid Build Coastguard Worker ~TextEditor() override; 40*c8dee2aaSAndroid Build Coastguard Worker 41*c8dee2aaSAndroid Build Coastguard Worker void toggleEnabled(); 42*c8dee2aaSAndroid Build Coastguard Worker void setEnabled(bool); 43*c8dee2aaSAndroid Build Coastguard Worker 44*c8dee2aaSAndroid Build Coastguard Worker void onDecorate(SkCanvas*, const TextInfo&) override; 45*c8dee2aaSAndroid Build Coastguard Worker 46*c8dee2aaSAndroid Build Coastguard Worker bool onMouseInput(SkScalar x, SkScalar y, skui::InputState state, skui::ModifierKey); 47*c8dee2aaSAndroid Build Coastguard Worker 48*c8dee2aaSAndroid Build Coastguard Worker bool onCharInput(SkUnichar c); 49*c8dee2aaSAndroid Build Coastguard Worker setCursorWeight(float w)50*c8dee2aaSAndroid Build Coastguard Worker void setCursorWeight(float w) { fCursorWeight = w; } 51*c8dee2aaSAndroid Build Coastguard Worker 52*c8dee2aaSAndroid Build Coastguard Worker private: 53*c8dee2aaSAndroid Build Coastguard Worker struct GlyphData { 54*c8dee2aaSAndroid Build Coastguard Worker SkRect fDevBounds; // Glyph bounds mapped to device space. 55*c8dee2aaSAndroid Build Coastguard Worker size_t fCluster; // UTF8 cluster index. 56*c8dee2aaSAndroid Build Coastguard Worker }; 57*c8dee2aaSAndroid Build Coastguard Worker 58*c8dee2aaSAndroid Build Coastguard Worker std::tuple<size_t, size_t> currentSelection() const; 59*c8dee2aaSAndroid Build Coastguard Worker size_t closestGlyph(const SkPoint& pt) const; 60*c8dee2aaSAndroid Build Coastguard Worker void drawCursor(SkCanvas*, const TextInfo&) const; 61*c8dee2aaSAndroid Build Coastguard Worker void insertChar(SkUnichar c); 62*c8dee2aaSAndroid Build Coastguard Worker void deleteChars(size_t offset, size_t count); 63*c8dee2aaSAndroid Build Coastguard Worker bool deleteSelection(); 64*c8dee2aaSAndroid Build Coastguard Worker void updateDeps(const SkString&); 65*c8dee2aaSAndroid Build Coastguard Worker 66*c8dee2aaSAndroid Build Coastguard Worker const std::unique_ptr<skottie::TextPropertyHandle> fTextProp; 67*c8dee2aaSAndroid Build Coastguard Worker const std::vector<std::unique_ptr<skottie::TextPropertyHandle>> fDependentProps; 68*c8dee2aaSAndroid Build Coastguard Worker const SkPath fCursorPath; 69*c8dee2aaSAndroid Build Coastguard Worker const SkRect fCursorBounds; 70*c8dee2aaSAndroid Build Coastguard Worker 71*c8dee2aaSAndroid Build Coastguard Worker std::vector<GlyphData> fGlyphData; 72*c8dee2aaSAndroid Build Coastguard Worker std::tuple<size_t, size_t> fSelection = {0,0}; // Indices in the glyphs domain. 73*c8dee2aaSAndroid Build Coastguard Worker size_t fCursorIndex = 0; // Index in the UTF8 domain. 74*c8dee2aaSAndroid Build Coastguard Worker float fCursorWeight = 1; 75*c8dee2aaSAndroid Build Coastguard Worker bool fEnabled = false; 76*c8dee2aaSAndroid Build Coastguard Worker bool fMouseDown = false; 77*c8dee2aaSAndroid Build Coastguard Worker 78*c8dee2aaSAndroid Build Coastguard Worker std::chrono::time_point<std::chrono::steady_clock> fTimeBase; 79*c8dee2aaSAndroid Build Coastguard Worker }; 80*c8dee2aaSAndroid Build Coastguard Worker 81*c8dee2aaSAndroid Build Coastguard Worker } // namespace skottie_utils 82*c8dee2aaSAndroid Build Coastguard Worker 83*c8dee2aaSAndroid Build Coastguard Worker #endif // SkottieTextEditor_DEFINED 84