diff --git a/src/composite_icon.rs b/src/composite_icon.rs index ea94d0b..82777c4 100644 --- a/src/composite_icon.rs +++ b/src/composite_icon.rs @@ -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 diff --git a/src/ui/editor.rs b/src/ui/editor.rs index 899620d..7a2457a 100644 --- a/src/ui/editor.rs +++ b/src/ui/editor.rs @@ -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();