1
0
Fork 0
mirror of https://github.com/Zedfrigg/ironbar.git synced 2025-07-01 10:41:03 +02:00

feat(networkmanager): add config for icons

This commit is contained in:
Rodrigo Batista de Moraes 2024-07-13 20:52:40 -03:00
parent 4fe03031dd
commit 81900c6a29
3 changed files with 186 additions and 55 deletions

View file

@ -10,64 +10,77 @@ Supports wired ethernet, wifi, cellular data and VPN connections among others.
> Type: `networkmanager` > Type: `networkmanager`
| Name | Type | Default | Description | | Name | Type | Default | Description |
|-------------|-----------|---------|-------------------------| | ----------------------------- | ---------- | ----------------------------------------------------- | ------------------------------------------------- |
| `icon_size` | `integer` | `24` | Size to render icon at. | | `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 |
<details> <details>
<summary>JSON</summary> <summary>JSON</summary>
```json
{
"end": [
{
"type": "networkmanager",
"icon_size": 32
}
]
}
```
```json
{
"end": [
{
"type": "networkmanager",
"icon_size": 32
}
]
}
```
</details> </details>
<details> <details>
<summary>TOML</summary> <summary>TOML</summary>
```toml
[[end]]
type = "networkmanager"
icon_size = 32
```
```toml
[[end]]
type = "networkmanager"
icon_size = 32
```
</details> </details>
<details> <details>
<summary>YAML</summary> <summary>YAML</summary>
```yaml
end:
- type: "networkmanager"
icon_size: 32
```
```yaml
end:
- type: "networkmanager"
icon_size: 32
```
</details> </details>
<details> <details>
<summary>Corn</summary> <summary>Corn</summary>
```corn
{
end = [
{
type = "networkmanager"
icon_size = 32
}
]
}
```
```corn
{
end = [
{
type = "networkmanager"
icon_size = 32
}
]
}
```
</details> </details>
## Styling ## Styling
| Selector | Description | | Selector | Description |
|------------------------|----------------------------------| | ---------------------- | -------------------------------- |
| `.networkmanager` | NetworkManager widget container. | | `.networkmanager` | NetworkManager widget container. |
| `.networkmanger .icon` | NetworkManager widget icons. | | `.networkmanger .icon` | NetworkManager widget icons. |

View file

@ -1,3 +1,5 @@
mod config;
use color_eyre::Result; use color_eyre::Result;
use futures_lite::StreamExt; use futures_lite::StreamExt;
use futures_signals::signal::SignalExt; use futures_signals::signal::SignalExt;
@ -22,6 +24,9 @@ pub struct NetworkManagerModule {
#[serde(default = "default_icon_size")] #[serde(default = "default_icon_size")]
icon_size: i32, icon_size: i32,
#[serde(default)]
icons: config::IconsConfig,
#[serde(flatten)] #[serde(flatten)]
pub common: Option<CommonConfig>, pub common: Option<CommonConfig>,
} }
@ -106,34 +111,27 @@ impl Module<GtkBox> for NetworkManagerModule {
} }
update_icon!(wired_icon, wired, { update_icon!(wired_icon, wired, {
WiredState::Connected => "icon:network-wired-symbolic", WiredState::Connected => &self.icons.wired.connected,
WiredState::Disconnected => "icon:network-wired-disconnected-symbolic", WiredState::Disconnected => &self.icons.wired.disconnected,
WiredState::NotPresent | WiredState::Unknown => "", WiredState::NotPresent | WiredState::Unknown => "",
}); });
update_icon!(wifi_icon, wifi, { update_icon!(wifi_icon, wifi, {
WifiState::Connected(state) => { WifiState::Connected(state) => {
let icons = [ let n = strengh_to_level(state.strength, self.icons.wifi.levels.len());
"icon:network-wireless-signal-none-symbolic", &self.icons.wifi.levels[n]
"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]
}, },
WifiState::Disconnected => "icon:network-wireless-offline-symbolic", WifiState::Disconnected => &self.icons.wifi.disconnected,
WifiState::Disabled => "icon:network-wireless-hardware-disabled-symbolic", WifiState::Disabled => &self.icons.wifi.disabled,
WifiState::NotPresent | WifiState::Unknown => "", WifiState::NotPresent | WifiState::Unknown => "",
}); });
update_icon!(cellular_icon, cellular, { update_icon!(cellular_icon, cellular, {
CellularState::Connected => "icon:network-cellular-connected-symbolic", CellularState::Connected => &self.icons.cellular.connected,
CellularState::Disconnected => "icon:network-cellular-offline-symbolic", CellularState::Disconnected => &self.icons.cellular.disconnected,
CellularState::Disabled => "icon:network-cellular-hardware-disabled-symbolic", CellularState::Disabled => &self.icons.cellular.disabled,
CellularState::NotPresent | CellularState::Unknown => "", CellularState::NotPresent | CellularState::Unknown => "",
}); });
update_icon!(vpn_icon, vpn, { update_icon!(vpn_icon, vpn, {
VpnState::Connected(_) => "icon:network-vpn-symbolic", VpnState::Connected(_) => &self.icons.vpn.connected,
VpnState::Disconnected | VpnState::Unknown => "", VpnState::Disconnected | VpnState::Unknown => "",
}); });
}); });

View file

@ -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<String>,
#[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<String> {
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"),
}