summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorthankyouverycool <66646555+thankyouverycool@users.noreply.github.com>2022-12-17 15:36:02 -0500
committerAndreas Kling <kling@serenityos.org>2022-12-20 10:22:27 +0100
commit40e94a315a8dee8eebda93ad2c94042258cf533f (patch)
treea9579f6858e66eb0ba73e98d54f84b2ac25143a5
parent02212f373be0bbf4ccbb97a7266368cd208389e9 (diff)
downloadserenity-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.cpp4
-rw-r--r--Userland/Libraries/LibGUI/GlyphMapWidget.cpp11
-rw-r--r--Userland/Libraries/LibGUI/GlyphMapWidget.h3
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);