Parcourir la source

LibGUI: Add automatic scrolling to GlyphMapWidget

Similar to TextEditor, GlyphMapWidget now automatically scrolls
when dragging a selection outside its boundaries.
thankyouverycool il y a 3 ans
Parent
commit
5c6326ae23

+ 15 - 8
Userland/Libraries/LibGUI/GlyphMapWidget.cpp

@@ -54,6 +54,19 @@ GlyphMapWidget::GlyphMapWidget()
     horizontal_scrollbar().set_visible(false);
     did_change_font();
     set_active_glyph('A');
+
+    m_automatic_selection_scroll_timer = add<Core::Timer>(20, [this] {
+        if (!m_in_drag_select) {
+            m_automatic_selection_scroll_timer->stop();
+            return;
+        }
+        auto glyph = glyph_at_position_clamped(m_last_mousemove_position);
+        m_selection.extend_to(glyph);
+        set_active_glyph(glyph, ShouldResetSelection::No);
+        scroll_to_glyph(glyph);
+        update();
+    });
+    m_automatic_selection_scroll_timer->stop();
 }
 
 void GlyphMapWidget::resize_event(ResizeEvent& event)
@@ -168,6 +181,7 @@ void GlyphMapWidget::mousedown_event(MouseEvent& event)
         if (event.shift())
             m_selection.extend_to(glyph);
         m_in_drag_select = true;
+        m_automatic_selection_scroll_timer->start();
         set_active_glyph(glyph, event.shift() ? ShouldResetSelection::No : ShouldResetSelection::Yes);
     }
 }
@@ -187,14 +201,7 @@ void GlyphMapWidget::mouseup_event(GUI::MouseEvent& event)
 
 void GlyphMapWidget::mousemove_event(GUI::MouseEvent& event)
 {
-    if (!m_in_drag_select)
-        return;
-
-    auto glyph = glyph_at_position_clamped(event.position());
-    m_selection.extend_to(glyph);
-    set_active_glyph(glyph, ShouldResetSelection::No);
-    scroll_to_glyph(glyph);
-    update();
+    m_last_mousemove_position = event.position();
 }
 
 void GlyphMapWidget::doubleclick_event(MouseEvent& event)

+ 3 - 0
Userland/Libraries/LibGUI/GlyphMapWidget.h

@@ -8,6 +8,7 @@
 
 #pragma once
 
+#include <LibCore/Timer.h>
 #include <LibGUI/AbstractScrollableWidget.h>
 #include <LibGUI/TextRange.h>
 #include <LibGfx/BitmapFont.h>
@@ -94,6 +95,8 @@ private:
     int m_visible_glyphs { 0 };
     bool m_in_drag_select { false };
     Unicode::CodePointRange m_active_range { 0x0000, 0x10FFFF };
+    RefPtr<Core::Timer> m_automatic_selection_scroll_timer;
+    Gfx::IntPoint m_last_mousemove_position;
 };
 
 }