diff --git a/kifu/kifu-gtk/src/ui/chat.rs b/kifu/kifu-gtk/src/ui/chat.rs new file mode 100644 index 0000000..4e31094 --- /dev/null +++ b/kifu/kifu-gtk/src/ui/chat.rs @@ -0,0 +1,50 @@ +use glib::Object; +use gtk::{prelude::*, subclass::prelude::*}; +use kifu_core::ui::ChatElement; + +#[derive(Default)] +pub struct ChatPrivate { + chat_history: gtk::Box, + entry: gtk::Entry, +} + +#[glib::object_subclass] +impl ObjectSubclass for ChatPrivate { + const NAME: &'static str = "Chat"; + type Type = Chat; + type ParentType = gtk::Box; +} + +impl ObjectImpl for ChatPrivate { + fn constructed(&self) { + self.chat_history + .set_orientation(gtk::Orientation::Vertical); + } +} +impl WidgetImpl for ChatPrivate {} +impl BoxImpl for ChatPrivate {} + +glib::wrapper! { + pub struct Chat(ObjectSubclass) @extends gtk::Box, gtk::Widget, @implements gtk::Orientable; +} + +impl Chat { + pub fn new(element: ChatElement) -> Chat { + let s: Self = Object::builder().build(); + s.set_orientation(gtk::Orientation::Vertical); + + s.append(&s.imp().chat_history); + s.append(&s.imp().entry); + + element.messages.into_iter().for_each(|msg| { + s.imp().chat_history.append( + >k::Label::builder() + .label(&msg) + .halign(gtk::Align::Start) + .build(), + ) + }); + + s + } +} diff --git a/kifu/kifu-gtk/src/ui/mod.rs b/kifu/kifu-gtk/src/ui/mod.rs index a6e992c..fe589f6 100644 --- a/kifu/kifu-gtk/src/ui/mod.rs +++ b/kifu/kifu-gtk/src/ui/mod.rs @@ -1,88 +1,5 @@ -use crate::ui; -use glib::Object; -use gtk::{prelude::*, subclass::prelude::*}; -use kifu_core::{ui::ChatElement, ui::PlayerCardElement, Color}; -use std::{cell::RefCell, rc::Rc}; +mod player_card; +pub use player_card::PlayerCard; -#[derive(Default)] -pub struct PlayerCardPrivate { - player_name: gtk::Label, - clock: gtk::Label, -} - -#[glib::object_subclass] -impl ObjectSubclass for PlayerCardPrivate { - const NAME: &'static str = "PlayerCard"; - type Type = PlayerCard; - type ParentType = gtk::Box; -} - -impl ObjectImpl for PlayerCardPrivate {} -impl WidgetImpl for PlayerCardPrivate {} -impl BoxImpl for PlayerCardPrivate {} - -glib::wrapper! { - pub struct PlayerCard(ObjectSubclass) @extends gtk::Box, gtk::Widget, @implements gtk::Orientable; -} - -impl PlayerCard { - pub fn new(element: PlayerCardElement) -> PlayerCard { - let s: Self = Object::builder().build(); - s.set_orientation(gtk::Orientation::Vertical); - s.imp() - .player_name - .set_text(&format!("{} ({})", element.name, element.rank)); - s.imp().clock.set_text(&element.clock); - - s.append(&s.imp().player_name); - s.append(&s.imp().clock); - s - } -} - -#[derive(Default)] -pub struct ChatPrivate { - chat_history: gtk::Box, - entry: gtk::Entry, -} - -#[glib::object_subclass] -impl ObjectSubclass for ChatPrivate { - const NAME: &'static str = "Chat"; - type Type = Chat; - type ParentType = gtk::Box; -} - -impl ObjectImpl for ChatPrivate { - fn constructed(&self) { - self.chat_history - .set_orientation(gtk::Orientation::Vertical); - } -} -impl WidgetImpl for ChatPrivate {} -impl BoxImpl for ChatPrivate {} - -glib::wrapper! { - pub struct Chat(ObjectSubclass) @extends gtk::Box, gtk::Widget, @implements gtk::Orientable; -} - -impl Chat { - pub fn new(element: ChatElement) -> Chat { - let s: Self = Object::builder().build(); - s.set_orientation(gtk::Orientation::Vertical); - - s.append(&s.imp().chat_history); - s.append(&s.imp().entry); - - element.messages.into_iter().for_each(|msg| { - s.imp().chat_history.append( - >k::Label::builder() - .label(&msg) - .halign(gtk::Align::Start) - .build(), - ) - }); - - s - } -} +mod chat; +pub use chat::Chat; diff --git a/kifu/kifu-gtk/src/ui/player_card.rs b/kifu/kifu-gtk/src/ui/player_card.rs new file mode 100644 index 0000000..04e10e2 --- /dev/null +++ b/kifu/kifu-gtk/src/ui/player_card.rs @@ -0,0 +1,39 @@ +use glib::Object; +use gtk::{prelude::*, subclass::prelude::*}; +use kifu_core::{ui::PlayerCardElement, Color}; + +#[derive(Default)] +pub struct PlayerCardPrivate { + player_name: gtk::Label, + clock: gtk::Label, +} + +#[glib::object_subclass] +impl ObjectSubclass for PlayerCardPrivate { + const NAME: &'static str = "PlayerCard"; + type Type = PlayerCard; + type ParentType = gtk::Box; +} + +impl ObjectImpl for PlayerCardPrivate {} +impl WidgetImpl for PlayerCardPrivate {} +impl BoxImpl for PlayerCardPrivate {} + +glib::wrapper! { + pub struct PlayerCard(ObjectSubclass) @extends gtk::Box, gtk::Widget, @implements gtk::Orientable; +} + +impl PlayerCard { + pub fn new(element: PlayerCardElement) -> PlayerCard { + let s: Self = Object::builder().build(); + s.set_orientation(gtk::Orientation::Vertical); + s.imp() + .player_name + .set_text(&format!("{} ({})", element.name, element.rank)); + s.imp().clock.set_text(&element.clock); + + s.append(&s.imp().player_name); + s.append(&s.imp().clock); + s + } +}