a fledgling visible library system

Why do I write these weird commit messages....
This commit is contained in:
Chris Cochrun 2025-01-14 15:03:59 -06:00
parent 201e9dc925
commit 89294061b7
7 changed files with 188 additions and 55 deletions

View file

@ -1,6 +1,9 @@
use crate::{Background, Slide, SlideBuilder, TextAlignment};
use super::{model::Model, service_items::ServiceTrait};
use super::{
model::{get_db, LibraryKind, Model},
service_items::ServiceTrait,
};
use crisp::types::{Keyword, Value};
use miette::{IntoDiagnostic, Result};
use serde::{Deserialize, Serialize};
@ -90,12 +93,22 @@ impl ServiceTrait for Image {
}
impl Model<Image> {
pub async fn load_from_db(&mut self) {
pub async fn new_image_model(db: &mut SqliteConnection) -> Self {
let mut model = Self {
items: vec![],
kind: LibraryKind::Image,
};
model.load_from_db(db).await;
model
}
pub async fn load_from_db(&mut self, db: &mut SqliteConnection) {
let result = query_as!(
Image,
r#"SELECT title as "title!", file_path as "path!", id as "id: i32" from images"#
)
.fetch_all(&mut self.db)
.fetch_all(db)
.await;
match result {
Ok(v) => {

View file

@ -6,12 +6,20 @@ use sqlx::{Connection, SqliteConnection};
use super::kinds::ServiceItemKind;
#[derive(Debug)]
#[derive(Debug, Clone)]
pub struct Model<T> {
pub items: Vec<T>,
pub db: SqliteConnection,
pub kind: ServiceItemKind,
pub kind: LibraryKind,
}
#[derive(Debug, Clone)]
pub enum LibraryKind {
Song,
Video,
Image,
Presentation,
}
impl<T> Model<T> {
pub fn add_item(&mut self, item: T) -> Result<()> {
self.items.push(item);

View file

@ -9,7 +9,10 @@ use tracing::error;
use crate::{Background, Slide, SlideBuilder, TextAlignment};
use super::{model::Model, service_items::ServiceTrait};
use super::{
model::{get_db, LibraryKind, Model},
service_items::ServiceTrait,
};
#[derive(
Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize,
@ -131,11 +134,23 @@ impl FromRow<'_, SqliteRow> for Presentation {
}
impl Model<Presentation> {
pub async fn load_from_db(&mut self) {
pub async fn new_presentation_model(
db: &mut SqliteConnection,
) -> Self {
let mut model = Self {
items: vec![],
kind: LibraryKind::Presentation,
};
model.load_from_db(db).await;
model
}
pub async fn load_from_db(&mut self, db: &mut SqliteConnection) {
let result = query!(
r#"SELECT id as "id: i32", title, file_path as "path", html from presentations"#
)
.fetch_all(&mut self.db)
.fetch_all(db)
.await;
match result {
Ok(v) => {

View file

@ -12,7 +12,7 @@ use tracing::{debug, error};
use crate::{core::slide, Slide, SlideBuilder};
use super::{
model::Model,
model::{get_db, LibraryKind, Model},
service_items::ServiceTrait,
slide::{Background, TextAlignment},
};
@ -348,9 +348,19 @@ pub async fn get_song_from_db(
}
impl Model<Song> {
pub async fn load_from_db(&mut self) {
pub async fn new_song_model(db: &mut SqliteConnection) -> Self {
let mut model = Self {
items: vec![],
kind: LibraryKind::Song,
};
model.load_from_db(db).await;
model
}
pub async fn load_from_db(&mut self, db: &mut SqliteConnection) {
// static DATABASE_URL: &str = "sqlite:///home/chris/.local/share/lumina/library-db.sqlite3";
let result = query(r#"SELECT verse_order as "verse_order!", font_size as "font_size!: i32", background_type as "background_type!", horizontal_text_alignment as "horizontal_text_alignment!", vertical_text_alignment as "vertical_text_alignment!", title as "title!", font as "font!", background as "background!", lyrics as "lyrics!", ccli as "ccli!", author as "author!", audio as "audio!", id as "id: i32" from songs"#).fetch_all(&mut self.db).await;
let result = query(r#"SELECT verse_order as "verse_order!", font_size as "font_size!: i32", background_type as "background_type!", horizontal_text_alignment as "horizontal_text_alignment!", vertical_text_alignment as "vertical_text_alignment!", title as "title!", font as "font!", background as "background!", lyrics as "lyrics!", ccli as "ccli!", author as "author!", audio as "audio!", id as "id: i32" from songs"#).fetch_all(db).await;
match result {
Ok(s) => {
for song in s.into_iter() {

View file

@ -1,7 +1,9 @@
use crate::{Background, SlideBuilder, TextAlignment};
use super::{
model::Model, service_items::ServiceTrait, slide::Slide,
model::{get_db, LibraryKind, Model},
service_items::ServiceTrait,
slide::Slide,
};
use cosmic::iced::Executor;
use crisp::types::{Keyword, Value};
@ -136,8 +138,18 @@ impl ServiceTrait for Video {
}
impl Model<Video> {
pub async fn load_from_db(&mut self) {
let result = query_as!(Video, r#"SELECT title as "title!", file_path as "path!", start_time as "start_time!: f32", end_time as "end_time!: f32", loop as "looping!", id as "id: i32" from videos"#).fetch_all(&mut self.db).await;
pub async fn new_video_model(db: &mut SqliteConnection) -> Self {
let mut model = Self {
items: vec![],
kind: LibraryKind::Video,
};
model.load_from_db(db).await;
model
}
pub async fn load_from_db(&mut self, db: &mut SqliteConnection) {
let result = query_as!(Video, r#"SELECT title as "title!", file_path as "path!", start_time as "start_time!: f32", end_time as "end_time!: f32", loop as "looping!", id as "id: i32" from videos"#).fetch_all(db).await;
match result {
Ok(v) => {
for video in v.into_iter() {