[fix]: dropping multiple items into library only adds one to model
This commit is contained in:
parent
2db560242a
commit
9084fe7fe4
2 changed files with 103 additions and 183 deletions
|
|
@ -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>> {
|
||||
|
|
|
|||
|
|
@ -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 => {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue