#pragma once #include "Base.hpp" #include "cru/common/Event.hpp" #include #include namespace cru::platform::gui { struct CompositionClause { int start; int end; bool target; }; using CompositionClauses = std::vector; struct CompositionText { std::u16string text; CompositionClauses clauses; TextRange selection; }; struct IInputMethodContext : virtual IPlatformResource { // Return true if you should draw composition text manually. Return false if // system will take care of that for you. virtual bool ShouldManuallyDrawCompositionText() = 0; virtual void EnableIME() = 0; virtual void DisableIME() = 0; virtual void CompleteComposition() = 0; virtual void CancelComposition() = 0; virtual CompositionText GetCompositionText() = 0; // Set the candidate window lefttop. Relative to window lefttop. Use this // method to prepare typing. virtual void SetCandidateWindowPosition(const Point& point) = 0; // Triggered when user starts composition. virtual IEvent* CompositionStartEvent() = 0; // Triggered when user stops composition. virtual IEvent* CompositionEndEvent() = 0; // Triggered every time composition text changes. virtual IEvent* CompositionEvent() = 0; virtual IEvent* TextEvent() = 0; }; } // namespace cru::platform::gui // template <> // struct fmt::formatter // : fmt::formatter { // auto parse(fmt::basic_format_parse_context& ctx) { // return fmt::formatter::parse(ctx); // } // template // auto format(const cru::platform::gui::CompositionText& ct, // FormatContext& ctx) { // auto output = ctx.out(); // output = format_to(output, u"text: {}\n", ct.text); // output = format_to(output, u"clauses:\n"); // for (gsl::index i = 0; i < static_cast(ct.clauses.size()); // i++) { // const auto& clause = ct.clauses[i]; // output = // format_to(output, u"\t{}. start: {} end: {}{}\n", i, clause.start, // clause.end, clause.target ? u" target" : u""); // } // output = format_to(output, u"selection: position: {} count: {}", // ct.selection.position, ct.selection.count); // return output; // } // };