diff --git a/src/ui/editor.rs b/src/ui/editor.rs index 1391ff3..f7cd08a 100644 --- a/src/ui/editor.rs +++ b/src/ui/editor.rs @@ -223,63 +223,51 @@ pub fn build_editor_page( }); } - let button = gtk::Button::builder() + let popover = gtk::Popover::new(); + let chooser = gtk::ColorChooserWidget::new(); + chooser.set_use_alpha(false); + chooser.set_rgba(&*current_rgba.borrow()); + chooser.set_size_request(350, 450); + popover.set_child(Some(&chooser)); + + let button = gtk::MenuButton::builder() .child(&drawing_area) + .popover(&popover) .build(); { - let composite = Rc::clone(&composite); let tag = tag.clone(); + let composite = Rc::clone(&composite); let refresh_preview = refresh_preview.clone(); let current_rgba = Rc::clone(¤t_rgba); let drawing_area = drawing_area.clone(); - button.connect_clicked(move |btn| { - let tag = tag.clone(); - let composite = Rc::clone(&composite); - let refresh_preview = refresh_preview.clone(); - let current_rgba = Rc::clone(¤t_rgba); - let drawing_area = drawing_area.clone(); - let parent_window = btn.root().and_downcast::(); - let initial_color = current_rgba.borrow().clone(); - - let dialog = gtk::ColorChooserDialog::new(Some("Pick a Color"), parent_window.as_ref()); - dialog.set_use_alpha(false); - dialog.set_rgba(&initial_color); - dialog.set_default_size(600, 600); - - dialog.connect_response(move |d, response| { - if response == gtk::ResponseType::Ok { - let new_rgba = d.rgba(); - let new_hex = format!( - "#{:02x}{:02x}{:02x}", - (new_rgba.red() * 255.0).round() as u8, - (new_rgba.green() * 255.0).round() as u8, - (new_rgba.blue() * 255.0).round() as u8, - ); - let changed = { - let mut comp = composite.borrow_mut(); - let res; - if is_emblem { - res = comp.emblem.as_mut().unwrap().update_color(&tag, &new_hex).unwrap_or(false); - } else { - res = comp.bg.update_color(&tag, &new_hex).unwrap_or(false); - } - if res { - comp.is_modified = true; - } - res - }; - if changed { - *current_rgba.borrow_mut() = new_rgba; - drawing_area.queue_draw(); - refresh_preview(); - } + chooser.connect_rgba_notify(move |c| { + let new_rgba = c.rgba(); + let new_hex = format!( + "#{:02x}{:02x}{:02x}", + (new_rgba.red() * 255.0).round() as u8, + (new_rgba.green() * 255.0).round() as u8, + (new_rgba.blue() * 255.0).round() as u8, + ); + let changed = { + let mut comp = composite.borrow_mut(); + let res; + if is_emblem { + res = comp.emblem.as_mut().unwrap().update_color(&tag, &new_hex).unwrap_or(false); + } else { + res = comp.bg.update_color(&tag, &new_hex).unwrap_or(false); } - d.destroy(); - }); - - dialog.show(); + if res { + comp.is_modified = true; + } + res + }; + if changed { + *current_rgba.borrow_mut() = new_rgba; + drawing_area.queue_draw(); + refresh_preview(); + } }); }