From c93454358f39a970da51536d9cebb6243277626e Mon Sep 17 00:00:00 2001 From: ALEZ-DEV Date: Thu, 16 Jan 2025 19:24:51 +0100 Subject: [PATCH] add menu --- babylonia-terminal-gui/src/ui/mod.rs | 121 +++++++++++++++++++-------- 1 file changed, 87 insertions(+), 34 deletions(-) diff --git a/babylonia-terminal-gui/src/ui/mod.rs b/babylonia-terminal-gui/src/ui/mod.rs index 9308dc0..450385c 100644 --- a/babylonia-terminal-gui/src/ui/mod.rs +++ b/babylonia-terminal-gui/src/ui/mod.rs @@ -14,8 +14,11 @@ use relm4::{ prelude::{BoxExt, ButtonExt, GtkWindowExt, OrientableExt, WidgetExt}, }, loading_widgets::LoadingWidgets, - prelude::{AsyncComponentParts, SimpleAsyncComponent}, - view, Component, RelmApp, RelmWidgetExt, WorkerController, + prelude::{ + AsyncComponent, AsyncComponentController, AsyncComponentParts, AsyncController, + SimpleAsyncComponent, + }, + view, Component, ComponentController, Controller, RelmApp, RelmWidgetExt, WorkerController, }; use crate::APP_RESOURCE_PATH; @@ -26,19 +29,23 @@ pub fn run(app: RelmApp) { #[derive(Debug)] pub enum MainWindowMsg { + ToggleMenuVisibility, + SelectPage, SetIsGameRunning(bool), } struct MainWindow { - game_handler: WorkerController, game_state: GameState, + game_handler: WorkerController, is_game_running: bool, + is_menu_visible: bool, } impl MainWindow { - fn new(game_state: GameState, sender: relm4::AsyncComponentSender) -> Self { + fn new(game_state: GameState, sender: &relm4::AsyncComponentSender) -> Self { MainWindow { game_state, + is_menu_visible: false, is_game_running: false, game_handler: manager::HandleGameProcess::builder() .detach_worker(()) @@ -61,45 +68,89 @@ impl SimpleAsyncComponent for MainWindow { gtk::Box { set_orientation: gtk::Orientation::Vertical, - adw::HeaderBar, + adw::Flap { + #[watch] + set_reveal_flap: model.is_menu_visible, + set_margin_all: 0, + set_fold_policy: adw::FlapFoldPolicy::Auto, - gtk::Box { - set_orientation: gtk::Orientation::Vertical, - set_vexpand: true, - set_margin_horizontal: 50, - set_valign: gtk::Align::Center, + #[wrap(Some)] + set_flap = >k::Box { + set_orientation: gtk::Orientation::Vertical, - adw::PreferencesPage { - add = &adw::PreferencesGroup { - gtk::Picture { - set_resource: Some(&format!("{APP_RESOURCE_PATH}/icons/hicolor/scalable/apps/icon.png")), - set_vexpand: true, + gtk::ListBox { + set_width_request: 250, + set_margin_all: 10, + + append = >k::Button { + set_margin_vertical: 5, + set_label: "Item 1", }, - gtk::Label { - set_label: "Babylonia Terminal", - set_margin_top: 24, - add_css_class: "title-1", + append = >k::Button { + set_margin_vertical: 5, + set_label: "Item 2" + }, + + append = >k::Button { + set_margin_vertical: 5, + set_label: "Item 3", + }, + }, + }, + + #[wrap(Some)] + set_content = >k::Box { + set_orientation: gtk::Orientation::Vertical, + + adw::HeaderBar { + pack_start = >k::Button { + set_label: "Menu", + connect_clicked => MainWindowMsg::ToggleMenuVisibility, }, }, - add = &adw::PreferencesGroup { - gtk::Button { - set_css_classes: &["suggested-action", "pill"], + gtk::Box { + set_orientation: gtk::Orientation::Vertical, + set_vexpand: true, + set_margin_horizontal: 50, + set_valign: gtk::Align::Center, - set_label: "Start game", - set_hexpand: false, - set_width_request: 200, + adw::PreferencesPage { + add = &adw::PreferencesGroup { + gtk::Picture { + set_resource: Some(&format!("{APP_RESOURCE_PATH}/icons/hicolor/scalable/apps/icon.png")), + set_vexpand: true, + }, - #[watch] - set_sensitive: !model.is_game_running, - connect_clicked[sender = model.game_handler.sender().clone()] => move |_| { - sender.send(manager::HandleGameProcessMsg::RunGame).unwrap(); + gtk::Label { + set_label: "Babylonia Terminal", + set_margin_top: 24, + add_css_class: "title-1", + }, + }, + + add = &adw::PreferencesGroup { + set_margin_vertical: 48, + + gtk::Button { + set_css_classes: &["suggested-action", "pill"], + + set_label: "Start game", + set_hexpand: false, + set_width_request: 200, + + #[watch] + set_sensitive: !model.is_game_running, + connect_clicked[sender = model.game_handler.sender().clone()] => move |_| { + sender.send(manager::HandleGameProcessMsg::RunGame).unwrap(); + }, + }, }, }, - } - }, - } + }, + } + }, } } } @@ -115,10 +166,10 @@ impl SimpleAsyncComponent for MainWindow { babylonia_terminal_sdk::game_state::GameState::get_current_state() .await .unwrap(), - sender, + &sender, ); } else { - model = MainWindow::new(game_state.unwrap(), sender); + model = MainWindow::new(game_state.unwrap(), &sender); } let widgets = view_output!(); @@ -147,6 +198,8 @@ impl SimpleAsyncComponent for MainWindow { async fn update(&mut self, message: Self::Input, _sender: relm4::AsyncComponentSender) { match message { + MainWindowMsg::ToggleMenuVisibility => self.is_menu_visible = !self.is_menu_visible, + MainWindowMsg::SelectPage => println!("Tried to select a new page"), MainWindowMsg::SetIsGameRunning(value) => self.is_game_running = value, } }