adds PawnList

This commit is contained in:
2019-06-04 21:39:08 +02:00
parent ca3696f63f
commit 525babba5b
4 changed files with 165 additions and 16 deletions

View File

@@ -32,17 +32,8 @@
<object class="GtkListBox" id="pawn_list">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkListBoxRow">
<property name="width_request">100</property>
<property name="height_request">80</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<child>
<placeholder/>
</child>
</object>
</child>
<property name="selection_mode">none</property>
<signal name="button-press-event" handler="on_pawn_click" swapped="no"/>
</object>
<packing>
<property name="resize">False</property>

66
res/pawn.glade Normal file
View File

@@ -0,0 +1,66 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.1 -->
<interface>
<requires lib="gtk+" version="3.20"/>
<object class="GtkBox" id="pawn">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkLabel" id="name">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_left">10</property>
<property name="hexpand">True</property>
<property name="label" translatable="yes">Name</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButtonBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">end</property>
<property name="margin_left">8</property>
<property name="spacing">3</property>
<property name="layout_style">start</property>
<child>
<object class="GtkButton" id="place_btn">
<property name="label" translatable="yes">Place</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="relief">half</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="stats_btn">
<property name="label" translatable="yes">Stats</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="relief">half</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</interface>

View File

@@ -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")

View File

@@ -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<Pawn> {
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<S: Into<String>>(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<gtk::Box> for Pawn {
fn as_ref(&self) -> &gtk::Box {
&self.widget
}
}
pub fn pawn_factory() -> Vec<Pawn> {
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();
}