amdguid 1.0.12

AMDGPU fan control service
Documentation
use amdgpu::pidfile::ports::Output;
use egui::{Color32, Response, Sense, Stroke, Ui, Vec2};

use crate::app::StatefulConfig;

pub struct OutputWidget<'output, 'stateful> {
    output: &'output Output,
    state: &'stateful mut StatefulConfig,
}

impl<'output, 'stateful> OutputWidget<'output, 'stateful> {
    pub fn new(output: &'output Output, state: &'stateful mut StatefulConfig) -> Self {
        Self { output, state }
    }
}

impl<'output, 'stateful> egui::Widget for OutputWidget<'output, 'stateful> {
    fn ui(self, ui: &mut Ui) -> Response {
        let (rect, res) = ui.allocate_exact_size(Vec2::new(80.0, 80.0), Sense::click());
        if let Some(handle) = self.output.ty.and_then(|ty| self.state.textures.get(&ty)) {
            ui.image(handle.id(), handle.size_vec2());
        } else {
            let painter = ui.painter();
            painter.rect_filled(rect, 0.0, Color32::DARK_RED);
            painter.rect(
                rect,
                2.0,
                Color32::DARK_RED,
                Stroke {
                    width: 1.0,
                    color: Color32::GREEN,
                },
            );

            let rect_middle_point = (rect.max - rect.min) / 2.0;

            painter.circle_filled(
                rect.min + Vec2::new(rect_middle_point.x / 2.0, rect_middle_point.y),
                3.0,
                Color32::GREEN,
            );
            painter.circle_filled(rect.min + rect_middle_point, 3.0, Color32::GREEN);

            painter.circle_filled(
                rect.min
                    + Vec2::new(
                        rect_middle_point.x + (rect_middle_point.x / 2.0),
                        rect_middle_point.y,
                    ),
                3.0,
                Color32::GREEN,
            );
        }
        res
    }
}