parent
dba83eb64a
commit
f3cd64ab56
@ -1,3 +1,188 @@ |
||||
pub mod cpu; |
||||
pub mod memory; |
||||
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