status/network: Use submenus when necessary
We currently stopped using submenus altogether, but that only works - if there is a single connection that represents the device as a whole - if there is just one device, so it is unambiguous what device items belong to To implement that behavior, add a 'single-device-mode' property that NMDeviceSection can set on its items, and have items update their 'use-submenu' property based on that. For wireless devices it's a straight mapping, as its items represent wireless networks that can appear and disappear by just walking around (multiple wifi adapters also sounds rather fringey). Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2407>
This commit is contained in:
parent
03ded1dcf0
commit
c2139b27da
@ -379,8 +379,13 @@ const NMDeviceConnectionItem = GObject.registerClass({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const NMDeviceItem = GObject.registerClass(
|
const NMDeviceItem = GObject.registerClass({
|
||||||
class NMDeviceItem extends NMSectionItem {
|
Properties: {
|
||||||
|
'single-device-mode': GObject.ParamSpec.boolean('single-device-mode', '', '',
|
||||||
|
GObject.ParamFlags.READWRITE,
|
||||||
|
false),
|
||||||
|
},
|
||||||
|
}, class NMDeviceItem extends NMSectionItem {
|
||||||
constructor(client, device) {
|
constructor(client, device) {
|
||||||
super();
|
super();
|
||||||
|
|
||||||
@ -419,6 +424,8 @@ class NMDeviceItem extends NMSectionItem {
|
|||||||
'notify::active-connection', () => this._activeConnectionChanged(),
|
'notify::active-connection', () => this._activeConnectionChanged(),
|
||||||
this);
|
this);
|
||||||
|
|
||||||
|
this.connect('notify::single-device-mode', () => this._sync());
|
||||||
|
|
||||||
this._syncConnections();
|
this._syncConnections();
|
||||||
this._activeConnectionChanged();
|
this._activeConnectionChanged();
|
||||||
}
|
}
|
||||||
@ -526,6 +533,7 @@ class NMDeviceItem extends NMSectionItem {
|
|||||||
_sync() {
|
_sync() {
|
||||||
const nItems = this._connectionItems.size;
|
const nItems = this._connectionItems.size;
|
||||||
this.radio_mode = nItems > 1;
|
this.radio_mode = nItems > 1;
|
||||||
|
this.useSubmenu = this.radioMode && !this.singleDeviceMode;
|
||||||
this._autoConnectItem.visible = nItems === 0;
|
this._autoConnectItem.visible = nItems === 0;
|
||||||
this._deactivateItem.visible = this.radioMode && this.isActive;
|
this._deactivateItem.visible = this.radioMode && this.isActive;
|
||||||
}
|
}
|
||||||
@ -959,8 +967,13 @@ class NMWirelessNetworkItem extends PopupMenu.PopupBaseMenuItem {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const NMWirelessDeviceItem = GObject.registerClass(
|
const NMWirelessDeviceItem = GObject.registerClass({
|
||||||
class NMWirelessDeviceItem extends NMSectionItem {
|
Properties: {
|
||||||
|
'single-device-mode': GObject.ParamSpec.boolean('single-device-mode', '', '',
|
||||||
|
GObject.ParamFlags.READWRITE,
|
||||||
|
false),
|
||||||
|
},
|
||||||
|
}, class NMWirelessDeviceItem extends NMSectionItem {
|
||||||
constructor(client, device) {
|
constructor(client, device) {
|
||||||
super();
|
super();
|
||||||
|
|
||||||
@ -996,6 +1009,10 @@ class NMWirelessDeviceItem extends NMSectionItem {
|
|||||||
this._updateItemsVisibility();
|
this._updateItemsVisibility();
|
||||||
}, this);
|
}, this);
|
||||||
|
|
||||||
|
this.bind_property('single-device-mode',
|
||||||
|
this, 'use-submenu',
|
||||||
|
GObject.BindingFlags.INVERT_BOOLEAN);
|
||||||
|
|
||||||
Main.sessionMode.connectObject('updated',
|
Main.sessionMode.connectObject('updated',
|
||||||
() => this._updateItemsVisibility(),
|
() => this._updateItemsVisibility(),
|
||||||
this);
|
this);
|
||||||
@ -1534,6 +1551,9 @@ class NMDeviceSection extends NMSection {
|
|||||||
_sync() {
|
_sync() {
|
||||||
super._sync();
|
super._sync();
|
||||||
|
|
||||||
|
const nItems = this._items.size;
|
||||||
|
this._items.forEach(item => (item.singleDeviceMode = nItems === 1));
|
||||||
|
|
||||||
let nDevices = this._itemsSection.box.get_children().reduce(
|
let nDevices = this._itemsSection.box.get_children().reduce(
|
||||||
(prev, child) => prev + (child.visible ? 1 : 0), 0);
|
(prev, child) => prev + (child.visible ? 1 : 0), 0);
|
||||||
this._summaryItem.label.text = this._getSummaryLabel(nDevices);
|
this._summaryItem.label.text = this._getSummaryLabel(nDevices);
|
||||||
|
Loading…
Reference in New Issue
Block a user