Files
MuditaOS/module-gui/gui/widgets/text/HowDoesTextWork.md
2020-07-10 11:18:28 +02:00

68 lines
2.9 KiB
Markdown

# Introduction
## Glosary
* Text formatting: bold, underline, strikethrough, font - all visual parameters of text to be shown on screen
## Classes explanation
We needed to somehow handle text + it's properties which might take more than one screen at a time.
To do so we've decomposed gui::Text item to possibly single responsibility objects:
*Non visual*:
* gui::text::Document item providing us with text, representing on what we normaly understand as "document" (some, possibly mulit page long formatted text). Formated text stored in Document as Blocks
* gui::text::Block formated part of text representation, stores text and it's format, may end with newline or with end of formatting (i.e. with end of bold)
* gui::text::Cursor element pointing to some place in document, used to navigate it and edit ( like iterator/`FILE*` etc) our way to access whats in document
*Visual*
* gui::TextLine visual line representation in gui::Text <- build on request from document via gui::TextCursor - just a render
* gui::TextCursor visual cursor representation in gui::Text <- extends cursor, used to access data which gui::Text have in gui::text::Document
* gui::Text base textual widget controlling text display and modification, consists of: TextLines, TextCursor and text text::Document
## Visual relationship between classes "on screen"
![Text Document and Block relation](./document-block-relation.svg)
## TextCursor movement - how it works?
### Generally
* Remove removes character previous to cursor, if no character previous to cursor - remove one before, if no chars - do nothing.
* Append adds character after current cursor position, then increments cursor position by 1 (and moves it visualy 1 right)
* Delete removes character before current cursor position, decrements it by 1 (and moves it visualy by 1 left)
* Movement moves left/right ,no up/down support yet, if cursor is at the end/begin of block it uses up one key press to move between blocks
*Warning*
* TextCursor implements movement of rect which "walks" on Text drawn on screen
* Cursor implements where and what is removed/added
```
When changing how removing / adding are seen on screen and react to key presses TextCursor should be updated, not Cursor
```
#### key handling cases
![key handling cases](./text-cursor-corner-cases.svg)
#### text movement, addition and remove in action
![text movement, addition and remove](./text_move_add_remove.gif)
## special character input
Characters which are not available via key presses are available under special character selection on long press on down left key.
One of these keys is newline.
### special char selection - how it works example
![How to input special char](./how_to_special_char.gif)
## digit input in textual mode
User can input digits while in textual mode with long press of selected digit key on keyboard. i.e. long press 1 will put in 1
### Digit long press - how it works example
![Digit long press](./digit_long_press.gif)