feat(settings): add grouped configuration hub, languages and tray controls

This commit is contained in:
aria committed 2026-10-28 03:37:22 +09:00
1 parent 6f34fd080f
commit cc3b6f903f
90 files changed
+3625 -408

No files matched your search

+1 -1
View File
@@ -8,7 +8,7 @@ use crate::motion::{Geometry, Motion};
const FADE: Duration = Duration::from_millis(120);
const CONTENT_DELAY: Duration = Duration::from_millis(130);
#[derive(Clone, Copy, Debug, PartialEq, Deserialize, Serialize)]
#[derive(Clone, Copy, Debug, PartialEq, Deserialize, Serialize, schemars::JsonSchema)]
#[serde(default, deny_unknown_fields)]
pub struct Profile {
pub peek_on_hover: bool,
+35 -16
View File
@@ -20,11 +20,13 @@ fn padding() -> [u16; 2] {
[2, 3]
}
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)]
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize, schemars::JsonSchema)]
#[serde(transparent)]
pub struct PanelId(pub String);
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Deserialize, Serialize)]
#[derive(
Clone, Copy, Debug, Default, PartialEq, Eq, Deserialize, Serialize, schemars::JsonSchema,
)]
#[serde(rename_all = "lowercase")]
pub enum Edge {
#[default]
@@ -42,15 +44,17 @@ impl Edge {
}
}
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)]
#[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize, schemars::JsonSchema)]
#[serde(transparent)]
pub struct GroupId(pub String);
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Deserialize, Serialize)]
#[derive(
Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Deserialize, Serialize, schemars::JsonSchema,
)]
#[serde(transparent)]
pub struct ItemId(pub String);
#[derive(Clone, Copy, Debug, PartialEq, Eq, Deserialize, Serialize)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Deserialize, Serialize, schemars::JsonSchema)]
#[serde(rename_all = "kebab-case")]
pub enum Representation {
Wide,
@@ -58,7 +62,9 @@ pub enum Representation {
Icon,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Deserialize, Serialize)]
#[derive(
Clone, Copy, Debug, Default, PartialEq, Eq, Deserialize, Serialize, schemars::JsonSchema,
)]
#[serde(rename_all = "kebab-case")]
pub enum OverflowPolicy {
#[default]
@@ -67,7 +73,9 @@ pub enum OverflowPolicy {
Always,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Deserialize, Serialize)]
#[derive(
Clone, Copy, Debug, Default, PartialEq, Eq, Deserialize, Serialize, schemars::JsonSchema,
)]
#[serde(rename_all = "kebab-case")]
pub enum WorkspaceStyle {
Numbers,
@@ -110,7 +118,7 @@ impl WorkspaceStyle {
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Deserialize, Serialize)]
#[derive(Clone, Copy, Debug, PartialEq, Eq, Deserialize, Serialize, schemars::JsonSchema)]
#[serde(tag = "kind", rename_all = "kebab-case")]
pub enum ItemKind {
Overview,
@@ -122,6 +130,7 @@ pub enum ItemKind {
Media,
Activities,
QuickSettings,
Tray,
NightLight,
Network,
Audio,
@@ -158,6 +167,7 @@ impl ItemKind {
Self::Media => "Media",
Self::Activities => "Activities",
Self::QuickSettings => "Quick Settings",
Self::Tray => "Application tray",
Self::NightLight => "Night light",
Self::Network => "Network",
Self::Audio => "Audio",
@@ -184,7 +194,7 @@ impl ItemKind {
}
}
#[derive(Clone, Debug, PartialEq, Serialize)]
#[derive(Clone, Debug, PartialEq, Serialize, schemars::JsonSchema)]
pub struct Item {
pub id: ItemId,
#[serde(flatten)]
@@ -241,7 +251,7 @@ impl<'de> Deserialize<'de> for Item {
"percentage is only supported by Battery items",
));
}
#[derive(Deserialize)]
#[derive(Deserialize, schemars::JsonSchema, serde::Serialize)]
struct Fields {
id: ItemId,
#[serde(flatten)]
@@ -325,6 +335,7 @@ impl Item {
match self.kind {
ItemKind::Activities => availability.activities,
ItemKind::Media => availability.media,
ItemKind::Tray => availability.tray,
ItemKind::CaptureStatus => availability.capture,
ItemKind::Network => availability.network,
ItemKind::Audio => availability.audio,
@@ -338,6 +349,7 @@ impl Item {
#[derive(Clone, Copy, Debug, Default)]
pub struct Availability {
pub tray: bool,
pub capture: bool,
pub media: bool,
pub activities: bool,
@@ -348,7 +360,9 @@ pub struct Availability {
pub external_display: bool,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Deserialize, Serialize)]
#[derive(
Clone, Copy, Debug, Default, PartialEq, Eq, Deserialize, Serialize, schemars::JsonSchema,
)]
#[serde(rename_all = "kebab-case")]
pub enum PanelSurface {
None,
@@ -356,7 +370,9 @@ pub enum PanelSurface {
Solid,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Deserialize, Serialize)]
#[derive(
Clone, Copy, Debug, Default, PartialEq, Eq, Deserialize, Serialize, schemars::JsonSchema,
)]
#[serde(rename_all = "kebab-case")]
pub enum GroupSurface {
#[default]
@@ -376,7 +392,7 @@ impl GroupSurface {
}
}
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize, schemars::JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct Group {
pub id: GroupId,
@@ -402,14 +418,14 @@ impl Group {
}
}
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize, schemars::JsonSchema)]
#[serde(default, deny_unknown_fields)]
pub struct Zone {
pub groups: Vec<Group>,
pub spacing: f32,
}
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize)]
#[derive(Clone, Debug, PartialEq, Deserialize, Serialize, schemars::JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct Panel {
pub id: PanelId,
@@ -700,6 +716,7 @@ impl Panel {
let controls = vec![
item("media", Media),
item("quick-settings", QuickSettings),
item("tray", Tray),
item("night-light", NightLight),
item("network", Network),
item("audio", Audio),
@@ -820,6 +837,7 @@ mod tests {
"focused-window",
"media",
"quick-settings",
"tray",
"night-light",
"network",
"audio",
@@ -866,6 +884,7 @@ mod tests {
);
assert_eq!(
visible(Availability {
tray: true,
capture: true,
activities: true,
media: true,
@@ -879,7 +898,7 @@ mod tests {
.map(|item| item.id.0.as_str())
.collect::<Vec<_>>()
);
assert_eq!(items(&panel).len(), 14);
assert_eq!(items(&panel).len(), 15);
}
#[test]
+2 -2
View File
@@ -1,6 +1,6 @@
use serde::{Deserialize, Serialize};
#[derive(Clone, Copy, Debug, Default, PartialEq, Deserialize, Serialize)]
#[derive(Clone, Copy, Debug, Default, PartialEq, Deserialize, Serialize, schemars::JsonSchema)]
#[serde(default, deny_unknown_fields)]
pub struct GeometryIntent {
#[serde(skip_serializing_if = "Option::is_none")]
@@ -51,7 +51,7 @@ impl GeometryIntent {
}
/// Logical dimensions owned by a panel, independent of its color theme or edge.
#[derive(Clone, Copy, Debug, PartialEq, Deserialize, Serialize)]
#[derive(Clone, Copy, Debug, PartialEq, Deserialize, Serialize, schemars::JsonSchema)]
#[serde(default, deny_unknown_fields)]
pub struct PanelGeometry {
pub height: f32,
+9
View File
@@ -4,6 +4,15 @@ use serde::{Deserialize, Deserializer, Serialize, Serializer};
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct CornerRadii(pub [f32; 4]);
impl schemars::JsonSchema for CornerRadii {
fn schema_name() -> std::borrow::Cow<'static, str> {
"CornerRadii".into()
}
fn json_schema(_: &mut schemars::SchemaGenerator) -> schemars::Schema {
schemars::json_schema!({"anyOf":[{"type":"number","minimum":0},{"type":"array","minItems":4,"maxItems":4,"items":{"type":"number","minimum":0}}]})
}
}
impl CornerRadii {
#[must_use]
pub fn uniform(radius: f32) -> Self {
+3 -1
View File
@@ -2,7 +2,9 @@ use crate::{CornerRadii, Edge};
use ferese_layout::Rect;
use serde::{Deserialize, Serialize};
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Deserialize, Serialize)]
#[derive(
Clone, Copy, Debug, Default, PartialEq, Eq, Deserialize, Serialize, schemars::JsonSchema,
)]
#[serde(rename_all = "kebab-case")]
pub enum Style {
Floating,