fix: use custom MenuButton and Popover with ColorChooserWidget explicitly sized to bypass Wayland desktop portal popover layout constraints

This commit is contained in:
2026-08-03 23:40:07 -04:00
parent f0f3cdfaf5
commit a12c17d896
+35 -47
View File
@@ -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(&current_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(&current_rgba);
let drawing_area = drawing_area.clone();
let parent_window = btn.root().and_downcast::<gtk::Window>();
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();
}
});
}