diff --git a/firmware/application/apps/ui_text_editor.cpp b/firmware/application/apps/ui_text_editor.cpp index 74f73c5b..4c155f8c 100644 --- a/firmware/application/apps/ui_text_editor.cpp +++ b/firmware/application/apps/ui_text_editor.cpp @@ -137,6 +137,16 @@ uint32_t TextViewer::offset() const { return 0; } +void TextViewer::cursor_home() { + cursor_.col = 0; + redraw(); +} + +void TextViewer::cursor_end() { + cursor_.col = line_length() - 1; + redraw(); +} + uint16_t TextViewer::line_length() { return file_->line_length(cursor_.line); } @@ -157,18 +167,14 @@ bool TextViewer::apply_scrolling_constraints(int16_t delta_line, int16_t delta_c ++new_line; } - // Snap to first/last to make navigating easier. - if (new_line < 0 && new_col > 0) { + // Snap to first/last line to make navigating easier. + if (new_line < 0 && cursor_.line > 0) { new_line = 0; - new_col = 0; } else if (new_line >= (int32_t)file_->line_count()) { auto last_line = file_->line_count() - 1; - int32_t last_col = file_->line_length(last_line) - 1; - if (new_col < last_col) { + if (cursor_.line < last_line) new_line = last_line; - new_col = last_col; - } } if (new_line < 0 || (uint32_t)new_line >= file_->line_count()) @@ -176,7 +182,6 @@ bool TextViewer::apply_scrolling_constraints(int16_t delta_line, int16_t delta_c new_line_length = file_->line_length(new_line); - // TODO: don't wrap with encoder? // Wrap or clamp column. if (new_line_length == 0) new_col = 0; @@ -267,9 +272,9 @@ TextEditorMenu::TextEditorMenu() add_children( { &rect_frame, - &button_cut, - &button_paste, - &button_zoom, + &button_home, + &button_end, + &button_copy, &button_delline, &button_edit, &button_addline, @@ -318,18 +323,19 @@ TextEditorView::TextEditorView(NavigationView& nav) }; menu.hidden(true); - menu.on_cut() = [this]() { - show_nyi(); - }; - menu.on_paste() = [this]() { - show_nyi(); - }; - menu.on_zoom() = [this]() { - viewer.toggle_font_zoom(); - refresh_ui(); + menu.on_home() = [this]() { + viewer.cursor_home(); hide_menu(true); }; + menu.on_end() = [this]() { + viewer.cursor_end(); + hide_menu(true); + }; + + menu.on_copy() = [this]() { + }; + menu.on_delete_line() = [this]() { prepare_for_write(); file_->delete_line(viewer.line()); @@ -500,10 +506,6 @@ void TextEditorView::show_edit_line() { }); } -void TextEditorView::show_nyi() { - nav_.display_modal("Soon...", "Coming soon."); -} - void TextEditorView::show_save_prompt(std::function continuation) { if (!file_dirty_) { if (continuation) diff --git a/firmware/application/apps/ui_text_editor.hpp b/firmware/application/apps/ui_text_editor.hpp index 060b296b..a8fbd73e 100644 --- a/firmware/application/apps/ui_text_editor.hpp +++ b/firmware/application/apps/ui_text_editor.hpp @@ -72,6 +72,9 @@ class TextViewer : public Widget { uint32_t col() const { return cursor_.col; } uint32_t offset() const; + void cursor_home(); + void cursor_end(); + // Gets the length of the current line. uint16_t line_length(); @@ -125,14 +128,12 @@ class TextEditorMenu : public View { void on_show() override; void on_hide() override; - std::function& on_cut() { return button_cut.on_select; } - std::function& on_paste() { return button_paste.on_select; } - std::function& on_zoom() { return button_zoom.on_select; } - + std::function& on_home() { return button_home.on_select; } + std::function& on_end() { return button_end.on_select; } + std::function& on_copy() { return button_copy.on_select; } std::function& on_delete_line() { return button_delline.on_select; } std::function& on_edit_line() { return button_edit.on_select; } std::function& on_add_line() { return button_addline.on_select; } - std::function& on_open() { return button_open.on_select; } std::function& on_save() { return button_save.on_select; } std::function& on_exit() { return button_exit.on_select; } @@ -144,16 +145,16 @@ class TextEditorMenu : public View { {0 * 8, 0 * 8, 23 * 8, 23 * 8}, Color::dark_grey()}; - NewButton button_cut{ + NewButton button_home{ {1 * 8, 1 * 8, 7 * 8, 7 * 8}, - "Cut", - &bitmap_icon_cut, + "Home", + &bitmap_arrow_left, Color::dark_grey()}; - NewButton button_paste{ + NewButton button_end{ {8 * 8, 1 * 8, 7 * 8, 7 * 8}, - "Paste", - &bitmap_icon_paste, + "End", + &bitmap_arrow_right, Color::dark_grey()}; NewButton button_zoom{ @@ -225,7 +226,6 @@ class TextEditorView : public View { void hide_menu(bool hidden = true); void show_file_picker(bool immediate = true); void show_edit_line(); - void show_nyi(); void show_save_prompt(std::function continuation); void prepare_for_write();