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 @@
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();
}