diff --git a/meson.build b/meson.build index ff6fd7cf..c6770d11 100644 --- a/meson.build +++ b/meson.build @@ -46,6 +46,7 @@ shared_module( 'src/Indicator.vala', 'src/rfkill.vala', 'src/Utils.vala', + 'src/Widgets/AirplaneModeToggle.vala', 'src/Widgets/DisplayWidget.vala', 'src/Widgets/EtherInterface.vala', 'src/Widgets/ModemInterface.vala', diff --git a/po/POTFILES b/po/POTFILES index 6ab568fd..0ffe77ff 100644 --- a/po/POTFILES +++ b/po/POTFILES @@ -1,6 +1,7 @@ src/Indicator.vala src/rfkill.vala src/Utils.vala +src/Widgets/AirplaneModeToggle.vala src/Widgets/DisplayWidget.vala src/Widgets/EtherInterface.vala src/Widgets/ModemInterface.vala diff --git a/src/Indicator.vala b/src/Indicator.vala index fd71ded8..2cff5c64 100644 --- a/src/Indicator.vala +++ b/src/Indicator.vala @@ -23,7 +23,6 @@ public class Network.Indicator : Wingpanel.Indicator { NetworkMonitor network_monitor; private Gtk.GestureMultiPress gesture_click; - private SimpleAction airplane_action; public bool is_in_session { get; set; default = false; } @@ -61,28 +60,11 @@ public class Network.Indicator : Wingpanel.Indicator { }; gesture_click.pressed.connect (() => { - airplane_action.activate (null); + var action_group = (SimpleActionGroup) popover_widget.get_action_group ("airplane-mode"); + action_group.activate_action ("toggle", null); }); } - airplane_action = new SimpleAction.stateful ("airplane-mode", null, new Variant.boolean (popover_widget.nm_client.networking_get_enabled ())); - airplane_action.activate.connect (() => { - popover_widget.nm_client.dbus_call.begin ( - NM.DBUS_PATH, NM.DBUS_INTERFACE, - "Enable", new Variant.tuple ({new Variant.boolean (!popover_widget.nm_client.networking_get_enabled ())}), - null, -1, null, (obj, res) => { - try { - ((NM.Client) obj).dbus_set_property.end (res); - } catch (Error e) { - warning ("Error setting airplane mode: %s", e.message); - } - } - ); - }); - - var action_group = (SimpleActionGroup) popover_widget.get_action_group ("network"); - action_group.add_action (airplane_action); - update_tooltip (); on_state_changed (); start_monitor (); @@ -102,8 +84,6 @@ public class Network.Indicator : Wingpanel.Indicator { display_widget.update_state (popover_widget.state, popover_widget.secure, popover_widget.extra_info); - airplane_action.set_state (new Variant.boolean (!popover_widget.nm_client.networking_get_enabled ())); - update_tooltip (); } diff --git a/src/Widgets/AirplaneModeToggle.vala b/src/Widgets/AirplaneModeToggle.vala new file mode 100644 index 00000000..5df95072 --- /dev/null +++ b/src/Widgets/AirplaneModeToggle.vala @@ -0,0 +1,26 @@ +/* +* SPDX-License-Identifier: LGPL-2.1-or-later +* SPDX-FileCopyrightText: 2025 elementary, Inc. (https://elementary.io) +*/ + +public class Network.AirplaneModeToggle : SettingsToggle { + construct { + action_name = "airplane-mode.toggle"; + icon_name = "airplane-mode-disabled-symbolic"; + settings_uri = "settings://network"; + text = _("Airplane Mode"); + + map.connect (() => { + var action_group = (SimpleActionGroup) get_action_group ("airplane-mode"); + action_group.action_state_changed.connect ((action_name, state) => { + if (action_name == "toggle") { + if (state.get_boolean ()) { + icon_name = "airplane-mode-symbolic"; + } else { + icon_name = "airplane-mode-disabled-symbolic"; + } + } + }); + }); + } +} diff --git a/src/Widgets/PopoverWidget.vala b/src/Widgets/PopoverWidget.vala index f77e4836..6de8d961 100644 --- a/src/Widgets/PopoverWidget.vala +++ b/src/Widgets/PopoverWidget.vala @@ -12,6 +12,7 @@ public class Network.Widgets.PopoverWidget : Gtk.Box { public string? extra_info { private set; get; default = null; } public Network.State state { private set; get; default = Network.State.CONNECTING_WIRED; } + private SimpleAction airplane_action; private Gtk.FlowBox other_box; private Gtk.Box wifi_box; private Gtk.Box vpn_box; @@ -56,26 +57,27 @@ public class Network.Widgets.PopoverWidget : Gtk.Box { } if (is_in_session) { - var airplane_toggle = new SettingsToggle () { - action_name = "network.airplane-mode", - icon_name = "airplane-mode-disabled-symbolic", - settings_uri = "settings://network", - text = _("Airplane Mode") - }; - - var action_group = new SimpleActionGroup (); - action_group.action_state_changed.connect ((action_name, state) => { - critical ("got a state change"); - if (action_name == "airplane-mode") { - if (state.get_boolean ()) { - airplane_toggle.icon_name = "airplane-mode-symbolic"; - } else { - airplane_toggle.icon_name = "airplane-mode-disabled-symbolic"; + airplane_action = new SimpleAction.stateful ("toggle", null, new Variant.boolean (nm_client.networking_get_enabled ())); + airplane_action.activate.connect (() => { + nm_client.dbus_call.begin ( + NM.DBUS_PATH, NM.DBUS_INTERFACE, + "Enable", new Variant.tuple ({new Variant.boolean (!nm_client.networking_get_enabled ())}), + null, -1, null, (obj, res) => { + try { + ((NM.Client) obj).dbus_set_property.end (res); + } catch (Error e) { + warning ("Error setting airplane mode: %s", e.message); + } } - } + ); }); - insert_action_group ("network", action_group); + var action_group = new SimpleActionGroup (); + action_group.add_action (airplane_action); + + insert_action_group ("airplane-mode", action_group); + + var airplane_toggle = new AirplaneModeToggle (); var airplane_child = new Gtk.FlowBoxChild () { // Prevent weird double focus border @@ -314,6 +316,8 @@ public class Network.Widgets.PopoverWidget : Gtk.Box { state = next_state; } + + airplane_action.set_state (new Variant.boolean (!nm_client.networking_get_enabled ())); } private void update_vpn_connection () {