use crate::components::monitor::Widget; pub use super::*; mod imp; use chrono::{prelude::*, DateTime, Duration, Utc}; use gtk::glib::{self, clone}; use gtk::prelude::*; use gtk::subclass::prelude::ObjectSubclassIsExt; glib::wrapper! { pub struct WidgetFrame(ObjectSubclass) @extends gtk::Widget; } impl Default for WidgetFrame { fn default() -> Self { Self::new() } } impl WidgetFrame { pub fn new() -> Self { let this: Self = glib::Object::new(); let frame = gtk::Frame::new(None); frame.set_hexpand(true); frame.set_vexpand(true); let drawing_area = gtk::DrawingArea::new(); let settings = gtk::Settings::default().unwrap(); let prefers_dark_theme = settings.is_gtk_application_prefer_dark_theme(); frame.set_child(Some(&drawing_area)); frame.set_parent(&this); this.imp().drawing_area.replace(Some(drawing_area)); this } pub fn set_widget(&self, widget: Box) { self.imp().widget.replace(Some(widget)); let drawing_area = self.imp().drawing_area.borrow(); let drawing_area = drawing_area.as_ref().unwrap(); let widget = self.imp().widget.clone(); let widget_ref = widget.borrow(); let widget_ref = widget_ref.as_ref().unwrap(); let (w, h) = widget_ref.size(); let margin = widget_ref.margin(); let location = widget_ref.location(); self.set_halign(location.0); self.set_valign(location.1); self.set_margin_top(margin[0]); self.set_margin_bottom(margin[2]); self.set_margin_start(margin[3]); self.set_margin_end(margin[1]); self.set_width_request(w as i32); self.set_height_request(h as i32); let padding = widget_ref.padding(); drawing_area.set_margin_top(padding[0]); drawing_area.set_margin_bottom(padding[2]); drawing_area.set_margin_start(padding[3]); drawing_area.set_margin_end(padding[1]); drawing_area.set_height_request(h as i32 - padding[0] - padding[2]); drawing_area.set_width_request(w as i32 - padding[1] - padding[3]); drawing_area.set_draw_func(clone!(@strong widget => move |_, canvas, x, y| { let widget = widget.borrow(); let widget = widget.as_ref().unwrap(); // widget.cairo_render(canvas,x as f32,y as f32); })); drawing_area.queue_draw(); } }