From 430c34b46234b6d175c5a803fde2b2db64c92dae Mon Sep 17 00:00:00 2001 From: Sam Date: Wed, 13 Oct 2021 22:54:59 -0400 Subject: [PATCH] Changed tooltips to take iterator. Tooltips also show original item as well as salvage output. --- voxygen/src/hud/bag.rs | 62 ++++++++++++++++---------- voxygen/src/hud/crafting.rs | 4 +- voxygen/src/hud/loot_scroller.rs | 4 +- voxygen/src/hud/mod.rs | 3 +- voxygen/src/hud/skillbar.rs | 11 +++-- voxygen/src/hud/trade.rs | 9 +++- voxygen/src/ui/widgets/item_tooltip.rs | 43 +++++++++++------- 7 files changed, 86 insertions(+), 50 deletions(-) diff --git a/voxygen/src/hud/bag.rs b/voxygen/src/hud/bag.rs index 0cf96acc5a..9b52b62dca 100644 --- a/voxygen/src/hud/bag.rs +++ b/voxygen/src/hud/bag.rs @@ -21,7 +21,7 @@ use common::{ combat::{combat_rating, Damage}, comp::{ inventory::InventorySortOrder, - item::{Item, ItemDef, ItemDesc, MaterialStatManifest, Quality}, + item::{ItemDef, ItemDesc, MaterialStatManifest, Quality}, Body, Energy, Health, Inventory, Poise, SkillSet, Stats, }, }; @@ -34,7 +34,7 @@ use i18n::Localization; use crate::hud::slots::SlotKind; use specs::Entity as EcsEntity; -use std::sync::Arc; +use std::{borrow::Borrow, sync::Arc}; use vek::Vec2; widget_ids! { @@ -383,29 +383,40 @@ impl<'a> InventoryScroller<'a> { .as_ref() .and_then(|(_, _, prices)| prices.clone()); - let salvage_result: Vec = item - .salvage_output() - .map(|asset| Item::new_from_asset_expect(asset)) - .collect(); + if self.show_salvage && item.is_salvageable() { + let salvage_result: Vec<_> = item + .salvage_output() + .map(|asset| Arc::::load_expect_cloned(asset)) + .map(|item| item as Arc) + .collect(); - let item: Vec<&dyn ItemDesc> = if self.show_salvage { - salvage_result + // let items = core::iter::once(item as &dyn ItemDesc) + // .chain(salvage_result.iter().map(|item| item.borrow())); + let items = salvage_result .iter() - .map(|item| item as &dyn ItemDesc) - .collect() - } else { - vec![item] - }; + .map(|item| item.borrow()) + .chain(core::iter::once(item as &dyn ItemDesc)); - slot_widget - .filled_slot(quality_col_img) - .with_item_tooltip( - self.item_tooltip_manager, - item, - &prices_info, - self.item_tooltip, - ) - .set(state.ids.inv_slots[i], ui); + slot_widget + .filled_slot(quality_col_img) + .with_item_tooltip( + self.item_tooltip_manager, + items, + &prices_info, + self.item_tooltip, + ) + .set(state.ids.inv_slots[i], ui); + } else { + slot_widget + .filled_slot(quality_col_img) + .with_item_tooltip( + self.item_tooltip_manager, + core::iter::once(item as &dyn ItemDesc), + &prices_info, + self.item_tooltip, + ) + .set(state.ids.inv_slots[i], ui); + } } else { slot_widget.set(state.ids.inv_slots[i], ui); } @@ -865,7 +876,12 @@ impl<'a> Widget for Bag<'a> { if let Some(item) = inventory.equipped($slot) { let manager = &mut *self.item_tooltip_manager; $slot_maker - .with_item_tooltip(manager, vec![item], &None, &item_tooltip) + .with_item_tooltip( + manager, + core::iter::once(item as &dyn ItemDesc), + &None, + &item_tooltip, + ) .set($slot_id, ui) } else { let manager = &mut *self.tooltip_manager; diff --git a/voxygen/src/hud/crafting.rs b/voxygen/src/hud/crafting.rs index 0ae79ca579..962c8f0427 100644 --- a/voxygen/src/hud/crafting.rs +++ b/voxygen/src/hud/crafting.rs @@ -724,7 +724,7 @@ impl<'a> Widget for Crafting<'a> { .middle_of(state.ids.output_img_frame) .with_item_tooltip( self.item_tooltip_manager, - vec![&*recipe.output.0], + core::iter::once(&*recipe.output.0 as &dyn ItemDesc), &None, &item_tooltip, ) @@ -970,7 +970,7 @@ impl<'a> Widget for Crafting<'a> { .graphics_for(state.ids.ingredient_btn[i]) .with_item_tooltip( self.item_tooltip_manager, - vec![&*item_def], + core::iter::once(&*item_def as &dyn ItemDesc), &None, &item_tooltip, ) diff --git a/voxygen/src/hud/loot_scroller.rs b/voxygen/src/hud/loot_scroller.rs index 4654c56193..75eb63b9a3 100644 --- a/voxygen/src/hud/loot_scroller.rs +++ b/voxygen/src/hud/loot_scroller.rs @@ -6,7 +6,7 @@ use super::{ }; use crate::ui::{fonts::Fonts, ImageFrame, ItemTooltip, ItemTooltipManager, ItemTooltipable}; use client::Client; -use common::comp::inventory::item::{ItemDef, MaterialStatManifest, Quality}; +use common::comp::inventory::item::{ItemDef, ItemDesc, MaterialStatManifest, Quality}; use conrod_core::{ color, position::Dimension, @@ -335,7 +335,7 @@ impl<'a> Widget for LootScroller<'a> { .middle_of(state.ids.message_icon_bgs[i]) .with_item_tooltip( self.item_tooltip_manager, - vec![&**item], + core::iter::once(&**item as &dyn ItemDesc), &None, &item_tooltip, ) diff --git a/voxygen/src/hud/mod.rs b/voxygen/src/hud/mod.rs index 88370c2175..2d27a2457c 100644 --- a/voxygen/src/hud/mod.rs +++ b/voxygen/src/hud/mod.rs @@ -728,7 +728,8 @@ impl Show { self.selected_crafting_tab(tab); self.crafting(true); self.craft_sprite = self.craft_sprite.or(craft_sprite); - self.salvage = matches!(craft_sprite, Some((_, SpriteKind::SalvagingBench))); + self.salvage = matches!(self.craft_sprite, Some((_, SpriteKind::SalvagingBench))) + && matches!(tab, CraftingTab::Dismantle); } fn diary(&mut self, open: bool) { diff --git a/voxygen/src/hud/skillbar.rs b/voxygen/src/hud/skillbar.rs index 5183d036bf..93157d3aa6 100644 --- a/voxygen/src/hud/skillbar.rs +++ b/voxygen/src/hud/skillbar.rs @@ -24,7 +24,7 @@ use common::comp::{ inventory::slot::EquipSlot, item::{ tool::{Tool, ToolKind}, - Hands, Item, ItemKind, MaterialStatManifest, + Hands, Item, ItemDesc, ItemKind, MaterialStatManifest, }, Energy, Health, Inventory, SkillSet, }; @@ -645,8 +645,13 @@ impl<'a> Skillbar<'a> { .position(entry.position); // if there is an item attached, show item tooltip if let Some(item) = slot_content(entry.slot) { - slot.with_item_tooltip(self.item_tooltip_manager, vec![item], &None, &item_tooltip) - .set(entry.widget_id, ui); + slot.with_item_tooltip( + self.item_tooltip_manager, + core::iter::once(item as &dyn ItemDesc), + &None, + &item_tooltip, + ) + .set(entry.widget_id, ui); // if we can gather some text to display, show it } else if let Some((title, desc)) = tooltip_text(entry.slot) { slot.with_tooltip(self.tooltip_manager, title, desc, &tooltip, TEXT_COLOR) diff --git a/voxygen/src/hud/trade.rs b/voxygen/src/hud/trade.rs index e4b1f1b89a..30db6aa617 100644 --- a/voxygen/src/hud/trade.rs +++ b/voxygen/src/hud/trade.rs @@ -10,7 +10,7 @@ use vek::*; use client::Client; use common::{ comp::{ - inventory::item::{MaterialStatManifest, Quality}, + inventory::item::{ItemDesc, MaterialStatManifest, Quality}, Inventory, Stats, }, trade::{PendingTrade, SitePrices, TradeAction, TradePhase}, @@ -393,7 +393,12 @@ impl<'a> Trade<'a> { slot_widget .filled_slot(quality_col_img) - .with_item_tooltip(self.item_tooltip_manager, vec![item], prices, &item_tooltip) + .with_item_tooltip( + self.item_tooltip_manager, + core::iter::once(item as &dyn ItemDesc), + prices, + &item_tooltip, + ) .set(slot_id, ui); } else { slot_widget.set(slot_id, ui); diff --git a/voxygen/src/ui/widgets/item_tooltip.rs b/voxygen/src/ui/widgets/item_tooltip.rs index a6afc65f7d..b2e7890f9d 100644 --- a/voxygen/src/ui/widgets/item_tooltip.rs +++ b/voxygen/src/ui/widgets/item_tooltip.rs @@ -24,7 +24,10 @@ use conrod_core::{ }; use i18n::Localization; use lazy_static::lazy_static; -use std::time::{Duration, Instant}; +use std::{ + borrow::Borrow, + time::{Duration, Instant}, +}; #[derive(Copy, Clone)] struct Hover(widget::Id, [f64; 2]); @@ -105,16 +108,18 @@ impl ItemTooltipManager { } #[allow(clippy::too_many_arguments)] // TODO: Pending review in #587 - fn set_tooltip( + fn set_tooltip<'a, I>( &mut self, - tooltip: &ItemTooltip, - items: Vec<&dyn ItemDesc>, - prices: &Option, + tooltip: &'a ItemTooltip, + items: impl Iterator, + prices: &'a Option, img_id: Option, image_dims: Option<(f64, f64)>, src_id: widget::Id, ui: &mut UiCell, - ) { + ) where + I: Borrow, + { let mut y_offset = 0.0; let mp_h = MOUSE_PAD_Y / self.logical_scale_factor; for item in items { @@ -125,7 +130,7 @@ impl ItemTooltipManager { // spacing let tooltip = tooltip .clone() - .item(item) + .item(item.borrow()) .prices(prices) .image(img_id) .image_dims(image_dims); @@ -178,17 +183,18 @@ impl ItemTooltipManager { } } -pub struct ItemTooltipped<'a, W> { +pub struct ItemTooltipped<'a, W, I> { inner: W, tooltip_manager: &'a mut ItemTooltipManager, - items: Vec<&'a dyn ItemDesc>, + items: I, prices: &'a Option, img_id: Option, image_dims: Option<(f64, f64)>, tooltip: &'a ItemTooltip<'a>, } -impl<'a, W: Widget> ItemTooltipped<'a, W> { + +impl<'a, W: Widget, I: Iterator> ItemTooltipped<'a, W, I> { pub fn tooltip_image(mut self, img_id: image::Id) -> Self { self.img_id = Some(img_id); self @@ -199,7 +205,10 @@ impl<'a, W: Widget> ItemTooltipped<'a, W> { self } - pub fn set(self, id: widget::Id, ui: &mut UiCell) -> W::Event { + pub fn set(self, id: widget::Id, ui: &mut UiCell) -> W::Event + where + ::Item: Borrow, + { let event = self.inner.set(id, ui); self.tooltip_manager.set_tooltip( self.tooltip, @@ -216,27 +225,27 @@ impl<'a, W: Widget> ItemTooltipped<'a, W> { pub trait ItemTooltipable { // If `Tooltip` is expensive to construct accept a closure here instead. - fn with_item_tooltip<'a>( + fn with_item_tooltip<'a, I>( self, tooltip_manager: &'a mut ItemTooltipManager, - items: Vec<&'a dyn ItemDesc>, + items: I, prices: &'a Option, tooltip: &'a ItemTooltip<'a>, - ) -> ItemTooltipped<'a, Self> + ) -> ItemTooltipped<'a, Self, I> where Self: std::marker::Sized; } impl ItemTooltipable for W { - fn with_item_tooltip<'a>( + fn with_item_tooltip<'a, I>( self, tooltip_manager: &'a mut ItemTooltipManager, - items: Vec<&'a dyn ItemDesc>, + items: I, prices: &'a Option, tooltip: &'a ItemTooltip<'a>, - ) -> ItemTooltipped<'a, W> { + ) -> ItemTooltipped<'a, W, I> { ItemTooltipped { inner: self, tooltip_manager,