From f15452802a33779f58465bc851aac212e1b958d1 Mon Sep 17 00:00:00 2001 From: Chris Cochrun Date: Wed, 24 Sep 2025 09:35:05 -0500 Subject: [PATCH] some updates to track the change of slides --- src/main.rs | 46 +++++++++++++++++++----------------------- src/ui/presenter.rs | 49 ++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 65 insertions(+), 30 deletions(-) diff --git a/src/main.rs b/src/main.rs index 3ea3e38..1799207 100644 --- a/src/main.rs +++ b/src/main.rs @@ -784,19 +784,11 @@ impl cosmic::Application for App { self.service.get(item_index) { if item.slides.len() > slide_index + 1 { - // let slide_length = item.slides.len(); - // debug!( - // slide_index, - // slide_length, - // ?item, - // "Slides are longer" - // ); - let slide = item.slides - [slide_index + 1] - .clone(); + let slide_index = slide_index + 1; let action = self.presenter.update( - presenter::Message::SlideChange( - slide, + presenter::Message::ActivateSlide( + item_index, + slide_index, ), ); match action { @@ -816,10 +808,12 @@ impl cosmic::Application for App { // debug!("Slides are not longer"); self.current_item = (item_index + 1, 0); - if let Some(item) = - self.service.get(item_index + 1) + if self + .service + .get(item_index + 1) + .is_some() { - let action = self.presenter.update(presenter::Message::SlideChange(item.slides[0].clone())); + let action = self.presenter.update(presenter::Message::ActivateSlide(self.current_item.0, self.current_item.1)); match action { presenter::Action::Task( task, @@ -850,12 +844,11 @@ impl cosmic::Application for App { self.service.get(item_index) { if slide_index != 0 { - let slide = item.slides - [slide_index - 1] - .clone(); + let slide_index = slide_index - 1; let action = self.presenter.update( - presenter::Message::SlideChange( - slide, + presenter::Message::ActivateSlide( + item_index, + slide_index, ), ); match action { @@ -890,10 +883,12 @@ impl cosmic::Application for App { item_index - 1, previous_item_slides_length - 1, ); - if let Some(item) = - self.service.get(item_index - 1) + if self + .service + .get(item_index - 1) + .is_some() { - let action = self.presenter.update(presenter::Message::SlideChange(item.slides[previous_item_slides_length - 1].clone())); + let action = self.presenter.update(presenter::Message::ActivateSlide(self.current_item.0, self.current_item.1)); match action { presenter::Action::Task( task, @@ -1080,8 +1075,9 @@ impl cosmic::Application for App { { self.current_item = (index, 0); self.presenter.update( - presenter::Message::SlideChange( - slide.clone(), + presenter::Message::ActivateSlide( + self.current_item.0, + self.current_item.1, ), ); } diff --git a/src/ui/presenter.rs b/src/ui/presenter.rs index c1c6a5a..20b4c63 100644 --- a/src/ui/presenter.rs +++ b/src/ui/presenter.rs @@ -68,6 +68,7 @@ pub(crate) enum Message { NextSlide, PrevSlide, SlideChange(Slide), + ActivateSlide(usize, usize), EndVideo, StartVideo, StartAudio, @@ -214,6 +215,19 @@ impl Presenter { // self.current_slide_index - 1, // )); } + Message::ActivateSlide(item_index, slide_index) => { + if let Some(slide) = self + .service + .get(item_index) + .map(|item| item.slides.get(slide_index)) + .flatten() + { + self.current_item = item_index; + self.current_slide_index = slide_index; + return self + .update(Message::SlideChange(slide.clone())); + } + } Message::SlideChange(slide) => { let slide_text = slide.text(); debug!(slide_text, "slide changed"); @@ -235,10 +249,34 @@ impl Presenter { self.reset_video(); } + let mut target_item = 0; + + self.service.iter().enumerate().try_for_each( + |(index, item)| { + item.slides.iter().enumerate().try_for_each( + |(slide_index, _)| { + target_item += 1; + if (index, slide_index) + == ( + self.current_item, + self.current_slide_index, + ) + { + None + } else { + Some(()) + } + }, + ) + }, + ); + + debug!(target_item); + let offset = AbsoluteOffset { x: { - if self.current_slide_index > 2 { - (self.current_slide_index as f32) + if target_item > 2 { + (target_item as f32) .mul_add(187.5, -187.5) } else { 0.0 @@ -246,7 +284,7 @@ impl Presenter { }, y: 0.0, }; - debug!(?offset); + let mut tasks = vec![]; tasks.push(scroll_to(self.scroll_id.clone(), offset)); @@ -509,8 +547,9 @@ impl Presenter { ))) }) .on_exit(Message::HoveredSlide(None)) - .on_press(Message::SlideChange( - slide.clone(), + .on_press(Message::ActivateSlide( + item_index, + slide_index, )); slides.push(delegate.into()); },