1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 16:48:12 +00:00

TextEditor+EditingEngine: Add support for the basics of Vim emulation

This commit is contained in:
Rok Povsic 2021-01-02 11:59:55 +01:00 committed by Andreas Kling
parent 1c17ecdeb7
commit b4a783d923
13 changed files with 1143 additions and 438 deletions

View file

@ -43,6 +43,7 @@ class TextEditor
: public ScrollableWidget
, public TextDocument::Client {
C_OBJECT(TextEditor)
public:
enum Type {
MultiLine,
@ -65,6 +66,9 @@ public:
const String& placeholder() const { return m_placeholder; }
void set_placeholder(const StringView& placeholder) { m_placeholder = placeholder; }
TextDocumentLine& current_line() { return line(m_cursor.line()); }
const TextDocumentLine& current_line() const { return line(m_cursor.line()); }
void set_visualize_trailing_whitespace(bool);
bool visualize_trailing_whitespace() const { return m_visualize_trailing_whitespace; }
@ -107,6 +111,10 @@ public:
void scroll_cursor_into_view();
void scroll_position_into_view(const TextPosition&);
size_t line_count() const { return document().line_count(); }
TextDocumentLine& line(size_t index) { return document().line(index); }
const TextDocumentLine& line(size_t index) const { return document().line(index); }
NonnullOwnPtrVector<TextDocumentLine>& lines() { return document().lines(); }
const NonnullOwnPtrVector<TextDocumentLine>& lines() const { return document().lines(); }
int line_spacing() const { return m_line_spacing; }
int line_height() const;
TextPosition cursor() const { return m_cursor; }
@ -164,11 +172,27 @@ public:
const AutocompleteProvider* autocomplete_provider() const;
void set_autocomplete_provider(OwnPtr<AutocompleteProvider>&&);
const EditingEngine* editing_engine() const;
void set_editing_engine(OwnPtr<EditingEngine>);
bool should_autocomplete_automatically() const { return m_autocomplete_timer; }
void set_should_autocomplete_automatically(bool);
bool is_in_drag_select() const { return m_in_drag_select; }
TextRange* selection() { return &m_selection; };
void did_update_selection();
void did_change();
void update_cursor();
void add_code_point(u32 code_point);
void reset_cursor_blink();
void toggle_selection_if_needed_for_event(bool is_selecting);
int number_of_visible_lines() const;
Gfx::IntRect cursor_content_rect() const;
TextPosition text_position_at_content_position(const Gfx::IntPoint&) const;
protected:
explicit TextEditor(Type = Type::MultiLine);
@ -191,7 +215,6 @@ protected:
Gfx::IntRect ruler_content_rect(size_t line) const;
TextPosition text_position_at(const Gfx::IntPoint&) const;
TextPosition text_position_at_content_position(const Gfx::IntPoint&) const;
bool ruler_visible() const { return m_ruler_visible; }
Gfx::IntRect content_rect_for_position(const TextPosition&) const;
int ruler_width() const;
@ -211,7 +234,6 @@ private:
void create_actions();
void paint_ruler(Painter&);
void update_content_size();
void did_change();
int fixed_glyph_width() const;
void defer_reflow();
@ -240,27 +262,13 @@ private:
Gfx::IntRect line_content_rect(size_t item_index) const;
Gfx::IntRect line_widget_rect(size_t line_index) const;
Gfx::IntRect cursor_content_rect() const;
void update_cursor();
const NonnullOwnPtrVector<TextDocumentLine>& lines() const { return document().lines(); }
NonnullOwnPtrVector<TextDocumentLine>& lines() { return document().lines(); }
TextDocumentLine& line(size_t index) { return document().line(index); }
const TextDocumentLine& line(size_t index) const { return document().line(index); }
TextDocumentLine& current_line() { return line(m_cursor.line()); }
const TextDocumentLine& current_line() const { return line(m_cursor.line()); }
void toggle_selection_if_needed_for_event(const KeyEvent&);
void delete_selection();
void did_update_selection();
int content_x_for_position(const TextPosition&) const;
Gfx::IntRect ruler_rect_in_inner_coordinates() const;
Gfx::IntRect visible_text_rect_in_inner_coordinates() const;
void recompute_all_visual_lines();
void ensure_cursor_is_valid();
void flush_pending_change_notification_if_needed();
void get_selection_line_boundaries(size_t& first_line, size_t& last_line);
void move_selected_lines_up();
void move_selected_lines_down();
void sort_selected_lines();
size_t visual_line_containing(size_t line_index, size_t column) const;
void recompute_visual_lines(size_t line_index);
@ -336,6 +344,8 @@ private:
RefPtr<Core::Timer> m_automatic_selection_scroll_timer;
RefPtr<Core::Timer> m_autocomplete_timer;
OwnPtr<EditingEngine> m_editing_engine;
Gfx::IntPoint m_last_mousemove_position;
RefPtr<Gfx::Bitmap> m_icon;