sysinfo-gui 0.1.18

A cross-platform system-monitoring gui application based on sysinfo and fltk
use crate::gui::styles::colors::*;
use crate::view::MyView;
use fltk::{enums::*, prelude::*, *};
use fltk_extras::{
    button::{RoundToggle, Toggle},
    slider::FancyHorSlider,
};
use std::sync::atomic::Ordering;

pub fn settings(view: &MyView) -> Option<Box<dyn FnMut() + Send>> {
    let mut win = unsafe {
        let mut win = window::Window::from_widget_ptr(app::first_window().unwrap().as_widget_ptr());
        win.assume_derived();
        win
    };
    let mut row = group::Flex::default().row();
    {
        frame::Frame::default()
            .with_align(Align::Left | Align::Inside)
            .with_label("Light mode:");
        let col = group::Flex::default().column();
        frame::Frame::default();
        let mut t = Toggle::default();
        t.set_value(view.light_mode.load(Ordering::Relaxed));
        let light_mode = view.light_mode.clone();
        t.set_callback(move |t| {
            if t.value() {
                app::foreground(50, 50, 50);
                app::background(255, 255, 255);
                light_mode.store(true, Ordering::Relaxed);
            } else {
                app::foreground(255, 255, 255);
                let (r, g, b) = GRAY.to_rgb();
                app::background(r, g, b);
                light_mode.store(false, Ordering::Relaxed);
            }
            app::redraw();
        });
        frame::Frame::default();
        col.end();
        row.fixed(&col, 80);
        row.end();
        let mut row = group::Flex::default().row();
        frame::Frame::default()
            .with_align(Align::Left | Align::Inside)
            .with_label("Enable logging:");
        let col = group::Flex::default().column();
        frame::Frame::default();
        let mut t = RoundToggle::default();
        t.set_value(false);
        t.set_callback({
            move |t| {
                if t.value() {
                    eprintln!("Logging is not yet added!");
                }
                app::redraw();
            }
        });
        frame::Frame::default();
        col.end();
        row.fixed(&col, 80);
        row.end();
        let mut row = group::Flex::default().row();
        frame::Frame::default()
            .with_align(Align::Left | Align::Inside)
            .with_label("Sleep duration:");
        let col = group::Flex::default().column();
        frame::Frame::default();
        let mut slider = FancyHorSlider::default().with_size(40, 10);
        let val = view.sleep.load(Ordering::Relaxed);
        let mut f = frame::Frame::default()
            .with_size(0, 40)
            .with_label(&format!("{} ms", val));
        slider.set_value((val as f64 - 100.) / 1000.);
        let sleep = view.sleep.clone();
        slider.set_callback(move |s| {
            let val = (s.value() * 1000.) as u64 + 100;
            f.set_label(&format!("{} ms", val));
            sleep.store(val, Ordering::Relaxed);
        });
        frame::Frame::default();
        col.end();
        row.fixed(&col, 80);
        row.end();
        let mut row = group::Flex::default().row();
        frame::Frame::default()
            .with_align(Align::Left | Align::Inside)
            .with_label("Window Opacity:");
        let col = group::Flex::default().column();
        frame::Frame::default();
        let mut slider = FancyHorSlider::default().with_size(40, 20);
        let opacity = win.opacity();
        let mut f = frame::Frame::default()
            .with_size(0, 40)
            .with_label(&format!("{}%", ((opacity * 100.) as i32)));
        slider.set_value(opacity);
        slider.set_callback(move |s| {
            let val = s.value();
            f.set_label(&format!("{}%", ((val * 100.) as i32)));
            win.set_opacity(val);
        });
        frame::Frame::default();
        col.end();
        row.fixed(&col, 80);
    }
    row.end();
    None
}