From 1c6fd220b27fd89bc3ff27a627e2dff5db27efda Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Thu, 27 Dec 2018 23:55:16 +0100 Subject: [PATCH] Improve text layout --- docs/emgui_bg.wasm | Bin 161262 -> 185128 bytes docs/frontend.js | 3 +- docs/frontend.ts | 4 +- src/app.rs | 17 +++----- src/layout.rs | 105 ++++++++++++++++++++++++--------------------- src/style.rs | 66 ++++------------------------ src/types.rs | 19 +++----- 7 files changed, 80 insertions(+), 134 deletions(-) diff --git a/docs/emgui_bg.wasm b/docs/emgui_bg.wasm index da741051d1dd7f874fc4aa72aae6dbd2a47323c7..1707e9b24131f360951c4e8f2ee611eb7cc8dde5 100644 GIT binary patch delta 69770 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�=^<{7O+lY$ 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

XyS$<5&O>p*)!??tnF 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 diff --git a/docs/frontend.js b/docs/frontend.js index 306da3e0..56f66a3d 100644 --- a/docs/frontend.js +++ b/docs/frontend.js @@ -63,8 +63,7 @@ function paint_command(canvas, cmd) { case "text": ctx.fillStyle = styleFromColor(cmd.fill_color); ctx.font = cmd.font_size + "px " + cmd.font_name; - ctx.textAlign = cmd.text_align; - ctx.textBaseline = "top"; + ctx.textBaseline = "middle"; ctx.fillText(cmd.text, cmd.pos.x, cmd.pos.y); return; } diff --git a/docs/frontend.ts b/docs/frontend.ts index f03e70e0..86169fa0 100644 --- a/docs/frontend.ts +++ b/docs/frontend.ts @@ -56,7 +56,6 @@ interface Text { pos: Vec2; stroke_color: Color | null; text: string; - text_align: "start" | "center" | "end"; } type PaintCmd = Circle | Clear | Line | Rect | Text; @@ -132,8 +131,7 @@ function paint_command(canvas, cmd: PaintCmd) { case "text": ctx.fillStyle = styleFromColor(cmd.fill_color); ctx.font = `${cmd.font_size}px ${cmd.font_name}`; - ctx.textAlign = cmd.text_align; - ctx.textBaseline = "top"; + ctx.textBaseline = "middle"; ctx.fillText(cmd.text, cmd.pos.x, cmd.pos.y); return; } diff --git a/src/app.rs b/src/app.rs index 2623282a..8598697f 100644 --- a/src/app.rs +++ b/src/app.rs @@ -56,7 +56,7 @@ impl GuiSettings for App { self.count += 1; } - gui.label(format!("The button have been clicked {} times", self.count)); + gui.label(format!("This is a multiline label.\nThe button have been clicked {} times.\nBelow are more options.", self.count)); gui.foldable("Box rendering options", |gui| { gui.slider_f32("width", &mut self.width, 0.0, 500.0); @@ -78,9 +78,9 @@ impl GuiSettings for App { }])); gui.foldable("LayoutOptions", |gui| { - let mut layout_options = gui.layout_options; - layout_options.show_gui(gui); - gui.layout_options = layout_options; + let mut options = gui.options; + options.show_gui(gui); + gui.options = options; }); } } @@ -94,16 +94,11 @@ impl GuiSettings for crate::layout::LayoutOptions { gui.slider_f32("char_size.y", &mut self.char_size.y, 0.0, 20.0); gui.slider_f32("item_spacing.x", &mut self.item_spacing.x, 0.0, 10.0); gui.slider_f32("item_spacing.y", &mut self.item_spacing.y, 0.0, 10.0); + gui.slider_f32("indent", &mut self.indent, 0.0, 100.0); gui.slider_f32("width", &mut self.width, 0.0, 1000.0); gui.slider_f32("button_padding.x", &mut self.button_padding.x, 0.0, 20.0); gui.slider_f32("button_padding.y", &mut self.button_padding.y, 0.0, 20.0); - gui.slider_f32( - "checkbox_radio_height", - &mut self.checkbox_radio_height, - 0.0, - 60.0, - ); - gui.slider_f32("slider_height", &mut self.slider_height, 0.0, 60.0); + gui.slider_f32("start_icon_width", &mut self.start_icon_width, 0.0, 60.0); } } diff --git a/src/layout.rs b/src/layout.rs index 4cdfa1a4..2fa71a42 100644 --- a/src/layout.rs +++ b/src/layout.rs @@ -22,23 +22,20 @@ pub struct LayoutOptions { /// Button size is text size plus this on each side pub button_padding: Vec2, - /// Height of a checkbox and radio button - pub checkbox_radio_height: f32, - - /// Height of a slider - pub slider_height: f32, + /// Checkboxed, radio button and foldables have an icon at the start. + /// The text starts after this many pixels. + pub start_icon_width: f32, } impl Default for LayoutOptions { fn default() -> Self { LayoutOptions { char_size: vec2(7.2, 14.0), - item_spacing: vec2(5.0, 3.0), + item_spacing: vec2(8.0, 4.0), indent: 21.0, width: 200.0, - button_padding: vec2(8.0, 8.0), - checkbox_radio_height: 24.0, - slider_height: 32.0, + button_padding: vec2(5.0, 3.0), + start_icon_width: 20.0, } } } @@ -69,7 +66,7 @@ type Id = u64; #[derive(Clone, Debug, Default)] pub struct Layout { - pub layout_options: LayoutOptions, + pub options: LayoutOptions, pub input: GuiInput, pub cursor: Vec2, id: Id, @@ -92,23 +89,26 @@ 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.layout_options.button_padding; + let text_cursor = self.cursor + self.options.button_padding; let (rect, interact) = - self.reserve_space(id, text_size + 2.0 * self.layout_options.button_padding); + self.reserve_space(id, text_size + 2.0 * self.options.button_padding); self.commands.push(GuiCmd::Button { interact, rect }); self.add_text(text_cursor, text); interact } - pub fn checkbox>(&mut self, label: S, checked: &mut bool) -> InteractInfo { - let label: String = label.into(); - let id = self.get_id(&label); + pub fn checkbox>(&mut self, text: S, checked: &mut bool) -> 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 + vec2(self.options.start_icon_width, 0.0); let (rect, interact) = self.reserve_space( id, - Vec2 { - x: self.layout_options.width, - y: self.layout_options.checkbox_radio_height, - }, + self.options.button_padding + + vec2(self.options.start_icon_width, 0.0) + + text_size + + self.options.button_padding, ); if interact.clicked { *checked = !*checked; @@ -117,8 +117,8 @@ impl Layout { checked: *checked, interact, rect, - text: label, }); + self.add_text(text_cursor, text); interact } @@ -127,57 +127,68 @@ impl Layout { let (text, text_size) = self.layout_text(&text); self.add_text(self.cursor, text); self.cursor.y += text_size.y; - self.cursor.y += self.layout_options.item_spacing.y; + self.cursor.y += self.options.item_spacing.y; } /// A radio button - pub fn radio>(&mut self, label: S, checked: bool) -> InteractInfo { - let label: String = label.into(); - let id = self.get_id(&label); + pub fn radio>(&mut self, text: S, checked: bool) -> 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 + vec2(self.options.start_icon_width, 0.0); let (rect, interact) = self.reserve_space( id, - Vec2 { - x: self.layout_options.width, - y: self.layout_options.checkbox_radio_height, - }, + self.options.button_padding + + vec2(self.options.start_icon_width, 0.0) + + text_size + + self.options.button_padding, ); self.commands.push(GuiCmd::RadioButton { checked, interact, rect, - text: label, }); + self.add_text(text_cursor, text); interact } pub fn slider_f32>( &mut self, - label: S, + text: S, value: &mut f32, min: f32, max: f32, ) -> InteractInfo { debug_assert!(min <= max); - let label: String = label.into(); - let id = self.get_id(&label); - let (rect, interact) = self.reserve_space( + 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( id, Vec2 { - x: self.layout_options.width, - y: self.layout_options.slider_height, + x: self.options.width, + y: self.options.char_size.y, }, ); if interact.active { - *value = remap_clamp(self.input.mouse_pos.x, rect.min().x, rect.max().x, min, max); + *value = remap_clamp( + self.input.mouse_pos.x, + slider_rect.min().x, + slider_rect.max().x, + min, + max, + ); } self.commands.push(GuiCmd::Slider { interact, - label, max, min, - rect, + rect: slider_rect, value: *value, }); @@ -195,12 +206,12 @@ 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.layout_options.button_padding; + let text_cursor = self.cursor + self.options.button_padding; let (rect, interact) = self.reserve_space( id, vec2( - self.layout_options.width, - text_size.y + 2.0 * self.layout_options.button_padding.y, + self.options.width, + text_size.y + 2.0 * self.options.button_padding.y, ), ); @@ -218,14 +229,13 @@ impl Layout { rect, open, }); - let icon_width = 16.0; // TODO: this offset is ugly - self.add_text(text_cursor + vec2(icon_width, 0.0), text); + self.add_text(text_cursor + vec2(self.options.start_icon_width, 0.0), text); if open { let old_id = self.id; self.id = id; let old_x = self.cursor.x; - self.cursor.x += self.layout_options.indent; + self.cursor.x += self.options.indent; add_contents(self); self.cursor.x = old_x; self.id = old_id; @@ -242,7 +252,7 @@ impl Layout { size, }; let interact = self.interactive_rect(id, &rect); - self.cursor.y += rect.size.y + self.layout_options.item_spacing.y; + self.cursor.y += rect.size.y + self.options.item_spacing.y; (rect, interact) } @@ -270,7 +280,7 @@ impl Layout { } fn layout_text(&self, text: &str) -> (TextFragments, Vec2) { - let char_size = self.layout_options.char_size; + let char_size = self.options.char_size; let mut cursor_y = 0.0; let mut max_width = 0.0; let mut text_fragments = Vec::new(); @@ -293,10 +303,9 @@ impl Layout { fn add_text(&mut self, pos: Vec2, text: Vec) { for fragment in text { self.commands.push(GuiCmd::Text { - pos: pos + fragment.rect.pos, + pos: pos + vec2(fragment.rect.pos.x, fragment.rect.center().y), style: TextStyle::Label, text: fragment.text, - text_align: TextAlign::Start, }); } } diff --git a/src/style.rs b/src/style.rs index 0c8f34dd..633da9d3 100644 --- a/src/style.rs +++ b/src/style.rs @@ -59,8 +59,8 @@ impl Style { } } - /// Returns small icon rectangle, big icon rectangle, and the remaining rectangle - fn icon_rectangles(&self, rect: &Rect) -> (Rect, Rect, Rect) { + /// Returns small icon rectangle and big icon rectangle + fn icon_rectangles(&self, rect: &Rect) -> (Rect, Rect) { let box_side = 16.0; let big_icon_rect = Rect::from_center_size( vec2(rect.min().x + 4.0 + box_side * 0.5, rect.center().y), @@ -69,10 +69,7 @@ impl Style { let small_icon_rect = Rect::from_center_size(big_icon_rect.center(), vec2(10.0, 10.0)); - let rest_rect = - Rect::from_min_size(vec2(big_icon_rect.max().x + 4.0, rect.min().y), rect.size); - - (small_icon_rect, big_icon_rect, rest_rect) + (small_icon_rect, big_icon_rect) } } @@ -109,9 +106,8 @@ fn translate_cmd(out_commands: &mut Vec, style: &Style, cmd: GuiCmd) { checked, interact, rect, - text, } => { - let (small_icon_rect, big_icon_rect, rest_rect) = style.icon_rectangles(&rect); + let (small_icon_rect, big_icon_rect) = style.icon_rectangles(&rect); out_commands.push(PaintCmd::Rect { corner_radius: 3.0, fill_color: Some(style.interact_fill_color(&interact)), @@ -134,18 +130,6 @@ fn translate_cmd(out_commands: &mut Vec, style: &Style, cmd: GuiCmd) { }); } - out_commands.push(PaintCmd::Text { - fill_color: stroke_color, - font_name: style.font_name.clone(), - font_size: style.font_size, - pos: Vec2 { - x: rest_rect.min().x, - y: rest_rect.center().y - 4.0, - }, - text, - text_align: TextAlign::Start, - }); - if style.debug_rects { out_commands.push(debug_rect(rect)); } @@ -168,7 +152,7 @@ fn translate_cmd(out_commands: &mut Vec, style: &Style, cmd: GuiCmd) { // TODO: paint a little triangle or arrow or something instead of this - let (small_icon_rect, _, _) = style.icon_rectangles(&rect); + let (small_icon_rect, _) = style.icon_rectangles(&rect); // Draw a minus: out_commands.push(PaintCmd::Line { points: vec![ @@ -178,7 +162,7 @@ fn translate_cmd(out_commands: &mut Vec, style: &Style, cmd: GuiCmd) { color: stroke_color, width: style.line_width, }); - if open { + if !open { // Draw it as a plus: out_commands.push(PaintCmd::Line { points: vec![ @@ -194,12 +178,11 @@ fn translate_cmd(out_commands: &mut Vec, style: &Style, cmd: GuiCmd) { checked, interact, rect, - text, } => { let fill_color = style.interact_fill_color(&interact); let stroke_color = style.interact_stroke_color(&interact); - let (small_icon_rect, big_icon_rect, rest_rect) = style.icon_rectangles(&rect); + let (small_icon_rect, big_icon_rect) = style.icon_rectangles(&rect); out_commands.push(PaintCmd::Circle { center: big_icon_rect.center(), @@ -217,35 +200,18 @@ fn translate_cmd(out_commands: &mut Vec, style: &Style, cmd: GuiCmd) { }); } - out_commands.push(PaintCmd::Text { - fill_color: stroke_color, - font_name: style.font_name.clone(), - font_size: style.font_size, - pos: Vec2 { - x: rest_rect.min().x, - y: rect.center().y - 4.0, - }, - text, - text_align: TextAlign::Start, - }); - if style.debug_rects { out_commands.push(debug_rect(rect)); } } GuiCmd::Slider { interact, - label, max, min, rect, value, } => { - let thin_rect = Rect::from_min_size( - vec2(rect.min().x, lerp(rect.min().y, rect.max().y, 2.0 / 3.0)), - vec2(rect.size.x, 8.0), - ); - + let thin_rect = Rect::from_center_size(rect.center(), vec2(rect.size.x, 6.0)); let marker_center_x = remap_clamp(value, min, max, rect.min().x, rect.max().x); let marker_rect = Rect::from_center_size( @@ -269,18 +235,6 @@ fn translate_cmd(out_commands: &mut Vec, style: &Style, cmd: GuiCmd) { size: marker_rect.size, }); - out_commands.push(PaintCmd::Text { - fill_color: style.interact_stroke_color(&interact), - font_name: style.font_name.clone(), - font_size: style.font_size, - pos: vec2( - rect.min().x, - lerp(rect.min().y, rect.max().y, 1.0 / 3.0) - 5.0, - ), - text: format!("{}: {:.3}", label, value), - text_align: TextAlign::Start, - }); - if style.debug_rects { out_commands.push(debug_rect(rect)); } @@ -288,7 +242,6 @@ fn translate_cmd(out_commands: &mut Vec, style: &Style, cmd: GuiCmd) { GuiCmd::Text { pos, text, - text_align, style: text_style, } => { let fill_color = match text_style { @@ -298,9 +251,8 @@ fn translate_cmd(out_commands: &mut Vec, style: &Style, cmd: GuiCmd) { fill_color, font_name: style.font_name.clone(), font_size: style.font_size, - pos: pos + vec2(0.0, style.font_size / 2.0 - 5.0), // TODO + pos, text, - text_align, }); } } diff --git a/src/types.rs b/src/types.rs index a6313460..89aa7698 100644 --- a/src/types.rs +++ b/src/types.rs @@ -74,14 +74,6 @@ pub struct InteractInfo { pub active: bool, } -#[derive(Clone, Copy, Debug, Serialize)] -#[serde(rename_all = "snake_case")] -pub enum TextAlign { - Start, // Test with arabic text - Center, - End, -} - #[derive(Clone, Copy, Debug, Serialize)] #[serde(rename_all = "snake_case")] pub enum TextStyle { @@ -100,7 +92,6 @@ pub enum GuiCmd { checked: bool, interact: InteractInfo, rect: Rect, - text: String, }, /// The header button background for a foldable region FoldableHeader { @@ -112,21 +103,21 @@ pub enum GuiCmd { checked: bool, interact: InteractInfo, rect: Rect, - text: String, }, Slider { interact: InteractInfo, - label: String, max: f32, min: f32, rect: Rect, value: f32, }, + /// Paint a single line of mono-space text. + /// The text should start at the given position and flow to the right. + /// The text should be vertically centered at the given position. Text { pos: Vec2, style: TextStyle, text: String, - text_align: TextAlign, }, } @@ -162,6 +153,9 @@ pub enum PaintCmd { pos: Vec2, size: Vec2, }, + /// Paint a single line of mono-space text. + /// The text should start at the given position and flow to the right. + /// The text should be vertically centered at the given position. Text { fill_color: Color, /// Name, e.g. Palatino @@ -170,6 +164,5 @@ pub enum PaintCmd { font_size: f32, pos: Vec2, text: String, - text_align: TextAlign, }, }