diff --git a/go-sgf/src/go.rs b/go-sgf/src/go.rs index 4fee4eb..79fab10 100644 --- a/go-sgf/src/go.rs +++ b/go-sgf/src/go.rs @@ -121,6 +121,12 @@ impl TryFrom<&str> for Rank { } } +impl ToString for Rank { + fn to_string(&self) -> String { + unimplemented!() + } +} + #[derive(Clone, Debug)] pub struct GameTree { pub file_format: i8, diff --git a/kifu/core/src/api.rs b/kifu/core/src/api.rs index 3af2fe0..b26af46 100644 --- a/kifu/core/src/api.rs +++ b/kifu/core/src/api.rs @@ -12,7 +12,6 @@ use typeshare::typeshare; #[serde(tag = "type", content = "content")] pub enum CoreRequest { CreateGame(CreateGameRequest), - LaunchScreen, Home, PlayingField, PlayStone(PlayStoneRequest), @@ -119,8 +118,9 @@ impl CoreApp { let game_state = app_state.game.as_ref().unwrap(); CoreResponse::PlayingFieldView(playing_field(game_state)) } - CoreRequest::LaunchScreen => CoreResponse::HomeView(home()), - CoreRequest::Home => CoreResponse::HomeView(home()), + CoreRequest::Home => { + CoreResponse::HomeView(home(self.state.read().unwrap().database.all_games())) + } CoreRequest::PlayingField => { let app_state = self.state.read().unwrap(); let game = app_state.game.as_ref().unwrap(); diff --git a/kifu/core/src/ui/elements/game_preview.rs b/kifu/core/src/ui/elements/game_preview.rs index 712738d..cd16694 100644 --- a/kifu/core/src/ui/elements/game_preview.rs +++ b/kifu/core/src/ui/elements/game_preview.rs @@ -13,7 +13,7 @@ pub struct GamePreviewElement { } impl GamePreviewElement { - pub fn new(game: GameTree) -> GamePreviewElement { + pub fn new(game: &GameTree) -> GamePreviewElement { GamePreviewElement { date: game.info.date.clone(), black_player: game diff --git a/kifu/core/src/ui/home.rs b/kifu/core/src/ui/home.rs index 4206dfc..12cca5b 100644 --- a/kifu/core/src/ui/home.rs +++ b/kifu/core/src/ui/home.rs @@ -1,4 +1,5 @@ use crate::ui::{Action, GamePreviewElement}; +use go_sgf::GameTree; use serde::{Deserialize, Serialize}; use typeshare::typeshare; @@ -55,7 +56,7 @@ pub struct HomeView { pub start_game: Action<()>, } -pub fn home() -> HomeView { +pub fn home<'a>(games: impl Iterator) -> HomeView { let black_player = PlayerElement::Hotseat(HotseatPlayerElement { placeholder: Some("black player".to_owned()), default_rank: None, @@ -69,7 +70,7 @@ pub fn home() -> HomeView { HomeView { black_player, white_player, - games: vec![], + games: games.map(GamePreviewElement::new).collect(), start_game: Action { id: "start-game-action".to_owned(), label: "New Game".to_owned(), diff --git a/kifu/gtk/src/ui/game_preview.rs b/kifu/gtk/src/ui/game_preview.rs new file mode 100644 index 0000000..64e2d92 --- /dev/null +++ b/kifu/gtk/src/ui/game_preview.rs @@ -0,0 +1,42 @@ +use glib::Object; +use gtk::{glib, prelude::*, subclass::prelude::*}; +use kifu_core::ui::GamePreviewElement; + +#[derive(Default)] +pub struct GamePreviewPrivate; + +#[glib::object_subclass] +impl ObjectSubclass for GamePreviewPrivate { + const NAME: &'static str = "GamePreview"; + type Type = GamePreview; + type ParentType = gtk::Box; +} + +impl ObjectImpl for GamePreviewPrivate {} +impl WidgetImpl for GamePreviewPrivate {} +impl BoxImpl for GamePreviewPrivate {} + +glib::wrapper! { + pub struct GamePreview(ObjectSubclass) @extends gtk::Box, gtk::Widget, @implements gtk::Orientable; +} + +impl GamePreview { + pub fn new(element: GamePreviewElement) -> GamePreview { + let s: Self = Object::builder().build(); + s.set_orientation(gtk::Orientation::Horizontal); + + println!("game_preview: {:?}", element); + let black_player = match element.black_rank { + Some(rank) => format!("{} ({})", element.black_player, rank.to_string()), + None => element.black_player, + }; + let white_player = match element.white_rank { + Some(rank) => format!("{} ({})", element.white_player, rank.to_string()), + None => element.white_player, + }; + s.append(>k::Label::new(Some(&black_player))); + s.append(>k::Label::new(Some(&white_player))); + + s + } +} diff --git a/kifu/gtk/src/ui/home.rs b/kifu/gtk/src/ui/home.rs index 07a53bc..8070a1d 100644 --- a/kifu/gtk/src/ui/home.rs +++ b/kifu/gtk/src/ui/home.rs @@ -1,3 +1,4 @@ +use crate::ui::GamePreview; use crate::CoreApi; use glib::Object; use gtk::{glib, prelude::*, subclass::prelude::*}; @@ -138,6 +139,12 @@ impl Home { } }); + let game_list = gtk::Box::new(gtk::Orientation::Vertical, 0); + s.attach(&game_list, 1, 3, 2, 1); + view.games + .iter() + .for_each(|game_preview| game_list.append(&GamePreview::new(game_preview.clone()))); + s } } diff --git a/kifu/gtk/src/ui/mod.rs b/kifu/gtk/src/ui/mod.rs index 3c9d56c..d3b9c14 100644 --- a/kifu/gtk/src/ui/mod.rs +++ b/kifu/gtk/src/ui/mod.rs @@ -1,9 +1,12 @@ -mod player_card; -pub use player_card::PlayerCard; - mod chat; pub use chat::Chat; +mod game_preview; +pub use game_preview::GamePreview; + +mod player_card; +pub use player_card::PlayerCard; + mod playing_field; pub use playing_field::PlayingField;