blob: 6f7ea62a1eae09aae85cf65614ed5894469cc91e [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
library fuchsia.ui.text;
/// Indicates a character position in a text field, either between two unicode code points
/// or at the very edge of the document. This is an opaque identifier generated and
/// maintained by the TextField.
///
/// Any valid Position is a place a typing caret could appear, and vice-versa.
/// Instead of using absolute character indexes, each Position has a
/// TextField-assigned ID; it's the TextField's responsibility to keep a mapping
/// of position IDs to its internal representation of position.
///
/// When the TextField's revision number increments, all existing Positions
/// become invalid. TextField should take care never reuse position IDs, even across
/// revisions.
struct Position {
uint64 id;
};
/// A range is the unicode code points between `start` and `end`. When sending
/// ranges to clients, TextField must ensure `start` is always upstream of
/// `end`. However, when receiving ranges from clients, it should accept
/// `start` and `end` in any order.
struct Range {
Position start;
Position end;
};
/// Selection anchor states which edge of the selection is the anchor, and which
/// is the focus. While holding down shift and using the arrow keys, or while
/// dragging across some text to select it, the anchor is the edge that stays in
/// place, and the focus is the edge that moves around.
enum SelectionAnchor {
ANCHORED_AT_START = 1;
ANCHORED_AT_END = 2;
};
/// Whether a Position is visually upstream or downstream when ambiguous.
///
/// For example, when a position exists at a soft line break, a single offset has
/// two visual positions, UPSTREAM (at the end of the first line) and DOWNSTREAM
/// (at the start of the second line). A text affinity disambiguates between those
/// cases. (Something similar happens with between runs of bidirectional text.)
enum Affinity {
UPSTREAM = 0;
DOWNSTREAM = 1;
};
/// A selection is the current range of the text that is selected by the user,
/// or the current position of the input caret.
///
/// A zero-length selection is a caret. Affinity only has an effect on carets.
///
/// Even in mixed RTL and LTR text situations, a selection is still just the
/// string-wise slice between `focus` and `anchor` — graphical representations
/// of selections flip directions when crossing the RTL/LTR boundary, but no
/// special code is needed to handle crossing the boundary in the model.
struct Selection {
Range range;
SelectionAnchor anchor;
Affinity affinity;
};