From 3913a15002acb97386d2066803bbf30f03f5af8b Mon Sep 17 00:00:00 2001 From: Chris Cochrun Date: Thu, 11 Sep 2025 07:25:09 -0500 Subject: [PATCH] working drag and drop --- src/core/service_items.rs | 17 +++++++---------- src/main.rs | 27 +++++++++++++++++++-------- 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/src/core/service_items.rs b/src/core/service_items.rs index 76e99cc..e54b07f 100644 --- a/src/core/service_items.rs +++ b/src/core/service_items.rs @@ -5,8 +5,9 @@ use std::sync::{Arc, Mutex}; use cosmic::iced::clipboard::mime::{AllowedMimeTypes, AsMimeTypes}; use crisp::types::{Keyword, Symbol, Value}; -use miette::Result; +use miette::{IntoDiagnostic, Result}; use resvg::usvg::fontdb; +use serde::{Deserialize, Serialize}; use tracing::{debug, error}; use crate::Slide; @@ -18,7 +19,7 @@ use super::videos::Video; use super::kinds::ServiceItemKind; -#[derive(Debug, Clone, PartialEq)] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct ServiceItem { pub id: i32, pub title: String, @@ -49,11 +50,7 @@ impl TryFrom<(Vec, String)> for ServiceItem { value: (Vec, String), ) -> std::result::Result { debug!(?value); - let val = Value::from( - String::from_utf8(value.0) - .expect("Value couldn't be made"), - ); - Ok(Self::from(&val)) + ron::de::from_bytes(&value.0).into_diagnostic() } } @@ -75,9 +72,9 @@ impl AsMimeTypes for ServiceItem { ) -> Option> { debug!(?self); debug!(mime_type); - let val = Value::from(self); - let val = String::from(val); - Some(Cow::from(val.into_bytes())) + let ron = ron::ser::to_string(self).ok()?; + debug!(ron); + Some(Cow::from(ron.into_bytes())) } } diff --git a/src/main.rs b/src/main.rs index 6893b2f..930a524 100644 --- a/src/main.rs +++ b/src/main.rs @@ -945,8 +945,20 @@ impl cosmic::Application for App { } Task::none() } - Message::AddServiceItem(index, item) => { + Message::AddServiceItem(index, mut item) => { + item.slides = item + .slides + .into_par_iter() + .map(|mut slide| { + let fontdb = Arc::clone(&self.fontdb); + text_svg::text_svg_generator( + &mut slide, fontdb, + ); + slide + }) + .collect(); self.service.insert(index, item); + self.presenter.update_items(self.service.clone()); Task::none() } Message::AddServiceItemDrop(index) => { @@ -1325,8 +1337,11 @@ where }, } }) + // .icon_size(cosmic::theme::spacing().space_l) .class(cosmic::theme::style::Button::HeaderBar) - .padding(5) + // .spacing(cosmic::theme::spacing().space_l) + // .padding(cosmic::theme::spacing().space_m) + // .height(cosmic::theme::spacing().space_xxxl) .width(Length::Fill) .on_press(Message::ChangeServiceItem(index)); let tooltip = tooltip(button, @@ -1339,9 +1354,6 @@ where } else { Message::None } - }).on_drop(move |x, y| { - debug!(x, y); - Message::AddServiceItemDrop(index) }).on_finish(move |mime, data, action, x, y| { debug!(mime, ?data, ?action, x, y); let Ok(item) = ServiceItem::try_from((data, mime)) else { @@ -1353,7 +1365,6 @@ where .into() }); - let end_index = self.service.len(); let column = column![ text::heading("Service List") .center() @@ -1361,7 +1372,7 @@ where iced::widget::horizontal_rule(1), column(list).spacing(10), dnd_destination( - vertical_space(), + vertical_space().width(Length::Fill), vec!["application/service-item".into()] ) .data_received_for::(|item| { @@ -1379,7 +1390,7 @@ where return Message::None; }; debug!(?item); - Message::AddServiceItem(end_index, item) + Message::AppendServiceItem(item) } ) ]