dialog: Make composer be read from database
This commit is contained in:
parent
ee8a887caa
commit
a7db35e8ac
@ -75,8 +75,8 @@ impl SheetKindDiscriminants {
|
|||||||
|
|
||||||
#[derive(sqlx::FromRow)]
|
#[derive(sqlx::FromRow)]
|
||||||
pub struct Composer {
|
pub struct Composer {
|
||||||
id: i64,
|
pub id: i64,
|
||||||
name: String,
|
pub name: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
|
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
database::Database,
|
database::Database,
|
||||||
sheet::{I64DateTime, Pdf, Sheet, SheetKind, SheetKindDiscriminants},
|
sheet::{Composer, I64DateTime, Pdf, Sheet, SheetKind, SheetKindDiscriminants},
|
||||||
};
|
};
|
||||||
use sqlx::{sqlite::SqliteRow, Row};
|
use sqlx::{sqlite::SqliteRow, Row};
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
@ -71,6 +71,16 @@ pub async fn update_sheet_last_opened(database: &Database, sheet: &Sheet) -> sql
|
|||||||
.map(|_| ())
|
.map(|_| ())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub async fn get_composer_by_id(database: &Database, id: i64) -> sqlx::Result<Composer> {
|
||||||
|
sqlx::query(&format!("SELECT * FROM {} WHERE id = {}", "composers", id))
|
||||||
|
.map(|row: SqliteRow| Composer {
|
||||||
|
id,
|
||||||
|
name: row.try_get("name").unwrap(),
|
||||||
|
})
|
||||||
|
.fetch_one(&database.connection)
|
||||||
|
.await
|
||||||
|
}
|
||||||
|
|
||||||
pub async fn fetch_all_sheets(database: &Database) -> sqlx::Result<Vec<Sheet>> {
|
pub async fn fetch_all_sheets(database: &Database) -> sqlx::Result<Vec<Sheet>> {
|
||||||
let mut sheets: Vec<Sheet> = Vec::new();
|
let mut sheets: Vec<Sheet> = Vec::new();
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@ use std::{path::PathBuf, sync::Arc};
|
|||||||
use chrono::Utc;
|
use chrono::Utc;
|
||||||
use gtk::prelude::*;
|
use gtk::prelude::*;
|
||||||
use relm4::{
|
use relm4::{
|
||||||
component::{AsyncComponent, AsyncComponentParts},
|
component::{AsyncComponent, AsyncComponentParts, AsyncController},
|
||||||
gtk::Adjustment,
|
gtk::Adjustment,
|
||||||
prelude::*,
|
prelude::*,
|
||||||
AsyncComponentSender,
|
AsyncComponentSender,
|
||||||
@ -18,7 +18,7 @@ use crate::{
|
|||||||
|
|
||||||
use super::{
|
use super::{
|
||||||
mcdu::McduModel,
|
mcdu::McduModel,
|
||||||
sheet_edit_dialog::{SheetEditDialogInput, SheetEditDialogModel},
|
sheet_edit_dialog::{SheetEditDialogInit, SheetEditDialogInput, SheetEditDialogModel},
|
||||||
sheet_listing::{SheetListingInput, SheetListingModel, SheetListingOutput},
|
sheet_listing::{SheetListingInput, SheetListingModel, SheetListingOutput},
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -29,7 +29,7 @@ pub struct AppModel {
|
|||||||
sheets_listing: Controller<SheetListingModel>,
|
sheets_listing: Controller<SheetListingModel>,
|
||||||
edit_mode: bool,
|
edit_mode: bool,
|
||||||
scroll_adjustment: Adjustment,
|
scroll_adjustment: Adjustment,
|
||||||
sheet_edit_dialog: Option<Controller<SheetEditDialogModel>>,
|
sheet_edit_dialog: Option<AsyncController<SheetEditDialogModel>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
@ -163,7 +163,10 @@ impl AsyncComponent for AppModel {
|
|||||||
self.sheet_edit_dialog = Some(
|
self.sheet_edit_dialog = Some(
|
||||||
SheetEditDialogModel::builder()
|
SheetEditDialogModel::builder()
|
||||||
.transient_for(&root)
|
.transient_for(&root)
|
||||||
.launch(sheet)
|
.launch(SheetEditDialogInit {
|
||||||
|
sheet,
|
||||||
|
database: Arc::clone(&self.database),
|
||||||
|
})
|
||||||
.forward(sender.input_sender(), |_| todo!()),
|
.forward(sender.input_sender(), |_| todo!()),
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
|
@ -1,11 +1,16 @@
|
|||||||
use std::borrow::BorrowMut;
|
use std::{borrow::BorrowMut, sync::Arc};
|
||||||
|
|
||||||
use gtk::prelude::*;
|
use gtk::prelude::*;
|
||||||
use relm4::prelude::*;
|
use relm4::{
|
||||||
|
component::{AsyncComponent, AsyncComponentParts},
|
||||||
|
prelude::*,
|
||||||
|
AsyncComponentSender,
|
||||||
|
};
|
||||||
|
|
||||||
use crate::sheet::Sheet;
|
use crate::{database::Database, sheet::Sheet, sheet_dao};
|
||||||
|
|
||||||
pub struct SheetEditDialogModel {
|
pub struct SheetEditDialogModel {
|
||||||
|
database: Arc<Database>,
|
||||||
hidden: bool,
|
hidden: bool,
|
||||||
sheet: Option<Sheet>,
|
sheet: Option<Sheet>,
|
||||||
sheet_name: String,
|
sheet_name: String,
|
||||||
@ -14,6 +19,11 @@ pub struct SheetEditDialogModel {
|
|||||||
book_sheets: Vec<(String, String, i64)>,
|
book_sheets: Vec<(String, String, i64)>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub struct SheetEditDialogInit {
|
||||||
|
pub database: Arc<Database>,
|
||||||
|
pub sheet: Sheet,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub enum SheetEditDialogInput {
|
pub enum SheetEditDialogInput {
|
||||||
Accept,
|
Accept,
|
||||||
@ -25,11 +35,12 @@ pub enum SheetEditDialogOutput {
|
|||||||
SheetEdited(Sheet),
|
SheetEdited(Sheet),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[relm4::component(pub)]
|
#[relm4::component(pub, async)]
|
||||||
impl SimpleComponent for SheetEditDialogModel {
|
impl AsyncComponent for SheetEditDialogModel {
|
||||||
type Init = Sheet;
|
type Init = SheetEditDialogInit;
|
||||||
type Input = SheetEditDialogInput;
|
type Input = SheetEditDialogInput;
|
||||||
type Output = SheetEditDialogOutput;
|
type Output = SheetEditDialogOutput;
|
||||||
|
type CommandOutput = ();
|
||||||
|
|
||||||
view! {
|
view! {
|
||||||
gtk::Window {
|
gtk::Window {
|
||||||
@ -54,6 +65,13 @@ impl SimpleComponent for SheetEditDialogModel {
|
|||||||
#[watch]
|
#[watch]
|
||||||
set_text : &model.sheet_composer,
|
set_text : &model.sheet_composer,
|
||||||
},
|
},
|
||||||
|
gtk::Label {
|
||||||
|
set_text: "Book"
|
||||||
|
},
|
||||||
|
gtk::CheckButton {
|
||||||
|
#[watch]
|
||||||
|
set_active: model.is_book,
|
||||||
|
},
|
||||||
gtk::Box {
|
gtk::Box {
|
||||||
set_orientation: gtk::Orientation::Horizontal,
|
set_orientation: gtk::Orientation::Horizontal,
|
||||||
set_margin_top:5,
|
set_margin_top:5,
|
||||||
@ -70,20 +88,26 @@ impl SimpleComponent for SheetEditDialogModel {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn init(
|
async fn init(
|
||||||
params: Self::Init,
|
params: Self::Init,
|
||||||
root: &Self::Root,
|
root: Self::Root,
|
||||||
sender: ComponentSender<Self>,
|
sender: AsyncComponentSender<Self>,
|
||||||
) -> ComponentParts<Self> {
|
) -> AsyncComponentParts<Self> {
|
||||||
let sheet = params;
|
let sheet = params.sheet;
|
||||||
let mut sheet_name = String::new();
|
let mut sheet_name = String::new();
|
||||||
let mut sheet_composer = String::new();
|
let mut sheet_composer = String::new();
|
||||||
let mut is_book = false;
|
let mut is_book = false;
|
||||||
|
|
||||||
match &sheet.kind {
|
match &sheet.kind {
|
||||||
crate::sheet::SheetKind::Sheet { name, .. } => {
|
crate::sheet::SheetKind::Sheet {
|
||||||
|
name, composer_id, ..
|
||||||
|
} => {
|
||||||
sheet_name = name.to_string();
|
sheet_name = name.to_string();
|
||||||
// sheet_composer = composer_id.to_string();
|
if let Ok(composer) =
|
||||||
|
sheet_dao::get_composer_by_id(¶ms.database, *composer_id).await
|
||||||
|
{
|
||||||
|
sheet_composer = composer.name;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
crate::sheet::SheetKind::Orphan => {
|
crate::sheet::SheetKind::Orphan => {
|
||||||
sheet_name = sheet.pdf.get_name().to_string();
|
sheet_name = sheet.pdf.get_name().to_string();
|
||||||
@ -92,10 +116,20 @@ impl SimpleComponent for SheetEditDialogModel {
|
|||||||
name,
|
name,
|
||||||
composer_id,
|
composer_id,
|
||||||
sheet_ids,
|
sheet_ids,
|
||||||
} => todo!("Cannot yet handle books!"),
|
} => {
|
||||||
|
is_book = true;
|
||||||
|
sheet_name = name.to_string();
|
||||||
|
if let Ok(composer) =
|
||||||
|
sheet_dao::get_composer_by_id(¶ms.database, *composer_id).await
|
||||||
|
{
|
||||||
|
sheet_composer = composer.name;
|
||||||
|
}
|
||||||
|
// TODO: load sheets of book
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let model = SheetEditDialogModel {
|
let model = SheetEditDialogModel {
|
||||||
|
database: params.database,
|
||||||
hidden: false,
|
hidden: false,
|
||||||
sheet: Some(sheet),
|
sheet: Some(sheet),
|
||||||
sheet_name,
|
sheet_name,
|
||||||
@ -105,10 +139,17 @@ impl SimpleComponent for SheetEditDialogModel {
|
|||||||
};
|
};
|
||||||
let widgets = view_output!();
|
let widgets = view_output!();
|
||||||
|
|
||||||
ComponentParts { model, widgets }
|
AsyncComponentParts { model, widgets }
|
||||||
}
|
}
|
||||||
|
|
||||||
fn update(&mut self, msg: Self::Input, sender: ComponentSender<Self>) {
|
// TODO: init_loading_widgets
|
||||||
|
|
||||||
|
async fn update(
|
||||||
|
&mut self,
|
||||||
|
msg: Self::Input,
|
||||||
|
sender: AsyncComponentSender<Self>,
|
||||||
|
_root: &Self::Root,
|
||||||
|
) {
|
||||||
match msg {
|
match msg {
|
||||||
SheetEditDialogInput::Accept => {
|
SheetEditDialogInput::Accept => {
|
||||||
self.hidden = true;
|
self.hidden = true;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user