Add CLI args
- Dumb UI widget that processes nothing - Accept icon, value, and color as arguments
This commit is contained in:
parent
1cde7cf7f3
commit
e56461d081
30
crates/popcorn/src/args.rs
Normal file
30
crates/popcorn/src/args.rs
Normal file
@ -0,0 +1,30 @@
|
||||
use clap::Parser;
|
||||
|
||||
#[derive(Parser, Debug)]
|
||||
#[command(name = "popcorn", version, about = "Minimal OSD popup renderer")]
|
||||
pub struct CliArgs {
|
||||
#[arg(long = "value")]
|
||||
pub value: Option<u8>,
|
||||
|
||||
#[arg(long = "icon")]
|
||||
pub icon: Option<String>,
|
||||
|
||||
#[arg(long = "color")]
|
||||
pub color: Option<String>,
|
||||
}
|
||||
|
||||
pub struct OsdArgs {
|
||||
pub value: Option<u8>,
|
||||
pub icon: Option<String>,
|
||||
pub color: Option<String>,
|
||||
}
|
||||
|
||||
impl From<CliArgs> for OsdArgs {
|
||||
fn from(c: CliArgs) -> Self {
|
||||
Self {
|
||||
value: c.value,
|
||||
icon: c.icon,
|
||||
color: c.color,
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,6 +1,13 @@
|
||||
mod args;
|
||||
mod show_popup;
|
||||
|
||||
use args::{CliArgs, OsdArgs};
|
||||
use clap::Parser;
|
||||
|
||||
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||
show_popup::show_popup()?;
|
||||
let cli = CliArgs::parse();
|
||||
let parsed_args: OsdArgs = cli.into();
|
||||
|
||||
show_popup::show_popup(&parsed_args)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
use crate::args::OsdArgs;
|
||||
use i_slint_backend_winit::{
|
||||
Backend,
|
||||
winit::{
|
||||
@ -13,8 +14,20 @@ fn argb_col(color_hex: u32) -> Color {
|
||||
Color::from_argb_encoded(color_hex)
|
||||
}
|
||||
|
||||
fn parse_hex_color(s: &str) -> Result<Color, String> {
|
||||
let clean = s.trim().trim_start_matches('#');
|
||||
|
||||
let raw = u32::from_str_radix(clean, 16).map_err(|_| "invalid hex color")?;
|
||||
|
||||
if clean.len() == 8 {
|
||||
Ok(Color::from_argb_encoded(raw))
|
||||
} else {
|
||||
Err("color must be 8 hex chars (AARRGGBB)".into())
|
||||
}
|
||||
}
|
||||
|
||||
/// Set Slint properties from config data
|
||||
fn set_ui_props(ui: &OSDpopup) {
|
||||
fn set_ui_props(ui: &OSDpopup, args: &OsdArgs) -> Result<(), Box<dyn std::error::Error>> {
|
||||
// Config values
|
||||
let popup_width = 200;
|
||||
let popup_height = 50;
|
||||
@ -24,17 +37,21 @@ fn set_ui_props(ui: &OSDpopup) {
|
||||
let window_position_y = 35;
|
||||
|
||||
let osd_bg_color = argb_col(0x_67_5f_5f_5f);
|
||||
let fill_color = argb_col(0x_ff_12_7a_9b);
|
||||
let fill_color = if let Some(c) = args.color.as_deref() {
|
||||
parse_hex_color(c)?
|
||||
} else {
|
||||
argb_col(0x_ff_12_7a_9b)
|
||||
};
|
||||
|
||||
let value_font_size = 35;
|
||||
let value_font_color = argb_col(0x_ff_ff_ff_ff);
|
||||
let value_font = "Iosevka Extrabold";
|
||||
let percent_value = 35;
|
||||
let percent_value = i32::from(args.value.unwrap_or(0));
|
||||
|
||||
let icon_size = value_font_size;
|
||||
let icon_font_color = value_font_color;
|
||||
let icon_font = "IosevkaTermSlab Nerd Font Mono";
|
||||
let icon_glyph = "";
|
||||
let icon_glyph = args.icon.as_deref().unwrap_or("");
|
||||
|
||||
// Config values -> Slint component properties
|
||||
ui.set_popup_width(popup_width);
|
||||
@ -66,10 +83,12 @@ fn set_ui_props(ui: &OSDpopup) {
|
||||
window_position_x as f32,
|
||||
window_position_y as f32,
|
||||
));
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Create and show the Window UI
|
||||
pub fn show_popup() -> Result<(), Box<dyn std::error::Error>> {
|
||||
pub fn show_popup(args: &OsdArgs) -> Result<(), Box<dyn std::error::Error>> {
|
||||
// Closure that adjusts winit WindowAttributes before Slint creates the window.
|
||||
let window_attrs = |attrs: WindowAttributes| {
|
||||
// Mark the X11 window as a Dock so the WM doesn't treat it as a normal window. Window type `Notification` didn't work. Fix later.
|
||||
@ -88,7 +107,7 @@ pub fn show_popup() -> Result<(), Box<dyn std::error::Error>> {
|
||||
let ui = OSDpopup::new()?;
|
||||
|
||||
// Send the data to the UI as properties
|
||||
set_ui_props(&ui);
|
||||
let _ = set_ui_props(&ui, args);
|
||||
|
||||
// Run the UI
|
||||
ui.run()?;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user