adds pawn creation
This commit is contained in:
98
src/main.rs
98
src/main.rs
@@ -20,8 +20,74 @@ mod pawn;
|
||||
pub struct AppData {
|
||||
/// A slot for any pawn waiting for placement
|
||||
pending: Option<pawn::PawnData>,
|
||||
/// Owned list of pawns
|
||||
pawns: Vec<pawn::Pawn>,
|
||||
pawns: Option<pawn::PawnList>,
|
||||
}
|
||||
|
||||
#[derive(Debug,Clone)]
|
||||
struct NewPawnDialog {
|
||||
root: gtk::Window,
|
||||
name: gtk::Entry,
|
||||
desc: gtk::TextBuffer,
|
||||
confirm: gtk::Button,
|
||||
abort: gtk::Button,
|
||||
}
|
||||
|
||||
impl NewPawnDialog {
|
||||
|
||||
fn init(builder: >k::Builder, app_state: AppState) -> Self {
|
||||
let dialog = NewPawnDialog {
|
||||
root: builder.get_object("new_pawn_dialog").unwrap(),
|
||||
name: builder.get_object("name_entry").unwrap(),
|
||||
desc: builder.get_object("pawn_desc").unwrap(),
|
||||
confirm: builder.get_object("confirm").unwrap(),
|
||||
abort: builder.get_object("abort").unwrap(),
|
||||
};
|
||||
let d = dialog.clone();
|
||||
dialog.abort.connect_clicked(move |_| { d.reset(); d.hide(); });
|
||||
let d = dialog.clone();
|
||||
dialog.confirm.connect_clicked(move |_| {
|
||||
if let Some(data) = d.take_data() {
|
||||
let pawn = pawn::Pawn::from_data(data);
|
||||
println!("Create {:?}", pawn);
|
||||
app_state.add_pawn(&pawn);
|
||||
d.reset();
|
||||
d.hide();
|
||||
};
|
||||
});
|
||||
dialog
|
||||
}
|
||||
|
||||
fn reset(&self) {
|
||||
self.name.set_text("");
|
||||
self.desc.set_text("");
|
||||
}
|
||||
|
||||
fn take_data(&self) -> Option<pawn::PawnData> {
|
||||
let name = String::from(self.name.get_text().unwrap().as_str());
|
||||
let description = {
|
||||
let (ref start, ref end) = self.desc.get_bounds();
|
||||
String::from(
|
||||
self.desc.get_text(start, end, true).unwrap().as_str()
|
||||
)
|
||||
};
|
||||
if name.is_empty() {
|
||||
None
|
||||
} else {
|
||||
Some(pawn::PawnData {
|
||||
name,
|
||||
description,
|
||||
position: None,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
fn show(&self) {
|
||||
self.root.show_all();
|
||||
}
|
||||
|
||||
fn hide(&self) {
|
||||
self.root.set_visible(false);
|
||||
}
|
||||
}
|
||||
|
||||
/// A sharable state for the whole application
|
||||
@@ -35,6 +101,20 @@ impl std::ops::Deref for AppState {
|
||||
}
|
||||
}
|
||||
|
||||
impl AppState {
|
||||
|
||||
fn add_pawn(&self, pawn: &pawn::Pawn) {
|
||||
pawn.connect_place(self.clone());
|
||||
pawn.connect_stats();
|
||||
self.borrow_mut()
|
||||
.pawns
|
||||
.as_ref()
|
||||
.expect("PawnList was not initialized !")
|
||||
.add(&pawn);
|
||||
dbg!(pawn);
|
||||
}
|
||||
}
|
||||
|
||||
struct App {
|
||||
inner: gtk::Application,
|
||||
state: AppState,
|
||||
@@ -75,12 +155,10 @@ impl App {
|
||||
// Pawn list
|
||||
let pawn_list = builder.get_object("pawn_list").unwrap();
|
||||
let pawn_list = pawn::PawnList::init(pawn_list);
|
||||
app_state.borrow_mut().pawns.replace(pawn_list);
|
||||
|
||||
for pawn in pawn::pawn_factory() {
|
||||
pawn_list.add(&pawn);
|
||||
pawn.connect_place(app_state.clone());
|
||||
pawn.connect_stats();
|
||||
app_state.borrow_mut().pawns.push(pawn);
|
||||
app_state.add_pawn(&pawn);
|
||||
}
|
||||
win.show_all(); // Before grid because we want to hide some widgets there
|
||||
// Initialize grid
|
||||
@@ -89,9 +167,17 @@ impl App {
|
||||
// * From pawn_list to cell : place pawn on dest cell
|
||||
// * From cell to cell : move pawn from source to dest cell
|
||||
let _grid = grid::Grid::init(grid, 10, app_state.clone());
|
||||
|
||||
let dialog = NewPawnDialog::init(&builder, app_state.clone());
|
||||
let new_pawn_btn: gtk::Button = builder.get_object("add_pawn").unwrap();
|
||||
new_pawn_btn.connect_clicked(move |_| { Self::on_add_pawn(&dialog)});
|
||||
});
|
||||
}
|
||||
|
||||
fn on_add_pawn(win: &NewPawnDialog) {
|
||||
win.show();
|
||||
}
|
||||
|
||||
/// Creates a simple action and connects the given handler to its activate signal.
|
||||
fn new_action<F: Fn(&gio::SimpleAction, &Option<glib::Variant>) + 'static>(
|
||||
app: >k::Application,
|
||||
|
||||
Reference in New Issue
Block a user