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 {
670
 
670
 
671
         // Handle app picker hover
671
         // Handle app picker hover
672
         if self.app_picker.is_visible() {
672
         if self.app_picker.is_visible() {
673
-            self.app_picker.on_mouse_move(pos);
673
+            return self.app_picker.on_mouse_move(pos);
674
-            return true;
675
         }
674
         }
676
 
675
 
677
         // Handle context menu hover
676
         // Handle context menu hover
678
         if self.context_menu.is_visible() {
677
         if self.context_menu.is_visible() {
679
-            self.context_menu.on_mouse_move(pos);
678
+            return self.context_menu.on_mouse_move(pos);
680
-            return true;
681
         }
679
         }
682
 
680
 
683
         // Handle sidebar resize in progress
681
         // Handle sidebar resize in progress
garfield/src/ui/app_picker.rsmodified
@@ -505,12 +505,13 @@ impl AppPickerDialog {
505
         None
505
         None
506
     }
506
     }
507
 
507
 
508
-    /// Handle mouse move.
508
+    /// Handle mouse move. Returns true if state changed.
509
-    pub fn on_mouse_move(&mut self, pos: Point) {
509
+    pub fn on_mouse_move(&mut self, pos: Point) -> bool {
510
         if !self.visible {
510
         if !self.visible {
511
-            return;
511
+            return false;
512
         }
512
         }
513
 
513
 
514
+        let old_hovered = self.hovered_index;
514
         let dialog_rect = self.dialog_rect();
515
         let dialog_rect = self.dialog_rect();
515
         let list_y_start = self.list_y_start();
516
         let list_y_start = self.list_y_start();
516
         let list_y_end = list_y_start + (MAX_VISIBLE_ITEMS as i32 * ITEM_HEIGHT as i32);
517
         let list_y_end = list_y_start + (MAX_VISIBLE_ITEMS as i32 * ITEM_HEIGHT as i32);
@@ -530,6 +531,8 @@ impl AppPickerDialog {
530
         } else {
531
         } else {
531
             self.hovered_index = None;
532
             self.hovered_index = None;
532
         }
533
         }
534
+
535
+        self.hovered_index != old_hovered
533
     }
536
     }
534
 
537
 
535
     /// Get the dialog rectangle (centered).
538
     /// Get the dialog rectangle (centered).
garfield/src/ui/context_menu.rsmodified
@@ -486,12 +486,16 @@ impl ContextMenu {
486
         }
486
         }
487
     }
487
     }
488
 
488
 
489
-    /// Handle mouse move.
489
+    /// Handle mouse move. Returns true if state changed and redraw is needed.
490
-    pub fn on_mouse_move(&mut self, pos: Point) {
490
+    pub fn on_mouse_move(&mut self, pos: Point) -> bool {
491
         if !self.visible {
491
         if !self.visible {
492
-            return;
492
+            return false;
493
         }
493
         }
494
 
494
 
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
+
495
         // Check submenu first if open
499
         // Check submenu first if open
496
         if let Some(ref submenu_bounds) = self.submenu_bounds {
500
         if let Some(ref submenu_bounds) = self.submenu_bounds {
497
             if submenu_bounds.contains_point(pos) {
501
             if submenu_bounds.contains_point(pos) {
@@ -502,7 +506,7 @@ impl ContextMenu {
502
                 if let Some(idx) = self.submenu_hovered_index {
506
                 if let Some(idx) = self.submenu_hovered_index {
503
                     self.submenu_focused_index = Some(idx);
507
                     self.submenu_focused_index = Some(idx);
504
                 }
508
                 }
505
-                return;
509
+                return self.submenu_hovered_index != old_submenu_hovered;
506
             }
510
             }
507
         }
511
         }
508
 
512
 
@@ -532,7 +536,9 @@ impl ContextMenu {
532
                         self.close_submenu();
536
                         self.close_submenu();
533
                     }
537
                     }
534
                 }
538
                 }
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;
536
             }
542
             }
537
         }
543
         }
538
 
544
 
@@ -549,6 +555,10 @@ impl ContextMenu {
549
                 self.submenu_hover_start = None;
555
                 self.submenu_hover_start = None;
550
             }
556
             }
551
         }
557
         }
558
+
559
+        self.hovered_index != old_hovered
560
+            || self.submenu_hovered_index != old_submenu_hovered
561
+            || self.open_submenu_index != old_open_submenu
552
     }
562
     }
553
 
563
 
554
     /// Open a submenu by index.
564
     /// Open a submenu by index.