diff --git a/res/cell.glade b/res/cell.glade index e19ede2..365e341 100644 --- a/res/cell.glade +++ b/res/cell.glade @@ -19,11 +19,12 @@ in - 128 - 128 + 96 + 96 True False vertical + True True @@ -43,14 +44,17 @@ - - True - False - Occupancy - Status + + Desc. + True + False + center + end + 5 + none - True + False True 1 @@ -59,7 +63,6 @@ - True False _x_ diff --git a/res/main.glade b/res/main.glade index 594b2a3..3862cea 100644 --- a/res/main.glade +++ b/res/main.glade @@ -71,51 +71,6 @@ center True True - - - True - False - - - - True - False - label - - - - - - 1 - 0 - - - - - True - False - - - True - False - label - - - - - 1 - 1 - - - - - - - - - - - diff --git a/src/grid.rs b/src/grid.rs index c9d20e1..6cee235 100644 --- a/src/grid.rs +++ b/src/grid.rs @@ -18,7 +18,7 @@ impl Grid { CellPosition(x,y) ); cell.inner.connect_clicked(app_state.clone()); - cell.inner.connect_dragging(app_state.clone()); + cell.inner.desc_btn.set_visible(false); inner.attach(cell.as_ref(), x, y, 1, 1); } Grid { inner } @@ -30,13 +30,13 @@ struct CellWidget { eventbox: gtk::EventBox, position: gtk::Label, header : gtk::Label, - content: gtk::Label, + desc_btn: gtk::Button, } impl CellWidget { fn new(pos: CellPosition, header_text: &str) -> Self { - let cell_src = include_str!("../res/cell.glade"); - let builder = gtk::Builder::new_from_string(&cell_src); + let cell_src = "/home/artus/Projets/rust/playmat/res/cell.glade"; + let builder = gtk::Builder::new_from_file(cell_src); // Set up reactivity on buttons let eventbox: gtk::EventBox = @@ -54,85 +54,93 @@ impl CellWidget { .get_object("position") .unwrap(); position.set_text(&format!("{}x{}", pos.0, pos.1)); + // Drag-and-drop capacity - let targets = vec![]; + let desc_btn: gtk::Button = + builder + .get_object("desc_btn") + .unwrap(); + desc_btn.set_visible(false); + // The data to be send + let targets = vec![ + gtk::TargetEntry::new("text/plain", gtk::TargetFlags::SAME_APP, 0) + ]; eventbox.drag_source_set( gdk::ModifierType::MODIFIER_MASK, &targets, - gdk::DragAction::COPY, + gdk::DragAction::MOVE, ); + let h = header.clone(); + // Send data to the drop site + eventbox.connect_drag_data_get( + move |_,_,data,info,time| { + println!("Send..."); + if let Some(to_send) = h.get_text() { + data.set_text(&to_send); + } + } + ); + let h = header.clone(); + let b = desc_btn.clone(); + // Empty the cell on successfull move + eventbox.connect_drag_data_delete( + move |w,drag| { + println!("Cleaning... {:#?}", (&drag.drag_drop_succeeded())); + h.set_text(""); + b.set_visible(false); + } + ); + eventbox.drag_dest_set( gtk::DestDefaults::ALL, &targets, - gdk::DragAction::COPY, + gdk::DragAction::MOVE, + ); + // Retrieve data from the source + let h = header.clone(); + let b = desc_btn.clone(); + eventbox.connect_drag_data_received( + move |_,drag,_,_,data,info,time| { + let del = + // Check if cell is not already occupied + if !(h.get_text().unwrap().as_str() == "") { + // TODO: Find what to do to abort, since + // DragContext methods don't seem to work... + println!("Overriding !!"); + false + } else { + println!("Dropped !"); + if let Some(text) = data.get_text() { + h.set_text(&text); + b.set_visible(true); + } else { + eprintln!("No data !"); + } + true + }; + } ); - - let cell = CellWidget { eventbox, position, header, - content: builder.get_object("content").unwrap(), + desc_btn }; cell } pub fn connect_clicked(&self, state: AppState) { let header = self.header.clone(); - let content = self.content.clone(); self.eventbox .connect_button_press_event(move |_,_| { let mut state = state.borrow_mut(); if let Some(data) = state.pending.take() { println!("{:?}", data); - content.set_text(&data.name); + header.set_text(&data.name); }; - header.set_text("Is Clicked."); gtk::Inhibit(true) }); } - - pub fn connect_dragging(&self, state: AppState) { - - // TODO: start over. - // Use this for reference : - // https://python-gtk-3-tutorial.readthedocs.io/en/latest/drag_and_drop.html - - // For starters, avoid using app_state and just copy the content of - // source cell inside dest cell. - - let state1 = state.clone(); - self.eventbox.connect_drag_begin(move |_,_| { - println!("Lift..."); - let mut state = state1.borrow_mut(); - state.pending = Some(pawn::PawnData{name: "Dropped".to_string(), position: None}); - // Copy the current instance data - // inside app_state.pending - }); - // TODO: Add failed signal to remove data - let state2 = state.clone(); - let content = self.content.clone(); - self.eventbox.connect_drag_end(move |_,_| { - println!("Drop !"); - let mut state = state2.borrow_mut(); - if state.pending.is_none() { - content.set_text("Emptied"); - } - state.pending = None; - // Same as clicked, grab data - }); - let state3 = state.clone(); - let content = self.content.clone(); - self.eventbox.connect_drag_drop(move |_,drag_ctx,_,_,time| { - println!("Got ! {:?}", ""); - let mut state = state3.borrow_mut(); - if let Some(data) = state.pending.take() { - content.set_text(&data.name); - }; - drag_ctx.drag_finish(true, true, time); - gtk::Inhibit(true) - }); - } } impl AsRef for CellWidget { diff --git a/src/main.rs b/src/main.rs index f25ba1c..5c10d48 100644 --- a/src/main.rs +++ b/src/main.rs @@ -61,8 +61,8 @@ impl App { self.inner.connect_activate( move |app| { println!("Activate App"); - let main_src = include_str!("../res/main.glade"); - let builder = gtk::Builder::new_from_string(main_src); + let main_src = "/home/artus/Projets/rust/playmat/res/main.glade"; + let builder = gtk::Builder::new_from_file(main_src); let win: gtk::ApplicationWindow = builder .get_object("app") diff --git a/src/pawn.rs b/src/pawn.rs index 84d3347..5cca34a 100644 --- a/src/pawn.rs +++ b/src/pawn.rs @@ -39,8 +39,8 @@ pub struct Pawn { 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 pawn_src = "/home/artus/Projets/rust/playmat/res/pawn.glade"; + let builder = gtk::Builder::new_from_file(pawn_src); let name = name.into(); let label: gtk::Label = builder