Restore slot interaction functionality

This commit is contained in:
Imbris 2020-04-04 03:13:51 -04:00 committed by Pfauenauge90
parent 9c76bdde0e
commit 968c064874
4 changed files with 84 additions and 19 deletions

View File

@ -1,6 +1,6 @@
use super::{
img_ids::{Imgs, ImgsRot},
item_imgs::{ItemImgs, ItemKey},
item_imgs::ItemImgs,
slot_kinds::{HudSlotManager, InventorySlot},
Event as HudEvent, Show, CRITICAL_HP_COLOR, LOW_HP_COLOR, TEXT_COLOR, UI_HIGHLIGHT_0, UI_MAIN,
XP_COLOR,
@ -15,7 +15,7 @@ use crate::{
use client::Client;
use common::comp::Stats;
use conrod_core::{
color, image,
color,
widget::{self, Button, Image, Rectangle, Text},
widget_ids, Color, Colorable, Labelable, Positionable, Sizeable, Widget, WidgetCommon,
};
@ -32,10 +32,7 @@ widget_ids! {
inv_slots_0,
map_title,
inv_slots[],
items[],
amounts[],
amounts_bg[],
tooltip[],
//tooltip[],
bg,
bg_frame,
char_ico,
@ -106,6 +103,7 @@ pub struct Bag<'a> {
common: widget::CommonBuilder,
rot_imgs: &'a ImgsRot,
tooltip_manager: &'a mut TooltipManager,
slot_manager: &'a mut HudSlotManager,
_pulse: f32,
localized_strings: &'a std::sync::Arc<VoxygenLocalization>,
stats: &'a Stats,
@ -120,6 +118,7 @@ impl<'a> Bag<'a> {
fonts: &'a ConrodVoxygenFonts,
rot_imgs: &'a ImgsRot,
tooltip_manager: &'a mut TooltipManager,
slot_manager: &'a mut HudSlotManager,
pulse: f32,
localized_strings: &'a std::sync::Arc<VoxygenLocalization>,
stats: &'a Stats,
@ -133,6 +132,7 @@ impl<'a> Bag<'a> {
common: widget::CommonBuilder::default(),
rot_imgs,
tooltip_manager,
slot_manager,
_pulse: pulse,
localized_strings,
stats,
@ -143,7 +143,6 @@ impl<'a> Bag<'a> {
pub struct State {
ids: Ids,
img_id_cache: Vec<Option<(ItemKey, image::Id)>>,
selected_slot: Option<usize>,
}
@ -161,7 +160,6 @@ impl<'a> Widget for Bag<'a> {
fn init_state(&self, id_gen: widget::id::Generator) -> Self::State {
State {
ids: Ids::new(id_gen),
img_id_cache: Vec::new(),
selected_slot: None,
}
}
@ -607,8 +605,6 @@ impl<'a> Widget for Bag<'a> {
});
}
// Display inventory contents
// TODO: add slot manager
let slot_manager: Option<&mut HudSlotManager> = None;
let mut slot_maker = SlotMaker {
background: self.imgs.inv_slot,
selected_background: self.imgs.inv_slot_sel,
@ -621,7 +617,7 @@ impl<'a> Widget for Bag<'a> {
amount_text_color: TEXT_COLOR,
content_source: inventory,
image_source: self.item_imgs,
slot_manager,
slot_manager: Some(self.slot_manager),
};
for (i, item) in inventory.slots().iter().enumerate() {
let x = i % 9;

View File

@ -36,7 +36,7 @@ use crate::{
i18n::{i18n_asset_key, LanguageMetadata, VoxygenLocalization},
render::{AaMode, CloudMode, Consts, FluidMode, Globals, Renderer},
scene::camera::{self, Camera},
ui::{fonts::ConrodVoxygenFonts, Graphic, Ingameable, ScaleMode, Ui},
ui::{fonts::ConrodVoxygenFonts, slot, Graphic, Ingameable, ScaleMode, Ui},
window::{Event as WinEvent, GameInput},
GlobalState,
};
@ -234,6 +234,8 @@ pub enum Event {
CharacterSelection,
UseInventorySlot(usize),
SwapInventorySlots(usize, usize),
SwapInventoryArmor(usize, slot_kinds::ArmorSlot),
SwapArmorSlots(slot_kinds::ArmorSlot, slot_kinds::ArmorSlot),
DropInventorySlot(usize),
Logout,
Quit,
@ -441,6 +443,7 @@ pub struct Hud {
pulse: f32,
velocity: f32,
voxygen_i18n: std::sync::Arc<VoxygenLocalization>,
slot_manager: slot_kinds::HudSlotManager,
}
impl Hud {
@ -509,6 +512,7 @@ impl Hud {
pulse: 0.0,
velocity: 0.0,
voxygen_i18n,
slot_manager: slot_kinds::HudSlotManager::new(),
}
}
@ -1646,6 +1650,7 @@ impl Hud {
&self.fonts,
&self.rot_imgs,
tooltip_manager,
&mut self.slot_manager,
self.pulse,
&self.voxygen_i18n,
&player_stats,
@ -1952,6 +1957,38 @@ impl Hud {
.set(self.ids.free_look_txt, ui_widgets);
}
// Maintain slot manager
for event in self.slot_manager.maintain(ui_widgets) {
use slot_kinds::HudSlotKinds;
match event {
slot::Event::Dragged(
HudSlotKinds::Inventory(from),
HudSlotKinds::Inventory(to),
) => {
// Swap between inventory slots
events.push(Event::SwapInventorySlots(from.0, to.0));
},
slot::Event::Dragged(HudSlotKinds::Armor(from), HudSlotKinds::Armor(to)) => {
// Swap between two armor slots
events.push(Event::SwapArmorSlots(from, to));
},
slot::Event::Dragged(HudSlotKinds::Inventory(inv), HudSlotKinds::Armor(arm))
| slot::Event::Dragged(HudSlotKinds::Armor(arm), HudSlotKinds::Inventory(inv)) => {
// Swap between inventory and armor slot
events.push(Event::SwapInventoryArmor(inv.0, arm));
},
slot::Event::Dropped(HudSlotKinds::Inventory(from)) => {
// Drop item from inventory
events.push(Event::DropInventorySlot(from.0));
},
slot::Event::Used(HudSlotKinds::Inventory(inv)) => {
// Item in inventory used (selected and then clicked again)
events.push(Event::UseInventorySlot(inv.0));
},
_ => {},
}
}
events
}

View File

@ -647,6 +647,15 @@ impl PlayState for SessionState {
HudEvent::SwapInventorySlots(a, b) => {
self.client.borrow_mut().swap_inventory_slots(a, b)
},
HudEvent::SwapInventoryArmor(inv_slot, armor_slot) => {
// Swapping between inventory and armor slot
// TODO: don't do this
self.client.borrow_mut().use_inventory_slot(inv_slot)
},
HudEvent::SwapArmorSlots(from, to) => {
// Only works with rings currently
// TODO: implement
},
HudEvent::DropInventorySlot(x) => {
self.client.borrow_mut().drop_inventory_slot(x)
},

View File

@ -111,7 +111,7 @@ enum Interaction {
None,
}
enum Event<K> {
pub enum Event<K> {
// Dragged to another slot
Dragged(K, K),
// Dragged to open space
@ -130,6 +130,25 @@ impl<K> SlotManager<K>
where
K: SlotKinds,
{
pub fn new() -> Self {
Self {
state: ManagerState::Idle,
events: Vec::new(),
}
}
pub fn maintain(&mut self, ui: &conrod_core::Ui) -> Vec<Event<K>> {
// Detect drops by of selected item by clicking in empty space
if let ManagerState::Selected(_, slot) = self.state {
if ui.widget_input(ui.window).clicks().left().next().is_some() {
self.state = ManagerState::Idle;
self.events.push(Event::Dropped(slot))
}
}
std::mem::replace(&mut self.events, Vec::new())
}
fn update(&mut self, widget: widget::Id, slot: K, ui: &conrod_core::Ui) -> Interaction {
// If this is the selected/dragged widget make sure the slot value is up to date
match &mut self.state {
@ -377,15 +396,15 @@ where
Image::new(content_image)
.x_y(x, y)
.wh(if let Interaction::Selected = interaction {
content_size
} else {
selected_content_size
} else {
content_size
}
.map(|e| e as f64)
.into_array())
.parent(id)
.graphics_for(id)
.set(state.ids.icon, ui);
.set(state.ids.content, ui);
}
// Draw amount
@ -393,11 +412,15 @@ where
let amount = format!("{}", &amount);
// Text shadow
Text::new(&amount)
.parent(id)
.graphics_for(id)
.font_id(amount_font)
.font_size(amount_font_size)
.top_right_with_margins_on(id, amount_margins.x as f64, amount_margins.y as f64)
.top_right_with_margins_on(
state.ids.content,
amount_margins.x as f64,
amount_margins.y as f64,
)
.parent(id)
.graphics_for(id)
.color(Color::Rgba(0.0, 0.0, 0.0, 1.0))
.set(state.ids.amount_bg, ui);
Text::new(&amount)