From 525babba5b4cbe6b3795761976e6b191cd3057e7 Mon Sep 17 00:00:00 2001 From: Artus Date: Tue, 4 Jun 2019 21:39:08 +0200 Subject: [PATCH] adds PawnList --- res/main.glade | 13 ++------ res/pawn.glade | 66 +++++++++++++++++++++++++++++++++++++++ src/grid.rs | 18 +++++++++++ src/main.rs | 84 +++++++++++++++++++++++++++++++++++++++++++++++--- 4 files changed, 165 insertions(+), 16 deletions(-) create mode 100644 res/pawn.glade diff --git a/res/main.glade b/res/main.glade index 4d96df4..9e33240 100644 --- a/res/main.glade +++ b/res/main.glade @@ -32,17 +32,8 @@ True False - - - 100 - 80 - True - True - - - - - + none + False diff --git a/res/pawn.glade b/res/pawn.glade new file mode 100644 index 0000000..b945130 --- /dev/null +++ b/res/pawn.glade @@ -0,0 +1,66 @@ + + + + + + True + False + + + True + False + 10 + True + Name + + + False + True + 0 + + + + + True + False + end + 8 + 3 + start + + + Place + True + True + True + half + + + False + True + 0 + + + + + Stats + True + True + True + half + + + True + True + 1 + + + + + False + True + 1 + + + + diff --git a/src/grid.rs b/src/grid.rs index 20fe45e..8829780 100644 --- a/src/grid.rs +++ b/src/grid.rs @@ -39,6 +39,24 @@ impl CellWidget { .unwrap(); eventbox.set_events(gdk::EventMask::BUTTON_PRESS_MASK); + // Drag-and-drop capacity + let targets = vec![]; + eventbox.drag_dest_set( + gtk::DestDefaults::ALL, + &targets, + gdk::DragAction::COPY, + ); + eventbox.drag_source_set( + gdk::ModifierType::MODIFIER_MASK, + &targets, + gdk::DragAction::COPY, + ); + eventbox.connect_drag_begin(|_,_| { + println!("Lift..."); + }); + eventbox.connect_drag_end(|_,_| { + println!("Drop !"); + }); let header: gtk::Label = builder .get_object("header") diff --git a/src/main.rs b/src/main.rs index 5ad11c9..f30b863 100644 --- a/src/main.rs +++ b/src/main.rs @@ -12,15 +12,79 @@ use std::process; mod grid; mod pawn { + use super::*; - pub struct Pawn { - name: String + #[derive(Debug,Clone)] + pub struct PawnList { + inner: gtk::ListBox, } - fn pawn_factory() -> Vec { + impl PawnList { + pub fn init(inner: gtk::ListBox) -> Self { + PawnList{ inner } + } + + pub fn add(&self, pawn: &Pawn) { + let row = gtk::ListBoxRow::new(); + row.add(pawn.as_ref()); + self.inner.add(&row); + } + } + + struct PawnData { + name: String, + } + + + pub struct Pawn { + data: PawnData, + widget: gtk::Box, + } + + impl Pawn { + + pub fn new>(name: S) -> Self { + let pawn_src = include_str!("../res/pawn.glade"); + let builder = gtk::Builder::new_from_string(pawn_src); + let name = name.into(); + let label: gtk::Label = + builder + .get_object("name") + .unwrap(); + label.set_text(&name); + let place_btn: gtk::Button = + builder + .get_object("place_btn") + .unwrap(); + place_btn.connect_clicked(|_| { + println!("Placing..."); + }); + let stats_btn: gtk::Button = + builder + .get_object("stats_btn") + .unwrap(); + stats_btn.connect_clicked(|_| { + println!("Showing stats..."); + }); + + let widget: gtk::Box = builder.get_object("pawn").unwrap(); + Pawn { + data: PawnData{ name }, + widget, + } + } + } + + impl AsRef for Pawn { + fn as_ref(&self) -> >k::Box { + &self.widget + } + } + + pub fn pawn_factory() -> Vec { let mut pawns = Vec::with_capacity(3); for name in &["Lomion", "Oilosse", "Fefi"] { - pawns.push(Pawn{ name: name.to_string() }); + pawns.push(Pawn::new(*name)); } pawns } @@ -28,7 +92,11 @@ mod pawn { #[cfg(test)] mod tests { #[test] - fn test_pawn_factory() {} + fn test_pawn_factory() { + let pawns = pawn_factory(); + assert_eq!(pawns.len(), 3); + assert_eq!(pawns.get(2).unwrap(), "Fefi"); + } } } @@ -84,6 +152,12 @@ impl App { // * Display creature description when hovering over its position (cell) // TODO: Pawn list + let pawn_list = builder.get_object("pawn_list").unwrap(); + let pawn_list = pawn::PawnList::init(pawn_list); + + for pawn in &pawn::pawn_factory() { + pawn_list.add(pawn); + } win.show_all(); }