fix updating song changes to the overall model
The listview didn't see the changes and everytime you came back to the changed song, the changes didn't show up since the model wasn't changing even thought the DB did.
This commit is contained in:
parent
1b7f8d3994
commit
f1b4ac495e
1 changed files with 93 additions and 158 deletions
|
@ -259,15 +259,25 @@ pub mod song_model {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_index(
|
fn get_indices(
|
||||||
mut self: Pin<&mut Self>,
|
mut self: Pin<&mut Self>,
|
||||||
song_id: i32,
|
song_id: i32,
|
||||||
) -> usize {
|
role: Role,
|
||||||
self.as_ref()
|
) -> (usize, QModelIndex, QVector_i32) {
|
||||||
|
let mut vector_roles = QVector_i32::default();
|
||||||
|
vector_roles.append(self.as_ref().get_role(role));
|
||||||
|
let index = self
|
||||||
|
.as_ref()
|
||||||
.songs()
|
.songs()
|
||||||
.iter()
|
.iter()
|
||||||
.position(|x| x.id == song_id)
|
.position(|x| x.id == song_id)
|
||||||
.unwrap()
|
.unwrap();
|
||||||
|
let model_index = self.as_ref().index(
|
||||||
|
index as i32,
|
||||||
|
0,
|
||||||
|
&QModelIndex::default(),
|
||||||
|
);
|
||||||
|
(index, model_index, vector_roles)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[qinvokable]
|
#[qinvokable]
|
||||||
|
@ -276,21 +286,8 @@ pub mod song_model {
|
||||||
song_id: i32,
|
song_id: i32,
|
||||||
updated_title: QString,
|
updated_title: QString,
|
||||||
) -> bool {
|
) -> bool {
|
||||||
let mut vector_roles = QVector_i32::default();
|
let (index, model_index, vector_roles) =
|
||||||
vector_roles
|
self.as_mut().get_indices(song_id, Role::TitleRole);
|
||||||
.append(self.as_ref().get_role(Role::TitleRole));
|
|
||||||
let index = self
|
|
||||||
.as_mut()
|
|
||||||
.songs()
|
|
||||||
.iter()
|
|
||||||
.position(|x| x.id == song_id)
|
|
||||||
.unwrap();
|
|
||||||
let model_index = &self.as_ref().index(
|
|
||||||
index as i32,
|
|
||||||
0,
|
|
||||||
&QModelIndex::default(),
|
|
||||||
);
|
|
||||||
|
|
||||||
let db = &mut self.as_mut().get_db();
|
let db = &mut self.as_mut().get_db();
|
||||||
let result = update(songs.filter(id.eq(song_id)))
|
let result = update(songs.filter(id.eq(song_id)))
|
||||||
.set(title.eq(updated_title.to_string()))
|
.set(title.eq(updated_title.to_string()))
|
||||||
|
@ -308,8 +305,8 @@ pub mod song_model {
|
||||||
song.title = updated_title.to_string();
|
song.title = updated_title.to_string();
|
||||||
}
|
}
|
||||||
self.as_mut().emit_data_changed(
|
self.as_mut().emit_data_changed(
|
||||||
model_index,
|
&model_index,
|
||||||
model_index,
|
&model_index,
|
||||||
&vector_roles,
|
&vector_roles,
|
||||||
);
|
);
|
||||||
true
|
true
|
||||||
|
@ -324,17 +321,10 @@ pub mod song_model {
|
||||||
song_id: i32,
|
song_id: i32,
|
||||||
updated_lyrics: QString,
|
updated_lyrics: QString,
|
||||||
) -> bool {
|
) -> bool {
|
||||||
let mut vector_roles = QVector_i32::default();
|
let (index, model_index, vector_roles) =
|
||||||
vector_roles
|
self.as_mut().get_indices(song_id, Role::LyricsRole);
|
||||||
.append(self.as_ref().get_role(Role::LyricsRole));
|
|
||||||
let model_index = &self.as_ref().index(
|
|
||||||
index,
|
|
||||||
0,
|
|
||||||
&QModelIndex::default(),
|
|
||||||
);
|
|
||||||
|
|
||||||
let db = &mut self.as_mut().get_db();
|
let db = &mut self.as_mut().get_db();
|
||||||
let result = update(songs.filter(id.eq(index)))
|
let result = update(songs.filter(id.eq(song_id)))
|
||||||
.set(lyrics.eq(updated_lyrics.to_string()))
|
.set(lyrics.eq(updated_lyrics.to_string()))
|
||||||
.execute(db);
|
.execute(db);
|
||||||
match result {
|
match result {
|
||||||
|
@ -346,8 +336,8 @@ pub mod song_model {
|
||||||
{
|
{
|
||||||
song.lyrics = updated_lyrics.to_string();
|
song.lyrics = updated_lyrics.to_string();
|
||||||
self.as_mut().emit_data_changed(
|
self.as_mut().emit_data_changed(
|
||||||
model_index,
|
&model_index,
|
||||||
model_index,
|
&model_index,
|
||||||
&vector_roles,
|
&vector_roles,
|
||||||
);
|
);
|
||||||
true
|
true
|
||||||
|
@ -362,20 +352,14 @@ pub mod song_model {
|
||||||
#[qinvokable]
|
#[qinvokable]
|
||||||
pub fn update_author(
|
pub fn update_author(
|
||||||
mut self: Pin<&mut Self>,
|
mut self: Pin<&mut Self>,
|
||||||
index: i32,
|
song_id: i32,
|
||||||
updated_author: QString,
|
updated_author: QString,
|
||||||
) -> bool {
|
) -> bool {
|
||||||
let mut vector_roles = QVector_i32::default();
|
let (index, model_index, vector_roles) =
|
||||||
vector_roles
|
self.as_mut().get_indices(song_id, Role::AuthorRole);
|
||||||
.append(self.as_ref().get_role(Role::AuthorRole));
|
|
||||||
let model_index = &self.as_ref().index(
|
|
||||||
index,
|
|
||||||
0,
|
|
||||||
&QModelIndex::default(),
|
|
||||||
);
|
|
||||||
|
|
||||||
let db = &mut self.as_mut().get_db();
|
let db = &mut self.as_mut().get_db();
|
||||||
let result = update(songs.filter(id.eq(index)))
|
let result = update(songs.filter(id.eq(song_id)))
|
||||||
.set(author.eq(updated_author.to_string()))
|
.set(author.eq(updated_author.to_string()))
|
||||||
.execute(db);
|
.execute(db);
|
||||||
match result {
|
match result {
|
||||||
|
@ -387,8 +371,8 @@ pub mod song_model {
|
||||||
{
|
{
|
||||||
song.author = updated_author.to_string();
|
song.author = updated_author.to_string();
|
||||||
self.as_mut().emit_data_changed(
|
self.as_mut().emit_data_changed(
|
||||||
model_index,
|
&model_index,
|
||||||
model_index,
|
&model_index,
|
||||||
&vector_roles,
|
&vector_roles,
|
||||||
);
|
);
|
||||||
true
|
true
|
||||||
|
@ -403,20 +387,14 @@ pub mod song_model {
|
||||||
#[qinvokable]
|
#[qinvokable]
|
||||||
pub fn update_audio(
|
pub fn update_audio(
|
||||||
mut self: Pin<&mut Self>,
|
mut self: Pin<&mut Self>,
|
||||||
index: i32,
|
song_id: i32,
|
||||||
updated_audio: QString,
|
updated_audio: QString,
|
||||||
) -> bool {
|
) -> bool {
|
||||||
let mut vector_roles = QVector_i32::default();
|
let (index, model_index, vector_roles) =
|
||||||
vector_roles
|
self.as_mut().get_indices(song_id, Role::AudioRole);
|
||||||
.append(self.as_ref().get_role(Role::AudioRole));
|
|
||||||
let model_index = &self.as_ref().index(
|
|
||||||
index,
|
|
||||||
0,
|
|
||||||
&QModelIndex::default(),
|
|
||||||
);
|
|
||||||
|
|
||||||
let db = &mut self.as_mut().get_db();
|
let db = &mut self.as_mut().get_db();
|
||||||
let result = update(songs.filter(id.eq(index)))
|
let result = update(songs.filter(id.eq(song_id)))
|
||||||
.set(audio.eq(updated_audio.to_string()))
|
.set(audio.eq(updated_audio.to_string()))
|
||||||
.execute(db);
|
.execute(db);
|
||||||
match result {
|
match result {
|
||||||
|
@ -428,8 +406,8 @@ pub mod song_model {
|
||||||
{
|
{
|
||||||
song.audio = updated_audio.to_string();
|
song.audio = updated_audio.to_string();
|
||||||
self.as_mut().emit_data_changed(
|
self.as_mut().emit_data_changed(
|
||||||
model_index,
|
&model_index,
|
||||||
model_index,
|
&model_index,
|
||||||
&vector_roles,
|
&vector_roles,
|
||||||
);
|
);
|
||||||
true
|
true
|
||||||
|
@ -444,20 +422,14 @@ pub mod song_model {
|
||||||
#[qinvokable]
|
#[qinvokable]
|
||||||
pub fn update_ccli(
|
pub fn update_ccli(
|
||||||
mut self: Pin<&mut Self>,
|
mut self: Pin<&mut Self>,
|
||||||
index: i32,
|
song_id: i32,
|
||||||
updated_ccli: QString,
|
updated_ccli: QString,
|
||||||
) -> bool {
|
) -> bool {
|
||||||
let mut vector_roles = QVector_i32::default();
|
let (index, model_index, vector_roles) =
|
||||||
vector_roles
|
self.as_mut().get_indices(song_id, Role::CcliRole);
|
||||||
.append(self.as_ref().get_role(Role::CcliRole));
|
|
||||||
let model_index = &self.as_ref().index(
|
|
||||||
index,
|
|
||||||
0,
|
|
||||||
&QModelIndex::default(),
|
|
||||||
);
|
|
||||||
|
|
||||||
let db = &mut self.as_mut().get_db();
|
let db = &mut self.as_mut().get_db();
|
||||||
let result = update(songs.filter(id.eq(index)))
|
let result = update(songs.filter(id.eq(song_id)))
|
||||||
.set(ccli.eq(updated_ccli.to_string()))
|
.set(ccli.eq(updated_ccli.to_string()))
|
||||||
.execute(db);
|
.execute(db);
|
||||||
match result {
|
match result {
|
||||||
|
@ -469,8 +441,8 @@ pub mod song_model {
|
||||||
{
|
{
|
||||||
song.ccli = updated_ccli.to_string();
|
song.ccli = updated_ccli.to_string();
|
||||||
self.as_mut().emit_data_changed(
|
self.as_mut().emit_data_changed(
|
||||||
model_index,
|
&model_index,
|
||||||
model_index,
|
&model_index,
|
||||||
&vector_roles,
|
&vector_roles,
|
||||||
);
|
);
|
||||||
true
|
true
|
||||||
|
@ -485,20 +457,15 @@ pub mod song_model {
|
||||||
#[qinvokable]
|
#[qinvokable]
|
||||||
pub fn update_verse_order(
|
pub fn update_verse_order(
|
||||||
mut self: Pin<&mut Self>,
|
mut self: Pin<&mut Self>,
|
||||||
index: i32,
|
song_id: i32,
|
||||||
updated_verse_order: QString,
|
updated_verse_order: QString,
|
||||||
) -> bool {
|
) -> bool {
|
||||||
let mut vector_roles = QVector_i32::default();
|
let (index, model_index, vector_roles) = self
|
||||||
vector_roles
|
.as_mut()
|
||||||
.append(self.as_ref().get_role(Role::VerseOrderRole));
|
.get_indices(song_id, Role::VerseOrderRole);
|
||||||
let model_index = &self.as_ref().index(
|
|
||||||
index,
|
|
||||||
0,
|
|
||||||
&QModelIndex::default(),
|
|
||||||
);
|
|
||||||
|
|
||||||
let db = &mut self.as_mut().get_db();
|
let db = &mut self.as_mut().get_db();
|
||||||
let result = update(songs.filter(id.eq(index)))
|
let result = update(songs.filter(id.eq(song_id)))
|
||||||
.set(verse_order.eq(updated_verse_order.to_string()))
|
.set(verse_order.eq(updated_verse_order.to_string()))
|
||||||
.execute(db);
|
.execute(db);
|
||||||
match result {
|
match result {
|
||||||
|
@ -511,8 +478,8 @@ pub mod song_model {
|
||||||
song.verse_order =
|
song.verse_order =
|
||||||
updated_verse_order.to_string();
|
updated_verse_order.to_string();
|
||||||
self.as_mut().emit_data_changed(
|
self.as_mut().emit_data_changed(
|
||||||
model_index,
|
&model_index,
|
||||||
model_index,
|
&model_index,
|
||||||
&vector_roles,
|
&vector_roles,
|
||||||
);
|
);
|
||||||
true
|
true
|
||||||
|
@ -527,20 +494,15 @@ pub mod song_model {
|
||||||
#[qinvokable]
|
#[qinvokable]
|
||||||
pub fn update_background(
|
pub fn update_background(
|
||||||
mut self: Pin<&mut Self>,
|
mut self: Pin<&mut Self>,
|
||||||
index: i32,
|
song_id: i32,
|
||||||
updated_background: QString,
|
updated_background: QString,
|
||||||
) -> bool {
|
) -> bool {
|
||||||
let mut vector_roles = QVector_i32::default();
|
let (index, model_index, vector_roles) = self
|
||||||
vector_roles
|
.as_mut()
|
||||||
.append(self.as_ref().get_role(Role::BackgroundRole));
|
.get_indices(song_id, Role::BackgroundRole);
|
||||||
let model_index = &self.as_ref().index(
|
|
||||||
index,
|
|
||||||
0,
|
|
||||||
&QModelIndex::default(),
|
|
||||||
);
|
|
||||||
|
|
||||||
let db = &mut self.as_mut().get_db();
|
let db = &mut self.as_mut().get_db();
|
||||||
let result = update(songs.filter(id.eq(index)))
|
let result = update(songs.filter(id.eq(song_id)))
|
||||||
.set(background.eq(updated_background.to_string()))
|
.set(background.eq(updated_background.to_string()))
|
||||||
.execute(db);
|
.execute(db);
|
||||||
match result {
|
match result {
|
||||||
|
@ -558,8 +520,8 @@ pub mod song_model {
|
||||||
roles = vector_roles.get(0)
|
roles = vector_roles.get(0)
|
||||||
);
|
);
|
||||||
self.as_mut().emit_data_changed(
|
self.as_mut().emit_data_changed(
|
||||||
model_index,
|
&model_index,
|
||||||
model_index,
|
&model_index,
|
||||||
&vector_roles,
|
&vector_roles,
|
||||||
);
|
);
|
||||||
self.as_mut().emit_background_changed();
|
self.as_mut().emit_background_changed();
|
||||||
|
@ -575,21 +537,15 @@ pub mod song_model {
|
||||||
#[qinvokable]
|
#[qinvokable]
|
||||||
pub fn update_background_type(
|
pub fn update_background_type(
|
||||||
mut self: Pin<&mut Self>,
|
mut self: Pin<&mut Self>,
|
||||||
index: i32,
|
song_id: i32,
|
||||||
updated_background_type: QString,
|
updated_background_type: QString,
|
||||||
) -> bool {
|
) -> bool {
|
||||||
let mut vector_roles = QVector_i32::default();
|
let (index, model_index, vector_roles) = self
|
||||||
vector_roles.append(
|
.as_mut()
|
||||||
self.as_ref().get_role(Role::BackgroundTypeRole),
|
.get_indices(song_id, Role::BackgroundTypeRole);
|
||||||
);
|
|
||||||
let model_index = &self.as_ref().index(
|
|
||||||
index,
|
|
||||||
0,
|
|
||||||
&QModelIndex::default(),
|
|
||||||
);
|
|
||||||
|
|
||||||
let db = &mut self.as_mut().get_db();
|
let db = &mut self.as_mut().get_db();
|
||||||
let result = update(songs.filter(id.eq(index)))
|
let result = update(songs.filter(id.eq(song_id)))
|
||||||
.set(
|
.set(
|
||||||
background_type
|
background_type
|
||||||
.eq(updated_background_type.to_string()),
|
.eq(updated_background_type.to_string()),
|
||||||
|
@ -605,8 +561,8 @@ pub mod song_model {
|
||||||
song.background_type =
|
song.background_type =
|
||||||
updated_background_type.to_string();
|
updated_background_type.to_string();
|
||||||
self.as_mut().emit_data_changed(
|
self.as_mut().emit_data_changed(
|
||||||
model_index,
|
&model_index,
|
||||||
model_index,
|
&model_index,
|
||||||
&vector_roles,
|
&vector_roles,
|
||||||
);
|
);
|
||||||
true
|
true
|
||||||
|
@ -621,22 +577,17 @@ pub mod song_model {
|
||||||
#[qinvokable]
|
#[qinvokable]
|
||||||
pub fn update_horizontal_text_alignment(
|
pub fn update_horizontal_text_alignment(
|
||||||
mut self: Pin<&mut Self>,
|
mut self: Pin<&mut Self>,
|
||||||
index: i32,
|
song_id: i32,
|
||||||
updated_horizontal_text_alignment: QString,
|
updated_horizontal_text_alignment: QString,
|
||||||
) -> bool {
|
) -> bool {
|
||||||
let mut vector_roles = QVector_i32::default();
|
let (index, model_index, vector_roles) =
|
||||||
vector_roles.append(
|
self.as_mut().get_indices(
|
||||||
self.as_ref()
|
song_id,
|
||||||
.get_role(Role::HorizontalTextAlignmentRole),
|
Role::HorizontalTextAlignmentRole,
|
||||||
);
|
);
|
||||||
let model_index = &self.as_ref().index(
|
|
||||||
index,
|
|
||||||
0,
|
|
||||||
&QModelIndex::default(),
|
|
||||||
);
|
|
||||||
|
|
||||||
let db = &mut self.as_mut().get_db();
|
let db = &mut self.as_mut().get_db();
|
||||||
let result = update(songs.filter(id.eq(index)))
|
let result = update(songs.filter(id.eq(song_id)))
|
||||||
.set(horizontal_text_alignment.eq(
|
.set(horizontal_text_alignment.eq(
|
||||||
updated_horizontal_text_alignment.to_string(),
|
updated_horizontal_text_alignment.to_string(),
|
||||||
))
|
))
|
||||||
|
@ -652,8 +603,8 @@ pub mod song_model {
|
||||||
updated_horizontal_text_alignment
|
updated_horizontal_text_alignment
|
||||||
.to_string();
|
.to_string();
|
||||||
self.as_mut().emit_data_changed(
|
self.as_mut().emit_data_changed(
|
||||||
model_index,
|
&model_index,
|
||||||
model_index,
|
&model_index,
|
||||||
&vector_roles,
|
&vector_roles,
|
||||||
);
|
);
|
||||||
true
|
true
|
||||||
|
@ -668,23 +619,18 @@ pub mod song_model {
|
||||||
#[qinvokable]
|
#[qinvokable]
|
||||||
pub fn update_vertical_text_alignment(
|
pub fn update_vertical_text_alignment(
|
||||||
mut self: Pin<&mut Self>,
|
mut self: Pin<&mut Self>,
|
||||||
index: i32,
|
song_id: i32,
|
||||||
updated_vertical_text_alignment: QString,
|
updated_vertical_text_alignment: QString,
|
||||||
) -> bool {
|
) -> bool {
|
||||||
let mut vector_roles = QVector_i32::default();
|
let (index, model_index, vector_roles) =
|
||||||
vector_roles.append(
|
self.as_mut().get_indices(
|
||||||
self.as_ref()
|
song_id,
|
||||||
.get_role(Role::VerticalTextAlignmentRole),
|
Role::VerticalTextAlignmentRole,
|
||||||
);
|
);
|
||||||
let model_index = &self.as_ref().index(
|
|
||||||
index,
|
|
||||||
0,
|
|
||||||
&QModelIndex::default(),
|
|
||||||
);
|
|
||||||
|
|
||||||
let db = &mut self.as_mut().get_db();
|
let db = &mut self.as_mut().get_db();
|
||||||
let result =
|
let result =
|
||||||
update(songs.filter(id.eq(index)))
|
update(songs.filter(id.eq(song_id)))
|
||||||
.set(vertical_text_alignment.eq(
|
.set(vertical_text_alignment.eq(
|
||||||
updated_vertical_text_alignment.to_string(),
|
updated_vertical_text_alignment.to_string(),
|
||||||
))
|
))
|
||||||
|
@ -700,8 +646,8 @@ pub mod song_model {
|
||||||
updated_vertical_text_alignment
|
updated_vertical_text_alignment
|
||||||
.to_string();
|
.to_string();
|
||||||
self.as_mut().emit_data_changed(
|
self.as_mut().emit_data_changed(
|
||||||
model_index,
|
&model_index,
|
||||||
model_index,
|
&model_index,
|
||||||
&vector_roles,
|
&vector_roles,
|
||||||
);
|
);
|
||||||
true
|
true
|
||||||
|
@ -716,20 +662,14 @@ pub mod song_model {
|
||||||
#[qinvokable]
|
#[qinvokable]
|
||||||
pub fn update_font(
|
pub fn update_font(
|
||||||
mut self: Pin<&mut Self>,
|
mut self: Pin<&mut Self>,
|
||||||
index: i32,
|
song_id: i32,
|
||||||
updated_font: QString,
|
updated_font: QString,
|
||||||
) -> bool {
|
) -> bool {
|
||||||
let mut vector_roles = QVector_i32::default();
|
let (index, model_index, vector_roles) =
|
||||||
vector_roles
|
self.as_mut().get_indices(song_id, Role::FontRole);
|
||||||
.append(self.as_ref().get_role(Role::FontRole));
|
|
||||||
let model_index = &self.as_ref().index(
|
|
||||||
index,
|
|
||||||
0,
|
|
||||||
&QModelIndex::default(),
|
|
||||||
);
|
|
||||||
|
|
||||||
let db = &mut self.as_mut().get_db();
|
let db = &mut self.as_mut().get_db();
|
||||||
let result = update(songs.filter(id.eq(index)))
|
let result = update(songs.filter(id.eq(song_id)))
|
||||||
.set(font.eq(updated_font.to_string()))
|
.set(font.eq(updated_font.to_string()))
|
||||||
.execute(db);
|
.execute(db);
|
||||||
match result {
|
match result {
|
||||||
|
@ -742,8 +682,8 @@ pub mod song_model {
|
||||||
song.font = updated_font.to_string();
|
song.font = updated_font.to_string();
|
||||||
debug!(?updated_font);
|
debug!(?updated_font);
|
||||||
self.as_mut().emit_data_changed(
|
self.as_mut().emit_data_changed(
|
||||||
model_index,
|
&model_index,
|
||||||
model_index,
|
&model_index,
|
||||||
&vector_roles,
|
&vector_roles,
|
||||||
);
|
);
|
||||||
true
|
true
|
||||||
|
@ -758,20 +698,15 @@ pub mod song_model {
|
||||||
#[qinvokable]
|
#[qinvokable]
|
||||||
pub fn update_font_size(
|
pub fn update_font_size(
|
||||||
mut self: Pin<&mut Self>,
|
mut self: Pin<&mut Self>,
|
||||||
index: i32,
|
song_id: i32,
|
||||||
updated_font_size: i32,
|
updated_font_size: i32,
|
||||||
) -> bool {
|
) -> bool {
|
||||||
let mut vector_roles = QVector_i32::default();
|
let (index, model_index, vector_roles) = self
|
||||||
vector_roles
|
.as_mut()
|
||||||
.append(self.as_ref().get_role(Role::FontSizeRole));
|
.get_indices(song_id, Role::FontSizeRole);
|
||||||
let model_index = &self.as_ref().index(
|
|
||||||
index,
|
|
||||||
0,
|
|
||||||
&QModelIndex::default(),
|
|
||||||
);
|
|
||||||
|
|
||||||
let db = &mut self.as_mut().get_db();
|
let db = &mut self.as_mut().get_db();
|
||||||
let result = update(songs.filter(id.eq(index)))
|
let result = update(songs.filter(id.eq(song_id)))
|
||||||
.set(font_size.eq(updated_font_size))
|
.set(font_size.eq(updated_font_size))
|
||||||
.execute(db);
|
.execute(db);
|
||||||
match result {
|
match result {
|
||||||
|
@ -783,8 +718,8 @@ pub mod song_model {
|
||||||
{
|
{
|
||||||
song.font_size = updated_font_size;
|
song.font_size = updated_font_size;
|
||||||
self.as_mut().emit_data_changed(
|
self.as_mut().emit_data_changed(
|
||||||
model_index,
|
&model_index,
|
||||||
model_index,
|
&model_index,
|
||||||
&vector_roles,
|
&vector_roles,
|
||||||
);
|
);
|
||||||
true
|
true
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue