feat: add drag-to-move emblem, center emblem origin, and fix editor preview blurriness

This commit is contained in:
2026-08-03 22:44:28 -04:00
parent 80db9daf0b
commit d757917ccf
2 changed files with 42 additions and 6 deletions
+2 -2
View File
@@ -70,9 +70,9 @@ impl CompositeIcon {
let (bg_w, bg_h) = parse_dims(&self.bg.content);
let (em_w, em_h) = parse_dims(&emblem.content);
let mapped_x = self.emblem_x * bg_w / 64.0;
let mapped_y = self.emblem_y * bg_h / 64.0;
let mapped_size = self.emblem_size * bg_w / 64.0; // Assuming uniform coordinate mapping scaling based on width
let mapped_x = (self.emblem_x * bg_w / 64.0) - (mapped_size / 2.0);
let mapped_y = (self.emblem_y * bg_h / 64.0) - (mapped_size / 2.0);
let scale_x = mapped_size / em_w;
let scale_y = mapped_size / em_h; // Keep aspect ratio mapping relative to its own viewBox
+40 -4
View File
@@ -80,16 +80,52 @@ pub fn build_editor_page(
let refresh_preview = {
let composite = Rc::clone(&composite);
let preview = preview.clone();
let temp_path = std::env::temp_dir().join(format!("icon-color-tool-preview-{}.svg", std::process::id()));
move || {
let bytes = glib::Bytes::from_owned(composite.borrow().render().into_bytes());
match gtk::gdk::Texture::from_bytes(&bytes) {
Ok(texture) => preview.set_paintable(Some(&texture)),
Err(_) => preview.set_paintable(gtk::gdk::Paintable::NONE),
let svg_data = composite.borrow().render();
if std::fs::write(&temp_path, svg_data).is_ok() {
let file = gtk::gio::File::for_path(&temp_path);
preview.set_file(Some(&file));
}
}
};
refresh_preview();
{
let drag = gtk::GestureDrag::new();
let initial_x = Rc::new(std::cell::Cell::new(0.0));
let initial_y = Rc::new(std::cell::Cell::new(0.0));
drag.connect_drag_begin({
let composite = Rc::clone(&composite);
let initial_x = initial_x.clone();
let initial_y = initial_y.clone();
move |_, _, _| {
initial_x.set(composite.borrow().emblem_x);
initial_y.set(composite.borrow().emblem_y);
}
});
drag.connect_drag_update({
let scale_x = scale_x.clone();
let scale_y = scale_y.clone();
let preview = preview.clone();
move |_, offset_x, offset_y| {
let width = preview.allocated_width() as f64;
let height = preview.allocated_height() as f64;
let size = width.min(height);
if size > 0.0 {
let dx = offset_x * 64.0 / size;
let dy = offset_y * 64.0 / size;
scale_x.set_value(initial_x.get() + dx);
scale_y.set_value(initial_y.get() + dy);
}
}
});
preview.add_controller(drag);
}
{
let composite = Rc::clone(&composite);
let refresh_preview = refresh_preview.clone();