a working build of the new update

This commit is contained in:
Chris Cochrun 2026-04-03 15:14:07 -05:00
parent ff2bfc4f86
commit f3d0ec9aa2
10 changed files with 342 additions and 347 deletions

View file

@ -1245,7 +1245,7 @@ impl cosmic::Application for App {
if let Some(video) = &mut self.presenter.video {
video.set_muted(false);
}
window::change_mode(id, Mode::Fullscreen)
window::maximize(id, true)
} else {
Task::none()
}
@ -1296,10 +1296,12 @@ impl cosmic::Application for App {
)
}
Message::HoveredServiceItem(index) => {
debug!(index);
self.hovered_item = index;
Task::none()
}
Message::HoveredServiceDrop(index) => {
debug!(index);
self.hovered_dnd = index;
Task::none()
}
@ -2149,7 +2151,7 @@ where
text::heading("Service List")
.center()
.width(Length::Fill),
iced::widget::horizontal_rule(1),
divider::horizontal::light(),
scrollable
]
.padding(10)

View file

@ -12,10 +12,10 @@ use cosmic::{
theme,
widget::{
Container, DndSource, Space, button, container, context_menu,
dnd_destination, icon,
divider, dnd_destination, icon,
menu::{self, Action as MenuAction},
mouse_area, responsive, row, scrollable,
space::horizontal,
space::{self, horizontal},
text, text_input,
},
};
@ -171,17 +171,21 @@ impl<'a> Library {
self.library_open.unwrap_or(LibraryKind::Song);
match kind {
LibraryKind::Song => {
let _song = Song::default();
let task = Task::future(self.db.acquire()).and_then(move |db| {
Task::perform(add_song_to_db(db), move |res| {
match res {
Ok(song) => {
Message::AddSong(song)
},
Err(e) => {error!(?e, "couldn't add song to db"); Message::None}
}
let task = Task::future(self.db.acquire())
.map_err(|e| {
miette::miette!("Database error: {e}")
})
});
.and_then(move |db| {
Task::perform(
add_song_to_db(db),
move |res| {
res.map(|song| {
Message::AddSong(song)
})
},
)
})
.map(|r| r.unwrap_or(Message::None));
return Action::Task(task);
}
LibraryKind::Video => {
@ -218,6 +222,9 @@ impl<'a> Library {
error!(?e);
}
let task = Task::future(self.db.acquire())
.map_err(|e| {
miette::miette!("Database error: {e}")
})
.and_then(move |db| {
Task::perform(
add_video_to_db(
@ -225,25 +232,16 @@ impl<'a> Library {
db,
),
move |res| {
debug!(
len,
index, "added to db"
);
if let Err(e) = res {
error!(?e);
}
if len == index {
debug!("open the pres");
res.map(|_| {
Message::OpenItem(Some((
LibraryKind::Video,
index as i32,
)))
} else {
Message::None
}
})
},
)
});
})
.map(|r| r.unwrap_or(Message::None));
tasks.push(task);
index += 1;
}
@ -267,23 +265,22 @@ impl<'a> Library {
error!(?e);
}
return Action::Task(
Task::future(self.db.acquire()).and_then(
move |db| {
Task::future(self.db.acquire())
.map_err(|e| {
miette::miette!("Database error: {e}")
})
.and_then(move |db| {
Task::perform(
add_presentation_to_db(
presentation.clone(),
db,
),
move |res| {
debug!("added to db");
if let Err(e) = res {
error!(?e);
}
Message::None
res.map(|_| Message::None)
},
)
},
),
})
.map(|r| r.unwrap_or(Message::None)),
);
}
}
@ -304,32 +301,16 @@ impl<'a> Library {
let task = Task::future(
self.db.acquire(),
)
.map_err(|e| miette::miette!("Database error: {e}"))
.and_then(move |db| {
Task::perform(
add_presentation_to_db(
presentation.clone(),
db,
),
move |res| {
debug!(
len,
index, "added to db"
);
if let Err(e) = res {
error!(?e);
}
if len == index {
debug!("open the pres");
Message::OpenItem(Some((
LibraryKind::Presentation,
index as i32,
)))
} else {
Message::None
}
},
move |res| res.map(|_| Message::OpenItem(Some((LibraryKind::Presentation, index as i32))))
)
});
}).map(|r| r.unwrap_or(Message::None));
tasks.push(task);
index += 1;
}
@ -358,6 +339,9 @@ impl<'a> Library {
error!(?e);
}
let task = Task::future(self.db.acquire())
.map_err(|e| {
miette::miette!("Database error: {e}")
})
.and_then(move |db| {
Task::perform(
add_image_to_db(
@ -365,25 +349,16 @@ impl<'a> Library {
db,
),
move |res| {
debug!(
len,
index, "added to db"
);
if let Err(e) = res {
error!(?e);
}
if len == index {
debug!("open the pres");
res.map(|_| {
Message::OpenItem(Some((
LibraryKind::Image,
index as i32,
)))
} else {
Message::None
}
})
},
)
});
})
.map(|r| r.unwrap_or(Message::None));
tasks.push(task);
index += 1;
}
@ -518,20 +493,17 @@ impl<'a> Library {
}
return Action::Task(
Task::future(self.db.acquire()).and_then(
move |conn| {
Task::future(self.db.acquire())
.map_err(|e| {
miette::miette!("Database error: {e}")
})
.and_then(move |conn| {
Task::perform(
update_song_in_db(song.clone(), conn),
|r| match r {
Ok(()) => Message::SongChanged,
Err(e) => {
error!(?e);
Message::None
}
},
|r| r.map(|_| Message::SongChanged),
)
},
),
})
.map(|r| r.unwrap_or(Message::None)),
);
}
Message::SongChanged => {
@ -568,23 +540,20 @@ impl<'a> Library {
}
return Action::Task(
Task::future(self.db.acquire()).and_then(
move |conn| {
Task::future(self.db.acquire())
.map_err(|e| {
miette::miette!("Database error: {e}")
})
.and_then(move |conn| {
Task::perform(
update_image_in_db(
image.clone(),
conn,
),
|r| match r {
Ok(()) => Message::ImageChanged,
Err(e) => {
error!(?e);
Message::None
}
},
|r| r.map(|_| Message::ImageChanged),
)
},
),
})
.map(|r| r.unwrap_or(Message::None)),
);
}
Message::ImageChanged => (),
@ -609,23 +578,20 @@ impl<'a> Library {
}
return Action::Task(
Task::future(self.db.acquire()).and_then(
move |conn| {
Task::future(self.db.acquire())
.map_err(|e| {
miette::miette!("Database error: {e}")
})
.and_then(move |conn| {
Task::perform(
update_video_in_db(
video.clone(),
conn,
),
|r| match r {
Ok(()) => Message::VideoChanged,
Err(e) => {
error!(?e);
Message::None
}
},
|r| r.map(|_| Message::VideoChanged),
)
},
),
})
.map(|r| r.unwrap_or(Message::None)),
);
}
Message::VideoChanged => debug!("vid shoulda changed"),
@ -653,23 +619,19 @@ impl<'a> Library {
.update_item(presentation.clone(), index)
{
Ok(()) => return Action::Task(
Task::future(self.db.acquire()).and_then(
Task::future(self.db.acquire()).map_err(|e| {
miette::miette!("Database error: {e}")
}).and_then(
move |conn| {
Task::perform(
update_presentation_in_db(
presentation.clone(),
conn,
),
|r| match r {
Ok(()) => Message::PresentationChanged,
Err(e) => {
error!(?e);
Message::None
}
},
|r| r.map(|_| Message::PresentationChanged)
)
},
),
).map(|r| r.unwrap_or(Message::None)),
),
Err(_) => todo!(),
}
@ -717,26 +679,27 @@ impl<'a> Library {
.add_item(song.clone())
.err()
else {
let task =
Task::future(self.db.acquire())
.and_then(move |db| {
Task::perform(
add_song_to_db(db),
{
move |res| {
if let Err(
e,
) = res
{
error!(
?e
);
}
Message::None
}
},
)
});
let task = Task::future(
self.db.acquire(),
)
.map_err(|e| {
miette::miette!(
"Database error: {e}"
)
})
.and_then(move |db| {
Task::perform(
add_song_to_db(db),
{
move |res| {
res.map(|song| {
Message::None
})
}
},
)
})
.map(|r| r.unwrap_or(Message::None));
tasks.push(task);
continue;
};
@ -748,30 +711,29 @@ impl<'a> Library {
.add_item(video.clone())
.err()
else {
let task = Task::future(
self.db.acquire(),
)
.and_then(move |db| {
Task::perform(
add_video_to_db(
video.clone(),
db,
),
{
let video = video.clone();
move |res| {
debug!(
?video,
"added to db"
);
if let Err(e) = res {
error!(?e);
}
Message::None
}
},
)
});
let task =
Task::future(self.db.acquire())
.map_err(|e| {
miette::miette!(
"Database error: {e}"
)
})
.and_then(move |db| {
Task::perform(
add_video_to_db(
video.clone(),
db,
),
move |res| {
res.map(|_| {
Message::None
})
},
)
})
.map(|r| {
r.unwrap_or(Message::None)
});
tasks.push(task);
continue;
};
@ -783,30 +745,29 @@ impl<'a> Library {
.add_item(image.clone())
.err()
else {
let task = Task::future(
self.db.acquire(),
)
.and_then(move |db| {
Task::perform(
add_image_to_db(
image.clone(),
db,
),
{
let image = image.clone();
move |res| {
debug!(
?image,
"added to db"
);
if let Err(e) = res {
error!(?e);
}
Message::None
}
},
)
});
let task =
Task::future(self.db.acquire())
.map_err(|e| {
miette::miette!(
"Database error: {e}"
)
})
.and_then(move |db| {
Task::perform(
add_image_to_db(
image.clone(),
db,
),
move |res| {
res.map(|_| {
Message::None
})
},
)
})
.map(|r| {
r.unwrap_or(Message::None)
});
tasks.push(task);
continue;
};
@ -822,6 +783,11 @@ impl<'a> Library {
else {
let task =
Task::future(self.db.acquire())
.map_err(|e| {
miette::miette!(
"Database error: {e}"
)
})
.and_then(move |db| {
Task::perform(
add_presentation_to_db(
@ -829,20 +795,16 @@ impl<'a> Library {
db,
),
{
let presentation =
presentation.clone();
move |res| {
debug!(
?presentation,
"added to db"
);
if let Err(e) = res {
error!(?e);
}
Message::None
res.map(|_| {
Message::None
})
}
},
)
})
.map(|r| {
r.unwrap_or(Message::None)
});
tasks.push(task);
@ -873,7 +835,7 @@ impl<'a> Library {
let library_column = column![
text::heading("Library").center().width(Length::Fill),
cosmic::iced::widget::horizontal_rule(1),
divider::horizontal::light(),
song_library,
image_library,
video_library,
@ -952,7 +914,7 @@ impl<'a> Library {
where
T: Content,
{
let mut row = row::<Message>().spacing(5);
let mut row = row::with_capacity(5).spacing(5);
match &model.kind {
LibraryKind::Song => {
row = row
@ -983,7 +945,7 @@ impl<'a> Library {
}
}
let item_count = model.items.len();
row = row.push(horizontal_space());
row = row.push(space::horizontal());
row = row
.push(textm!("{}", item_count).align_y(Vertical::Center));
row = row.push(
@ -1120,7 +1082,7 @@ impl<'a> Library {
column![library_toolbar, context_menu].spacing(3);
Container::new(library_column).padding(5)
} else {
Container::new(Space::new(0, 0))
Container::new(Space::new())
};
column![library_button, lib_container].into()
}
@ -1135,6 +1097,9 @@ impl<'a> Library {
where
T: Content,
{
let cosmic::cosmic_theme::Spacing {
space_xxs, space_s, ..
} = theme::spacing();
let text = Container::new(responsive(|size| {
text::heading(elide_text(item.title(), size.width))
.center()
@ -1189,7 +1154,6 @@ impl<'a> Library {
.spacing(10)
.align_y(Vertical::Center),
)
// .padding(5)
.width(Length::Fill)
.style(move |t| {
container::Style::default()
@ -1230,7 +1194,7 @@ impl<'a> Library {
.rounded(t.cosmic().corner_radii.radius_m),
)
})
.padding([3, 0])
.padding([space_xxs, space_s])
.into()
}
@ -1361,8 +1325,8 @@ impl<'a> Library {
error!(?e);
Task::none()
} else {
Task::future(self.db.acquire())
.and_then(move |db| {
Task::future(self.db.acquire()).and_then(
move |db| {
Task::perform(
songs::remove_from_db(
db, song.id,
@ -1371,11 +1335,12 @@ impl<'a> Library {
if let Err(e) = r {
error!(?e);
}
r.map(|_| Message::None)
Message::None
},
)
})
.map(|r| r.unwrap_or(Task::none()))
.map(|m| Ok(m))
},
)
}
} else {
Task::none()
@ -1392,8 +1357,8 @@ impl<'a> Library {
error!(?e);
Task::none()
} else {
Task::future(self.db.acquire())
.and_then(move |db| {
Task::future(self.db.acquire()).and_then(
move |db| {
Task::perform(
videos::remove_from_db(
db, video.id,
@ -1405,8 +1370,9 @@ impl<'a> Library {
Message::None
},
)
})
.map(|r| r.unwrap_or(Task::none()))
.map(|m| Ok(m))
},
)
}
} else {
Task::none()
@ -1425,8 +1391,8 @@ impl<'a> Library {
} else {
debug!("let's remove {0}", image.id);
debug!("let's remove {0}", image.title);
Task::future(self.db.acquire())
.and_then(move |db| {
Task::future(self.db.acquire()).and_then(
move |db| {
Task::perform(
images::remove_from_db(
db, image.id,
@ -1438,8 +1404,9 @@ impl<'a> Library {
Message::None
},
)
})
.map(|r| r.unwrap_or(Task::none()))
.map(|m| Ok(m))
},
)
}
} else {
Task::none()
@ -1457,8 +1424,8 @@ impl<'a> Library {
error!(?e);
Task::none()
} else {
Task::future(self.db.acquire())
.and_then(move |db| {
Task::future(self.db.acquire()).and_then(
move |db| {
Task::perform(
presentations::remove_from_db(
db,
@ -1471,14 +1438,20 @@ impl<'a> Library {
Message::None
},
)
})
.map(|r| r.unwrap_or(Task::none()))
.map(|m| Ok(m))
},
)
}
} else {
Task::none()
}
}
})
.map(|t| {
t.map(
|r| if let Ok(r) = r { r } else { Message::None },
)
})
.collect();
if !tasks.is_empty() {
self.selected_items = None;

View file

@ -124,7 +124,7 @@ impl<'a> Program<SlideWidget, cosmic::Theme, cosmic::Renderer>
event: &canvas::Event,
bounds: cosmic::iced::Rectangle,
_cursor: cosmic::iced_core::mouse::Cursor,
) -> (&cosmic::event::Status, Option<SlideWidget>) {
) -> Option<cosmic::iced_widget::Action<SlideWidget>> {
match event {
canvas::Event::Mouse(event) => match event {
cosmic::iced::mouse::Event::CursorEntered => {
@ -165,7 +165,7 @@ impl<'a> Program<SlideWidget, cosmic::Theme, cosmic::Renderer>
todo!()
}
}
(iced_core::event::Status::Ignored, None)
None
}
fn mouse_interaction(

View file

@ -178,6 +178,7 @@ impl VideoEditor {
}
fn update_entire_video(&mut self, video: &videos::Video) {
debug!(?video);
let Ok(mut player_video) =
Url::from_file_path(video.path.clone())
.map(|url| Video::new(&url).expect("Should be here"))

View file

@ -434,9 +434,7 @@ where
clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>,
viewport: &Rectangle,
) -> event::Status {
let mut event_status = event::Status::Ignored;
) {
let action = tree.state.downcast_mut::<Action>();
match event {
@ -457,7 +455,7 @@ where
index,
origin: cursor_position,
};
event_status = event::Status::Captured;
shell.capture_event();
break;
}
}
@ -482,7 +480,7 @@ where
DragEvent::Picked { index },
));
}
event_status = event::Status::Captured;
shell.capture_event();
}
}
Action::Dragging { origin, index, .. } => {
@ -494,7 +492,7 @@ where
origin,
index,
};
event_status = event::Status::Captured;
shell.capture_event();
}
}
_ => {}
@ -527,8 +525,7 @@ where
drop_position,
},
));
event_status =
event::Status::Captured;
shell.capture_event();
}
} else if let Some(on_reorder) =
&self.on_drag
@ -536,8 +533,7 @@ where
shell.publish(on_reorder(
DragEvent::Canceled { index },
));
event_status =
event::Status::Captured;
shell.capture_event();
}
}
*action = Action::Idle;
@ -552,12 +548,11 @@ where
_ => {}
}
let child_status = self
.children
self.children
.iter_mut()
.zip(&mut tree.children)
.zip(layout.children())
.map(|((child, state), c_layout)| {
.for_each(|((child, state), c_layout)| {
child.as_widget_mut().update(
state,
&event.clone(),
@ -569,18 +564,7 @@ where
shell,
viewport,
)
})
.fold(
event::Status::Ignored,
|arg0: cosmic::iced::event::Status, arg1: ()| {
event::Status::merge(
event::Status::Ignored,
arg0, /* cosmic::iced::event::Status */
)
},
);
event::Status::merge(event_status, child_status)
});
}
fn mouse_interaction(

View file

@ -421,9 +421,7 @@ where
clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>,
viewport: &Rectangle,
) -> event::Status {
let mut event_status = event::Status::Ignored;
) {
let action = tree.state.downcast_mut::<Action>();
match event {
@ -444,7 +442,7 @@ where
index,
origin: cursor_position,
};
event_status = event::Status::Captured;
shell.capture_event();
break;
}
}
@ -469,7 +467,7 @@ where
DragEvent::Picked { index },
));
}
event_status = event::Status::Captured;
shell.capture_event();
}
}
Action::Dragging { origin, index, .. } => {
@ -481,7 +479,7 @@ where
origin,
index,
};
event_status = event::Status::Captured;
shell.capture_event();
}
}
_ => {}
@ -514,8 +512,7 @@ where
drop_position,
},
));
event_status =
event::Status::Captured;
shell.capture_event();
}
} else if let Some(on_reorder) =
&self.on_drag
@ -523,8 +520,7 @@ where
shell.publish(on_reorder(
DragEvent::Canceled { index },
));
event_status =
event::Status::Captured;
shell.capture_event();
}
}
*action = Action::Idle;
@ -544,7 +540,7 @@ where
.iter_mut()
.zip(&mut tree.children)
.zip(layout.children())
.map(|((child, state), layout)| {
.for_each(|((child, state), layout)| {
child.as_widget_mut().update(
state,
&event.clone(),
@ -555,18 +551,7 @@ where
shell,
viewport,
)
})
.fold(
event::Status::Ignored,
|arg0: cosmic::iced::event::Status, arg1: ()| {
event::Status::merge(
event::Status::Ignored,
arg0, /* cosmic::iced::event::Status */
)
},
);
event::Status::merge(event_status, child_status)
});
}
fn mouse_interaction(
@ -953,7 +938,7 @@ where
clipboard: &mut dyn Clipboard,
shell: &mut Shell<'_, Message>,
viewport: &Rectangle,
) -> event::Status {
) {
self.row.update(
tree, event, layout, cursor, renderer, clipboard, shell,
viewport,

View file

@ -2,5 +2,5 @@
#[allow(clippy::nursery)]
#[allow(clippy::pedantic)]
pub mod draggable;
pub mod slide_text;
// pub mod slide_text;
pub mod verse_editor;