Set up SGF reading and start on the game database #47
|
@ -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,
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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<Item = &'a GameTree>) -> 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(),
|
||||
|
|
|
@ -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<GamePreviewPrivate>) @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
|
||||
}
|
||||
}
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in New Issue