[gnome-shell] PopupBaseMenuItem: Use active property for menu items



commit a23391ea28a156ce405859d51c912f83c8abe520
Author: Marco Trevisan (Treviño) <mail 3v1n0 net>
Date:   Wed Apr 17 18:15:56 2019 -0500

    PopupBaseMenuItem: Use active property for menu items
    
    Instead of using methods and flags, just use a gobject property to keep track
    of the active state.
    
    https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/499

 js/ui/popupMenu.js | 42 ++++++++++++++++++++++++------------------
 1 file changed, 24 insertions(+), 18 deletions(-)
---
diff --git a/js/ui/popupMenu.js b/js/ui/popupMenu.js
index d068394e2..8e58b016f 100644
--- a/js/ui/popupMenu.js
+++ b/js/ui/popupMenu.js
@@ -52,9 +52,14 @@ function arrowIcon(side) {
 }
 
 var PopupBaseMenuItem = GObject.registerClass({
+    Properties: {
+        'active': GObject.ParamSpec.boolean('active', 'active', 'active',
+                                            GObject.ParamFlags.READWRITE,
+                                            GObject.TYPE_BOOLEAN,
+                                            false),
+    },
     Signals: {
         'activate': { param_types: [Clutter.Event.$gtype] },
-        'active-changed': { param_types: [GObject.TYPE_BOOLEAN] },
         'sensitive-changed': {},
     }
 }, class PopupBaseMenuItem extends St.BoxLayout {
@@ -77,7 +82,7 @@ var PopupBaseMenuItem = GObject.registerClass({
         this.add(this._ornamentLabel);
 
         this._parent = null;
-        this.active = false;
+        this._active = false;
         this._activatable = params.reactive && params.activate;
         this._sensitive = true;
 
@@ -94,7 +99,7 @@ var PopupBaseMenuItem = GObject.registerClass({
             this.connect('key-press-event', this._onKeyPressEvent.bind(this));
         }
         if (params.reactive && params.hover)
-            this.connect('notify::hover', this._onHoverChanged.bind(this));
+            this.bind_property('hover', this, 'active', GObject.BindingFlags.SYNC_CREATE);
     }
 
     get actor() {
@@ -160,26 +165,26 @@ var PopupBaseMenuItem = GObject.registerClass({
 
     vfunc_key_focus_in() {
         super.vfunc_key_focus_in();
-        this.setActive(true);
+        this.active = true;
     }
 
     vfunc_key_focus_out() {
         super.vfunc_key_focus_out();
-        this.setActive(false);
-    }
-
-    _onHoverChanged(actor) {
-        this.setActive(actor.hover);
+        this.active = false;
     }
 
     activate(event) {
         this.emit('activate', event);
     }
 
-    setActive(active) {
+    get active() {
+        return this._active;
+    }
+
+    set active(active) {
         let activeChanged = active != this.active;
         if (activeChanged) {
-            this.active = active;
+            this._active = active;
             if (active) {
                 this.add_style_class_name('selected');
                 if (this.can_focus)
@@ -194,7 +199,7 @@ var PopupBaseMenuItem = GObject.registerClass({
                 // in the container
                 this.remove_style_pseudo_class('active');
             }
-            this.emit('active-changed', active);
+            this.notify('active');
         }
     }
 
@@ -518,16 +523,17 @@ var PopupMenuBase = class {
 
     _subMenuActiveChanged(submenu, submenuItem) {
         if (this._activeMenuItem && this._activeMenuItem != submenuItem)
-            this._activeMenuItem.setActive(false);
+            this._activeMenuItem.active = false;
         this._activeMenuItem = submenuItem;
         this.emit('active-changed', submenuItem);
     }
 
     _connectItemSignals(menuItem) {
-        menuItem._activeChangeId = menuItem.connect('active-changed', (menuItem, active) => {
+        menuItem._activeChangeId = menuItem.connect('notify::active', (menuItem) => {
+            let active = menuItem.active;
             if (active && this._activeMenuItem != menuItem) {
                 if (this._activeMenuItem)
-                    this._activeMenuItem.setActive(false);
+                    this._activeMenuItem.active = false;
                 this._activeMenuItem = menuItem;
                 this.emit('active-changed', menuItem);
             } else if (!active && this._activeMenuItem == menuItem) {
@@ -858,7 +864,7 @@ var PopupMenu = class extends PopupMenuBase {
 
     close(animate) {
         if (this._activeMenuItem)
-            this._activeMenuItem.setActive(false);
+            this._activeMenuItem.active = false;
 
         if (this._boxPointer.visible) {
             this._boxPointer.close(animate, () => {
@@ -997,7 +1003,7 @@ var PopupSubMenu = class extends PopupMenuBase {
         this.emit('open-state-changed', false);
 
         if (this._activeMenuItem)
-            this._activeMenuItem.setActive(false);
+            this._activeMenuItem.active = false;
 
         if (animate && this._needsScrollbar())
             animate = false;
@@ -1029,7 +1035,7 @@ var PopupSubMenu = class extends PopupMenuBase {
 
         if (this.isOpen && event.get_key_symbol() == Clutter.KEY_Left) {
             this.close(BoxPointer.PopupAnimation.FULL);
-            this.sourceActor._delegate.setActive(true);
+            this.sourceActor._delegate.active = true;
             return Clutter.EVENT_STOP;
         }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]