This commit is contained in:
ALEZ-DEV 2025-01-16 19:24:51 +01:00
parent 08364f8624
commit c93454358f

View File

@ -14,8 +14,11 @@ use relm4::{
prelude::{BoxExt, ButtonExt, GtkWindowExt, OrientableExt, WidgetExt}, prelude::{BoxExt, ButtonExt, GtkWindowExt, OrientableExt, WidgetExt},
}, },
loading_widgets::LoadingWidgets, loading_widgets::LoadingWidgets,
prelude::{AsyncComponentParts, SimpleAsyncComponent}, prelude::{
view, Component, RelmApp, RelmWidgetExt, WorkerController, AsyncComponent, AsyncComponentController, AsyncComponentParts, AsyncController,
SimpleAsyncComponent,
},
view, Component, ComponentController, Controller, RelmApp, RelmWidgetExt, WorkerController,
}; };
use crate::APP_RESOURCE_PATH; use crate::APP_RESOURCE_PATH;
@ -26,19 +29,23 @@ pub fn run(app: RelmApp<MainWindowMsg>) {
#[derive(Debug)] #[derive(Debug)]
pub enum MainWindowMsg { pub enum MainWindowMsg {
ToggleMenuVisibility,
SelectPage,
SetIsGameRunning(bool), SetIsGameRunning(bool),
} }
struct MainWindow { struct MainWindow {
game_handler: WorkerController<manager::HandleGameProcess>,
game_state: GameState, game_state: GameState,
game_handler: WorkerController<manager::HandleGameProcess>,
is_game_running: bool, is_game_running: bool,
is_menu_visible: bool,
} }
impl MainWindow { impl MainWindow {
fn new(game_state: GameState, sender: relm4::AsyncComponentSender<Self>) -> Self { fn new(game_state: GameState, sender: &relm4::AsyncComponentSender<Self>) -> Self {
MainWindow { MainWindow {
game_state, game_state,
is_menu_visible: false,
is_game_running: false, is_game_running: false,
game_handler: manager::HandleGameProcess::builder() game_handler: manager::HandleGameProcess::builder()
.detach_worker(()) .detach_worker(())
@ -61,45 +68,89 @@ impl SimpleAsyncComponent for MainWindow {
gtk::Box { gtk::Box {
set_orientation: gtk::Orientation::Vertical, 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 { #[wrap(Some)]
set_orientation: gtk::Orientation::Vertical, set_flap = &gtk::Box {
set_vexpand: true, set_orientation: gtk::Orientation::Vertical,
set_margin_horizontal: 50,
set_valign: gtk::Align::Center,
adw::PreferencesPage { gtk::ListBox {
add = &adw::PreferencesGroup { set_width_request: 250,
gtk::Picture { set_margin_all: 10,
set_resource: Some(&format!("{APP_RESOURCE_PATH}/icons/hicolor/scalable/apps/icon.png")),
set_vexpand: true, append = &gtk::Button {
set_margin_vertical: 5,
set_label: "Item 1",
}, },
gtk::Label { append = &gtk::Button {
set_label: "Babylonia Terminal", set_margin_vertical: 5,
set_margin_top: 24, set_label: "Item 2"
add_css_class: "title-1", },
append = &gtk::Button {
set_margin_vertical: 5,
set_label: "Item 3",
},
},
},
#[wrap(Some)]
set_content = &gtk::Box {
set_orientation: gtk::Orientation::Vertical,
adw::HeaderBar {
pack_start = &gtk::Button {
set_label: "Menu",
connect_clicked => MainWindowMsg::ToggleMenuVisibility,
}, },
}, },
add = &adw::PreferencesGroup { gtk::Box {
gtk::Button { set_orientation: gtk::Orientation::Vertical,
set_css_classes: &["suggested-action", "pill"], set_vexpand: true,
set_margin_horizontal: 50,
set_valign: gtk::Align::Center,
set_label: "Start game", adw::PreferencesPage {
set_hexpand: false, add = &adw::PreferencesGroup {
set_width_request: 200, gtk::Picture {
set_resource: Some(&format!("{APP_RESOURCE_PATH}/icons/hicolor/scalable/apps/icon.png")),
set_vexpand: true,
},
#[watch] gtk::Label {
set_sensitive: !model.is_game_running, set_label: "Babylonia Terminal",
connect_clicked[sender = model.game_handler.sender().clone()] => move |_| { set_margin_top: 24,
sender.send(manager::HandleGameProcessMsg::RunGame).unwrap(); 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() babylonia_terminal_sdk::game_state::GameState::get_current_state()
.await .await
.unwrap(), .unwrap(),
sender, &sender,
); );
} else { } else {
model = MainWindow::new(game_state.unwrap(), sender); model = MainWindow::new(game_state.unwrap(), &sender);
} }
let widgets = view_output!(); let widgets = view_output!();
@ -147,6 +198,8 @@ impl SimpleAsyncComponent for MainWindow {
async fn update(&mut self, message: Self::Input, _sender: relm4::AsyncComponentSender<Self>) { async fn update(&mut self, message: Self::Input, _sender: relm4::AsyncComponentSender<Self>) {
match message { 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, MainWindowMsg::SetIsGameRunning(value) => self.is_game_running = value,
} }
} }