start/stop logic

This commit is contained in:
Daniel Langbein 2025-02-11 20:35:03 +01:00
parent 0b46e51694
commit 62e65282b7
Signed by: langfingaz
GPG Key ID: 6C47C753F0823002

View File

@ -1,15 +1,25 @@
// Based on example from https://crates.io/crates/gtk4 // Based on examples
// - https://crates.io/crates/gtk4
// - https://github.com/gtk-rs/gtk4-rs/blob/main/examples/clock/main.rs
// - https://github.com/gtk-rs/gtk4-rs/blob/main/examples/clipboard/main.rs
// - https://github.com/kashifsoofi/blog-code-samples/blob/gtk4-c-counter-app/gtk4-rust-counter-app/src/main.rs
use chrono::Local; use chrono::Local;
use std::cell::Cell;
use std::rc::Rc;
use gtk4 as gtk; use gtk::glib;
use gtk::glib::clone;
use gtk::prelude::*; use gtk::prelude::*;
use gtk::{glib}; use gtk4 as gtk;
const APP_ID: &str = "de.privacy1st.pdt";
const DUR_MIN: f64 = 1.0;
const INTERVAL_SEC: u32 = 1;
fn main() -> glib::ExitCode { fn main() -> glib::ExitCode {
let application = gtk::Application::builder() let application = gtk::Application::builder().application_id(APP_ID).build();
.application_id("de.privacy1st.pdt")
.build();
application.connect_activate(build_ui); application.connect_activate(build_ui);
application.run() application.run()
} }
@ -33,18 +43,28 @@ fn build_ui(app: &gtk::Application) {
.spacing(24) .spacing(24)
.build(); .build();
// How to change variable using GTK4 Button? https://stackoverflow.com/a/76657798/6334421
let running = Rc::new(Cell::new(false));
let button_start = gtk::Button::with_label("Start"); let button_start = gtk::Button::with_label("Start");
button_start.connect_clicked(|_| { button_start.connect_clicked(clone!(@strong running => move |_| {
running.set(true);
eprintln!("Timer started."); eprintln!("Timer started.");
}); }));
container.append(&button_start); container.append(&button_start);
let button_stop = gtk::Button::with_label("Stop"); let button_stop = gtk::Button::with_label("Stop");
button_stop.connect_clicked(|_| { button_stop.connect_clicked(clone!(@strong running => move |_| {
eprintln!("Timer stopped."); running.set(false);
}); eprintln!("Timer stopped.");
}));
container.append(&button_stop); container.append(&button_stop);
let mut progress: f64 = 0.0;
let progress_bar = gtk::ProgressBar::new();
progress_bar.set_fraction(progress);
container.append(&progress_bar);
let time = current_time(); let time = current_time();
let label = gtk::Label::default(); let label = gtk::Label::default();
label.set_text(&time); label.set_text(&time);
@ -56,14 +76,23 @@ fn build_ui(app: &gtk::Application) {
// we are using a closure to capture the label (else we could also use a normal function) // we are using a closure to capture the label (else we could also use a normal function)
let tick = move || { let tick = move || {
if running.get() {
progress += ((INTERVAL_SEC as f64) / 60.0) / DUR_MIN;
progress_bar.set_fraction(progress);
}
if progress > 1.0 {
// todo
}
let time = current_time(); let time = current_time();
label.set_text(&time); label.set_text(&time);
// we could return glib::ControlFlow::Break to stop our clock after this tick // we could return glib::ControlFlow::Break to stop our clock after this tick
glib::ControlFlow::Continue glib::ControlFlow::Continue
}; };
// executes the closure once every second // executes the closure once every `INTERVAL_SEC` seconds
glib::timeout_add_seconds_local(1, tick); glib::timeout_add_seconds_local(INTERVAL_SEC, tick);
} }
fn current_time() -> String { fn current_time() -> String {