diff options
author | thankyouverycool <66646555+thankyouverycool@users.noreply.github.com> | 2022-12-17 15:36:02 -0500 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2022-12-20 10:22:27 +0100 |
commit | 40e94a315a8dee8eebda93ad2c94042258cf533f (patch) | |
tree | a9579f6858e66eb0ba73e98d54f84b2ac25143a5 | |
parent | 02212f373be0bbf4ccbb97a7266368cd208389e9 (diff) | |
download | serenity-40e94a315a8dee8eebda93ad2c94042258cf533f.zip |
LibGUI+FontEditor: Restore normalized selections on Undo/Redo
Selections are always normalized when saving undo commands.
The restore_selection() function reverses this process so
negatively sized selections (created right-to-left) continue
to resize correctly with the keyboard when restored.
-rw-r--r-- | Userland/Applications/FontEditor/MainWidget.cpp | 4 | ||||
-rw-r--r-- | Userland/Libraries/LibGUI/GlyphMapWidget.cpp | 11 | ||||
-rw-r--r-- | Userland/Libraries/LibGUI/GlyphMapWidget.h | 3 |
3 files changed, 16 insertions, 2 deletions
diff --git a/Userland/Applications/FontEditor/MainWidget.cpp b/Userland/Applications/FontEditor/MainWidget.cpp index 73a82e1eb9..048a299171 100644 --- a/Userland/Applications/FontEditor/MainWidget.cpp +++ b/Userland/Applications/FontEditor/MainWidget.cpp @@ -811,7 +811,7 @@ void MainWidget::undo() deferred_invoke([this, glyph] { auto start = m_undo_selection->restored_start(); auto size = m_undo_selection->restored_size(); - m_glyph_map_widget->set_selection(start, size, glyph); + m_glyph_map_widget->restore_selection(start, size, glyph); m_glyph_map_widget->scroll_to_glyph(glyph); m_glyph_map_widget->set_focus(true); }); @@ -841,7 +841,7 @@ void MainWidget::redo() deferred_invoke([this, glyph] { auto start = m_undo_selection->restored_start(); auto size = m_undo_selection->restored_size(); - m_glyph_map_widget->set_selection(start, size, glyph); + m_glyph_map_widget->restore_selection(start, size, glyph); m_glyph_map_widget->scroll_to_glyph(glyph); m_glyph_map_widget->set_focus(true); }); diff --git a/Userland/Libraries/LibGUI/GlyphMapWidget.cpp b/Userland/Libraries/LibGUI/GlyphMapWidget.cpp index f6a4923f1c..3bbf36d6a2 100644 --- a/Userland/Libraries/LibGUI/GlyphMapWidget.cpp +++ b/Userland/Libraries/LibGUI/GlyphMapWidget.cpp @@ -97,6 +97,17 @@ void GlyphMapWidget::set_selection(int start, int size, Optional<u32> active_gly set_active_glyph(active_glyph.value(), ShouldResetSelection::No); } +void GlyphMapWidget::restore_selection(int start, int size, int active_glyph) +{ + if (start == active_glyph && size > 1) { + start = active_glyph + size - 1; + size = -size + 1; + } + m_selection.set_start(start); + m_selection.set_size(size); + set_active_glyph(active_glyph, ShouldResetSelection::No); +} + Gfx::IntRect GlyphMapWidget::get_outer_rect(int glyph) const { glyph -= m_active_range.first; diff --git a/Userland/Libraries/LibGUI/GlyphMapWidget.h b/Userland/Libraries/LibGUI/GlyphMapWidget.h index 0c2746c731..7b319321ca 100644 --- a/Userland/Libraries/LibGUI/GlyphMapWidget.h +++ b/Userland/Libraries/LibGUI/GlyphMapWidget.h @@ -57,7 +57,10 @@ public: void set_active_range(Unicode::CodePointRange); void set_active_glyph(int, ShouldResetSelection = ShouldResetSelection::Yes); + void set_selection(int start, int size, Optional<u32> active_glyph = {}); + void restore_selection(int start, int size, int active_glyph); + void scroll_to_glyph(int); void update_glyph(int); |