From e607097da02a18764074f27d1651fd4890c53339 Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Sat, 12 Jan 2019 23:20:19 +0100 Subject: [PATCH] Refactor where and how options are stored --- emigui/src/emigui.rs | 20 ++++---------------- emigui/src/layout.rs | 28 +++++++++++++++++++--------- 2 files changed, 23 insertions(+), 25 deletions(-) diff --git a/emigui/src/emigui.rs b/emigui/src/emigui.rs index 292aff92..06a8b2bf 100644 --- a/emigui/src/emigui.rs +++ b/emigui/src/emigui.rs @@ -75,6 +75,7 @@ impl Emigui { let size = self.data.input.screen_size; layout::Region { data: self.data.clone(), + options: self.data.options(), id: Default::default(), dir: layout::Direction::Vertical, cursor: Default::default(), @@ -83,16 +84,6 @@ impl Emigui { } } - pub fn options(&self) -> &layout::LayoutOptions { - &self.data.options - } - - pub fn set_options(&mut self, options: layout::LayoutOptions) { - let mut new_data = (*self.data).clone(); - new_data.options = options; - self.data = Arc::new(new_data); - } - pub fn paint(&mut self) -> Frame { let gui_commands = self.data.graphics.lock().unwrap().drain(); let paint_commands = style::into_paint_commands(gui_commands, &self.style); @@ -103,14 +94,14 @@ impl Emigui { } pub fn example(&mut self, region: &mut Region) { - let mut options = self.options().clone(); region.foldable("LayoutOptions", |gui| { + let mut options = self.data.options(); show_options(&mut options, gui); + self.data.set_options(options); }); - let mut style = self.style.clone(); region.foldable("Style", |gui| { - show_style(&mut style, gui); + show_style(&mut self.style, gui); }); region.foldable("Stats", |gui| { @@ -120,8 +111,5 @@ impl Emigui { self.stats.num_triangles ))); }); - - // self.set_options(options); // TODO - self.style = style; } } diff --git a/emigui/src/layout.rs b/emigui/src/layout.rs index 04d02150..d8edbf6f 100644 --- a/emigui/src/layout.rs +++ b/emigui/src/layout.rs @@ -141,7 +141,8 @@ impl GraphicLayers { // TODO: give a better name. /// Contains the input, options and output of all GUI commands. pub struct Data { - pub(crate) options: LayoutOptions, + /// The default options for new regions + pub(crate) options: Mutex, pub(crate) font: Arc, pub(crate) input: GuiInput, pub(crate) memory: Mutex, @@ -151,7 +152,7 @@ pub struct Data { impl Clone for Data { fn clone(&self) -> Self { Data { - options: self.options.clone(), + options: Mutex::new(self.options()), font: self.font.clone(), input: self.input.clone(), memory: Mutex::new(self.memory.lock().unwrap().clone()), @@ -175,12 +176,12 @@ impl Data { &self.input } - pub fn options(&self) -> &LayoutOptions { - &self.options + pub fn options(&self) -> LayoutOptions { + *self.options.lock().unwrap() } - pub fn set_options(&mut self, options: LayoutOptions) { - self.options = options; + pub fn set_options(&self, options: LayoutOptions) { + *self.options.lock().unwrap() = options; } // TODO: move @@ -200,10 +201,12 @@ where // TODO: nicer way to do layering! let num_graphics_before = data.graphics.lock().unwrap().graphics.len(); - let window_padding = data.options.window_padding; + let options = data.options(); + let window_padding = options.window_padding; let mut popup_region = Region { data: data.clone(), + options, id: Default::default(), dir: Direction::Vertical, cursor: window_pos + window_padding, @@ -214,7 +217,7 @@ where add_contents(&mut popup_region); // TODO: handle the last item_spacing in a nicer way - let inner_size = popup_region.bounding_size - data.options.item_spacing; + let inner_size = popup_region.bounding_size - options.item_spacing; let outer_size = inner_size + 2.0 * window_padding; let rect = Rect::from_min_size(window_pos, outer_size); @@ -233,6 +236,8 @@ where pub struct Region { pub(crate) data: Arc, + pub(crate) options: LayoutOptions, + /// Unique ID of this region. pub(crate) id: Id, @@ -259,8 +264,9 @@ impl Region { self.data.graphics.lock().unwrap().graphics.push(gui_cmd) } + /// Options for this region, and any child regions we may spawn. pub fn options(&self) -> &LayoutOptions { - self.data.options() + &self.options } pub fn input(&self) -> &GuiInput { @@ -343,6 +349,7 @@ impl Region { let indent = vec2(self.options().indent, 0.0); let mut child_region = Region { data: self.data.clone(), + options: self.options, id: self.id, dir: self.dir, cursor: self.cursor + indent, @@ -358,6 +365,7 @@ impl Region { pub fn centered_column(&mut self, width: f32) -> Region { Region { data: self.data.clone(), + options: self.options, id: self.id, dir: self.dir, cursor: vec2((self.available_space.x - width) / 2.0, self.cursor.y), @@ -373,6 +381,7 @@ impl Region { { let mut child_region = Region { data: self.data.clone(), + options: self.options, id: self.id, dir: Direction::Horizontal, cursor: self.cursor, @@ -402,6 +411,7 @@ impl Region { let mut columns: Vec = (0..num_columns) .map(|col_idx| Region { data: self.data.clone(), + options: self.options, id: self.make_child_id(&("column", col_idx)), dir: Direction::Vertical, cursor: self.cursor + vec2((col_idx as f32) * (column_width + padding), 0.0),