Refactoring to slide_model and service_item getting the data from db
This is kinda a broken commit. There isn't any order to the adding of the slide anymore. So it'll need to find a way of keeping track of where all the current slides are and then insert the new ones in the correct order while moving the others around as well.
This commit is contained in:
parent
6052cd01ac
commit
2c014e242f
9 changed files with 347 additions and 604 deletions
|
|
@ -101,17 +101,16 @@ pub mod slide_model {
|
|||
fn insert_item_from_service(
|
||||
self: Pin<&mut SlideModel>,
|
||||
index: i32,
|
||||
service_item: &QMap_QString_QVariant,
|
||||
id: i32,
|
||||
);
|
||||
item_model_id: i32,
|
||||
kind: &QString,
|
||||
) -> Result<()>;
|
||||
|
||||
#[qinvokable]
|
||||
fn add_item_from_service(
|
||||
self: Pin<&mut SlideModel>,
|
||||
index: i32,
|
||||
service_item: &QMap_QString_QVariant,
|
||||
id: i32,
|
||||
);
|
||||
item_model_id: i32,
|
||||
kind: &QString,
|
||||
) -> Result<()>;
|
||||
|
||||
#[qinvokable]
|
||||
fn move_item_from_service(
|
||||
|
|
@ -229,20 +228,25 @@ pub mod slide_model {
|
|||
}
|
||||
|
||||
use crate::image_model::image_model::ImageModel;
|
||||
use crate::image_model::{self, Image, ImageModelRust};
|
||||
use crate::presentation_model::presentation_model::PresentationModel;
|
||||
use crate::songs::song_model::song_model::SongModel;
|
||||
use crate::songs::song_model::SongModelRust;
|
||||
use crate::presentation_model::{self, Presentation, PresentationModelRust};
|
||||
use crate::songs::song_model::song_model::{self, SongModel};
|
||||
use crate::songs::song_model::{get_song, Song, SongModelRust};
|
||||
use crate::video_model::video_model::VideoModel;
|
||||
use crate::video_model::VideoModelRust;
|
||||
use crate::video_model::{self, Video, VideoModelRust};
|
||||
use crate::{ffmpeg, slide_types::SlideType};
|
||||
use crate::obs::Obs;
|
||||
use crate::slide_model::slide_model::QList_QString;
|
||||
use color_eyre::owo_colors::OwoColorize;
|
||||
use color_eyre::eyre::Result;
|
||||
use color_eyre::Section;
|
||||
use cxx_qt::{CxxQtType, Threading};
|
||||
use cxx_qt_lib::{
|
||||
CaseSensitivity, QByteArray, QModelIndex, QString, QStringList, QVariant
|
||||
CaseSensitivity, QByteArray, QList, QModelIndex, QString, QStringList, QVariant
|
||||
};
|
||||
use slide_model::SlideObject;
|
||||
use std::error::Error;
|
||||
use std::fmt::{Display};
|
||||
use std::{path::PathBuf, pin::Pin};
|
||||
use tracing::{debug, error};
|
||||
|
||||
|
|
@ -302,6 +306,111 @@ impl Default for Slide {
|
|||
}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum ParseSlideError {
|
||||
UnknownType,
|
||||
}
|
||||
|
||||
impl Error for ParseSlideError {}
|
||||
|
||||
impl Display for ParseSlideError {
|
||||
fn fmt(
|
||||
&self,
|
||||
f: &mut std::fmt::Formatter<'_>,
|
||||
) -> std::fmt::Result {
|
||||
let message = match self {
|
||||
Self::UnknownType => "The type does not exist. It needs to be one of 'song', 'video', 'image', 'presentation', or 'content'",
|
||||
};
|
||||
write!(f, "Error: {message}")
|
||||
}
|
||||
}
|
||||
|
||||
impl TryFrom<Video> for Slide {
|
||||
type Error = ParseSlideError;
|
||||
fn try_from(value: Video) -> Result<Self, Self::Error> {
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
|
||||
impl Slide {
|
||||
fn slides_from_song(song: Song) -> Result<Vec<Self>> {
|
||||
let list = song.get_lyric_list();
|
||||
let total = list.len();
|
||||
let mut vector: Vec<Slide> = vec![];
|
||||
list.iter().map(|t| t.to_string()).enumerate()
|
||||
.for_each(|(i, s)| {
|
||||
if song.background_type == "image" {
|
||||
vector.push(
|
||||
Self {
|
||||
text: s,
|
||||
ty: SlideType::Song,
|
||||
audio: song.audio.clone(),
|
||||
image_background: song.background.clone(),
|
||||
video_background: "".to_owned(),
|
||||
htext_alignment: song.horizontal_text_alignment.clone(),
|
||||
vtext_alignment: song.vertical_text_alignment.clone(),
|
||||
font: song.font.clone(),
|
||||
font_size: song.font_size,
|
||||
slide_count: total as i32,
|
||||
slide_index: i as i32,
|
||||
..Default::default()
|
||||
}
|
||||
);
|
||||
} else {
|
||||
vector.push(
|
||||
Self {
|
||||
text: s,
|
||||
ty: SlideType::Song,
|
||||
audio: song.audio.clone(),
|
||||
image_background: "".to_owned(),
|
||||
video_background: song.background.clone(),
|
||||
htext_alignment: song.horizontal_text_alignment.clone(),
|
||||
vtext_alignment: song.vertical_text_alignment.clone(),
|
||||
font: song.font.clone(),
|
||||
font_size: song.font_size,
|
||||
slide_count: total as i32,
|
||||
slide_index: i as i32,
|
||||
..Default::default()
|
||||
}
|
||||
)
|
||||
}
|
||||
});
|
||||
Ok(vector)
|
||||
}
|
||||
|
||||
fn slide_from_video(video: Video) -> Result<Self> {
|
||||
Ok(Self {
|
||||
video_background: video.path,
|
||||
video_start_time: video.start_time,
|
||||
video_end_time: video.end_time,
|
||||
looping: video.looping,
|
||||
..Default::default()
|
||||
})
|
||||
}
|
||||
|
||||
fn slide_from_image(image: Image) -> Result<Self> {
|
||||
Ok(Self {
|
||||
image_background: image.path,
|
||||
..Default::default()
|
||||
})
|
||||
}
|
||||
|
||||
fn slides_from_presentation(presentation: Presentation) -> Result<Vec<Self>> {
|
||||
let total = presentation.page_count;
|
||||
let mut slides: Vec<Slide> = vec![];
|
||||
for i in 0..total {
|
||||
slides.push(Self {
|
||||
html: presentation.html,
|
||||
slide_count: total,
|
||||
slide_index: i,
|
||||
image_background: presentation.path.clone(),
|
||||
..Default::default()
|
||||
})
|
||||
};
|
||||
Ok(slides)
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct SlideModelRust {
|
||||
current_index: i32,
|
||||
|
|
@ -499,379 +608,57 @@ impl slide_model::SlideModel {
|
|||
pub fn insert_item_from_service(
|
||||
mut self: Pin<&mut Self>,
|
||||
index: i32,
|
||||
service_item: &QMap_QString_QVariant,
|
||||
id: i32,
|
||||
) {
|
||||
debug!(index, "Inserting slide from service insert");
|
||||
for (key, data) in service_item.iter() {
|
||||
debug!(
|
||||
?key,
|
||||
data = data.value_or_default::<QString>().to_string()
|
||||
);
|
||||
}
|
||||
let ty = service_item
|
||||
.get(&QString::from("ty"))
|
||||
.unwrap_or(QVariant::from(&QString::from("")))
|
||||
.value::<QString>();
|
||||
|
||||
let background = service_item
|
||||
.get(&QString::from("background"))
|
||||
.unwrap_or(QVariant::from(&QString::from("")))
|
||||
.value::<QString>()
|
||||
.unwrap_or_default();
|
||||
|
||||
let background_type = service_item
|
||||
.get(&QString::from("backgroundType"))
|
||||
.unwrap_or(QVariant::from(&QString::from("")))
|
||||
.value::<QString>()
|
||||
.unwrap_or_default();
|
||||
|
||||
let textlist = service_item
|
||||
.get(&QString::from("text"))
|
||||
.unwrap_or(QVariant::from(&QString::from("")))
|
||||
.value::<QStringList>()
|
||||
.unwrap_or_default();
|
||||
|
||||
let text_vec =
|
||||
Vec::<QString>::from(&QList_QString::from(&textlist));
|
||||
// let vec_slize: &[usize] = &text_vec;
|
||||
|
||||
let mut slide = Slide {
|
||||
ty: SlideType::try_from(extract_string(service_item, "type")).unwrap(),
|
||||
text: extract_string(service_item, "text"),
|
||||
image_background: extract_string(service_item, "imageBackground"),
|
||||
video_background: extract_string(service_item, "videoBackground"),
|
||||
audio: extract_string(service_item, "audio"),
|
||||
font: extract_string(service_item, "font"),
|
||||
htext_alignment: extract_string(service_item, "htextAlignment"),
|
||||
vtext_alignment: extract_string(service_item, "vtextAlignment"),
|
||||
service_item_id: index,
|
||||
font_size: extract_value(service_item, "fontSize"),
|
||||
slide_index: extract_value(service_item, "slideNumber"),
|
||||
slide_count: extract_value(service_item, "slideCount"),
|
||||
video_start_time: extract_float(service_item, "videoStartTime"),
|
||||
video_end_time: extract_float(service_item, "videoEndTime"),
|
||||
video_thumbnail: "".to_owned(),
|
||||
looping: extract_bool(service_item, "loop"),
|
||||
active: extract_bool(service_item, "active"),
|
||||
selected: extract_bool(service_item, "selected"),
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
slide.font_size = service_item
|
||||
.get(&QString::from("fontSize"))
|
||||
.unwrap_or(QVariant::from(&50))
|
||||
.value()
|
||||
.unwrap_or(50);
|
||||
slide.slide_index = service_item
|
||||
.get(&QString::from("slideNumber"))
|
||||
.unwrap_or(QVariant::from(&0))
|
||||
.value()
|
||||
.unwrap_or(0);
|
||||
slide.slide_count = service_item
|
||||
.get(&QString::from("slideCount"))
|
||||
.unwrap_or(QVariant::from(&1))
|
||||
.value()
|
||||
.unwrap_or(1);
|
||||
slide.video_thumbnail = String::from("");
|
||||
|
||||
let mut binding = self.as_mut().rust_mut();
|
||||
let slides_iter = binding.slides.iter_mut();
|
||||
let mut slide_index = 0;
|
||||
for (i, slide) in slides_iter.enumerate() {
|
||||
if slide.service_item_id == index {
|
||||
slide_index = i as i32;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// We need to move all the current slides service_item_id's up by one.
|
||||
let slides_iter = binding.slides.iter_mut();
|
||||
for slide in
|
||||
slides_iter.filter(|x| x.service_item_id >= index)
|
||||
{
|
||||
slide.service_item_id += 1;
|
||||
}
|
||||
|
||||
match ty {
|
||||
Some(ty) if ty == QString::from("image") => {
|
||||
slide.ty = ty.try_into().unwrap();
|
||||
slide.image_background = background.to_string();
|
||||
slide.video_background = String::from("");
|
||||
slide.slide_index = 0;
|
||||
self.as_mut().insert_slide(&slide, slide_index);
|
||||
debug!("Image added to slide model!");
|
||||
}
|
||||
Some(ty) if ty == QString::from("song") => {
|
||||
let count = text_vec.len();
|
||||
for (i, text) in text_vec.iter().enumerate() {
|
||||
debug!(
|
||||
"rust: add song of {:?} length at index {:?}",
|
||||
&count, &slide_index
|
||||
);
|
||||
slide.ty = ty.clone().try_into().unwrap();
|
||||
// debug!("{:?}", text_vec[i].clone());
|
||||
slide.text = text.clone().to_string();
|
||||
slide.slide_count = count as i32;
|
||||
slide.slide_index = i as i32;
|
||||
if background_type == QString::from("image") {
|
||||
slide.image_background = background.clone().to_string();
|
||||
slide.video_background = String::from("");
|
||||
} else {
|
||||
slide.video_background = background.clone().to_string();
|
||||
slide.image_background = String::from("");
|
||||
}
|
||||
self.as_mut()
|
||||
.insert_slide(&slide, slide_index + i as i32);
|
||||
item_model_id: i32,
|
||||
kind: &QString,
|
||||
) -> Result<()> {
|
||||
let kind = SlideType::try_from(kind.clone())?;
|
||||
match kind {
|
||||
SlideType::Song => {
|
||||
let song = get_song(item_model_id)?;
|
||||
let slides = Slide::slides_from_song(song)?;
|
||||
slides.iter().for_each(|slide| self.as_mut().insert_slide(slide, index));
|
||||
Ok(())
|
||||
},
|
||||
SlideType::Video => {
|
||||
let video = video_model::get_video(item_model_id)?;
|
||||
self.insert_slide(&Slide::slide_from_video(video)?, index);
|
||||
Ok(())
|
||||
},
|
||||
SlideType::Image => {
|
||||
let result = image_model::get_image(item_model_id);
|
||||
match result {
|
||||
Ok(image) => self.insert_slide(&Slide::slide_from_image(image)?, index),
|
||||
Err(e) => {
|
||||
e.with_note(|| {
|
||||
format!("This might fail if we are loading the items from a file")
|
||||
});
|
||||
let mut slide = Slide::default();
|
||||
slide.image_background = "qrc:/assets/black.jpg".to_owned();
|
||||
self.insert_slide(&slide, index);
|
||||
},
|
||||
}
|
||||
Ok(())
|
||||
},
|
||||
SlideType::Content => {
|
||||
todo!();
|
||||
Ok(())
|
||||
},
|
||||
SlideType::Presentation(_) => {
|
||||
let presentation = presentation_model::get_presentation(item_model_id)?;
|
||||
let slides = Slide::slides_from_presentation(presentation)?;
|
||||
slides.iter().for_each(|slide| self.as_mut().insert_slide(slide, slide.slide_index + index));
|
||||
Ok(())
|
||||
}
|
||||
Some(ty) if ty == QString::from("video") => {
|
||||
slide.ty = ty.try_into().unwrap();
|
||||
slide.image_background = String::from("");
|
||||
slide.video_background = background.to_string();
|
||||
slide.slide_index = 0;
|
||||
self.as_mut().insert_slide(&slide, slide_index);
|
||||
}
|
||||
Some(ty) if ty == QString::from("presentation") => {
|
||||
debug!(?slide, "Inserting presentation slide");
|
||||
if background.clone().ends_with(
|
||||
&QString::from(".html"),
|
||||
CaseSensitivity::CaseInsensitive,
|
||||
) {
|
||||
slide.ty = ty.clone().try_into().unwrap();
|
||||
slide.html = true;
|
||||
slide.image_background = background.clone().to_string();
|
||||
slide.video_background = String::from("");
|
||||
slide.slide_index = 0;
|
||||
self.as_mut().insert_slide(&slide, slide_index);
|
||||
} else {
|
||||
for i in 0..slide.slide_count {
|
||||
slide.ty = ty.clone().try_into().unwrap();
|
||||
slide.image_background = background.clone().to_string();
|
||||
slide.video_background = String::from("");
|
||||
slide.slide_index = i;
|
||||
self.as_mut()
|
||||
.insert_slide(&slide, slide_index + i);
|
||||
}
|
||||
}
|
||||
}
|
||||
_ => debug!("It's somethign else!"),
|
||||
};
|
||||
|
||||
debug!("Item added in slide model!");
|
||||
}
|
||||
}
|
||||
|
||||
pub fn add_item_from_service(
|
||||
mut self: Pin<&mut Self>,
|
||||
index: i32,
|
||||
id: i32,
|
||||
self: Pin<&mut Self>,
|
||||
item_model_id: i32,
|
||||
kind: &QString,
|
||||
) {
|
||||
debug!("add rust slide {:?}", index);
|
||||
let mut slide = Slide::default();
|
||||
let iter = service_item.iter();
|
||||
if let Ok(kind) = SlideType::try_from(kind) {
|
||||
match kind {
|
||||
SlideType::Song => {
|
||||
let song = SongModelRust::get_song(id)?;
|
||||
},
|
||||
SlideType::Video => {
|
||||
let video = VideoModelRust::get_video(id)?;
|
||||
},
|
||||
SlideType::Image => {
|
||||
let image = ImageModelRust::get_image(id)?;
|
||||
},
|
||||
SlideType::Content => {
|
||||
todo!()
|
||||
},
|
||||
SlideType::Presentation(_) => {
|
||||
let presentation = PresentationModelRust::get_presentation(id)?;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (key, _value) in iter {
|
||||
debug!(?key);
|
||||
// match key.to_string().as_str() {
|
||||
// "ty" => slide.ty = QString::from(value),
|
||||
// // "background" => {
|
||||
// // slide.background = QString::from(value)
|
||||
// // }
|
||||
// // "backgroundType" => {
|
||||
// // slide.background_type = QString::from(value)
|
||||
// // }
|
||||
// "audio" => slide.audio = QString::from(value),
|
||||
// "font" => slide.font = QString::from(value),
|
||||
// "fontSize" => slide.font_size = i32::from(value),
|
||||
// "looping" => slide.looping = bool::from(value),
|
||||
// "slideCount" => slide.slide_count = i32::from(value),
|
||||
// "videoEndTime" => {
|
||||
// slide.video_end_time = f32::from(value)
|
||||
// }
|
||||
// "videoStartTime" => {
|
||||
// slide.video_end_time = f32::from(value)
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
let ty = service_item
|
||||
.get(&QString::from("ty"))
|
||||
.unwrap_or(QVariant::from(&QString::from("")))
|
||||
.value::<QString>();
|
||||
|
||||
let background = service_item
|
||||
.get(&QString::from("background"))
|
||||
.unwrap_or(QVariant::from(&QString::from("")))
|
||||
.value::<QString>()
|
||||
.unwrap_or_default();
|
||||
|
||||
let background_type = service_item
|
||||
.get(&QString::from("backgroundType"))
|
||||
.unwrap_or(QVariant::from(&QString::from("")))
|
||||
.value::<QString>()
|
||||
.unwrap_or_default();
|
||||
|
||||
let textlist = service_item
|
||||
.get(&QString::from("text"))
|
||||
.unwrap_or(QVariant::from(&QString::from("")))
|
||||
.value::<QStringList>()
|
||||
.unwrap_or_default();
|
||||
|
||||
let text_vec =
|
||||
Vec::<QString>::from(&QList_QString::from(&textlist));
|
||||
// let vec_slize: &[usize] = &text_vec;
|
||||
|
||||
slide.ty = service_item
|
||||
.get(&QString::from("type"))
|
||||
.unwrap_or(QVariant::from(&QString::from("")))
|
||||
.value()
|
||||
.unwrap_or(QString::from("")).try_into().unwrap_or(SlideType::Image);
|
||||
slide.text = service_item
|
||||
.get(&QString::from("text"))
|
||||
.unwrap_or(QVariant::from(&QString::from("")))
|
||||
.value()
|
||||
.unwrap_or(QString::from("")).to_string();
|
||||
slide.image_background = service_item
|
||||
.get(&QString::from("imageBackground"))
|
||||
.unwrap_or(QVariant::from(&QString::from("")))
|
||||
.value()
|
||||
.unwrap_or(QString::from("")).to_string();
|
||||
slide.video_background = service_item
|
||||
.get(&QString::from("videoBackground"))
|
||||
.unwrap_or(QVariant::from(&QString::from("")))
|
||||
.value()
|
||||
.unwrap_or(QString::from("")).to_string();
|
||||
slide.audio = service_item
|
||||
.get(&QString::from("audio"))
|
||||
.unwrap_or(QVariant::from(&QString::from("")))
|
||||
.value()
|
||||
.unwrap_or(QString::from("")).to_string();
|
||||
slide.font = service_item
|
||||
.get(&QString::from("font"))
|
||||
.unwrap_or(QVariant::from(&QString::from("")))
|
||||
.value()
|
||||
.unwrap_or(QString::from("")).to_string();
|
||||
slide.font_size = service_item
|
||||
.get(&QString::from("fontSize"))
|
||||
.unwrap_or(QVariant::from(&50))
|
||||
.value()
|
||||
.unwrap_or(50);
|
||||
slide.htext_alignment = service_item
|
||||
.get(&QString::from("vtextAlignment"))
|
||||
.unwrap_or(QVariant::from(&QString::from("center")))
|
||||
.value()
|
||||
.unwrap_or(QString::from("center")).to_string();
|
||||
slide.vtext_alignment = service_item
|
||||
.get(&QString::from("vtextAlignment"))
|
||||
.unwrap_or(QVariant::from(&QString::from("center")))
|
||||
.value()
|
||||
.unwrap_or(QString::from("center")).to_string();
|
||||
slide.service_item_id = index;
|
||||
slide.slide_index = service_item
|
||||
.get(&QString::from("slideNumber"))
|
||||
.unwrap_or(QVariant::from(&0))
|
||||
.value()
|
||||
.unwrap_or(0);
|
||||
slide.slide_count = service_item
|
||||
.get(&QString::from("slideCount"))
|
||||
.unwrap_or(QVariant::from(&1))
|
||||
.value()
|
||||
.unwrap_or(1);
|
||||
slide.looping = service_item
|
||||
.get(&QString::from("loop"))
|
||||
.unwrap_or(QVariant::from(&false))
|
||||
.value()
|
||||
.unwrap_or(false);
|
||||
slide.active = service_item
|
||||
.get(&QString::from("active"))
|
||||
.unwrap_or(QVariant::from(&false))
|
||||
.value()
|
||||
.unwrap_or(false);
|
||||
slide.selected = service_item
|
||||
.get(&QString::from("selected"))
|
||||
.unwrap_or(QVariant::from(&false))
|
||||
.value()
|
||||
.unwrap_or(false);
|
||||
slide.video_thumbnail = String::from("");
|
||||
|
||||
match ty {
|
||||
Some(ty) if ty == QString::from("image") => {
|
||||
slide.ty = ty.try_into().unwrap_or(SlideType::Image);
|
||||
slide.image_background = background.to_string();
|
||||
slide.video_background = String::from("");
|
||||
slide.slide_index = 0;
|
||||
self.as_mut().add_slide(&slide);
|
||||
}
|
||||
Some(ty) if ty == QString::from("song") => {
|
||||
for (i, text) in text_vec.iter().enumerate() {
|
||||
slide.ty = ty.clone().try_into().unwrap_or(SlideType::Image);
|
||||
// debug!("{:?}", text_vec[i].clone());
|
||||
slide.text = text.clone().to_string();
|
||||
slide.slide_count = text_vec.len() as i32;
|
||||
slide.slide_index = i as i32;
|
||||
if background_type == QString::from("image") {
|
||||
slide.image_background = background.clone().to_string();
|
||||
slide.video_background = String::from("");
|
||||
} else {
|
||||
slide.video_background = background.clone().to_string();
|
||||
slide.image_background = String::from("");
|
||||
}
|
||||
self.as_mut().add_slide(&slide);
|
||||
}
|
||||
}
|
||||
Some(ty) if ty == QString::from("video") => {
|
||||
slide.ty = ty.try_into().unwrap_or(SlideType::Image);
|
||||
slide.image_background = String::from("");
|
||||
slide.video_background = background.to_string();
|
||||
slide.slide_index = 0;
|
||||
self.as_mut().add_slide(&slide);
|
||||
}
|
||||
Some(ty) if ty == QString::from("presentation") => {
|
||||
debug!(?slide, "Inserting presentation slide");
|
||||
if background.clone().ends_with(
|
||||
&QString::from(".html"),
|
||||
CaseSensitivity::CaseInsensitive,
|
||||
) {
|
||||
slide.ty = ty.clone().try_into().unwrap_or(SlideType::Image);
|
||||
slide.html = true;
|
||||
slide.image_background = background.clone().to_string();
|
||||
slide.video_background = String::from("");
|
||||
slide.slide_index = 0;
|
||||
self.as_mut().add_slide(&slide);
|
||||
} else {
|
||||
for i in 0..slide.slide_count {
|
||||
slide.ty = ty.clone().try_into().unwrap_or(SlideType::Image);
|
||||
slide.image_background = background.clone().to_string();
|
||||
slide.video_background = String::from("");
|
||||
slide.slide_index = i;
|
||||
self.as_mut().add_slide(&slide);
|
||||
}
|
||||
}
|
||||
}
|
||||
_ => debug!("It's somethign else!"),
|
||||
};
|
||||
|
||||
debug!("Item added in rust model!");
|
||||
) -> Result<()>{
|
||||
let index = self.count;
|
||||
self.insert_item_from_service(index, item_model_id, kind)
|
||||
}
|
||||
|
||||
pub fn move_item_from_service(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue