Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions data/16/network-wireless-no-route-symbolic.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 2 additions & 0 deletions data/16/network-wireless-offline-symbolic.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
5 changes: 5 additions & 0 deletions data/Indicator.css
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,10 @@
* SPDX-FileCopyrightText: 2023 elementary, Inc. (https://elementary.io)
*/

settings-toggle {
font-size: 0.85rem;
}

network .image-button.toggle,
settings-toggle .image-button.toggle {
border-radius: 1em;
Expand All @@ -14,6 +18,7 @@ settings-toggle .image-button {
box-shadow: none;
min-height: 2.1666rem; /* 26px */
min-width: 2.1666rem; /* 26px */
margin-bottom: 0.3rem;
}

network .image-button,
Expand Down
2 changes: 2 additions & 0 deletions data/network.gresource.xml
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,8 @@
<file alias="24x24/status/panel-network-wireless-no-route-symbolic.svg" compressed="true" preprocess="xml-stripblanks">24/network-wireless-no-route-symbolic.svg</file>
<file alias="24x24/status/panel-network-wireless-offline-symbolic.svg" compressed="true" preprocess="xml-stripblanks">24/network-wireless-offline-symbolic.svg</file>

<file alias="scalable/status/panel-network-wireless-no-route-symbolic.svg" compressed="true" preprocess="xml-stripblanks">16/network-wireless-no-route-symbolic.svg</file>
<file alias="scalable/status/panel-network-wireless-offline-symbolic.svg" compressed="true" preprocess="xml-stripblanks">16/network-wireless-offline-symbolic.svg</file>
<file alias="scalable/status/panel-network-wireless-signal-excellent-symbolic.svg" compressed="true" preprocess="xml-stripblanks">16/network-wireless-signal-excellent-symbolic.svg</file>
<file alias="scalable/status/panel-network-wireless-signal-good-symbolic.svg" compressed="true" preprocess="xml-stripblanks">16/network-wireless-signal-good-symbolic.svg</file>
<file alias="scalable/status/panel-network-wireless-signal-ok-symbolic.svg" compressed="true" preprocess="xml-stripblanks">16/network-wireless-signal-ok-symbolic.svg</file>
Expand Down
50 changes: 3 additions & 47 deletions src/Widgets/PopoverWidget.vala
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,7 @@ public class Network.Widgets.PopoverWidget : Gtk.Box {
public Network.State state { private set; get; default = Network.State.CONNECTING_WIRED; }

private Gtk.FlowBox other_box;
private Gtk.Box wifi_box;
private Gtk.Box vpn_box;
private Gtk.ModelButton hidden_item;
private Gtk.Revealer toggle_revealer;

public bool is_in_session { get; construct; }
Expand Down Expand Up @@ -46,7 +44,6 @@ public class Network.Widgets.PopoverWidget : Gtk.Box {
max_children_per_line = 3,
selection_mode = Gtk.SelectionMode.NONE
};
wifi_box = new Gtk.Box (Gtk.Orientation.VERTICAL, 0);
vpn_box = new Gtk.Box (Gtk.Orientation.VERTICAL, 0);

try {
Expand Down Expand Up @@ -101,17 +98,11 @@ public class Network.Widgets.PopoverWidget : Gtk.Box {

add (toggle_revealer);
add (vpn_box);
add (wifi_box);

if (is_in_session) {
hidden_item = new Gtk.ModelButton ();
hidden_item.text = _("Connect to Hidden Network…");
hidden_item.no_show_all = true;

var show_settings_button = new Gtk.ModelButton ();
show_settings_button.text = _("Network Settings…");

add (hidden_item);
add (show_settings_button);

show_settings_button.clicked.connect (show_settings);
Expand All @@ -130,16 +121,6 @@ public class Network.Widgets.PopoverWidget : Gtk.Box {
show_all ();
update_vpn_connection ();

hidden_item.clicked.connect (() => {
bool found = false;
foreach (unowned var iface in network_interface) {
if (iface is WifiInterface && ((WifiInterface) iface).hidden_sensitivity && !found) {
((WifiInterface) iface).connect_to_hidden ();
found = true;
}
}
});

/* Monitor network manager */
nm_client.device_added.connect (device_added_cb);
nm_client.device_removed.connect (device_removed_cb);
Expand All @@ -150,8 +131,7 @@ public class Network.Widgets.PopoverWidget : Gtk.Box {
}

private void add_interface (WidgetNMInterface widget_interface) {
if (widget_interface is EtherInterface || widget_interface is ModemInterface) {

if (!(widget_interface is Network.VpnInterface)) {
var flowboxchild = new Gtk.FlowBoxChild () {
// Prevent weird double focus border
can_focus = false,
Expand All @@ -162,35 +142,11 @@ public class Network.Widgets.PopoverWidget : Gtk.Box {
return;
}

var container_box = wifi_box;

if (widget_interface is Network.WifiInterface) {
container_box = wifi_box;
hidden_item.no_show_all = false;
hidden_item.show_all ();

((Network.WifiInterface) widget_interface).notify["hidden-sensitivity"].connect (() => {
bool hidden_sensitivity = false;

foreach (unowned var iface in network_interface) {
if (iface is WifiInterface) {
hidden_sensitivity = hidden_sensitivity || ((WifiInterface) iface ).hidden_sensitivity;
}

hidden_item.sensitive = hidden_sensitivity;
}
});
}

if (widget_interface is Network.VpnInterface) {
container_box = vpn_box;
}

if (is_in_session && get_children ().length () > 0) {
container_box.pack_end (widget_interface.sep);
vpn_box.pack_end (widget_interface.sep);
}

container_box.pack_end (widget_interface);
vpn_box.pack_end (widget_interface);
}

public void opened () {
Expand Down
104 changes: 89 additions & 15 deletions src/Widgets/SettingsToggle.vala
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,15 @@ public class Network.SettingsToggle : Gtk.Box {
public string icon_name { get; set; }
public string text { get; set; }
public string settings_uri { get; set; default = "settings://"; }
public string subtitle { get; set; default = ""; }
public Gtk.Popover? popover { get; set; default = null; }

private Gtk.GestureMultiPress middle_click_gesture;
private Gtk.Label subtitle_label;
private Gtk.Revealer subtitle_revealer;
private Gtk.ToggleButton button;
private Gtk.GestureMultiPress click_controller;
private Gtk.GestureLongPress long_press_controller;
private Gtk.EventControllerKey menu_key_controller;

class construct {
set_css_name ("settings-toggle");
Expand All @@ -18,7 +25,7 @@ public class Network.SettingsToggle : Gtk.Box {
construct {
var image = new Gtk.Image ();

var button = new Gtk.ToggleButton () {
button = new Gtk.ToggleButton () {
halign = CENTER,
image = image
};
Expand All @@ -30,30 +37,97 @@ public class Network.SettingsToggle : Gtk.Box {
max_width_chars = 13,
mnemonic_widget = button
};
label.get_style_context ().add_class (Granite.STYLE_CLASS_SMALL_LABEL);

halign = CENTER;
subtitle_label = new Gtk.Label (null) {
ellipsize = MIDDLE,
justify = CENTER,
lines = 1,
max_width_chars = 13
};
subtitle_label.get_style_context ().add_class (Granite.STYLE_CLASS_SMALL_LABEL);
subtitle_label.get_style_context ().add_class (Gtk.STYLE_CLASS_DIM_LABEL);

subtitle_revealer = new Gtk.Revealer () {
child = subtitle_label
};

hexpand = true;
orientation = VERTICAL;
spacing = 3;
add (button);
add (label);
add (subtitle_revealer);

bind_property ("action-name", button, "action-name");
bind_property ("icon-name", image, "icon-name");
bind_property ("text", label, "label");

middle_click_gesture = new Gtk.GestureMultiPress (this) {
button = Gdk.BUTTON_MIDDLE
click_controller = new Gtk.GestureMultiPress (this) {
button = 0,
exclusive = true
};
middle_click_gesture.pressed.connect (() => {
try {
AppInfo.launch_default_for_uri (settings_uri, null);

var popover = (Gtk.Popover) get_ancestor (typeof (Gtk.Popover));
popover.popdown ();
} catch (Error e) {
critical ("Failed to open system settings: %s", e.message);
click_controller.pressed.connect (() => {
if (click_controller.get_current_button () == Gdk.BUTTON_MIDDLE) {
try {
AppInfo.launch_default_for_uri (settings_uri, null);

click_controller.set_state (CLAIMED);
click_controller.reset ();

var popover = (Gtk.Popover) get_ancestor (typeof (Gtk.Popover));
popover.popdown ();
} catch (Error e) {
critical ("Failed to open system settings: %s", e.message);
}
}

if (popover != null) {
var sequence = click_controller.get_current_sequence ();
var event = click_controller.get_last_event (sequence);

if (event.triggers_context_menu ()) {
popover.popup ();

click_controller.set_state (CLAIMED);
click_controller.reset ();
}
}
});

notify["popover"].connect (construct_menu);
notify["subtitle"].connect (construct_subtitle);
}

private void construct_menu () {
popover.position = RIGHT;
popover.relative_to = button;

long_press_controller = new Gtk.GestureLongPress (this);
long_press_controller.pressed.connect (() => {
popover.popup ();
});

menu_key_controller = new Gtk.EventControllerKey (this);
menu_key_controller.key_released.connect ((keyval, keycode, state) => {
var mods = state & Gtk.accelerator_get_default_mod_mask ();
switch (keyval) {
case Gdk.Key.F10:
if (mods == Gdk.ModifierType.SHIFT_MASK) {
popover.popup ();
}
break;
case Gdk.Key.Menu:
case Gdk.Key.MenuKB:
popover.popup ();
break;
default:
return;
}
});
}

private void construct_subtitle () {
subtitle_label.label = subtitle;
subtitle_revealer.reveal_child = subtitle != "";
button.get_accessible ().accessible_description = subtitle;
}
}
Loading