[fix]: dropping multiple items into library only adds one to model

This commit is contained in:
Chris Cochrun 2026-04-17 07:05:21 -05:00
parent 2db560242a
commit 9084fe7fe4
2 changed files with 103 additions and 183 deletions

View file

@ -561,113 +561,7 @@ impl<'a> Library {
}
self.context_menu = Some(index);
}
Message::AddFiles(items) => {
let mut tasks = Vec::new();
let last_item = &items.last();
let after_task = match last_item {
Some(ServiceItemKind::Image(_image)) => {
Task::done(Message::OpenItem(Some((
LibraryKind::Image,
self.image_library.items.len() as i32 - 1,
))))
}
_ => Task::none(),
};
for item in items {
match item {
ServiceItemKind::Song(song) => {
let task = Task::perform(
songs::add_song(
self.song_library.items.clone(),
Arc::clone(&self.db),
),
{
move |res| match res {
Ok(songs) => {
Message::ReaddSongs(songs)
}
Err(e) => {
error!(?e);
Message::None
}
}
},
);
tasks.push(task);
}
ServiceItemKind::Video(video) => {
let task = Task::perform(
videos::add_video(
vec![video],
self.video_library.items.clone(),
Arc::clone(&self.db),
),
move |res| {
res.map_or(
Message::None,
|videos| {
Message::ReaddVideos(
videos,
)
},
)
},
);
tasks.push(task);
}
ServiceItemKind::Image(image) => {
let task = Task::perform(
images::add_image(
vec![image],
self.image_library.items.clone(),
Arc::clone(&self.db),
),
move |res| {
res.map_or(
Message::None,
|images| {
Message::ReaddImages(
images,
)
},
)
},
);
tasks.push(task);
}
ServiceItemKind::Presentation(
presentation,
) => {
let task = Task::perform(
presentations::add_presentation(
vec![presentation],
self.presentation_library
.items
.clone(),
Arc::clone(&self.db),
),
move |res| {
res.map_or(
Message::None,
|presentations| {
Message::ReaddPres(
presentations,
)
},
)
},
);
tasks.push(task);
}
ServiceItemKind::Content(_slide) => todo!(),
}
}
return Action::Task(
Task::batch(tasks).chain(after_task),
);
}
Message::AddFiles(items) => return self.add_files(items),
}
Action::None
}
@ -1312,6 +1206,108 @@ impl<'a> Library {
self.selected_items = None;
Action::Task(task)
}
fn add_files(&mut self, items: Vec<ServiceItemKind>) -> Action {
let mut tasks = Vec::new();
let videos: Vec<Video> = items
.iter()
.filter_map(|item| match item {
ServiceItemKind::Video(video) => {
Some(video.to_owned())
}
_ => None,
})
.collect();
let task = Task::perform(
videos::add_video(
videos,
self.video_library.items.clone(),
Arc::clone(&self.db),
),
move |res| {
res.map_or(Message::None, |videos| {
Message::ReaddVideos(videos)
})
},
);
tasks.push(task);
let presentations: Vec<Presentation> = items
.iter()
.filter_map(|item| match item {
ServiceItemKind::Presentation(presentation) => {
Some(presentation.to_owned())
}
_ => None,
})
.collect();
let task = Task::perform(
presentations::add_presentation(
presentations,
self.presentation_library.items.clone(),
Arc::clone(&self.db),
),
move |res| {
res.map_or(Message::None, |presentations| {
Message::ReaddPres(presentations)
})
},
);
tasks.push(task);
let images: Vec<Image> = items
.iter()
.filter_map(|item| match item {
ServiceItemKind::Image(image) => {
Some(image.to_owned())
}
_ => None,
})
.collect();
let task = Task::perform(
images::add_image(
images,
self.image_library.items.clone(),
Arc::clone(&self.db),
),
move |res| {
res.map_or(Message::None, |images| {
Message::ReaddImages(images)
})
},
);
tasks.push(task);
let last_item = &items.last();
let after_task = match last_item {
Some(ServiceItemKind::Image(_image)) => {
Task::done(Message::OpenItem(Some((
LibraryKind::Image,
self.image_library.items.len() as i32,
))))
}
Some(ServiceItemKind::Video(_image)) => {
Task::done(Message::OpenItem(Some((
LibraryKind::Video,
self.video_library.items.len() as i32,
))))
}
Some(ServiceItemKind::Presentation(_image)) => {
Task::done(Message::OpenItem(Some((
LibraryKind::Presentation,
self.presentation_library.items.len() as i32,
))))
}
_ => Task::none(),
};
Action::Task(Task::batch(tasks).chain(after_task))
}
}
async fn add_images() -> Option<Vec<Image>> {

View file

@ -1030,82 +1030,6 @@ impl Presenter {
}
}
// fn slide_delegate(&self, slide: &Slide) -> Element<'_, Message> {
// let font_name = slide.font().into_boxed_str();
// let family = Family::Name(Box::leak(font_name));
// let weight = Weight::Normal;
// let stretch = Stretch::Normal;
// let style = Style::Normal;
// let font = Font {
// family,
// weight,
// stretch,
// style,
// };
// let is_current_slide = self.service[self.current_item]
// .slides
// .get(self.current_slide_index as usize)
// .is_some();
// let this_item_index = self
// .service
// .iter()
// .position(|item| item == self.service[self.current_item])
// .unwrap();
// let this_slide_index = self.service[this_item_index].slides;
// let container =
// slide_view(slide.clone(), &self.video, font, true, false);
// let delegate = mouse_area(
// Container::new(container)
// .style(move |t| {
// let mut style = container::Style::default();
// let theme = t.cosmic();
// let hovered = self.hovered_slide == slide_id;
// style.background = Some(Background::Color(
// if is_current_slide {
// theme.accent.base.into()
// } else if hovered {
// theme.accent.hover.into()
// } else {
// theme.palette.neutral_3.into()
// },
// ));
// style.border = Border::default().rounded(10.0);
// style.shadow = Shadow {
// color: Color::BLACK,
// offset: {
// if is_current_slide {
// Vector::new(5.0, 5.0)
// } else if hovered {
// Vector::new(5.0, 5.0)
// } else {
// Vector::new(0.0, 0.0)
// }
// },
// blur_radius: {
// if is_current_slide {
// 10.0
// } else if hovered {
// 10.0
// } else {
// 0.0
// }
// },
// };
// style
// })
// .center_x(100.0 * 16.0 / 9.0)
// .height(100)
// .padding(10),
// )
// .interaction(cosmic::iced::mouse::Interaction::Pointer)
// .on_move(move |_| Message::HoveredSlide(slide_id))
// .on_exit(Message::HoveredSlide(-1))
// .on_press(Message::SlideChange(slide.clone()));
// delegate.into()
// }
fn reset_video(&mut self) {
match self.current_slide.background().kind {
BackgroundKind::Video => {