diff --git a/docs/modules/Networkmanager.md b/docs/modules/Networkmanager.md index bd318d9..e79cfde 100644 --- a/docs/modules/Networkmanager.md +++ b/docs/modules/Networkmanager.md @@ -10,64 +10,77 @@ Supports wired ethernet, wifi, cellular data and VPN connections among others. > Type: `networkmanager` -| Name | Type | Default | Description | -|-------------|-----------|---------|-------------------------| -| `icon_size` | `integer` | `24` | Size to render icon at. | +| Name | Type | Default | Description | +| ----------------------------- | ---------- | ----------------------------------------------------- | ------------------------------------------------- | +| `icon_size` | `integer` | `24` | Size to render icon at. | +| `icons.wired.connected` | `string` | `icon:network-wired-symbolic` | Icon to show when there is a wired connection | +| `icons.wired.disconnected` | `string` | `icon:network-wired-symbolic` | Icon to show when there is no wired connection | +| `icons.wifi.levels` | `string[]` | `["icon:network-wireless-signal-none-symbolic", ...]` | Icon to show when there is no wifi connection | +| `icons.wifi.disconnected` | `string` | `icon:network-wireless-offline-symbolic` | Icon to show when there is no wifi connection | +| `icons.wifi.disabled` | `string` | `icon:network-wireless-hardware-disabled-symbolic` | Icon to show when wifi is disabled | +| `icons.cellular.connected` | `string` | `icon:network-cellular-connected-symbolic` | Icon to show when there is a cellular connection | +| `icons.cellular.disconnected` | `string` | `icon:network-cellular-offline-symbolic` | Icon to show when there is no cellular connection | +| `icons.cellular.disabled` | `string` | `icon:network-cellular-hardware-disabled-symbolic` | Icon to show when cellular connection is disabled | +| `icons.vpn.connected` | `string` | `icon:network-vpn-symbolic` | Icon to show when there is a VPN connection |
- JSON +JSON + +```json +{ + "end": [ + { + "type": "networkmanager", + "icon_size": 32 + } + ] +} +``` - ```json - { - "end": [ - { - "type": "networkmanager", - "icon_size": 32 - } - ] - } - ```
- TOML +TOML + +```toml +[[end]] +type = "networkmanager" +icon_size = 32 +``` - ```toml - [[end]] - type = "networkmanager" - icon_size = 32 - ```
- YAML +YAML + +```yaml +end: + - type: "networkmanager" + icon_size: 32 +``` - ```yaml - end: - - type: "networkmanager" - icon_size: 32 - ```
- Corn +Corn + +```corn +{ + end = [ + { + type = "networkmanager" + icon_size = 32 + } + ] +} +``` - ```corn - { - end = [ - { - type = "networkmanager" - icon_size = 32 - } - ] - } - ```
## Styling | Selector | Description | -|------------------------|----------------------------------| +| ---------------------- | -------------------------------- | | `.networkmanager` | NetworkManager widget container. | | `.networkmanger .icon` | NetworkManager widget icons. | diff --git a/src/modules/networkmanager.rs b/src/modules/networkmanager.rs index e5be89e..2689d90 100644 --- a/src/modules/networkmanager.rs +++ b/src/modules/networkmanager.rs @@ -1,3 +1,5 @@ +mod config; + use color_eyre::Result; use futures_lite::StreamExt; use futures_signals::signal::SignalExt; @@ -22,6 +24,9 @@ pub struct NetworkManagerModule { #[serde(default = "default_icon_size")] icon_size: i32, + #[serde(default)] + icons: config::IconsConfig, + #[serde(flatten)] pub common: Option, } @@ -106,34 +111,27 @@ impl Module for NetworkManagerModule { } update_icon!(wired_icon, wired, { - WiredState::Connected => "icon:network-wired-symbolic", - WiredState::Disconnected => "icon:network-wired-disconnected-symbolic", + WiredState::Connected => &self.icons.wired.connected, + WiredState::Disconnected => &self.icons.wired.disconnected, WiredState::NotPresent | WiredState::Unknown => "", }); update_icon!(wifi_icon, wifi, { WifiState::Connected(state) => { - let icons = [ - "icon:network-wireless-signal-none-symbolic", - "icon:network-wireless-signal-weak-symbolic", - "icon:network-wireless-signal-ok-symbolic", - "icon:network-wireless-signal-good-symbolic", - "icon:network-wireless-signal-excellent-symbolic", - ]; - let n = strengh_to_level(state.strength, icons.len()); - icons[n] + let n = strengh_to_level(state.strength, self.icons.wifi.levels.len()); + &self.icons.wifi.levels[n] }, - WifiState::Disconnected => "icon:network-wireless-offline-symbolic", - WifiState::Disabled => "icon:network-wireless-hardware-disabled-symbolic", + WifiState::Disconnected => &self.icons.wifi.disconnected, + WifiState::Disabled => &self.icons.wifi.disabled, WifiState::NotPresent | WifiState::Unknown => "", }); update_icon!(cellular_icon, cellular, { - CellularState::Connected => "icon:network-cellular-connected-symbolic", - CellularState::Disconnected => "icon:network-cellular-offline-symbolic", - CellularState::Disabled => "icon:network-cellular-hardware-disabled-symbolic", + CellularState::Connected => &self.icons.cellular.connected, + CellularState::Disconnected => &self.icons.cellular.disconnected, + CellularState::Disabled => &self.icons.cellular.disabled, CellularState::NotPresent | CellularState::Unknown => "", }); update_icon!(vpn_icon, vpn, { - VpnState::Connected(_) => "icon:network-vpn-symbolic", + VpnState::Connected(_) => &self.icons.vpn.connected, VpnState::Disconnected | VpnState::Unknown => "", }); }); diff --git a/src/modules/networkmanager/config.rs b/src/modules/networkmanager/config.rs new file mode 100644 index 0000000..c2fd77c --- /dev/null +++ b/src/modules/networkmanager/config.rs @@ -0,0 +1,120 @@ +use serde::Deserialize; + +macro_rules! default_function { + ($(($name:ident, $default:expr),)*) => { + $( + fn $name() -> String { + ($default).to_string() + } + )* + }; +} + +#[derive(Debug, Deserialize, Clone, Default)] +#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))] +pub struct IconsConfig { + #[serde(default)] + pub wired: IconsConfigWired, + #[serde(default)] + pub wifi: IconsConfigWifi, + #[serde(default)] + pub cellular: IconsConfigCellular, + #[serde(default)] + pub vpn: IconsConfigVpn, +} + +#[derive(Debug, Deserialize, Clone)] +#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))] +pub struct IconsConfigWired { + #[serde(default = "default_wired_connected")] + pub connected: String, + #[serde(default = "default_wired_disconnected")] + pub disconnected: String, +} +impl Default for IconsConfigWired { + fn default() -> Self { + Self { + connected: default_wired_connected(), + disconnected: default_wired_disconnected(), + } + } +} + +#[derive(Debug, Deserialize, Clone)] +#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))] +pub struct IconsConfigWifi { + #[serde(default = "default_wifi_levels")] + pub levels: Vec, + #[serde(default = "default_wifi_disconnected")] + pub disconnected: String, + #[serde(default = "default_wifi_disabled")] + pub disabled: String, +} + +impl Default for IconsConfigWifi { + fn default() -> Self { + Self { + levels: default_wifi_levels(), + disconnected: default_wifi_disconnected(), + disabled: default_wifi_disabled(), + } + } +} + +#[derive(Debug, Deserialize, Clone)] +#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))] +pub struct IconsConfigCellular { + #[serde(default = "default_cellular_connected")] + pub connected: String, + #[serde(default = "default_cellular_disconnected")] + pub disconnected: String, + #[serde(default = "default_cellular_disabled")] + pub disabled: String, +} +impl Default for IconsConfigCellular { + fn default() -> Self { + Self { + connected: default_cellular_connected(), + disconnected: default_cellular_disconnected(), + disabled: default_cellular_disabled(), + } + } +} + +#[derive(Debug, Deserialize, Clone)] +#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))] +pub struct IconsConfigVpn { + #[serde(default = "default_vpn_connected")] + pub connected: String, +} +impl Default for IconsConfigVpn { + fn default() -> Self { + Self { + connected: default_vpn_connected(), + } + } +} + +pub fn default_wifi_levels() -> Vec { + vec![ + "icon:network-wireless-signal-none-symbolic".to_string(), + "icon:network-wireless-signal-weak-symbolic".to_string(), + "icon:network-wireless-signal-ok-symbolic".to_string(), + "icon:network-wireless-signal-good-symbolic".to_string(), + "icon:network-wireless-signal-excellent-symbolic".to_string(), + ] +} + +default_function! { + (default_wired_connected, "icon:network-wired-symbolic"), + (default_wired_disconnected, "icon:network-wired-disconnected-symbolic"), + + (default_wifi_disconnected, "icon:network-wireless-offline-symbolic"), + (default_wifi_disabled, "icon:network-wireless-hardware-disabled-symbolic"), + + (default_cellular_connected,"icon:network-cellular-connected-symbolic"), + (default_cellular_disconnected,"icon:network-cellular-offline-symbolic"), + (default_cellular_disabled,"icon:network-cellular-hardware-disabled-symbolic"), + + (default_vpn_connected, "icon:network-vpn-symbolic"), +}