1
0
Fork 0
mirror of https://github.com/Zedfrigg/ironbar.git synced 2025-07-03 19:51:03 +02:00

feat: dynamic tooltips

Resolves #36
This commit is contained in:
Jake Stanger 2022-11-30 22:27:56 +00:00
parent 1320639d4e
commit d20972cb32
No known key found for this signature in database
GPG key ID: C51FC8F9CB0BEA61
7 changed files with 79 additions and 36 deletions

View file

@ -5,17 +5,20 @@ use std::sync::{Arc, Mutex};
use tokio::spawn;
#[derive(Debug)]
enum DynamicLabelSegment {
enum DynamicStringSegment {
Static(String),
Dynamic(Script),
}
pub struct DynamicLabel {
pub label: gtk::Label,
pub struct DynamicString {
// pub label: gtk::Label,
}
impl DynamicLabel {
pub fn new(label: gtk::Label, input: &str) -> Self {
impl DynamicString {
pub fn new<F>(input: &str, f: F) -> Self
where
F: FnMut(String) -> Continue + 'static,
{
let mut segments = vec![];
let mut chars = input.chars().collect::<Vec<_>>();
@ -36,7 +39,7 @@ impl DynamicLabel {
let len = str.len();
(
DynamicLabelSegment::Dynamic(Script::from(str.as_str())),
DynamicStringSegment::Dynamic(Script::from(str.as_str())),
len + SKIP_BRACKETS,
)
} else {
@ -49,7 +52,7 @@ impl DynamicLabel {
let len = str.len();
(DynamicLabelSegment::Static(str), len)
(DynamicStringSegment::Static(str), len)
};
assert_ne!(skip, 0);
@ -63,13 +66,13 @@ impl DynamicLabel {
for (i, segment) in segments.into_iter().enumerate() {
match segment {
DynamicLabelSegment::Static(str) => {
DynamicStringSegment::Static(str) => {
label_parts
.lock()
.expect("Failed to get lock on label parts")
.insert(i, str);
}
DynamicLabelSegment::Dynamic(script) => {
DynamicStringSegment::Dynamic(script) => {
let tx = tx.clone();
let label_parts = label_parts.clone();
@ -77,11 +80,21 @@ impl DynamicLabel {
script
.run(|(out, _)| {
if let OutputStream::Stdout(out) = out {
label_parts
let mut label_parts = label_parts
.lock()
.expect("Failed to get lock on label parts")
.expect("Failed to get lock on label parts");
label_parts
// .lock()
// .expect("Failed to get lock on label parts")
.insert(i, out);
tx.send(()).expect("Failed to send update");
let string = label_parts
.iter()
.map(|(_, part)| part.as_str())
.collect::<String>();
tx.send(string).expect("Failed to send update");
}
})
.await;
@ -90,25 +103,22 @@ impl DynamicLabel {
}
}
tx.send(()).expect("Failed to send update");
// initialize
{
let label = label.clone();
rx.attach(None, move |_| {
let new_label = label_parts
.lock()
.expect("Failed to get lock on label parts")
.iter()
.map(|(_, part)| part.as_str())
.collect::<String>();
let label_parts = label_parts
.lock()
.expect("Failed to get lock on label parts")
.iter()
.map(|(_, part)| part.as_str())
.collect::<String>();
label.set_label(new_label.as_str());
Continue(true)
});
tx.send(label_parts).expect("Failed to send update");
}
Self { label }
rx.attach(None, f);
// Self { label }
Self {}
}
}
@ -121,7 +131,13 @@ mod tests {
// TODO: see if we can run gtk tests in ci
if gtk::init().is_ok() {
let label = gtk::Label::new(None);
DynamicLabel::new(label, "Uptime: {{1000:uptime -p | cut -d ' ' -f2-}}");
DynamicString::new(
"Uptime: {{1000:uptime -p | cut -d ' ' -f2-}}",
move |string| {
label.set_label(string);
Continue(true)
},
);
}
}
}