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 (bg_w, bg_h) = parse_dims(&self.bg.content);
|
||||||
let (em_w, em_h) = parse_dims(&emblem.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_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_x = mapped_size / em_w;
|
||||||
let scale_y = mapped_size / em_h; // Keep aspect ratio mapping relative to its own viewBox
|
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 refresh_preview = {
|
||||||
let composite = Rc::clone(&composite);
|
let composite = Rc::clone(&composite);
|
||||||
let preview = preview.clone();
|
let preview = preview.clone();
|
||||||
|
let temp_path = std::env::temp_dir().join(format!("icon-color-tool-preview-{}.svg", std::process::id()));
|
||||||
move || {
|
move || {
|
||||||
let bytes = glib::Bytes::from_owned(composite.borrow().render().into_bytes());
|
let svg_data = composite.borrow().render();
|
||||||
match gtk::gdk::Texture::from_bytes(&bytes) {
|
if std::fs::write(&temp_path, svg_data).is_ok() {
|
||||||
Ok(texture) => preview.set_paintable(Some(&texture)),
|
let file = gtk::gio::File::for_path(&temp_path);
|
||||||
Err(_) => preview.set_paintable(gtk::gdk::Paintable::NONE),
|
preview.set_file(Some(&file));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
refresh_preview();
|
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 composite = Rc::clone(&composite);
|
||||||
let refresh_preview = refresh_preview.clone();
|
let refresh_preview = refresh_preview.clone();
|
||||||
|
|||||||
Reference in New Issue
Block a user