From 5728d08fce8a5d5a934add2bb48d88ee675d47d9 Mon Sep 17 00:00:00 2001 From: Snowram <robin.gilh@gmail.com> Date: Mon, 7 Jun 2021 02:51:46 +0200 Subject: [PATCH] Item tooltip refactor and fixed related to new stats --- voxygen/src/hud/util.rs | 20 +-- voxygen/src/ui/widgets/item_tooltip.rs | 182 +++++++++---------------- 2 files changed, 78 insertions(+), 124 deletions(-) diff --git a/voxygen/src/hud/util.rs b/voxygen/src/hud/util.rs index bad69a814f..7f93c96049 100644 --- a/voxygen/src/hud/util.rs +++ b/voxygen/src/hud/util.rs @@ -73,13 +73,13 @@ pub fn kind_text<'a>(kind: &ItemKind, i18n: &'a Localization) -> Cow<'a, str> { } } -pub fn material_kind_text<'a>(kind: &MaterialKind, i18n: &'a Localization) -> Cow<'a, str> { +pub fn material_kind_text<'a>(kind: &MaterialKind, i18n: &'a Localization) -> &'a str { match kind { - MaterialKind::Metal { .. } => Cow::Borrowed(i18n.get("common.material.metal")), - MaterialKind::Wood { .. } => Cow::Borrowed(i18n.get("common.material.wood")), - MaterialKind::Stone { .. } => Cow::Borrowed(i18n.get("common.material.stone")), - MaterialKind::Cloth { .. } => Cow::Borrowed(i18n.get("common.material.cloth")), - MaterialKind::Hide { .. } => Cow::Borrowed(i18n.get("common.material.hide")), + MaterialKind::Metal { .. } => i18n.get("common.material.metal"), + MaterialKind::Wood { .. } => i18n.get("common.material.wood"), + MaterialKind::Stone { .. } => i18n.get("common.material.stone"), + MaterialKind::Cloth { .. } => i18n.get("common.material.cloth"), + MaterialKind::Hide { .. } => i18n.get("common.material.hide"), } } @@ -190,7 +190,7 @@ fn armor_kind<'a>(armor: &Armor, i18n: &'a Localization) -> &'a str { kind } -//Tool +// Tool fn tool_kind<'a>(tool: &Tool, i18n: &'a Localization) -> &'a str { let kind = match tool.kind { ToolKind::Sword => i18n.get("common.weapons.sword"), @@ -211,7 +211,7 @@ fn tool_kind<'a>(tool: &Tool, i18n: &'a Localization) -> &'a str { kind } -// Output the number of hands needed to hold a tool +/// Output the number of hands needed to hold a tool pub fn tool_hands<'a>(tool: &Tool, i18n: &'a Localization) -> &'a str { let hands = match tool.hands { Hands::One => i18n.get("common.hands.one"), @@ -229,7 +229,7 @@ fn statblock_desc(stats: &Stats) -> String { ) + &format!("Crit chance: {:0.1}%\n\n", stats.crit_chance * 100.0,) } -// Compare two type, output a colored character to show comparison +/// Compare two type, output a colored character to show comparison pub fn comparison<T: PartialOrd>(first: T, other: T) -> (&'static str, conrod_core::Color) { if first == other { ("•", conrod_core::color::GREY) @@ -240,7 +240,7 @@ pub fn comparison<T: PartialOrd>(first: T, other: T) -> (&'static str, conrod_co } } -// Output protection as a string +/// Output protection as a string pub fn protec2string(stat: Protection) -> String { match stat { Protection::Normal(a) => format!("{:.1}", a), diff --git a/voxygen/src/ui/widgets/item_tooltip.rs b/voxygen/src/ui/widgets/item_tooltip.rs index 5e76f6abba..c1a64ed74b 100644 --- a/voxygen/src/ui/widgets/item_tooltip.rs +++ b/voxygen/src/ui/widgets/item_tooltip.rs @@ -437,7 +437,7 @@ impl<'a> Widget for ItemTooltip<'a> { 5 } }, - ItemKind::Tool(_) => 5, + ItemKind::Tool(_) => 4, ItemKind::Consumable { .. } => 1, _ => 0, }; @@ -465,14 +465,10 @@ impl<'a> Widget for ItemTooltip<'a> { let item_kind = util::kind_text(item.kind(), i18n).to_string(); - let material_tag = item - .tags() - .iter() - .filter_map(|t| match t { - ItemTag::Material(material) => Some(material), - _ => None, - }) - .next(); + let material_tag = item.tags().iter().find_map(|t| match t { + ItemTag::Material(material) => Some(material), + _ => None, + }); let subtitle = if let Some(material_tag) = material_tag { format!( @@ -484,6 +480,8 @@ impl<'a> Widget for ItemTooltip<'a> { item_kind }; + let style = self.style.desc; + let text_color = conrod_core::color::WHITE; // Widths @@ -696,57 +694,40 @@ impl<'a> Widget for ItemTooltip<'a> { .set(state.ids.diff_main_stat, ui); } - if diff.power.abs() > f32::EPSILON { - widget::Text::new(&format!( - "{} {:.1}", - &power_diff.0, - &diff.power * 10.0 - )) - .align_middle_y_of(state.ids.stats[0]) - .right_from(state.ids.stats[0], H_PAD) - .graphics_for(id) - .parent(id) - .with_style(self.style.desc) - .color(power_diff.1) - .set(state.ids.diffs[0], ui); - } - if diff.speed.abs() > f32::EPSILON { - widget::Text::new(&format!("{} {:.1}", &speed_diff.0, &diff.speed)) - .align_middle_y_of(state.ids.stats[1]) - .right_from(state.ids.stats[1], H_PAD) + let mut diff_text = |text: String, color, id_index| { + widget::Text::new(&*text) + .align_middle_y_of(state.ids.stats[id_index]) + .right_from(state.ids.stats[id_index], H_PAD) .graphics_for(id) .parent(id) - .with_style(self.style.desc) - .color(speed_diff.1) - .set(state.ids.diffs[1], ui); + .with_style(style) + .color(color) + .set(state.ids.diffs[id_index], ui) + }; + + if diff.power.abs() > f32::EPSILON { + let text = format!("{} {:.1}", &power_diff.0, &diff.power * 10.0); + diff_text(text, power_diff.1, 0) + } + if diff.speed.abs() > f32::EPSILON { + let text = format!("{} {:.1}", &speed_diff.0, &diff.speed); + diff_text(text, speed_diff.1, 1) } if diff.poise_strength.abs() > f32::EPSILON { - widget::Text::new(&format!( + let text = format!( "{} {:.1}", &poise_strength_diff.0, &diff.poise_strength * 10.0 - )) - .align_middle_y_of(state.ids.stats[2]) - .right_from(state.ids.stats[2], H_PAD) - .graphics_for(id) - .parent(id) - .with_style(self.style.desc) - .color(poise_strength_diff.1) - .set(state.ids.diffs[2], ui); + ); + diff_text(text, poise_strength_diff.1, 2) } if diff.crit_chance.abs() > f32::EPSILON { - widget::Text::new(&format!( + let text = format!( "{} {:.1}%", &crit_chance_diff.0, &diff.crit_chance * 100.0 - )) - .align_middle_y_of(state.ids.stats[3]) - .right_from(state.ids.stats[3], H_PAD) - .graphics_for(id) - .parent(id) - .with_style(self.style.desc) - .color(crit_chance_diff.1) - .set(state.ids.diffs[3], ui); + ); + diff_text(text, crit_chance_diff.1, 3) } } } @@ -811,21 +792,6 @@ impl<'a> Widget for ItemTooltip<'a> { .down_from(state.ids.item_frame, V_PAD) .set(state.ids.stats[0], ui); - // Slots - if item.num_slots() > 0 { - widget::Text::new(&format!( - "{} : {}", - i18n.get("common.stats.slots"), - item.num_slots() - )) - .graphics_for(id) - .parent(id) - .with_style(self.style.desc) - .color(text_color) - .x_align_to(state.ids.item_frame, conrod_core::position::Align::Start) - .down_from(state.ids.stats[0], V_PAD_STATS) - .set(state.ids.stats[1], ui); - } // Max Energy widget::Text::new(&format!( "{} : {}", @@ -877,6 +843,21 @@ impl<'a> Widget for ItemTooltip<'a> { .color(text_color) .down_from(state.ids.stats[3], V_PAD_STATS) .set(state.ids.stats[4], ui); + + // Slots + if item.num_slots() > 0 { + widget::Text::new(&format!( + "{} : {}", + i18n.get("common.stats.slots"), + item.num_slots() + )) + .graphics_for(id) + .parent(id) + .with_style(self.style.desc) + .color(text_color) + .down_from(state.ids.stats[4], V_PAD_STATS) + .set(state.ids.stats[5], ui); + } }, } @@ -909,75 +890,48 @@ impl<'a> Widget for ItemTooltip<'a> { .set(state.ids.diff_main_stat, ui); } + let mut diff_text = |text: String, color, id_index| { + widget::Text::new(&*text) + .align_middle_y_of(state.ids.stats[id_index]) + .right_from(state.ids.stats[id_index], H_PAD) + .graphics_for(id) + .parent(id) + .with_style(style) + .color(color) + .set(state.ids.diffs[id_index], ui) + }; + if diff.poise_resilience() != Protection::Normal(0.0) { - widget::Text::new(&format!( + let text = format!( "{} {}", &poise_res_diff.0, util::protec2string(diff.poise_resilience()) - )) - .align_middle_y_of(state.ids.stats[0]) - .right_from(state.ids.stats[0], H_PAD) - .graphics_for(id) - .parent(id) - .with_style(self.style.desc) - .color(poise_res_diff.1) - .set(state.ids.diffs[0], ui); + ); + diff_text(text, poise_res_diff.1, 0) } if diff.energy_max() != 0.0 as i32 { - widget::Text::new(&format!( - "{} {}", - &energy_max_diff.0, - diff.energy_max() / 10 - )) - .align_middle_y_of(state.ids.stats[1]) - .right_from(state.ids.stats[1], H_PAD) - .graphics_for(id) - .parent(id) - .with_style(self.style.desc) - .color(energy_max_diff.1) - .set(state.ids.diffs[1], ui); + let text = format!("{} {}", &energy_max_diff.0, diff.energy_max() / 10); + diff_text(text, energy_max_diff.1, 1) } if diff.energy_reward() != 0.0_f32 { - widget::Text::new(&format!( + let text = format!( "{} {}", &energy_reward_diff.0, diff.energy_reward() * 10.0 - )) - .align_middle_y_of(state.ids.stats[2]) - .right_from(state.ids.stats[2], H_PAD) - .graphics_for(id) - .parent(id) - .with_style(self.style.desc) - .color(energy_reward_diff.1) - .set(state.ids.diffs[2], ui); + ); + diff_text(text, energy_reward_diff.1, 2) } if diff.crit_power() != 0.0_f32 { - widget::Text::new(&format!( - "{} {}", - &crit_power_diff.0, - diff.crit_power() - )) - .align_middle_y_of(state.ids.stats[3]) - .right_from(state.ids.stats[3], H_PAD) - .graphics_for(id) - .parent(id) - .with_style(self.style.desc) - .color(crit_power_diff.1) - .set(state.ids.diffs[3], ui); + let text = format!("{} {}", &crit_power_diff.0, diff.crit_power()); + diff_text(text, crit_power_diff.1, 3) } if diff.stealth() != 0.0_f32 { - widget::Text::new(&format!("{} {}", &stealth_diff.0, diff.stealth())) - .align_middle_y_of(state.ids.stats[4]) - .right_from(state.ids.stats[4], H_PAD) - .graphics_for(id) - .parent(id) - .with_style(self.style.desc) - .color(stealth_diff.1) - .set(state.ids.diffs[4], ui); + let text = format!("{} {}", &stealth_diff.0, diff.stealth()); + diff_text(text, stealth_diff.1, 4) } } } @@ -1094,7 +1048,7 @@ impl<'a> Widget for ItemTooltip<'a> { 5 } }, - ItemKind::Tool(_) => 5, + ItemKind::Tool(_) => 4, ItemKind::Consumable { .. } => 1, ItemKind::ModularComponent { .. } => 1, _ => 0,