diff --git a/src/main.rs b/src/main.rs index d84c7d7..9e2a6ce 100644 --- a/src/main.rs +++ b/src/main.rs @@ -157,7 +157,7 @@ impl cosmic::Application for App { input: Self::Flags, ) -> (Self, Task) { debug!("init"); - let nav_model = nav_bar::Model::default(); + let mut nav_model = nav_bar::Model::default(); let mut windows = vec![]; @@ -308,6 +308,7 @@ impl cosmic::Application for App { let tooltip = tooltip(button, text::body(item.kind.to_string()), TPosition::Right); + let dragged_item = &self.library_dragged_item; dnd_destination(tooltip, vec!["application/service-item".into()]) .data_received_for::( move |item| { if let Some(item) = item { @@ -599,10 +600,10 @@ impl cosmic::Application for App { } Message::Present(message) => { // debug!(?message); - if self.presentation_open - && let Some(video) = &mut self.presenter.video - { - video.set_muted(false); + if self.presentation_open { + if let Some(video) = &mut self.presenter.video { + video.set_muted(false); + } } match self.presenter.update(message) { presenter::Action::Task(task) => task.map(|m| { @@ -887,21 +888,21 @@ impl cosmic::Application for App { // debug!(?action); // debug!(?service_item); - if let Some(library) = &self.library - && let Some((lib, item)) = library.dragged_item - { - // match lib { - // core::model::LibraryKind::Song => , - // core::model::LibraryKind::Video => todo!(), - // core::model::LibraryKind::Image => todo!(), - // core::model::LibraryKind::Presentation => todo!(), - // } - let item = library.get_song(item).unwrap(); - let item = ServiceItem::from(item); - self.nav_model - .insert() - .text(item.title.clone()) - .data(item); + if let Some(library) = &self.library { + if let Some((lib, item)) = library.dragged_item { + // match lib { + // core::model::LibraryKind::Song => , + // core::model::LibraryKind::Video => todo!(), + // core::model::LibraryKind::Image => todo!(), + // core::model::LibraryKind::Presentation => todo!(), + // } + let item = library.get_song(item).unwrap(); + let item = ServiceItem::from(item); + self.nav_model + .insert() + .text(item.title.clone()) + .data(item); + } } Task::none() } @@ -932,14 +933,15 @@ impl cosmic::Application for App { .iter() .enumerate() .find(|(id, _)| index == *id) - && let Some(slide) = item.slides.first() { - self.current_item = (index, 0); - self.presenter.update( - presenter::Message::SlideChange( - slide.clone(), - ), - ); + if let Some(slide) = item.slides.first() { + self.current_item = (index, 0); + self.presenter.update( + presenter::Message::SlideChange( + slide.clone(), + ), + ); + } } Task::none() } diff --git a/src/ui/library.rs b/src/ui/library.rs index 56b47f6..ed81f04 100644 --- a/src/ui/library.rs +++ b/src/ui/library.rs @@ -1,3 +1,5 @@ +use std::rc::Rc; + use cosmic::{ iced::{ alignment::Vertical, clipboard::dnd::DndAction, @@ -392,7 +394,7 @@ impl<'a> Library { ) .action(DndAction::Copy) .drag_icon({ - let model = model.kind; + let model = model.kind.clone(); move |i| { let state = State::None; let icon = match model { diff --git a/src/ui/mod.rs b/src/ui/mod.rs index 0289c38..ff81e8c 100644 --- a/src/ui/mod.rs +++ b/src/ui/mod.rs @@ -7,7 +7,6 @@ pub mod song_editor; pub mod text_svg; pub mod video; pub mod widgets; -pub mod slide_editor; pub enum EditorMode { Song, diff --git a/src/ui/presenter.rs b/src/ui/presenter.rs index 779e964..ad82797 100644 --- a/src/ui/presenter.rs +++ b/src/ui/presenter.rs @@ -9,17 +9,20 @@ use cosmic::{ Background, Border, Color, ContentFit, Font, Length, Shadow, Vector, }, + iced_core::text::Span, iced_widget::{ rich_text, scrollable::{ scroll_to, AbsoluteOffset, Direction, Scrollbar, }, - span, stack, vertical_rule, + span, stack, + text::Rich, + vertical_rule, }, prelude::*, widget::{ - container, image, mouse_area, responsive, scrollable, text, - Column, Container, Id, Row, Space, + container, horizontal_space, image, mouse_area, responsive, + scrollable, text, Column, Container, Id, Row, Space, }, Task, }; @@ -29,7 +32,11 @@ use tracing::{debug, error, info, warn}; use url::Url; use crate::{ - core::{service_items::ServiceItem, slide::Slide}, + core::{ + service_items::{Service, ServiceItem}, + slide::Slide, + }, + ui::text_svg::{self, Font as SvgFont}, // ui::widgets::slide_text, BackgroundKind, }; diff --git a/src/ui/slide_editor.rs b/src/ui/slide_editor.rs deleted file mode 100644 index d05d2af..0000000 --- a/src/ui/slide_editor.rs +++ /dev/null @@ -1,125 +0,0 @@ -use std::{io, path::PathBuf}; - -use cosmic::{ - iced::{Color, Font}, - widget::{ - self, - canvas::{self, Program, Stroke}, - }, - Renderer, -}; - -#[derive(Debug, Default)] -struct State { - cache: canvas::Cache, -} - -#[derive(Debug)] -struct SlideEditor<'a> { - state: &'a State, - font: &'a Font, -} - -#[derive(Debug, Clone)] -pub enum Message { - ChangeFont(String), - ChangeFontSize(usize), - ChangeTitle(String), - ChangeBackground(Result), - PickBackground, - Edit(bool), - None, -} - -pub struct Text { - text: String, -} - -pub enum SlideWidget { - Text(Text), -} - -#[derive(Debug, Clone)] -pub enum SlideError { - DialogClosed, - IOError(io::ErrorKind), -} - -impl State { - pub fn view<'a>( - &'a self, - font: &'a Font, - ) -> cosmic::iced::Element<'a, SlideWidget> { - widget::canvas(SlideEditor { state: self, font }).into() - } -} - -impl<'a> Program for SlideEditor<'a> { - type State = (); - - fn draw( - &self, - state: &Self::State, - renderer: &Renderer, - theme: &cosmic::iced_runtime::core::Theme, - bounds: cosmic::iced::Rectangle, - cursor: cosmic::iced_core::mouse::Cursor, - ) -> Vec> { - // We prepare a new `Frame` - let mut frame = canvas::Frame::new(renderer, bounds.size()); - - // We create a `Path` representing a simple circle - let circle = canvas::Path::circle(frame.center(), 50.0); - - // And fill it with some color - frame.fill(&circle, Color::BLACK); - frame.stroke( - &circle, - Stroke::default() - .with_width(5.0) - .with_color(Color::BLACK), - ); - - // Then, we produce the geometry - vec![frame.into_geometry()] - } - - fn update( - &self, - _state: &mut Self::State, - event: canvas::Event, - _bounds: cosmic::iced::Rectangle, - _cursor: cosmic::iced_core::mouse::Cursor, - ) -> (canvas::event::Status, Option) { - match event { - canvas::Event::Mouse(event) => match event { - cosmic::iced::mouse::Event::CursorEntered => todo!(), - cosmic::iced::mouse::Event::CursorLeft => todo!(), - cosmic::iced::mouse::Event::CursorMoved { - position, - } => todo!(), - cosmic::iced::mouse::Event::ButtonPressed(button) => { - todo!() - } - cosmic::iced::mouse::Event::ButtonReleased( - button, - ) => todo!(), - cosmic::iced::mouse::Event::WheelScrolled { - delta, - } => todo!(), - }, - canvas::Event::Touch(event) => todo!(), - canvas::Event::Keyboard(event) => todo!(), - } - (canvas::event::Status::Ignored, None) - } - - fn mouse_interaction( - &self, - _state: &Self::State, - _bounds: cosmic::iced::Rectangle, - _cursor: cosmic::iced_core::mouse::Cursor, - ) -> cosmic::iced_core::mouse::Interaction { - cosmic::iced_core::mouse::Interaction::default() - } -} diff --git a/src/ui/song_editor.rs b/src/ui/song_editor.rs index b175e3d..c2932db 100644 --- a/src/ui/song_editor.rs +++ b/src/ui/song_editor.rs @@ -7,11 +7,12 @@ use cosmic::{ Font, Length, }, iced_wgpu::graphics::text::cosmic_text::fontdb, - iced_widget::row, + iced_widget::{row, stack}, theme, widget::{ - button, column, combo_box, container, horizontal_space, icon, - scrollable, text, text_editor, text_input, + button, column, combo_box, container, dropdown, + horizontal_space, icon, scrollable, svg::Handle, text, + text_editor, text_input, Svg, }, Element, Task, }; @@ -178,11 +179,11 @@ impl SongEditor { .filter(|f| f.1 == font) .map(|f| f.0) .next(); - if let Some(id) = font_id - && let Some(face) = self.font_db.face(id) - { - self.font = face.post_script_name.clone(); - // self.current_font = Font::from(face); + if let Some(id) = font_id { + if let Some(face) = self.font_db.face(id) { + self.font = face.post_script_name.clone(); + // self.current_font = Font::from(face); + } } self.font = font.clone(); @@ -424,16 +425,16 @@ order", } fn background_video(&mut self, background: &Option) { - if let Some(background) = background - && background.kind == BackgroundKind::Video - { - let video = - Video::try_from(background).ok().map(|mut v| { - v.set_looping(true); - v - }); - debug!(?video); - self.video = video; + if let Some(background) = background { + if background.kind == BackgroundKind::Video { + let video = + Video::try_from(background).ok().map(|mut v| { + v.set_looping(true); + v + }); + debug!(?video); + self.video = video; + } } } } diff --git a/src/ui/text_svg.rs b/src/ui/text_svg.rs index cbfd280..d690198 100644 --- a/src/ui/text_svg.rs +++ b/src/ui/text_svg.rs @@ -10,7 +10,7 @@ use cosmic::{ Length, Size, }, prelude::*, - widget::{container, svg::Handle, Svg}, + widget::{container, lazy, responsive, svg::Handle, Svg}, }; use tracing::error; @@ -330,7 +330,7 @@ mod test { #[test] fn test_text_spans() { - let mut text = TextSvg::new("yes"); + let mut text = TextSvg::new(); text.text = "This is multiline text."