feat: add drag-to-move emblem, center emblem origin, and fix editor preview blurriness
This commit is contained in:
@@ -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
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user