Pseudo pseudorandom color picker

This commit is contained in:
Alexey 2025-09-18 16:30:37 +03:00
commit 218ee49a8b
7 changed files with 75 additions and 15 deletions

View file

@ -1,5 +1,5 @@
use config::Config;
use std::path::PathBuf;
use std::{hash::{DefaultHasher, Hash, Hasher}, path::PathBuf};
pub mod config;
pub mod log;
@ -13,3 +13,11 @@ pub fn load_config() -> Config {
}
Config::new(PathBuf::from("./config.toml"))
}
/// Get random-like color id in range 0..16 by computing string hash
pub fn color_id_from_name(name: String) -> i32 {
let mut s = DefaultHasher::new();
name.hash(&mut s);
let hash = s.finish();
(hash.count_ones() / 4) as i32
}

View file

@ -3,7 +3,7 @@
use std::{error::Error, rc::Rc, sync::{Arc, Mutex}};
use aliveline::{config::Config, load_config, log::{Event, Log}};
use aliveline::{color_id_from_name, config::Config, load_config, log::{Event, Log}};
use chrono::{Datelike, Timelike};
use slint::{Model, ModelRc, SharedString, ToSharedString, VecModel, Weak};
use toml::value::{Date as TomlDate, Time};
@ -22,7 +22,8 @@ impl From<Event> for TimelineEvent {
start,
duration: end - start,
label: event.name.to_shared_string(),
finished: event.finished
finished: event.finished,
color_id: color_id_from_name(event.name)
}
}
}
@ -143,8 +144,9 @@ fn main() -> Result<(), Box<dyn Error>> {
let event = TimelineEvent {
duration: 0,
finished: false,
label: event_name,
start: offset
label: event_name.clone(),
start: offset,
color_id: color_id_from_name(event_name.to_string())
};
{
@ -177,8 +179,9 @@ fn main() -> Result<(), Box<dyn Error>> {
let new_event = TimelineEvent {
duration: offset - event.start,
finished: true,
label: event.label,
start: event.start
label: event.label.clone(),
start: event.start,
color_id: color_id_from_name(event.label.to_string())
};
{
@ -215,7 +218,7 @@ fn main() -> Result<(), Box<dyn Error>> {
let maybe_unfinished_event = log_guard.events.iter().find(|event| !event.finished);
match maybe_unfinished_event {
Some(unfinished_event) => Some(Event::new(unfinished_event.name.clone(), 0, 0, false)),
None => None
_ => None
}
};