mirror of
https://github.com/encounter/engine.git
synced 2026-03-30 11:09:55 -07:00
38d545ee17
Significantly improves the behavior of non-ASCII text input on Windows. Correctly processes incoming character events as UTF-16, and for now uses UTF-32 for the text model so that the existing index-based logic will work much more often. Future work is still needed, but this will handle far more cases correctly.
103 lines
3.2 KiB
C++
103 lines
3.2 KiB
C++
// Copyright 2013 The Flutter Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#ifndef FLUTTER_SHELL_PLATFORM_CPP_TEXT_INPUT_MODEL_H_
|
|
#define FLUTTER_SHELL_PLATFORM_CPP_TEXT_INPUT_MODEL_H_
|
|
|
|
#include <memory>
|
|
#include <string>
|
|
|
|
#include "rapidjson/document.h"
|
|
|
|
namespace flutter {
|
|
// Handles underlying text input state, using a simple ASCII model.
|
|
//
|
|
// Ignores special states like "insert mode" for now.
|
|
class TextInputModel {
|
|
public:
|
|
TextInputModel(int client_id, const rapidjson::Value& config);
|
|
virtual ~TextInputModel();
|
|
|
|
// Attempts to set the text state.
|
|
//
|
|
// Returns false if the state is not valid (base or extent are out of
|
|
// bounds, or base is less than extent).
|
|
bool SetEditingState(size_t selection_base,
|
|
size_t selection_extent,
|
|
const std::string& text);
|
|
|
|
// Adds a character.
|
|
//
|
|
// Either appends after the cursor (when selection base and extent are the
|
|
// same), or deletes the selected characters, replacing the text with the
|
|
// character specified.
|
|
void AddCharacter(char32_t c);
|
|
|
|
// Deletes either the selection, or one character ahead of the cursor.
|
|
//
|
|
// Deleting one character ahead of the cursor occurs when the selection base
|
|
// and extent are the same.
|
|
//
|
|
// Returns true if any deletion actually occurred.
|
|
bool Delete();
|
|
|
|
// Deletes either the selection, or one character behind the cursor.
|
|
//
|
|
// Deleting one character behind the cursor occurs when the selection base
|
|
// and extent are the same.
|
|
//
|
|
// Returns true if any deletion actually occurred.
|
|
bool Backspace();
|
|
|
|
// Attempts to move the cursor backward.
|
|
//
|
|
// Returns true if the cursor could be moved. Changes base and extent to be
|
|
// equal to either the extent (if extent is at the end of the string), or
|
|
// for extent to be equal to
|
|
bool MoveCursorBack();
|
|
|
|
// Attempts to move the cursor forward.
|
|
//
|
|
// Returns true if the cursor could be moved.
|
|
bool MoveCursorForward();
|
|
|
|
// Attempts to move the cursor to the beginning.
|
|
//
|
|
// Returns true if the cursor could be moved.
|
|
void MoveCursorToBeginning();
|
|
|
|
// Attempts to move the cursor to the back.
|
|
//
|
|
// Returns true if the cursor could be moved.
|
|
void MoveCursorToEnd();
|
|
|
|
// Returns the state in the form of a platform message.
|
|
std::unique_ptr<rapidjson::Document> GetState() const;
|
|
|
|
// Id of the text input client.
|
|
int client_id() const { return client_id_; }
|
|
|
|
// Keyboard type of the client. See available options:
|
|
// https://docs.flutter.io/flutter/services/TextInputType-class.html
|
|
std::string input_type() const { return input_type_; }
|
|
|
|
// An action requested by the user on the input client. See available options:
|
|
// https://docs.flutter.io/flutter/services/TextInputAction-class.html
|
|
std::string input_action() const { return input_action_; }
|
|
|
|
private:
|
|
void DeleteSelected();
|
|
|
|
std::u32string text_;
|
|
int client_id_;
|
|
std::string input_type_;
|
|
std::string input_action_;
|
|
std::u32string::iterator selection_base_;
|
|
std::u32string::iterator selection_extent_;
|
|
};
|
|
|
|
} // namespace flutter
|
|
|
|
#endif // FLUTTER_SHELL_PLATFORM_CPP_TEXT_INPUT_MODEL_H_
|