From f17dfb5d4ceaeb29d34bc3303fe9087bf49755fc Mon Sep 17 00:00:00 2001 From: lucasmerlin Date: Thu, 12 Jun 2025 13:30:48 +0200 Subject: [PATCH 1/2] Use the new Popup api in color picker --- crates/egui/src/widgets/color_picker.rs | 35 +++++-------------------- 1 file changed, 7 insertions(+), 28 deletions(-) diff --git a/crates/egui/src/widgets/color_picker.rs b/crates/egui/src/widgets/color_picker.rs index 07678d458445..5d36173ef85c 100644 --- a/crates/egui/src/widgets/color_picker.rs +++ b/crates/egui/src/widgets/color_picker.rs @@ -2,8 +2,8 @@ use crate::util::fixed_cache::FixedCache; use crate::{ - epaint, lerp, remap_clamp, Area, Context, DragValue, Frame, Id, Key, Order, Painter, Response, - Sense, Ui, UiKind, Widget as _, WidgetInfo, WidgetType, + epaint, lerp, remap_clamp, Context, DragValue, Id, Painter, Popup, Response, Sense, Ui, + Widget as _, WidgetInfo, WidgetType, }; use epaint::{ ecolor::{Color32, Hsva, HsvaGamma, Rgba}, @@ -496,35 +496,14 @@ pub fn color_edit_button_hsva(ui: &mut Ui, hsva: &mut Hsva, alpha: Alpha) -> Res button_response = button_response.on_hover_text("Click to edit color"); } - if button_response.clicked() { - ui.memory_mut(|mem| mem.toggle_popup(popup_id)); - } - const COLOR_SLIDER_WIDTH: f32 = 275.0; - // TODO(lucasmerlin): Update this to use new Popup struct - if ui.memory(|mem| mem.is_popup_open(popup_id)) { - ui.memory_mut(|mem| mem.keep_popup_open(popup_id)); - let area_response = Area::new(popup_id) - .kind(UiKind::Picker) - .order(Order::Foreground) - .fixed_pos(button_response.rect.max) - .show(ui.ctx(), |ui| { - ui.spacing_mut().slider_width = COLOR_SLIDER_WIDTH; - Frame::popup(ui.style()).show(ui, |ui| { - if color_picker_hsva_2d(ui, hsva, alpha) { - button_response.mark_changed(); - } - }); - }) - .response; - - if !button_response.clicked() - && (ui.input(|i| i.key_pressed(Key::Escape)) || area_response.clicked_elsewhere()) - { - ui.memory_mut(|mem| mem.close_popup(popup_id)); + Popup::menu(&button_response).id(popup_id).show(|ui| { + ui.spacing_mut().slider_width = COLOR_SLIDER_WIDTH; + if color_picker_hsva_2d(ui, hsva, alpha) { + button_response.mark_changed(); } - } + }); button_response } From ba0c98ba2780de91b928439f96e76bd2de29dd33 Mon Sep 17 00:00:00 2001 From: lucasmerlin Date: Mon, 16 Jun 2025 08:37:54 +0200 Subject: [PATCH 2/2] Close behaviour --- crates/egui/src/widgets/color_picker.rs | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/crates/egui/src/widgets/color_picker.rs b/crates/egui/src/widgets/color_picker.rs index 5d36173ef85c..ebcd45b2761f 100644 --- a/crates/egui/src/widgets/color_picker.rs +++ b/crates/egui/src/widgets/color_picker.rs @@ -2,8 +2,8 @@ use crate::util::fixed_cache::FixedCache; use crate::{ - epaint, lerp, remap_clamp, Context, DragValue, Id, Painter, Popup, Response, Sense, Ui, - Widget as _, WidgetInfo, WidgetType, + epaint, lerp, remap_clamp, Context, DragValue, Id, Painter, Popup, PopupCloseBehavior, + Response, Sense, Ui, Widget as _, WidgetInfo, WidgetType, }; use epaint::{ ecolor::{Color32, Hsva, HsvaGamma, Rgba}, @@ -498,12 +498,15 @@ pub fn color_edit_button_hsva(ui: &mut Ui, hsva: &mut Hsva, alpha: Alpha) -> Res const COLOR_SLIDER_WIDTH: f32 = 275.0; - Popup::menu(&button_response).id(popup_id).show(|ui| { - ui.spacing_mut().slider_width = COLOR_SLIDER_WIDTH; - if color_picker_hsva_2d(ui, hsva, alpha) { - button_response.mark_changed(); - } - }); + Popup::menu(&button_response) + .id(popup_id) + .close_behavior(PopupCloseBehavior::CloseOnClickOutside) + .show(|ui| { + ui.spacing_mut().slider_width = COLOR_SLIDER_WIDTH; + if color_picker_hsva_2d(ui, hsva, alpha) { + button_response.mark_changed(); + } + }); button_response }