85 lines
3.0 KiB
Rust
85 lines
3.0 KiB
Rust
use std::vec;
|
|
use std::vec::Vec;
|
|
use std::time::{ SystemTime, UNIX_EPOCH };
|
|
|
|
use crate::window_manager::{ DrawInstructions, WindowLike, WindowLikeType, INDICATOR_HEIGHT };
|
|
use crate::messages::{ WindowMessage, WindowMessageResponse, ShortcutType };
|
|
use crate::framebuffer::Dimensions;
|
|
use crate::themes::ThemeInfo;
|
|
|
|
const WIDTH: usize = 15;
|
|
const ONE_MINUTE: u64 = 60;
|
|
const ONE_HOUR: u64 = 60 * ONE_MINUTE;
|
|
const ONE_DAY: u64 = 24 * ONE_HOUR;
|
|
|
|
pub struct WorkspaceIndicator {
|
|
dimensions: Dimensions,
|
|
current_workspace: u8,
|
|
}
|
|
|
|
impl WindowLike for WorkspaceIndicator {
|
|
fn handle_message(&mut self, message: WindowMessage) -> WindowMessageResponse {
|
|
match message {
|
|
WindowMessage::Init(dimensions) => {
|
|
self.dimensions = dimensions;
|
|
WindowMessageResponse::JustRedraw
|
|
},
|
|
WindowMessage::Shortcut(shortcut) => {
|
|
match shortcut {
|
|
ShortcutType::SwitchWorkspace(workspace) => {
|
|
self.current_workspace = workspace;
|
|
WindowMessageResponse::JustRedraw
|
|
},
|
|
_ => WindowMessageResponse::DoNothing,
|
|
}
|
|
},
|
|
_ => WindowMessageResponse::DoNothing,
|
|
}
|
|
}
|
|
|
|
//simple
|
|
fn draw(&self, theme_info: &ThemeInfo) -> Vec<DrawInstructions> {
|
|
let mut instructions = vec![
|
|
//background
|
|
DrawInstructions::Rect([0, 0], [self.dimensions[0], self.dimensions[1] - 1], theme_info.background),
|
|
//bottom border
|
|
DrawInstructions::Rect([0, self.dimensions[1] - 1], [self.dimensions[0], 1], theme_info.border_right_bottom),
|
|
];
|
|
for w in 0..9 {
|
|
if w == self.current_workspace as usize {
|
|
instructions.push(DrawInstructions::Rect([w * WIDTH, 0], [WIDTH, self.dimensions[1]], theme_info.top));
|
|
instructions.push(DrawInstructions::Text([w * WIDTH + 5, 4], vec!["nimbus-roman".to_string()], (w + 1).to_string(), theme_info.top_text, theme_info.top, None, None));
|
|
} else {
|
|
instructions.push(DrawInstructions::Text([w * WIDTH + 5, 4], vec!["nimbus-roman".to_string()], (w + 1).to_string(), theme_info.text, theme_info.background, None, None));
|
|
}
|
|
}
|
|
//also add the utc time in the right edge
|
|
let today_secs = SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs() % ONE_DAY;
|
|
let hours = (today_secs / ONE_HOUR).to_string();
|
|
let minutes = ((today_secs % ONE_HOUR) / ONE_MINUTE).to_string();
|
|
let time_string = format!("{}:{}~ UTC", if hours.len() == 1 { "0".to_string() + &hours } else { hours }, if minutes.len() == 1 { "0".to_string() + &minutes } else { minutes });
|
|
instructions.push(DrawInstructions::Text([self.dimensions[0] - 90, 4], vec!["nimbus-roman".to_string()], time_string, theme_info.text, theme_info.background, None, None));
|
|
instructions
|
|
}
|
|
|
|
//properties
|
|
fn subtype(&self) -> WindowLikeType {
|
|
WindowLikeType::WorkspaceIndicator
|
|
}
|
|
|
|
fn ideal_dimensions(&self, dimensions: Dimensions) -> Dimensions {
|
|
[dimensions[0], INDICATOR_HEIGHT]
|
|
}
|
|
}
|
|
|
|
impl WorkspaceIndicator {
|
|
pub fn new() -> Self {
|
|
Self {
|
|
dimensions: [0, 0],
|
|
current_workspace: 0,
|
|
}
|
|
}
|
|
}
|
|
|
|
|