From f60c44d812a970e1e22c96a853fc65588d7a761e Mon Sep 17 00:00:00 2001 From: Isse Date: Wed, 26 Apr 2023 20:38:35 +0200 Subject: [PATCH] nicer ui --- voxygen/src/hud/mod.rs | 10 +++- voxygen/src/hud/subtitles.rs | 104 +++++++++++++++++++++++------------ 2 files changed, 78 insertions(+), 36 deletions(-) diff --git a/voxygen/src/hud/mod.rs b/voxygen/src/hud/mod.rs index 7d3db12c93..c76c101002 100644 --- a/voxygen/src/hud/mod.rs +++ b/voxygen/src/hud/mod.rs @@ -3349,8 +3349,14 @@ impl Hud { } if global_state.settings.audio.subtitles { - Subtitles::new(client, &mut global_state.audio.subtitles, &self.fonts, i18n) - .set(self.ids.subtitles, ui_widgets); + Subtitles::new( + client, + &global_state.settings, + &mut global_state.audio.subtitles, + &self.fonts, + i18n, + ) + .set(self.ids.subtitles, ui_widgets); } else { global_state.audio.subtitles.clear(); } diff --git a/voxygen/src/hud/subtitles.rs b/voxygen/src/hud/subtitles.rs index 22d99f7eba..42f36aa16b 100644 --- a/voxygen/src/hud/subtitles.rs +++ b/voxygen/src/hud/subtitles.rs @@ -1,11 +1,11 @@ use std::collections::VecDeque; -use crate::ui::fonts::Fonts; +use crate::{settings::Settings, ui::fonts::Fonts}; use client::Client; use common::comp; use conrod_core::{ - widget::{self, Text}, - widget_ids, Colorable, Positionable, Widget, WidgetCommon, + widget::{self, Id, Rectangle, Text}, + widget_ids, Colorable, Positionable, UiCell, Widget, WidgetCommon, }; use i18n::Localization; @@ -13,15 +13,16 @@ use vek::{Vec2, Vec3}; widget_ids! { struct Ids { - subtitle_box, subtitle_box_bg, subtitle_message[], + subtitle_dir[], } } #[derive(WidgetCommon)] pub struct Subtitles<'a> { client: &'a Client, + settings: &'a Settings, fonts: &'a Fonts, @@ -36,12 +37,14 @@ pub struct Subtitles<'a> { impl<'a> Subtitles<'a> { pub fn new( client: &'a Client, + settings: &'a Settings, new_subtitles: &'a mut VecDeque, fonts: &'a Fonts, localized_strings: &'a Localization, ) -> Self { Self { client, + settings, fonts, new_subtitles, common: widget::CommonBuilder::default(), @@ -123,21 +126,26 @@ impl<'a> Widget for Subtitles<'a> { s.ids .subtitle_message .resize(s.subtitles.len(), &mut ui.widget_id_generator()); + s.ids + .subtitle_dir + .resize(s.subtitles.len(), &mut ui.widget_id_generator()); }); - let mut subtitles = state - .ids - .subtitle_message - .iter() - .zip(state.subtitles.iter()); - - let fade_amount = |t: &Subtitle| ((t.show_until - time) * 1.5).clamp(0.0, 1.0) as f32; + let color = |t: &Subtitle| { + conrod_core::Color::Rgba( + 0.9, + 1.0, + 1.0, + ((t.show_until - time) * 1.5).clamp(0.0, 1.0) as f32, + ) + }; let player_dir = player_dir.xy().try_normalized().unwrap_or(Vec2::unit_y()); let player_right = Vec2::new(player_dir.y, -player_dir.x); - let message = |subtitle: &Subtitle| { - let message = self.localized_strings.get_msg(&subtitle.localization); + let message = |subtitle: &Subtitle| self.localized_strings.get_msg(&subtitle.localization); + + let dir = |subtitle: &Subtitle, id: &Id, dir_id: &Id, ui: &mut UiCell| { let is_right = subtitle.position.and_then(|pos| { let dist = pos.distance(player_pos); let dir = (pos - player_pos) / dist; @@ -149,41 +157,69 @@ impl<'a> Widget for Subtitles<'a> { Some(dir.xy().dot(player_right) >= 0.0) } }); - match is_right { - Some(true) => format!(" {message} >"), - Some(false) => format!("< {message} "), - None => format!(" {message} "), + Some(true) => Text::new("> ") + .font_size(self.fonts.cyri.scale(14)) + .font_id(self.fonts.cyri.conrod_id) + .parent(state.ids.subtitle_box_bg) + .align_right_of(state.ids.subtitle_box_bg) + .align_middle_y_of(*id) + .color(color(subtitle)) + .set(*dir_id, ui), + Some(false) => Text::new(" <") + .font_size(self.fonts.cyri.scale(14)) + .font_id(self.fonts.cyri.conrod_id) + .parent(state.ids.subtitle_box_bg) + .align_left_of(state.ids.subtitle_box_bg) + .align_middle_y_of(*id) + .color(color(subtitle)) + .set(*dir_id, ui), + None => Text::new("") + .font_size(self.fonts.cyri.scale(14)) + .font_id(self.fonts.cyri.conrod_id) + .parent(state.ids.subtitle_box_bg) + .color(color(subtitle)) + .set(*dir_id, ui), } }; - if let Some((id, subtitle)) = subtitles.next() { + Rectangle::fill([200.0, 2.0 + 22.0 * state.subtitles.len() as f64]) + .rgba(0.0, 0.0, 0.0, self.settings.chat.chat_opacity) + .bottom_right_with_margins_on(ui.window, 40.0, 50.0) + .set(state.ids.subtitle_box_bg, ui); + + let mut subtitles = state + .ids + .subtitle_message + .iter() + .zip(state.ids.subtitle_dir.iter()) + .zip(state.subtitles.iter()); + + if let Some(((id, dir_id), subtitle)) = subtitles.next() { Text::new(&message(subtitle)) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) + .parent(state.ids.subtitle_box_bg) .center_justify() - .bottom_right_with_margins(40.0, 50.0) - .color(conrod_core::Color::Rgba( - 0.9, - 1.0, - 1.0, - fade_amount(subtitle), - )) + .mid_bottom_with_margin_on(state.ids.subtitle_box_bg, 6.0) + .color(color(subtitle)) .set(*id, ui); + + dir(subtitle, id, dir_id, ui); + let mut last_id = *id; - for (id, subtitle) in subtitles { + for ((id, dir_id), subtitle) in subtitles { Text::new(&message(subtitle)) .font_size(self.fonts.cyri.scale(14)) .font_id(self.fonts.cyri.conrod_id) - .center_justify() - .up_from(last_id, 10.0) - .color(conrod_core::Color::Rgba( - 0.9, - 1.0, - 1.0, - fade_amount(subtitle), - )) + .parent(state.ids.subtitle_box_bg) + .up_from(last_id, 8.0) + .align_middle_x_of(last_id) + .color(color(subtitle)) .set(*id, ui); + + dir(subtitle, id, dir_id, ui); + last_id = *id; } }