diff --git a/CHANGELOG.md b/CHANGELOG.md index b7a0dd24..5a738ce8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,7 +14,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). * Add support for secondary and middle mouse buttons. * Add `Label` methods for code, strong, strikethrough, underline and italics. * Add `ui.group(|ui| { … })` to visually group some widgets within a frame -* Text will now wrap at newlines, spaces, dashes, punctuation or in the middle of a words if necessary, in that order of priority. +* Add `TextEdit::hint_text` for showing a weak hint text when empty. * `egui::popup::popup_below_widget`: show a popup area below another widget. * Add `Slider::clamp_to_range(bool)`: if set, clamp the incoming and outgoing values to the slider range. * Add: `ui.spacing()`, `ui.spacing_mut()`, `ui.visuals()`, `ui.visuals_mut()`. @@ -22,6 +22,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Changed 🔧 +* Text will now wrap at newlines, spaces, dashes, punctuation or in the middle of a words if necessary, in that order of priority. * `mouse` has be renamed `pointer` everywhere (to make it clear it includes touches too). * Most parts of `Response` are now methods, so `if ui.button("…").clicked {` is now `if ui.button("…").clicked() {`. * `Response::active` is now gone. You can use `response.dragged()` or `response.clicked()` instead. diff --git a/egui/src/style.rs b/egui/src/style.rs index 5c427e6e..093a2b00 100644 --- a/egui/src/style.rs +++ b/egui/src/style.rs @@ -362,14 +362,14 @@ impl Widgets { noninteractive: WidgetVisuals { bg_stroke: Stroke::new(1.0, Color32::from_gray(65)), // window outline bg_fill: Color32::from_gray(30), // window background - fg_stroke: Stroke::new(1.0, Color32::from_gray(160)), // text color + fg_stroke: Stroke::new(1.0, Color32::from_gray(160)), // normal text color corner_radius: 4.0, expansion: 0.0, }, disabled: WidgetVisuals { bg_fill: Color32::from_gray(40), // Should look grayed out bg_stroke: Stroke::new(1.0, Color32::from_gray(70)), - fg_stroke: Stroke::new(1.0, Color32::from_gray(140)), // Should look grayed out + fg_stroke: Stroke::new(1.0, Color32::from_gray(110)), // Should look grayed out. Also used for "weak" text color. corner_radius: 4.0, expansion: 0.0, }, @@ -402,14 +402,14 @@ impl Widgets { noninteractive: WidgetVisuals { bg_stroke: Stroke::new(1.0, Color32::from_gray(180)), // window outline bg_fill: Color32::from_gray(220), // window background - fg_stroke: Stroke::new(1.0, Color32::from_gray(70)), // text color + fg_stroke: Stroke::new(1.0, Color32::from_gray(70)), // normal text color corner_radius: 4.0, expansion: 0.0, }, disabled: WidgetVisuals { bg_fill: Color32::from_gray(215), // Should look grayed out bg_stroke: Stroke::new(1.0, Color32::from_gray(185)), - fg_stroke: Stroke::new(1.0, Color32::from_gray(115)), // Should look grayed out + fg_stroke: Stroke::new(1.0, Color32::from_gray(145)), // Should look grayed out. Also used for "weak" text color. corner_radius: 4.0, expansion: 0.0, }, diff --git a/egui/src/widgets/text_edit.rs b/egui/src/widgets/text_edit.rs index 43429a74..b0eb894f 100644 --- a/egui/src/widgets/text_edit.rs +++ b/egui/src/widgets/text_edit.rs @@ -123,6 +123,7 @@ impl CCursorPair { #[derive(Debug)] pub struct TextEdit<'t> { text: &'t mut String, + hint_text: String, id: Option, id_source: Option, text_style: Option, @@ -144,6 +145,7 @@ impl<'t> TextEdit<'t> { pub fn singleline(text: &'t mut String) -> Self { TextEdit { text, + hint_text: Default::default(), id: None, id_source: None, text_style: None, @@ -160,6 +162,7 @@ impl<'t> TextEdit<'t> { pub fn multiline(text: &'t mut String) -> Self { TextEdit { text, + hint_text: Default::default(), id: None, id_source: None, text_style: None, @@ -183,6 +186,12 @@ impl<'t> TextEdit<'t> { self } + /// Show a faint hint text when the text field is empty. + pub fn hint_text(mut self, hint_text: impl Into) -> Self { + self.hint_text = hint_text.into(); + self + } + pub fn text_style(mut self, text_style: TextStyle) -> Self { self.text_style = Some(text_style); self @@ -268,6 +277,7 @@ impl<'t> TextEdit<'t> { fn content_ui(self, ui: &mut Ui) -> Response { let TextEdit { text, + hint_text, id, id_source, text_style, @@ -511,6 +521,18 @@ impl<'t> TextEdit<'t> { ui.painter() .galley(response.rect.min, galley, text_style, text_color); + if text.is_empty() && !hint_text.is_empty() { + let font = &ui.fonts()[text_style]; + let galley = if multiline { + font.layout_multiline(hint_text, available_width) + } else { + font.layout_single_line(hint_text) + }; + let hint_text_color = ui.visuals().weak_text_color(); + ui.painter() + .galley(response.rect.min, galley, text_style, hint_text_color); + } + ui.memory().text_edit.insert(id, state); Response { diff --git a/egui_demo_lib/src/apps/demo/widget_gallery.rs b/egui_demo_lib/src/apps/demo/widget_gallery.rs index 73400a84..9c5ccdcb 100644 --- a/egui_demo_lib/src/apps/demo/widget_gallery.rs +++ b/egui_demo_lib/src/apps/demo/widget_gallery.rs @@ -21,7 +21,7 @@ impl Default for WidgetGallery { boolean: false, radio: Enum::First, scalar: 42.0, - string: "Hello World!".to_owned(), + string: Default::default(), color: egui::Color32::LIGHT_BLUE.linear_multiply(0.5), } } @@ -66,7 +66,7 @@ impl super::View for WidgetGallery { ui.end_row(); ui.label("Text Input:"); - ui.text_edit_singleline(string); + ui.add(egui::TextEdit::singleline(string).hint_text("Write something here")); ui.end_row(); ui.label("Checkbox:");