network/status: Split out NMMenuItem base class
The class only provides the GObject properties that are currently defined by NMConnectionItem, plus a way to set the active connection that should be used for the item's :is-active state. Its sole purpose is to provide a shared base for both device- and connection items, and to have that base be a GObject so we can start linking properties via bindings rather than manual fiddling. Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2407>
This commit is contained in:
parent
9002344ec6
commit
b4da69d474
@ -148,7 +148,7 @@ class ItemSorter {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const NMConnectionItem = GObject.registerClass({
|
const NMMenuItem = GObject.registerClass({
|
||||||
Properties: {
|
Properties: {
|
||||||
'radio-mode': GObject.ParamSpec.boolean('radio-mode', '', '',
|
'radio-mode': GObject.ParamSpec.boolean('radio-mode', '', '',
|
||||||
GObject.ParamFlags.READWRITE,
|
GObject.ParamFlags.READWRITE,
|
||||||
@ -163,7 +163,45 @@ const NMConnectionItem = GObject.registerClass({
|
|||||||
GObject.ParamFlags.READWRITE,
|
GObject.ParamFlags.READWRITE,
|
||||||
''),
|
''),
|
||||||
},
|
},
|
||||||
}, class NMConnectionItem extends PopupMenu.PopupBaseMenuItem {
|
}, class NMMenuItem extends PopupMenu.PopupBaseMenuItem {
|
||||||
|
get state() {
|
||||||
|
return this._activeConnection?.state ??
|
||||||
|
NM.ActiveConnectionState.DEACTIVATED;
|
||||||
|
}
|
||||||
|
|
||||||
|
get is_active() {
|
||||||
|
return this.state <= NM.ActiveConnectionState.ACTIVATED;
|
||||||
|
}
|
||||||
|
|
||||||
|
activate() {
|
||||||
|
super.activate(Clutter.get_current_event());
|
||||||
|
}
|
||||||
|
|
||||||
|
_activeConnectionStateChanged() {
|
||||||
|
this.notify('is-active');
|
||||||
|
this.notify('icon-name');
|
||||||
|
|
||||||
|
this._sync();
|
||||||
|
}
|
||||||
|
|
||||||
|
_setActiveConnection(activeConnection) {
|
||||||
|
this._activeConnection?.disconnectObject(this);
|
||||||
|
|
||||||
|
this._activeConnection = activeConnection;
|
||||||
|
|
||||||
|
this._activeConnection?.connectObject(
|
||||||
|
'notify::state', () => this._activeConnectionStateChanged(),
|
||||||
|
this);
|
||||||
|
this._activeConnectionStateChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
_sync() {
|
||||||
|
// Overridden by subclasses
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const NMConnectionItem = GObject.registerClass(
|
||||||
|
class NMConnectionItem extends NMMenuItem {
|
||||||
constructor(section, connection) {
|
constructor(section, connection) {
|
||||||
super();
|
super();
|
||||||
|
|
||||||
@ -203,15 +241,6 @@ const NMConnectionItem = GObject.registerClass({
|
|||||||
return this._connection.get_id();
|
return this._connection.get_id();
|
||||||
}
|
}
|
||||||
|
|
||||||
get state() {
|
|
||||||
return this._activeConnection?.state ??
|
|
||||||
NM.ActiveConnectionState.DEACTIVATED;
|
|
||||||
}
|
|
||||||
|
|
||||||
get is_active() {
|
|
||||||
return this.state <= NM.ActiveConnectionState.ACTIVATED;
|
|
||||||
}
|
|
||||||
|
|
||||||
updateForConnection(connection) {
|
updateForConnection(connection) {
|
||||||
// connection should always be the same object
|
// connection should always be the same object
|
||||||
// (and object path) as this._connection, but
|
// (and object path) as this._connection, but
|
||||||
@ -249,7 +278,7 @@ const NMConnectionItem = GObject.registerClass({
|
|||||||
}
|
}
|
||||||
|
|
||||||
activate() {
|
activate() {
|
||||||
super.activate(Clutter.get_current_event());
|
super.activate();
|
||||||
|
|
||||||
if (this.radio_mode && this._activeConnection != null)
|
if (this.radio_mode && this._activeConnection != null)
|
||||||
return; // only activate in radio mode
|
return; // only activate in radio mode
|
||||||
@ -262,20 +291,8 @@ const NMConnectionItem = GObject.registerClass({
|
|||||||
this._sync();
|
this._sync();
|
||||||
}
|
}
|
||||||
|
|
||||||
_connectionStateChanged(_ac, _newstate, _reason) {
|
setActiveConnection(connection) {
|
||||||
this.notify('is-active');
|
this._setActiveConnection(connection);
|
||||||
this._sync();
|
|
||||||
}
|
|
||||||
|
|
||||||
setActiveConnection(activeConnection) {
|
|
||||||
this._activeConnection?.disconnectObject(this);
|
|
||||||
|
|
||||||
this._activeConnection = activeConnection;
|
|
||||||
|
|
||||||
this._activeConnection?.connectObject('notify::state',
|
|
||||||
this._connectionStateChanged.bind(this), this);
|
|
||||||
|
|
||||||
this._sync();
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -1498,7 +1515,7 @@ const NMVpnConnectionItem = GObject.registerClass({
|
|||||||
this.remove_accessible_state(Atk.StateType.CHECKED);
|
this.remove_accessible_state(Atk.StateType.CHECKED);
|
||||||
}
|
}
|
||||||
|
|
||||||
_connectionStateChanged() {
|
_activeConnectionStateChanged() {
|
||||||
const state = this._activeConnection?.get_state();
|
const state = this._activeConnection?.get_state();
|
||||||
const reason = this._activeConnection?.get_state_reason();
|
const reason = this._activeConnection?.get_state_reason();
|
||||||
|
|
||||||
@ -1507,8 +1524,7 @@ const NMVpnConnectionItem = GObject.registerClass({
|
|||||||
reason !== NM.ActiveConnectionStateReason.USER_DISCONNECTED)
|
reason !== NM.ActiveConnectionStateReason.USER_DISCONNECTED)
|
||||||
this.emit('activation-failed');
|
this.emit('activation-failed');
|
||||||
|
|
||||||
this.notify('icon-name');
|
super._activeConnectionStateChanged();
|
||||||
super._connectionStateChanged();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
get icon_name() {
|
get icon_name() {
|
||||||
|
Loading…
Reference in New Issue
Block a user