mirror of
https://github.com/ALEZ-DEV/Babylonia-terminal.git
synced 2025-12-16 09:28:53 +00:00
add menu
This commit is contained in:
parent
08364f8624
commit
c93454358f
@ -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<MainWindowMsg>) {
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum MainWindowMsg {
|
||||
ToggleMenuVisibility,
|
||||
SelectPage,
|
||||
SetIsGameRunning(bool),
|
||||
}
|
||||
|
||||
struct MainWindow {
|
||||
game_handler: WorkerController<manager::HandleGameProcess>,
|
||||
game_state: GameState,
|
||||
game_handler: WorkerController<manager::HandleGameProcess>,
|
||||
is_game_running: bool,
|
||||
is_menu_visible: bool,
|
||||
}
|
||||
|
||||
impl MainWindow {
|
||||
fn new(game_state: GameState, sender: relm4::AsyncComponentSender<Self>) -> Self {
|
||||
fn new(game_state: GameState, sender: &relm4::AsyncComponentSender<Self>) -> 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<Self>) {
|
||||
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,
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user