From 589ffd2a973bf6d9f8dc0f3032fb653089fce642 Mon Sep 17 00:00:00 2001 From: Felix Huettner Date: Tue, 16 Feb 2021 23:15:04 +0100 Subject: [PATCH] Persist minimap settings This change persists the open/close state as well as the facing-north state of the minimap to the settings file. --- voxygen/src/hud/minimap.rs | 47 +++++++++++++++++++------------------- voxygen/src/hud/mod.rs | 15 +++++++----- voxygen/src/session.rs | 8 +++++++ voxygen/src/settings.rs | 4 ++++ 4 files changed, 45 insertions(+), 29 deletions(-) diff --git a/voxygen/src/hud/minimap.rs b/voxygen/src/hud/minimap.rs index 387062e4bd..3162bb6681 100644 --- a/voxygen/src/hud/minimap.rs +++ b/voxygen/src/hud/minimap.rs @@ -1,9 +1,12 @@ use super::{ img_ids::{Imgs, ImgsRot}, - Show, QUALITY_COMMON, QUALITY_DEBUG, QUALITY_EPIC, QUALITY_HIGH, QUALITY_LOW, QUALITY_MODERATE, + QUALITY_COMMON, QUALITY_DEBUG, QUALITY_EPIC, QUALITY_HIGH, QUALITY_LOW, QUALITY_MODERATE, TEXT_COLOR, UI_HIGHLIGHT_0, UI_MAIN, }; -use crate::ui::{fonts::Fonts, img_ids}; +use crate::{ + ui::{fonts::Fonts, img_ids}, + GlobalState, +}; use client::{self, Client}; use common::{comp, comp::group::Role, terrain::TerrainChunkSize, vol::RectVolSize}; use common_net::msg::world_msg::SiteKind; @@ -40,8 +43,6 @@ widget_ids! { #[derive(WidgetCommon)] pub struct MiniMap<'a> { - show: &'a Show, - client: &'a Client, imgs: &'a Imgs, @@ -51,20 +52,20 @@ pub struct MiniMap<'a> { #[conrod(common_builder)] common: widget::CommonBuilder, ori: Vec3, + global_state: &'a GlobalState, } impl<'a> MiniMap<'a> { pub fn new( - show: &'a Show, client: &'a Client, imgs: &'a Imgs, rot_imgs: &'a ImgsRot, world_map: &'a (img_ids::Rotations, Vec2), fonts: &'a Fonts, ori: Vec3, + global_state: &'a GlobalState, ) -> Self { Self { - show, client, imgs, rot_imgs, @@ -72,6 +73,7 @@ impl<'a> MiniMap<'a> { fonts, common: widget::CommonBuilder::default(), ori, + global_state, } } } @@ -80,12 +82,11 @@ pub struct State { ids: Ids, zoom: f64, - - is_facing_north: bool, } pub enum Event { - Toggle, + Show(bool), + FaceNorth(bool), } impl<'a> Widget for MiniMap<'a> { @@ -105,8 +106,6 @@ impl<'a> Widget for MiniMap<'a> { * (16.0 / 1024.0), ) }, - - is_facing_north: false, } } @@ -117,13 +116,15 @@ impl<'a> Widget for MiniMap<'a> { let widget::UpdateArgs { state, ui, .. } = args; let zoom = state.zoom; const SCALE: f64 = 1.5; // TODO Make this a setting - let orientation = if state.is_facing_north { + let show_minimap = self.global_state.settings.gameplay.minimap_show; + let is_facing_north = self.global_state.settings.gameplay.minimap_face_north; + let orientation = if is_facing_north { Vec3::new(0.0, 1.0, 0.0) } else { self.ori }; - if self.show.mini_map { + if show_minimap { Image::new(self.imgs.mmap_frame) .w_h(174.0 * SCALE, 190.0 * SCALE) .top_right_with_margins_on(ui.window, 5.0, 5.0) @@ -194,18 +195,18 @@ impl<'a> Widget for MiniMap<'a> { } // Always northfacing button - if Button::image(if state.is_facing_north { + if Button::image(if is_facing_north { self.imgs.mmap_north_press } else { self.imgs.mmap_north }) .w_h(18.0 * SCALE, 18.0 * SCALE) - .hover_image(if state.is_facing_north { + .hover_image(if is_facing_north { self.imgs.mmap_north_press_hover } else { self.imgs.mmap_north_hover }) - .press_image(if state.is_facing_north { + .press_image(if is_facing_north { self.imgs.mmap_north_press_hover } else { self.imgs.mmap_north_press @@ -215,7 +216,7 @@ impl<'a> Widget for MiniMap<'a> { .set(state.ids.mmap_north_button, ui) .was_clicked() { - state.update(|s| s.is_facing_north = !s.is_facing_north); + return Some(Event::FaceNorth(!is_facing_north)); } // Reload zoom in case it changed. @@ -247,7 +248,7 @@ impl<'a> Widget for MiniMap<'a> { let map_size = Vec2::new(170.0 * SCALE, 170.0 * SCALE); // Map Image - let world_map_rotation = if state.is_facing_north { + let world_map_rotation = if is_facing_north { world_map.none } else { world_map.source_north @@ -405,7 +406,7 @@ impl<'a> Widget for MiniMap<'a> { // Indicator let ind_scale = 0.4; - let ind_rotation = if state.is_facing_north { + let ind_rotation = if is_facing_north { self.rot_imgs.indicator_mmap_small.target_north } else { self.rot_imgs.indicator_mmap_small.none @@ -453,18 +454,18 @@ impl<'a> Widget for MiniMap<'a> { .set(state.ids.mmap_frame, ui); } - if Button::image(if self.show.mini_map { + if Button::image(if show_minimap { self.imgs.mmap_open } else { self.imgs.mmap_closed }) .w_h(18.0 * SCALE, 18.0 * SCALE) - .hover_image(if self.show.mini_map { + .hover_image(if show_minimap { self.imgs.mmap_open_hover } else { self.imgs.mmap_closed_hover }) - .press_image(if self.show.mini_map { + .press_image(if show_minimap { self.imgs.mmap_open_press } else { self.imgs.mmap_closed_press @@ -474,7 +475,7 @@ impl<'a> Widget for MiniMap<'a> { .set(state.ids.mmap_button, ui) .was_clicked() { - return Some(Event::Toggle); + return Some(Event::Show(!show_minimap)); } // TODO: Subregion name display diff --git a/voxygen/src/hud/mod.rs b/voxygen/src/hud/mod.rs index d0368826e3..4194536090 100644 --- a/voxygen/src/hud/mod.rs +++ b/voxygen/src/hud/mod.rs @@ -419,6 +419,8 @@ pub enum Event { AssignLeader(Uid), RemoveBuff(BuffKind), UnlockSkill(Skill), + MinimapShow(bool), + MinimapFaceNorth(bool), } // TODO: Are these the possible layouts we want? @@ -495,7 +497,6 @@ pub struct Show { esc_menu: bool, open_windows: Windows, map: bool, - mini_map: bool, ingame: bool, settings_tab: SettingsTab, skilltreetab: SelectedSkillTree, @@ -569,8 +570,6 @@ impl Show { fn toggle_map(&mut self) { self.map(!self.map) } - fn toggle_mini_map(&mut self) { self.mini_map = !self.mini_map; } - fn settings(&mut self, open: bool) { if !self.esc_menu { self.open_windows = if open { @@ -805,7 +804,6 @@ impl Hud { diary: false, group: false, group_menu: false, - mini_map: true, settings_tab: SettingsTab::Interface, skilltreetab: SelectedSkillTree::General, social_tab: SocialTab::Online, @@ -1989,17 +1987,22 @@ impl Hud { // MiniMap match MiniMap::new( - &self.show, client, &self.imgs, &self.rot_imgs, &self.world_map, &self.fonts, camera.get_orientation(), + &global_state, ) .set(self.ids.minimap, ui_widgets) { - Some(minimap::Event::Toggle) => self.show.toggle_mini_map(), + Some(minimap::Event::Show(show)) => { + events.push(Event::MinimapShow(show)); + }, + Some(minimap::Event::FaceNorth(should_face_north)) => { + events.push(Event::MinimapFaceNorth(should_face_north)) + }, None => {}, } diff --git a/voxygen/src/session.rs b/voxygen/src/session.rs index ca60e76c7e..7eb334b345 100644 --- a/voxygen/src/session.rs +++ b/voxygen/src/session.rs @@ -1273,6 +1273,14 @@ impl PlayState for SessionState { HudEvent::AssignLeader(uid) => { self.client.borrow_mut().assign_group_leader(uid); }, + HudEvent::MinimapShow(state) => { + global_state.settings.gameplay.minimap_show = state; + global_state.settings.save_to_file_warn(); + }, + HudEvent::MinimapFaceNorth(state) => { + global_state.settings.gameplay.minimap_face_north = state; + global_state.settings.save_to_file_warn(); + }, } } diff --git a/voxygen/src/settings.rs b/voxygen/src/settings.rs index 0aaf47cde0..e92a7ec217 100644 --- a/voxygen/src/settings.rs +++ b/voxygen/src/settings.rs @@ -524,6 +524,8 @@ pub struct GameplaySettings { pub map_show_castles: bool, pub loading_tips: bool, pub map_show_caves: bool, + pub minimap_show: bool, + pub minimap_face_north: bool, } impl Default for GameplaySettings { @@ -561,6 +563,8 @@ impl Default for GameplaySettings { map_show_castles: true, loading_tips: true, map_show_caves: true, + minimap_show: true, + minimap_face_north: false, } } }