From b3cae2f3ddf5142659cbede2ac118867201c582f Mon Sep 17 00:00:00 2001 From: Joshua Barretto Date: Fri, 26 Jul 2019 18:08:40 +0100 Subject: [PATCH] Added better item manipulation --- client/src/lib.rs | 4 ++++ common/src/msg/client.rs | 1 + server/src/lib.rs | 8 ++++++++ voxygen/src/hud/bag.rs | 23 ++++++++++++++++++++++- voxygen/src/hud/mod.rs | 1 + voxygen/src/session.rs | 3 +++ 6 files changed, 39 insertions(+), 1 deletion(-) diff --git a/client/src/lib.rs b/client/src/lib.rs index 617e2a93ca..5da4d11abb 100644 --- a/client/src/lib.rs +++ b/client/src/lib.rs @@ -169,6 +169,10 @@ impl Client { .send_message(ClientMsg::SwapInventorySlots(a, b)) } + pub fn drop_inventory_slot(&mut self, x: usize) { + self.postbox.send_message(ClientMsg::DropInventorySlot(x)) + } + pub fn view_distance(&self) -> Option { self.view_distance } diff --git a/common/src/msg/client.rs b/common/src/msg/client.rs index 5322609e9a..b2acf4a0b8 100644 --- a/common/src/msg/client.rs +++ b/common/src/msg/client.rs @@ -29,6 +29,7 @@ pub enum ClientMsg { ori: comp::Ori, }, SwapInventorySlots(usize, usize), + DropInventorySlot(usize), TerrainChunkRequest { key: Vec2, }, diff --git a/server/src/lib.rs b/server/src/lib.rs index a2e93fcecb..c064818dc2 100644 --- a/server/src/lib.rs +++ b/server/src/lib.rs @@ -498,6 +498,14 @@ impl Server { .map(|inv| inv.swap_slots(a, b)); state.write_component(entity, comp::InventoryUpdate); } + ClientMsg::DropInventorySlot(x) => { + state + .ecs() + .write_storage::() + .get_mut(entity) + .map(|inv| inv.remove(x)); // TODO: Spawn an item drop entity + state.write_component(entity, comp::InventoryUpdate); + } ClientMsg::Character { name, body } => match client.client_state { // Become Registered first. ClientState::Connected => { diff --git a/voxygen/src/hud/bag.rs b/voxygen/src/hud/bag.rs index ff34ca2272..749732e001 100644 --- a/voxygen/src/hud/bag.rs +++ b/voxygen/src/hud/bag.rs @@ -46,6 +46,7 @@ impl<'a> Bag<'a> { pub struct State { ids: Ids, + selected_slot: Option, } const BAG_SCALE: f64 = 4.0; @@ -63,6 +64,7 @@ impl<'a> Widget for Bag<'a> { fn init_state(&self, id_gen: widget::id::Generator) -> Self::State { State { ids: Ids::new(id_gen), + selected_slot: None, } } @@ -128,6 +130,8 @@ impl<'a> Widget for Bag<'a> { let x = i % 5; let y = i / 5; + let is_selected = Some(i) == state.selected_slot; + // Slot if Button::image(self.imgs.inv_slot) .top_left_with_margins_on( @@ -137,11 +141,28 @@ impl<'a> Widget for Bag<'a> { ) // conrod uses a (y,x) format for placing... .parent(state.ids.inv_alignment) // Avoids the background overlapping available slots .w_h(40.0, 40.0) + .image_color(if is_selected { + color::WHITE + } else { + color::DARK_YELLOW + }) .floating(true) .set(state.ids.inv_slots[i], ui) .was_clicked() { - event = Some(Event::HudEvent(HudEvent::SwapInventorySlots(0, i))); + let selected_slot = match state.selected_slot { + Some(a) => { + if a == i { + event = Some(Event::HudEvent(HudEvent::DropInventorySlot(i))); + } else { + event = Some(Event::HudEvent(HudEvent::SwapInventorySlots(a, i))); + } + None + } + None if item.is_some() => Some(i), + None => None, + }; + state.update(|s| s.selected_slot = selected_slot); } // Item diff --git a/voxygen/src/hud/mod.rs b/voxygen/src/hud/mod.rs index f7c1afb456..1a52b1192e 100644 --- a/voxygen/src/hud/mod.rs +++ b/voxygen/src/hud/mod.rs @@ -142,6 +142,7 @@ pub enum Event { UiScale(ScaleChange), CharacterSelection, SwapInventorySlots(usize, usize), + DropInventorySlot(usize), Logout, Quit, } diff --git a/voxygen/src/session.rs b/voxygen/src/session.rs index a2e2833b50..cd728ff573 100644 --- a/voxygen/src/session.rs +++ b/voxygen/src/session.rs @@ -321,6 +321,9 @@ impl PlayState for SessionState { HudEvent::SwapInventorySlots(a, b) => { self.client.borrow_mut().swap_inventory_slots(a, b) } + HudEvent::DropInventorySlot(x) => { + self.client.borrow_mut().drop_inventory_slot(x) + } } }