gardesk/garfield / cbd3758

Browse files

perf: optimize context menu and app picker hover detection

Authored by mfwolffe <wolffemf@dukes.jmu.edu>
SHA
cbd3758f1b1ab7a6d2775ac3960a91843e75f97c
Parents
4a37cd0
Tree
ff4c958

3 changed files

StatusFile+-
M garfield/src/app.rs 2 4
M garfield/src/ui/app_picker.rs 6 3
M garfield/src/ui/context_menu.rs 15 5
garfield/src/app.rsmodified
@@ -670,14 +670,12 @@ impl App {
670670
 
671671
         // Handle app picker hover
672672
         if self.app_picker.is_visible() {
673
-            self.app_picker.on_mouse_move(pos);
674
-            return true;
673
+            return self.app_picker.on_mouse_move(pos);
675674
         }
676675
 
677676
         // Handle context menu hover
678677
         if self.context_menu.is_visible() {
679
-            self.context_menu.on_mouse_move(pos);
680
-            return true;
678
+            return self.context_menu.on_mouse_move(pos);
681679
         }
682680
 
683681
         // Handle sidebar resize in progress
garfield/src/ui/app_picker.rsmodified
@@ -505,12 +505,13 @@ impl AppPickerDialog {
505505
         None
506506
     }
507507
 
508
-    /// Handle mouse move.
509
-    pub fn on_mouse_move(&mut self, pos: Point) {
508
+    /// Handle mouse move. Returns true if state changed.
509
+    pub fn on_mouse_move(&mut self, pos: Point) -> bool {
510510
         if !self.visible {
511
-            return;
511
+            return false;
512512
         }
513513
 
514
+        let old_hovered = self.hovered_index;
514515
         let dialog_rect = self.dialog_rect();
515516
         let list_y_start = self.list_y_start();
516517
         let list_y_end = list_y_start + (MAX_VISIBLE_ITEMS as i32 * ITEM_HEIGHT as i32);
@@ -530,6 +531,8 @@ impl AppPickerDialog {
530531
         } else {
531532
             self.hovered_index = None;
532533
         }
534
+
535
+        self.hovered_index != old_hovered
533536
     }
534537
 
535538
     /// Get the dialog rectangle (centered).
garfield/src/ui/context_menu.rsmodified
@@ -486,12 +486,16 @@ impl ContextMenu {
486486
         }
487487
     }
488488
 
489
-    /// Handle mouse move.
490
-    pub fn on_mouse_move(&mut self, pos: Point) {
489
+    /// Handle mouse move. Returns true if state changed and redraw is needed.
490
+    pub fn on_mouse_move(&mut self, pos: Point) -> bool {
491491
         if !self.visible {
492
-            return;
492
+            return false;
493493
         }
494494
 
495
+        let old_hovered = self.hovered_index;
496
+        let old_submenu_hovered = self.submenu_hovered_index;
497
+        let old_open_submenu = self.open_submenu_index;
498
+
495499
         // Check submenu first if open
496500
         if let Some(ref submenu_bounds) = self.submenu_bounds {
497501
             if submenu_bounds.contains_point(pos) {
@@ -502,7 +506,7 @@ impl ContextMenu {
502506
                 if let Some(idx) = self.submenu_hovered_index {
503507
                     self.submenu_focused_index = Some(idx);
504508
                 }
505
-                return;
509
+                return self.submenu_hovered_index != old_submenu_hovered;
506510
             }
507511
         }
508512
 
@@ -532,7 +536,9 @@ impl ContextMenu {
532536
                         self.close_submenu();
533537
                     }
534538
                 }
535
-                return;
539
+                return self.hovered_index != old_hovered
540
+                    || self.submenu_hovered_index != old_submenu_hovered
541
+                    || self.open_submenu_index != old_open_submenu;
536542
             }
537543
         }
538544
 
@@ -549,6 +555,10 @@ impl ContextMenu {
549555
                 self.submenu_hover_start = None;
550556
             }
551557
         }
558
+
559
+        self.hovered_index != old_hovered
560
+            || self.submenu_hovered_index != old_submenu_hovered
561
+            || self.open_submenu_index != old_open_submenu
552562
     }
553563
 
554564
     /// Open a submenu by index.