1use std::sync::Arc;
2
3use elgato_streamdeck::AsyncStreamDeck;
4
5use crate::{
6 button::RenderConfig,
7 navigation::NavigationEntry,
8 theme::Theme,
9 view::DisplayManager,
10};
11
12pub async fn run<N, W, H, C>(
17 theme: Theme,
18 config: RenderConfig,
19 deck: Arc<AsyncStreamDeck>,
20 context: C,
21) -> Result<(), Box<dyn std::error::Error>>
22where
23 W: generic_array::ArrayLength,
24 H: generic_array::ArrayLength,
25 C: Send + Sync + Clone + 'static,
26 N: NavigationEntry<W, H, C>,
27{
28 let (display_manager, mut navigation_receiver) =
29 DisplayManager::<N, W, H, C>::new(deck.clone(), config, theme, context)?;
30
31 display_manager.fetch_all().await?;
32 display_manager.render().await?;
33
34 let reader = deck.get_reader();
35 loop {
36 let events_future = reader.read(10.0);
37 let navigation_future = navigation_receiver.recv();
38 tokio::select! {
39 events = events_future => {
40 let events = events?;
41 for event in events {
42 match event {
43 elgato_streamdeck::DeviceStateUpdate::ButtonDown(id) => {
44 display_manager.on_press(id).await?;
45 }
46 elgato_streamdeck::DeviceStateUpdate::ButtonUp(id) => {
47 display_manager.on_release(id).await?;
48 }
49 _ => {}
50 }
51 }
52 }
53 Some(navigation) = navigation_future => {
54 display_manager.navigate_to(navigation).await?;
55 display_manager.fetch_all().await?;
56 display_manager.render().await?;
57 }
58 }
59 }
60}