// Copyright (c) 2022 Marceline Cramer // SPDX-License-Identifier: AGPL-3.0-or-later #[global_allocator] static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT; pub mod anim; pub mod main_menu; pub mod music_player; pub mod style; pub mod widgets; use api::*; use canary_script::*; use main_menu::MainMenuPanel; use music_player::MusicPlayerPanel; use widgets::Widget; export_abi!(bind_panel_impl); fn bind_panel_impl(panel: Panel, protocol: Message, msg: Message) -> Box { let protocol = protocol.to_vec(); let protocol = String::from_utf8(protocol).unwrap(); match protocol.as_str() { "tebibyte-media.desktop.music-player-controller" => MusicPlayerPanel::bind(panel, msg), "wip-dialog" => ConfirmationDialogPanel::bind(panel, msg), _ => MainMenuPanel::bind(panel, msg), } } pub const ICON_FONT: &str = "Iosevka Nerd Font"; pub const DISPLAY_FONT: &str = "Homenaje"; pub const CONTENT_FONT: &str = "Ubuntu"; pub struct ConfirmationDialogPanel { panel: Panel, dialog: widgets::dialog::Dialog, } impl PanelImpl for ConfirmationDialogPanel { fn update(&mut self, dt: f32) { self.dialog.update(dt); } fn draw(&mut self) { let ctx = DrawContext::new(self.panel); self.dialog.draw(&ctx); } fn on_cursor_event(&mut self, kind: CursorEventKind, at: Vec2) { self.dialog.on_cursor_event(kind, at.into()); } fn on_resize(&mut self, size: Vec2) { self.dialog.resize(size); } fn on_message(&mut self, _msg: Message) {} } impl ConfirmationDialogPanel { pub fn bind(panel: Panel, msg: Message) -> Box { // let msg = msg.to_vec(); // let info: DialogInfo = serde_json::from_slice(&msg).unwrap(); let info = DialogInfo { title: "Hello world!".to_string(), content: "Testing, testing...".to_string(), responses: vec![DialogResponse::Yes, DialogResponse::No], }; use widgets::dialog::*; let style = DialogStyle::default(); let dialog = Dialog::new(style, &info); Box::new(Self { panel, dialog }) } }