From 1e2409515485f5c3857f44ef9d73153dcadc749b Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Fri, 28 Dec 2018 10:39:08 +0100 Subject: [PATCH] Horizontal layout --- docs/emgui_bg.wasm | Bin 185128 -> 186092 bytes src/app.rs | 29 ++++----- src/emgui.rs | 11 +--- src/layout.rs | 156 +++++++++++++++++++++++++++++++++------------ 4 files changed, 130 insertions(+), 66 deletions(-) diff --git a/docs/emgui_bg.wasm b/docs/emgui_bg.wasm index 1707e9b24131f360951c4e8f2ee611eb7cc8dde5..15110b682b58891b61485c79a5c1171e4e3e8845 100644 GIT binary patch delta 39576 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 Vec { diff --git a/src/layout.rs b/src/layout.rs index 2fa71a42..eda477aa 100644 --- a/src/layout.rs +++ b/src/layout.rs @@ -33,7 +33,7 @@ impl Default for LayoutOptions { char_size: vec2(7.2, 14.0), item_spacing: vec2(8.0, 4.0), indent: 21.0, - width: 200.0, + width: 250.0, button_padding: vec2(5.0, 3.0), start_icon_width: 20.0, } @@ -43,9 +43,9 @@ impl Default for LayoutOptions { // ---------------------------------------------------------------------------- #[derive(Clone, Debug, Default)] -pub struct Memory { +struct Memory { /// The widget being interacted with (e.g. dragged, in case of a slider). - pub active_id: Option, + active_id: Option, /// Which foldable regions are open. open_foldables: HashSet, @@ -62,16 +62,61 @@ type TextFragments = Vec; // ---------------------------------------------------------------------------- +#[derive(Clone, Copy, Debug, PartialEq)] +enum Direction { + Horizontal, + Vertical, +} + +impl Default for Direction { + fn default() -> Direction { + Direction::Vertical + } +} + +// ---------------------------------------------------------------------------- + +// TODO: give this a better name +#[derive(Clone, Debug, Default)] +struct Layouter { + /// Doesn't change. + dir: Direction, + + /// Changes only along self.dir + cursor: Vec2, + + /// We keep track of our max-size along the orthogonal to self.dir + size: Vec2, +} + +impl Layouter { + /// Reserve this much space and move the cursor. + fn reserve_space(&mut self, size: Vec2) { + if self.dir == Direction::Horizontal { + self.cursor.x += size.x; + self.size.x += size.x; + self.size.y = self.size.y.max(size.y); + } else { + self.cursor.y += size.y; + self.size.y += size.y; + self.size.x = self.size.x.max(size.x); + } + } +} + +// ---------------------------------------------------------------------------- + type Id = u64; +/// TODO: non-pub #[derive(Clone, Debug, Default)] pub struct Layout { - pub options: LayoutOptions, - pub input: GuiInput, - pub cursor: Vec2, + pub options: LayoutOptions, // TODO: remove pub + input: GuiInput, + memory: Memory, id: Id, - pub memory: Memory, - pub commands: Vec, + layouter: Layouter, + pub commands: Vec, // TODO: remove pub } impl Layout { @@ -83,15 +128,25 @@ impl Layout { &self.commands } + // TODO: move + pub fn new_frae(&mut self, gui_input: GuiInput) { + self.commands.clear(); + self.layouter = Default::default(); + self.input = gui_input; + if !gui_input.mouse_down { + self.memory.active_id = None; + } + } + // ------------------------------------------------------------------------ pub fn button>(&mut self, text: S) -> InteractInfo { let text: String = text.into(); let id = self.get_id(&text); let (text, text_size) = self.layout_text(&text); - let text_cursor = self.cursor + self.options.button_padding; + let text_cursor = self.layouter.cursor + self.options.button_padding; let (rect, interact) = - self.reserve_space(id, text_size + 2.0 * self.options.button_padding); + self.reserve_interactive_space(id, text_size + 2.0 * self.options.button_padding); self.commands.push(GuiCmd::Button { interact, rect }); self.add_text(text_cursor, text); interact @@ -101,9 +156,10 @@ impl Layout { let text: String = text.into(); let id = self.get_id(&text); let (text, text_size) = self.layout_text(&text); - let text_cursor = - self.cursor + self.options.button_padding + vec2(self.options.start_icon_width, 0.0); - let (rect, interact) = self.reserve_space( + let text_cursor = self.layouter.cursor + + self.options.button_padding + + vec2(self.options.start_icon_width, 0.0); + let (rect, interact) = self.reserve_interactive_space( id, self.options.button_padding + vec2(self.options.start_icon_width, 0.0) @@ -125,9 +181,8 @@ impl Layout { pub fn label>(&mut self, text: S) { let text: String = text.into(); let (text, text_size) = self.layout_text(&text); - self.add_text(self.cursor, text); - self.cursor.y += text_size.y; - self.cursor.y += self.options.item_spacing.y; + self.add_text(self.layouter.cursor, text); + self.reserve_space_default_spacing(text_size); } /// A radio button @@ -135,9 +190,10 @@ impl Layout { let text: String = text.into(); let id = self.get_id(&text); let (text, text_size) = self.layout_text(&text); - let text_cursor = - self.cursor + self.options.button_padding + vec2(self.options.start_icon_width, 0.0); - let (rect, interact) = self.reserve_space( + let text_cursor = self.layouter.cursor + + self.options.button_padding + + vec2(self.options.start_icon_width, 0.0); + let (rect, interact) = self.reserve_interactive_space( id, self.options.button_padding + vec2(self.options.start_icon_width, 0.0) @@ -164,9 +220,9 @@ impl Layout { let text: String = text.into(); let id = self.get_id(&text); let (text, text_size) = self.layout_text(&format!("{}: {:.3}", text, value)); - self.add_text(self.cursor, text); - self.cursor.y += text_size.y; - let (slider_rect, interact) = self.reserve_space( + self.add_text(self.layouter.cursor, text); + self.layouter.reserve_space(text_size); + let (slider_rect, interact) = self.reserve_interactive_space( id, Vec2 { x: self.options.width, @@ -203,11 +259,15 @@ impl Layout { S: Into, F: FnOnce(&mut Layout), { + assert!( + self.layouter.dir == Direction::Vertical, + "Horizontal foldable is unimplemented" + ); let text: String = text.into(); let id = self.get_id(&text); let (text, text_size) = self.layout_text(&text); - let text_cursor = self.cursor + self.options.button_padding; - let (rect, interact) = self.reserve_space( + let text_cursor = self.layouter.cursor + self.options.button_padding; + let (rect, interact) = self.reserve_interactive_space( id, vec2( self.options.width, @@ -234,29 +294,46 @@ impl Layout { if open { let old_id = self.id; self.id = id; - let old_x = self.cursor.x; - self.cursor.x += self.options.indent; + let old_x = self.layouter.cursor.x; + self.layouter.cursor.x += self.options.indent; add_contents(self); - self.cursor.x = old_x; + self.layouter.cursor.x = old_x; self.id = old_id; } interact } - // ------------------------------------------------------------------------ - - fn reserve_space(&mut self, id: Id, size: Vec2) -> (Rect, InteractInfo) { - let rect = Rect { - pos: self.cursor, - size, + /// Start a region with horizontal layout + pub fn horizontal(&mut self, add_contents: F) + where + F: FnOnce(&mut Layout), + { + let horizontal_layouter = Layouter { + dir: Direction::Horizontal, + cursor: self.layouter.cursor, + ..Default::default() }; - let interact = self.interactive_rect(id, &rect); - self.cursor.y += rect.size.y + self.options.item_spacing.y; - (rect, interact) + let old_layouter = std::mem::replace(&mut self.layouter, horizontal_layouter); + add_contents(self); + let horizontal_layouter = std::mem::replace(&mut self.layouter, old_layouter); + self.layouter.reserve_space(horizontal_layouter.size); } - fn interactive_rect(&mut self, id: Id, rect: &Rect) -> InteractInfo { + // ------------------------------------------------------------------------ + + fn reserve_space_default_spacing(&mut self, size: Vec2) -> Rect { + let rect = Rect { + pos: self.layouter.cursor, + size, + }; + self.layouter + .reserve_space(size + self.options.item_spacing); + rect + } + + fn reserve_interactive_space(&mut self, id: Id, size: Vec2) -> (Rect, InteractInfo) { + let rect = self.reserve_space_default_spacing(size); let hovered = rect.contains(self.input.mouse_pos); let clicked = hovered && self.input.mouse_clicked; if clicked { @@ -264,11 +341,12 @@ impl Layout { } let active = self.memory.active_id == Some(id); - InteractInfo { + let interact = InteractInfo { hovered, clicked, active, - } + }; + (rect, interact) } fn get_id(&self, id_str: &str) -> Id {