parent
dba83eb64a
commit
f3cd64ab56
@ -1,3 +1,188 @@ |
|||||||
pub mod cpu; |
pub mod cpu; |
||||||
pub mod memory; |
pub mod memory; |
||||||
pub mod time; |
pub mod time; |
||||||
|
|
||||||
|
use std::ops::Deref; |
||||||
|
|
||||||
|
use serde::Serialize; |
||||||
|
|
||||||
|
use crate::protocol::i3bar_event::{I3BarEventButton, I3BarEventModifier}; |
||||||
|
|
||||||
|
pub trait Block { |
||||||
|
fn id(&self) -> usize; |
||||||
|
|
||||||
|
fn name(&self) -> &str; |
||||||
|
|
||||||
|
fn run(&mut self, event_r: flume::Receiver<BlockEvent>, update_s: flume::Sender<BlockUpdate>); |
||||||
|
} |
||||||
|
|
||||||
|
#[derive(Clone, Debug)] |
||||||
|
pub enum BlockUpdate { |
||||||
|
Single(BlockInfo), |
||||||
|
Multi(Vec<BlockInfo>), |
||||||
|
} |
||||||
|
|
||||||
|
#[derive(Clone, Debug, Default)] |
||||||
|
pub struct BlockInfo { |
||||||
|
pub part_name: BlockPartName, |
||||||
|
pub full_text: String, |
||||||
|
pub short_text: Option<String>, |
||||||
|
pub fg_color: Color, |
||||||
|
pub bg_color: Color, |
||||||
|
pub border: Option<BlockBorder>, |
||||||
|
pub min_width: Option<i32>, |
||||||
|
pub urgent: Option<bool>, |
||||||
|
} |
||||||
|
|
||||||
|
impl BlockInfo { |
||||||
|
pub fn from_main(full_text: String) -> BlockInfoBuilder { |
||||||
|
BlockInfoBuilder::new(full_text, BlockPartName::Main) |
||||||
|
} |
||||||
|
|
||||||
|
pub fn from_named(name: String, full_text: String) -> BlockInfoBuilder { |
||||||
|
BlockInfoBuilder::new(full_text, BlockPartName::Named(name)) |
||||||
|
} |
||||||
|
|
||||||
|
pub fn from_unnamed(full_text: String) -> BlockInfoBuilder { |
||||||
|
BlockInfoBuilder::new(full_text, BlockPartName::Unnamed) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
pub struct BlockInfoBuilder { |
||||||
|
inner: BlockInfo, |
||||||
|
} |
||||||
|
|
||||||
|
impl BlockInfoBuilder { |
||||||
|
pub fn new(full_text: String, part_name: BlockPartName) -> Self { |
||||||
|
Self { |
||||||
|
inner: BlockInfo { |
||||||
|
full_text, |
||||||
|
part_name, |
||||||
|
..Default::default() |
||||||
|
}, |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
pub fn short_text(mut self, short_text: Option<String>) -> Self { |
||||||
|
self.inner.short_text = short_text; |
||||||
|
self |
||||||
|
} |
||||||
|
|
||||||
|
pub fn fg_color(mut self, fg_color: Color) -> Self { |
||||||
|
self.inner.fg_color = fg_color; |
||||||
|
self |
||||||
|
} |
||||||
|
|
||||||
|
pub fn bg_color(mut self, bg_color: Color) -> Self { |
||||||
|
self.inner.bg_color = bg_color; |
||||||
|
self |
||||||
|
} |
||||||
|
|
||||||
|
pub fn border(mut self, border: Option<BlockBorder>) -> Self { |
||||||
|
self.inner.border = border; |
||||||
|
self |
||||||
|
} |
||||||
|
|
||||||
|
pub fn min_width(mut self, min_width: Option<i32>) -> Self { |
||||||
|
self.inner.min_width = min_width; |
||||||
|
self |
||||||
|
} |
||||||
|
|
||||||
|
pub fn urgent(mut self, urgent: Option<bool>) -> Self { |
||||||
|
self.inner.urgent = urgent; |
||||||
|
self |
||||||
|
} |
||||||
|
|
||||||
|
pub fn build(self) -> BlockInfo { |
||||||
|
self.inner |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
impl Deref for BlockInfoBuilder { |
||||||
|
type Target = BlockInfo; |
||||||
|
|
||||||
|
fn deref(&self) -> &Self::Target { |
||||||
|
&self.inner |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
#[derive(Clone, Debug)] |
||||||
|
pub enum BlockPartName { |
||||||
|
Main, |
||||||
|
Unnamed, |
||||||
|
Named(String), |
||||||
|
} |
||||||
|
|
||||||
|
impl From<&str> for BlockPartName { |
||||||
|
fn from(part_name_raw: &str) -> Self { |
||||||
|
match part_name_raw { |
||||||
|
"__main" => Self::Main, |
||||||
|
"__unnamed" => Self::Unnamed, |
||||||
|
s => Self::Named(s.to_owned()), |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
impl From<BlockPartName> for String { |
||||||
|
fn from(block_part_name: BlockPartName) -> Self { |
||||||
|
match block_part_name { |
||||||
|
BlockPartName::Main => String::from("__main"), |
||||||
|
BlockPartName::Unnamed => String::from("__unnamed"), |
||||||
|
BlockPartName::Named(s) => s, |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
impl Default for BlockPartName { |
||||||
|
fn default() -> Self { |
||||||
|
Self::Main |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
#[derive(Clone, Copy, Debug, Default)] |
||||||
|
pub struct BlockBorder { |
||||||
|
pub color: Color, |
||||||
|
pub border_top: Option<i32>, |
||||||
|
pub top: Option<i32>, |
||||||
|
pub right: Option<i32>, |
||||||
|
pub bottom: Option<i32>, |
||||||
|
pub left: Option<i32>, |
||||||
|
} |
||||||
|
|
||||||
|
#[derive(Clone, Copy, Debug)] |
||||||
|
pub enum Color { |
||||||
|
Default, |
||||||
|
Rgb(u8, u8, u8), |
||||||
|
Rgba(u8, u8, u8, u8), |
||||||
|
} |
||||||
|
|
||||||
|
impl Color { |
||||||
|
pub fn to_hex(&self) -> Option<String> { |
||||||
|
match *self { |
||||||
|
Color::Default => None, |
||||||
|
Color::Rgb(r, g, b) => Some(format!("#{:02x}{:02x}{:02x}", r, g, b)), |
||||||
|
Color::Rgba(r, g, b, a) => Some(format!("#{:02x}{:02x}{:02x}{:02x}", r, g, b, a)), |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
impl Default for Color { |
||||||
|
fn default() -> Self { |
||||||
|
Self::Default |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
#[derive(Clone, Debug)] |
||||||
|
pub struct BlockEvent { |
||||||
|
pub part_name: BlockPartName, |
||||||
|
pub button: I3BarEventButton, |
||||||
|
pub modifiers: Vec<I3BarEventModifier>, |
||||||
|
} |
||||||
|
|
||||||
|
pub trait BlockConfig: Block { |
||||||
|
type Config: Serialize; |
||||||
|
|
||||||
|
fn new(id: usize, block_config: Self::Config, shared_config: String) -> std::io::Result<Self> |
||||||
|
where |
||||||
|
Self: Sized; |
||||||
|
} |
||||||
|
Loading…
Reference in new issue