streamduck_core/thread/rendering/
custom.rs1use std::collections::HashMap;
2use std::sync::Arc;
3use image::DynamicImage;
4use streamdeck::{DeviceImage, StreamDeck};
5use tokio::sync::{RwLock, RwLockReadGuard};
6use crate::core::button::Button;
7use crate::core::{CoreHandle, UniqueButton};
8use crate::modules::components::UIValue;
9use crate::thread::rendering::RendererComponent;
10
11pub struct DeviceReference<'a> {
15 streamdeck: &'a mut StreamDeck,
16 key: u8,
17}
18
19#[allow(dead_code)]
20impl<'a> DeviceReference<'a> {
21 pub(crate) fn new(streamdeck: &'a mut StreamDeck, key: u8) -> Self {
22 Self {
23 streamdeck,
24 key
25 }
26 }
27
28 pub fn write_image(&mut self, image: &DeviceImage) -> Result<(), streamdeck::Error> {
30 self.streamdeck.write_button_image(self.key, image)
31 }
32}
33
34#[allow(unused_variables)]
36#[async_trait]
37pub trait CustomRenderer: Send + Sync {
38 fn name(&self) -> String;
40
41 async fn refresh(&self, core_handle: &CoreHandle) {}
43
44 async fn render(&self, key: u8, button: &UniqueButton, core_handle: &CoreHandle, streamdeck: &mut DeviceReference) {}
46
47 async fn representation(&self, key: u8, button: &UniqueButton, core_handle: &CoreHandle) -> Option<DynamicImage> { None }
49
50 async fn component_values(&self, button: &Button, component: &RendererComponent, core_handle: &CoreHandle) -> Vec<UIValue> { vec![] }
52
53 async fn set_component_value(&self, button: &mut Button, component: &mut RendererComponent, core_handle: &CoreHandle, value: Vec<UIValue>) { }
55}
56
57pub type UniqueRenderer = Arc<dyn CustomRenderer>;
59
60#[derive(Default)]
62pub struct RenderingManager {
63 renderers: RwLock<HashMap<String, UniqueRenderer>>
64}
65
66impl RenderingManager {
67 pub fn new() -> Arc<Self> {
69 Arc::new(Self::default())
70 }
71
72 pub async fn add_custom_renderer(&self, renderer: UniqueRenderer) {
74 let mut lock = self.renderers.write().await;
75 lock.insert(renderer.name(), renderer);
76 }
77
78 pub async fn get_renderers(&self) -> HashMap<String, UniqueRenderer> {
80 self.renderers.read().await.clone()
81 }
82
83 pub async fn read_renderers(&self) -> RwLockReadGuard<'_, HashMap<String, UniqueRenderer>> {
85 self.renderers.read().await
86 }
87}