popupMenu: Replace event handlers with click action
Actions provide a higher-level API than event handlers, not unlike GTK's event controllers (albeit less complete). Allowing them to take care of the low-level bits where possible is generally a good idea. Menu items are a very straight-forward case, with a good amount of code saving, so port them over. Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2742>
This commit is contained in:
parent
cd862aa53e
commit
a9ba9b7a47
@ -97,6 +97,19 @@ var PopupBaseMenuItem = GObject.registerClass({
|
|||||||
this._activatable = params.reactive && params.activate;
|
this._activatable = params.reactive && params.activate;
|
||||||
this._sensitive = true;
|
this._sensitive = true;
|
||||||
|
|
||||||
|
this._clickAction = new Clutter.ClickAction({
|
||||||
|
enabled: this._activatable,
|
||||||
|
});
|
||||||
|
this._clickAction.connect('clicked',
|
||||||
|
() => this.activate(Clutter.get_current_event()));
|
||||||
|
this._clickAction.connect('notify::pressed', () => {
|
||||||
|
if (this._clickAction.pressed)
|
||||||
|
this.add_style_pseudo_class('active');
|
||||||
|
else
|
||||||
|
this.remove_style_pseudo_class('active');
|
||||||
|
});
|
||||||
|
this.add_action(this._clickAction);
|
||||||
|
|
||||||
if (!this._activatable)
|
if (!this._activatable)
|
||||||
this.add_style_class_name('popup-inactive-menu-item');
|
this.add_style_class_name('popup-inactive-menu-item');
|
||||||
|
|
||||||
@ -124,44 +137,6 @@ var PopupBaseMenuItem = GObject.registerClass({
|
|||||||
this._parent = parent;
|
this._parent = parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
vfunc_button_press_event() {
|
|
||||||
if (!this._activatable)
|
|
||||||
return Clutter.EVENT_PROPAGATE;
|
|
||||||
|
|
||||||
// This is the CSS active state
|
|
||||||
this.add_style_pseudo_class('active');
|
|
||||||
return Clutter.EVENT_PROPAGATE;
|
|
||||||
}
|
|
||||||
|
|
||||||
vfunc_button_release_event() {
|
|
||||||
if (!this._activatable)
|
|
||||||
return Clutter.EVENT_PROPAGATE;
|
|
||||||
|
|
||||||
this.remove_style_pseudo_class('active');
|
|
||||||
|
|
||||||
// Pointer left the item during the grab
|
|
||||||
if (!this.hover)
|
|
||||||
return Clutter.EVENT_PROPAGATE;
|
|
||||||
|
|
||||||
this.activate(Clutter.get_current_event());
|
|
||||||
return Clutter.EVENT_STOP;
|
|
||||||
}
|
|
||||||
|
|
||||||
vfunc_touch_event(touchEvent) {
|
|
||||||
if (!this._activatable)
|
|
||||||
return Clutter.EVENT_PROPAGATE;
|
|
||||||
|
|
||||||
if (touchEvent.type == Clutter.EventType.TOUCH_END) {
|
|
||||||
this.remove_style_pseudo_class('active');
|
|
||||||
this.activate(Clutter.get_current_event());
|
|
||||||
return Clutter.EVENT_STOP;
|
|
||||||
} else if (touchEvent.type == Clutter.EventType.TOUCH_BEGIN) {
|
|
||||||
// This is the CSS active state
|
|
||||||
this.add_style_pseudo_class('active');
|
|
||||||
}
|
|
||||||
return Clutter.EVENT_PROPAGATE;
|
|
||||||
}
|
|
||||||
|
|
||||||
vfunc_key_press_event(keyEvent) {
|
vfunc_key_press_event(keyEvent) {
|
||||||
if (global.focus_manager.navigate_from_event(Clutter.get_current_event()))
|
if (global.focus_manager.navigate_from_event(Clutter.get_current_event()))
|
||||||
return Clutter.EVENT_STOP;
|
return Clutter.EVENT_STOP;
|
||||||
@ -1267,25 +1242,7 @@ class PopupSubMenuMenuItem extends PopupBaseMenuItem {
|
|||||||
}
|
}
|
||||||
|
|
||||||
activate(_event) {
|
activate(_event) {
|
||||||
this._setOpenState(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
vfunc_button_release_event() {
|
|
||||||
// Since we override the parent, we need to manage what the parent does
|
|
||||||
// with the active style class
|
|
||||||
this.remove_style_pseudo_class('active');
|
|
||||||
this._setOpenState(!this._getOpenState());
|
this._setOpenState(!this._getOpenState());
|
||||||
return Clutter.EVENT_PROPAGATE;
|
|
||||||
}
|
|
||||||
|
|
||||||
vfunc_touch_event(touchEvent) {
|
|
||||||
if (touchEvent.type == Clutter.EventType.TOUCH_END) {
|
|
||||||
// Since we override the parent, we need to manage what the parent does
|
|
||||||
// with the active style class
|
|
||||||
this.remove_style_pseudo_class('active');
|
|
||||||
this._setOpenState(!this._getOpenState());
|
|
||||||
}
|
|
||||||
return Clutter.EVENT_PROPAGATE;
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user