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)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct GameTree {
|
pub struct GameTree {
|
||||||
pub file_format: i8,
|
pub file_format: i8,
|
||||||
|
|
|
@ -12,7 +12,6 @@ use typeshare::typeshare;
|
||||||
#[serde(tag = "type", content = "content")]
|
#[serde(tag = "type", content = "content")]
|
||||||
pub enum CoreRequest {
|
pub enum CoreRequest {
|
||||||
CreateGame(CreateGameRequest),
|
CreateGame(CreateGameRequest),
|
||||||
LaunchScreen,
|
|
||||||
Home,
|
Home,
|
||||||
PlayingField,
|
PlayingField,
|
||||||
PlayStone(PlayStoneRequest),
|
PlayStone(PlayStoneRequest),
|
||||||
|
@ -119,8 +118,9 @@ impl CoreApp {
|
||||||
let game_state = app_state.game.as_ref().unwrap();
|
let game_state = app_state.game.as_ref().unwrap();
|
||||||
CoreResponse::PlayingFieldView(playing_field(game_state))
|
CoreResponse::PlayingFieldView(playing_field(game_state))
|
||||||
}
|
}
|
||||||
CoreRequest::LaunchScreen => CoreResponse::HomeView(home()),
|
CoreRequest::Home => {
|
||||||
CoreRequest::Home => CoreResponse::HomeView(home()),
|
CoreResponse::HomeView(home(self.state.read().unwrap().database.all_games()))
|
||||||
|
}
|
||||||
CoreRequest::PlayingField => {
|
CoreRequest::PlayingField => {
|
||||||
let app_state = self.state.read().unwrap();
|
let app_state = self.state.read().unwrap();
|
||||||
let game = app_state.game.as_ref().unwrap();
|
let game = app_state.game.as_ref().unwrap();
|
||||||
|
|
|
@ -13,7 +13,7 @@ pub struct GamePreviewElement {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl GamePreviewElement {
|
impl GamePreviewElement {
|
||||||
pub fn new(game: GameTree) -> GamePreviewElement {
|
pub fn new(game: &GameTree) -> GamePreviewElement {
|
||||||
GamePreviewElement {
|
GamePreviewElement {
|
||||||
date: game.info.date.clone(),
|
date: game.info.date.clone(),
|
||||||
black_player: game
|
black_player: game
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
use crate::ui::{Action, GamePreviewElement};
|
use crate::ui::{Action, GamePreviewElement};
|
||||||
|
use go_sgf::GameTree;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use typeshare::typeshare;
|
use typeshare::typeshare;
|
||||||
|
|
||||||
|
@ -55,7 +56,7 @@ pub struct HomeView {
|
||||||
pub start_game: Action<()>,
|
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 {
|
let black_player = PlayerElement::Hotseat(HotseatPlayerElement {
|
||||||
placeholder: Some("black player".to_owned()),
|
placeholder: Some("black player".to_owned()),
|
||||||
default_rank: None,
|
default_rank: None,
|
||||||
|
@ -69,7 +70,7 @@ pub fn home() -> HomeView {
|
||||||
HomeView {
|
HomeView {
|
||||||
black_player,
|
black_player,
|
||||||
white_player,
|
white_player,
|
||||||
games: vec![],
|
games: games.map(GamePreviewElement::new).collect(),
|
||||||
start_game: Action {
|
start_game: Action {
|
||||||
id: "start-game-action".to_owned(),
|
id: "start-game-action".to_owned(),
|
||||||
label: "New Game".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 crate::CoreApi;
|
||||||
use glib::Object;
|
use glib::Object;
|
||||||
use gtk::{glib, prelude::*, subclass::prelude::*};
|
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
|
s
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,12 @@
|
||||||
mod player_card;
|
|
||||||
pub use player_card::PlayerCard;
|
|
||||||
|
|
||||||
mod chat;
|
mod chat;
|
||||||
pub use chat::Chat;
|
pub use chat::Chat;
|
||||||
|
|
||||||
|
mod game_preview;
|
||||||
|
pub use game_preview::GamePreview;
|
||||||
|
|
||||||
|
mod player_card;
|
||||||
|
pub use player_card::PlayerCard;
|
||||||
|
|
||||||
mod playing_field;
|
mod playing_field;
|
||||||
pub use playing_field::PlayingField;
|
pub use playing_field::PlayingField;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue