advotracker_qml: advotracker variant with Qt/Qml GUI
Signed-off-by: Ralf Zerres <ralf.zerres@networkx.de>
This commit is contained in:
85
advotracker_qml/src/main.rs
Normal file
85
advotracker_qml/src/main.rs
Normal file
@@ -0,0 +1,85 @@
|
||||
/* advotracker infrastructure.
|
||||
*
|
||||
* Copyright 2020 Ralf Zerres <ralf.zerres@networkx.de>
|
||||
* SPDX-License-Identifier: (0BSD or MIT)
|
||||
*/
|
||||
|
||||
//#[macro_use] extern crate cstr;
|
||||
extern crate qmetaobject;
|
||||
|
||||
use qmetaobject::*;
|
||||
use std::ffi::CStr;
|
||||
|
||||
mod qml;
|
||||
mod number_harm;
|
||||
|
||||
// make files available to the Qt resource system
|
||||
qrc!(advotracker_resource,
|
||||
"/" {
|
||||
"resources/icons/advotracker/index.theme",
|
||||
"resources/icons/advotracker/20x20/back.png",
|
||||
"resources/icons/advotracker/20x20/drawer.png",
|
||||
"resources/icons/advotracker/20x20/menu.png",
|
||||
"resources/icons/advotracker/20x20@2/back.png",
|
||||
"resources/icons/advotracker/20x20@2/drawer.png",
|
||||
"resources/icons/advotracker/20x20@2/menu.png",
|
||||
"resources/icons/advotracker/20x20@3/back.png",
|
||||
"resources/icons/advotracker/20x20@3/drawer.png",
|
||||
"resources/icons/advotracker/20x20@3/menu.png",
|
||||
"resources/icons/advotracker/20x20@4/back.png",
|
||||
"resources/icons/advotracker/20x20@4/drawer.png",
|
||||
"resources/icons/advotracker/20x20@4/menu.png",
|
||||
"resources/images/background.jpg" as "pages/images/background.jpg",
|
||||
"resources/images/customer_logo.jpg" as "pages/images/customer_logo.jpg",
|
||||
"resources/images/networkx_logo.jpg" as "pages/images/networkx_logo.jpg",
|
||||
"resources/images/nobody.png" as "pages/images/nobody.png",
|
||||
"resources/pages/advotracker.qml" as "pages/advotracker.qml",
|
||||
"resources/pages/LoginPage.qml" as "pages/LoginPage.qml",
|
||||
"resources/pages/MaterialIconsPage.qml" as "pages/MaterialIconsPage.qml",
|
||||
"resources/pages/NewUserPage.qml" as "pages/NewUserPage.qml",
|
||||
"resources/pages/PageNumberHarmList.qml" as "pages/PageNumberHarmList.qml",
|
||||
"resources/pages/PageNumberHarm.qml" as "pages/PageNumberHarm.qml",
|
||||
//"resources/pages/PageUserDegate.qml" as "pages/PageUserDelegate.qml",
|
||||
"resources/pages/PageUserDetail.qml" as "pages/PageUserDetail.qml",
|
||||
"resources/pages/PageUserEdit.qml" as "pages/PageUserEdit.qml",
|
||||
"resources/pages/PageUserList.qml" as "pages/PageUserList.qml",
|
||||
"resources/pages/PaneNumberHarmAdmin.qml" as "pages/PaneNumberHarmAdmin.qml",
|
||||
"resources/pages/PaneNumberHarmData.qml" as "pages/PaneNumberHarmData.qml",
|
||||
"resources/pages/RectanglesTab.qml" as "pages/RectanglesTab.qml",
|
||||
"resources/pages/SearchToolBar.qml" as "pages/SearchToolBar.qml",
|
||||
"resources/pages/SqlTestPage.qml" as "pages/SqlTestPage.qml",
|
||||
"resources/pages/SqlViewPage.qml" as "pages/SqlViewPage.qml",
|
||||
"resources/pages/SwipeDelegatePage.qml" as "pages/SwipeDelegatePage.qml",
|
||||
"resources/pages/TestPage.qml" as "pages/TestPage.qml",
|
||||
// "resources/pages/UserImage.qml" as "pages/UserImage.qml",
|
||||
//"resources/pages/UserImageDelegate.qml" as "pages/UserImageDelegate.qml",
|
||||
"resources/pages/UserModelPage.qml" as "pages/UserModelPage.qml",
|
||||
"resources/pages/UserRoleChangesPage.qml" as "pages/UserRoleChangesPage.qml",
|
||||
//"resources/pages/UserRoleItemDelegatePage.qml" as "pages/UserRoleItemDelegatePage.qml",
|
||||
"resources/pages/UserRoleListPage.qml" as "pages/UserRoleListPage.qml",
|
||||
"resources/pages/UserRoleTablePage.qml" as "pages/UserRoleTablePage.qml",
|
||||
"resources/qtquickcontrols2.conf" as "qtquickcontrol2.conf",
|
||||
"resources/qt-project.org/imports/de/networkx/AdvoTracker/qmldir",
|
||||
"resources/qt-project.org/imports/de/networkx/AdvoTracker/AdvoTracker.qmltypes",
|
||||
"resources/qt-project.org/imports/de/networkx/AdvoTracker/Button.qml",
|
||||
"resources/qt-project.org/imports/de/networkx/AdvoTracker/CheckBox.qml",
|
||||
"resources/qt-project.org/imports/de/networkx/AdvoTracker/MdiFont.js",
|
||||
"resources/qt-project.org/imports/de/networkx/AdvoTracker/IconLabel.qml",
|
||||
"resources/qt-project.org/imports/de/networkx/AdvoTracker/Label.qml",
|
||||
"resources/qt-project.org/imports/de/networkx/AdvoTracker/TextField.qml",
|
||||
"resources/qt-project.org/imports/de/networkx/AdvoTracker/ScrollBar.qml",
|
||||
},
|
||||
);
|
||||
|
||||
fn main() {
|
||||
advotracker_resource();
|
||||
qml_register_type::<qml::AdvoTracker>(
|
||||
CStr::from_bytes_with_nul(b"RustCode\0").unwrap(),
|
||||
1,
|
||||
0,
|
||||
CStr::from_bytes_with_nul(b"AdvoTracker\0").unwrap(),
|
||||
);
|
||||
let mut engine = QmlEngine::new();
|
||||
engine.load_file("qrc:/pages/advotracker.qml".into());
|
||||
engine.exec();
|
||||
}
|
||||
56
advotracker_qml/src/main.rs-explicit
Normal file
56
advotracker_qml/src/main.rs-explicit
Normal file
@@ -0,0 +1,56 @@
|
||||
/* advotracker infrastructure.
|
||||
*
|
||||
* Copyright 2020 Ralf Zerres <ralf.zerres@networkx.de>
|
||||
* SPDX-License-Identifier: (0BSD or MIT)
|
||||
*/
|
||||
|
||||
//#[macro_use] extern crate cstr;
|
||||
extern crate qmetaobject;
|
||||
|
||||
use qmetaobject::*;
|
||||
use std::ffi::CStr;
|
||||
|
||||
mod qml;
|
||||
mod number_harm;
|
||||
|
||||
// make files available to the Qt resource system
|
||||
qrc!(advotracker_resource,
|
||||
"/" {
|
||||
"resources/qt-project.org/imports/de/networkx/AdvoTracker/qmldir",
|
||||
"resources/qt-project.org/imports/de/networkx/AdvoTracker/AdvoTracker.qmltypes",
|
||||
"resources/qt-project.org/imports/de/networkx/AdvoTracker/Button.qml",
|
||||
"resources/qt-project.org/imports/de/networkx/AdvoTracker/CheckBox.qml",
|
||||
"resources/qt-project.org/imports/de/networkx/AdvoTracker/MdiFont.js",
|
||||
"resources/qt-project.org/imports/de/networkx/AdvoTracker/IconLabel.qml",
|
||||
"resources/qt-project.org/imports/de/networkx/AdvoTracker/Label.qml",
|
||||
"resources/qt-project.org/imports/de/networkx/AdvoTracker/TextField.qml",
|
||||
"resources/qt-project.org/imports/de/networkx/AdvoTracker/ScrollBar.qml",
|
||||
"resources/advotracker.qml" as "pages/AdvoTracker.qml",
|
||||
"resources/images/customer_logo.jpg",
|
||||
"resources/pages/LoginPage.qml" as "pages/LoginPage.qml",
|
||||
"resources/pages/MaterialIconsPage.qml" as "pages/MaterialIconsPage.qml",
|
||||
"resources/pages/NewUserPage.qml",
|
||||
"resources/pages/PageNumberHarmList.qml" as "pages/PageNumberHarmList.qml",
|
||||
"resources/pages/PageNumberHarm.qml" as "pages/PageNumberHarm.qml",
|
||||
"resources/pages/PageUserDetail.qml" as "pages/PageUserDetail.qml",
|
||||
"resources/pages/PageUserEdit.qml",
|
||||
"resources/pages/PageUserList.qml",
|
||||
"resources/pages/PageUserDetail.qml",
|
||||
"resources/pages/LoginPage.qml" as "pages/LoginPage.qml",
|
||||
"resources/pages/SearchToolBar.qml",
|
||||
"resources/qtquickcontrols2.conf",
|
||||
},
|
||||
);
|
||||
|
||||
fn main() {
|
||||
advotracker_resource();
|
||||
qml_register_type::<qml::AdvoTracker>(
|
||||
CStr::from_bytes_with_nul(b"RustCode\0").unwrap(),
|
||||
1,
|
||||
0,
|
||||
CStr::from_bytes_with_nul(b"AdvoTracker\0").unwrap(),
|
||||
);
|
||||
let mut engine = QmlEngine::new();
|
||||
engine.load_file("qrc:/pages/advotracker.qml".into());
|
||||
engine.exec();
|
||||
}
|
||||
1
advotracker_qml/src/number_harm/edit_number_harm.rs
Normal file
1
advotracker_qml/src/number_harm/edit_number_harm.rs
Normal file
@@ -0,0 +1 @@
|
||||
// todo
|
||||
83
advotracker_qml/src/number_harm/list_number_harm.rs
Normal file
83
advotracker_qml/src/number_harm/list_number_harm.rs
Normal file
@@ -0,0 +1,83 @@
|
||||
/* advotracker infrastructure.
|
||||
*
|
||||
* Copyright 2020 Ralf Zerres <ralf.zerres@networkx.de>
|
||||
* SPDX-License-Identifier: (0BSD or MIT)
|
||||
*
|
||||
* Based on an example from https://github.com/woboq/qmetaobject-rs/tree/master/examples
|
||||
* Copyright 2019 Olivier Goffart <ogoffart@woboq.com>
|
||||
*
|
||||
*/
|
||||
|
||||
use qmetaobject::*;
|
||||
use std::collections::HashMap;
|
||||
|
||||
#[derive(Default, Clone)]
|
||||
struct NumberHarmItem {
|
||||
number_harm: String,
|
||||
number_policyholder: String,
|
||||
number_clerk_id: u32,
|
||||
data_recorded: String,
|
||||
completed: bool,
|
||||
description: String,
|
||||
}
|
||||
|
||||
impl NumberHarmItem {
|
||||
// fn update_active_count(&mut self) {
|
||||
// let ac = self.list.iter().filter(|i| !i.completed).count();
|
||||
// if self.activeCount != ac {
|
||||
// self.activeCount = ac;
|
||||
// self.active_count_changed();
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
#[allow(non_snake_case)]
|
||||
#[derive(Default, QObject)]
|
||||
pub struct NumberHarm {
|
||||
base: qt_base_class!(trait QAbstractListModel),
|
||||
//base: qt_base_class!(trait SortFilterProxyModel),
|
||||
|
||||
count: qt_property!(i32; READ row_count NOTIFY count_changed),
|
||||
count_changed: qt_signal!(),
|
||||
list: Vec<NumberHarmItem>,
|
||||
// activeCount: qt_property!(usize; NOTIFY active_count_changed),
|
||||
// active_count_changed: qt_signal!(),
|
||||
|
||||
// setCompleted: qt_method!(fn(&mut self, item: usize, v: bool) -> bool),
|
||||
// setDescription: qt_method!(fn(&mut self, item: usize, v: String) -> bool ),
|
||||
// insert_rows: qt_method!(fn(&mut self, row: usize, count: usize) -> bool),
|
||||
// remove_rows: qt_method!(fn(&mut self, row: usize, count: usize) -> bool),
|
||||
// clearCompleted: qt_method!(fn(&mut self)),
|
||||
// add: qt_method!(fn(&mut self, description: String)),
|
||||
// remove: qt_method!(fn(&mut self, index: u64) -> bool),
|
||||
// setAll: qt_method!(fn(&mut self, completed: bool)),
|
||||
}
|
||||
|
||||
//impl QAbstractListModel for NumberHarm {
|
||||
impl QSqlQueryModel for NumberHarm {
|
||||
fn row_count(&self) -> i32 {
|
||||
self.list.len() as i32
|
||||
}
|
||||
fn data(&self, index: QModelIndex, role: i32) -> QVariant {
|
||||
let idx = index.row() as usize;
|
||||
if idx < self.list.len() {
|
||||
if role == USER_ROLE {
|
||||
self.list[idx].completed.into()
|
||||
} else if role == USER_ROLE + 1 {
|
||||
QString::from(self.list[idx].description.clone()).into()
|
||||
} else {
|
||||
QVariant::default()
|
||||
}
|
||||
} else {
|
||||
QVariant::default()
|
||||
}
|
||||
}
|
||||
fn role_names(&self) -> HashMap<i32, QByteArray> {
|
||||
let mut map = HashMap::new();
|
||||
map.insert(USER_ROLE, "number_harm".into());
|
||||
map.insert(USER_ROLE + 1, "number_policyholder".into());
|
||||
map.insert(USER_ROLE + 2, "clerk_id".into());
|
||||
map.insert(USER_ROLE + 1, "date_recorded".into());
|
||||
map
|
||||
}
|
||||
}
|
||||
7
advotracker_qml/src/number_harm/mod.rs
Normal file
7
advotracker_qml/src/number_harm/mod.rs
Normal file
@@ -0,0 +1,7 @@
|
||||
/// number_harm methods
|
||||
|
||||
/// List number_harm elements
|
||||
mod list_number_harm;
|
||||
|
||||
/// Edit number_harm elements
|
||||
mod edit_number_harm;
|
||||
163
advotracker_qml/src/qml.rs
Normal file
163
advotracker_qml/src/qml.rs
Normal file
@@ -0,0 +1,163 @@
|
||||
/* AdvoTracker - Hotline tackingtool for Advocats
|
||||
*
|
||||
* Copyright 2020 Ralf Zerres <ralf.zerres@networkx.de>
|
||||
* SPDX-License-Identifier: (0BSD or MIT)
|
||||
*
|
||||
* Based on an example from https://github.com/woboq/qmetaobject-rs/tree/master/examples
|
||||
* Copyright 2019 Olivier Goffart <ogoffart@woboq.com>
|
||||
*
|
||||
*/
|
||||
|
||||
use qmetaobject::*;
|
||||
|
||||
#[derive(Default, Clone)]
|
||||
struct AdvoTrackerItem {
|
||||
completed: bool,
|
||||
description: String,
|
||||
}
|
||||
|
||||
#[allow(non_snake_case)]
|
||||
#[derive(Default, QObject)]
|
||||
pub struct AdvoTracker {
|
||||
base: qt_base_class!(trait QAbstractListModel),
|
||||
//base: qt_base_class!(trait QAbstractTableModel),
|
||||
//base: qt_base_class!(trait QSqlQueryModel),
|
||||
|
||||
count: qt_property!(i32; READ row_count NOTIFY count_changed),
|
||||
count_changed: qt_signal!(),
|
||||
list: Vec<AdvoTrackerItem>,
|
||||
// activeCount: qt_property!(usize; NOTIFY active_count_changed),
|
||||
// active_count_changed: qt_signal!(),
|
||||
|
||||
// setCompleted: qt_method!(fn(&mut self, item: usize, v: bool) -> bool),
|
||||
// setDescription: qt_method!(fn(&mut self, item: usize, v: String) -> bool ),
|
||||
// insert_rows: qt_method!(fn(&mut self, row: usize, count: usize) -> bool),
|
||||
// remove_rows: qt_method!(fn(&mut self, row: usize, count: usize) -> bool),
|
||||
clearCompleted: qt_method!(fn(&mut self)),
|
||||
// add: qt_method!(fn(&mut self, description: String)),
|
||||
// remove: qt_method!(fn(&mut self, index: u64) -> bool),
|
||||
// setAll: qt_method!(fn(&mut self, completed: bool)),
|
||||
}
|
||||
|
||||
impl AdvoTracker {
|
||||
// fn update_active_count(&mut self) {
|
||||
// let ac = self.list.iter().filter(|i| !i.completed).count();
|
||||
// if self.activeCount != ac {
|
||||
// self.activeCount = ac;
|
||||
// self.active_count_changed();
|
||||
// }
|
||||
// }
|
||||
|
||||
// #[allow(non_snake_case)]
|
||||
// fn setCompleted(&mut self, item: usize, v: bool) -> bool {
|
||||
// if item >= self.list.len() {
|
||||
// return false;
|
||||
// }
|
||||
// self.list[item].completed = v;
|
||||
// let idx = (self as &mut dyn QAbstractListModel).row_index(item as i32);
|
||||
// (self as &mut dyn QAbstractListModel).data_changed(idx.clone(), idx);
|
||||
// self.update_active_count();
|
||||
// true
|
||||
// }
|
||||
|
||||
#[allow(non_snake_case)]
|
||||
fn setDescription(&mut self, item: usize, v: String) -> bool {
|
||||
if item >= self.list.len() {
|
||||
return false;
|
||||
}
|
||||
self.list[item].description = v;
|
||||
let idx = (self as &mut dyn QAbstractListModel).row_index(item as i32);
|
||||
(self as &mut dyn QAbstractListModel).data_changed(idx.clone(), idx);
|
||||
true
|
||||
}
|
||||
|
||||
// fn insert_rows(&mut self, row: usize, count: usize) -> bool {
|
||||
// if count == 0 || row > self.list.len() {
|
||||
// return false;
|
||||
// }
|
||||
// (self as &mut dyn QAbstractListModel)
|
||||
// .begin_insert_rows(row as i32, (row + count - 1) as i32);
|
||||
// for i in 0..count {
|
||||
// self.list.insert(row + i, TodosItem::default());
|
||||
// }
|
||||
// (self as &mut dyn QAbstractListModel).end_insert_rows();
|
||||
// self.activeCount += count;
|
||||
// self.active_count_changed();
|
||||
// self.count_changed();
|
||||
// true
|
||||
// }
|
||||
|
||||
// fn remove_rows(&mut self, row: usize, count: usize) -> bool {
|
||||
// if count == 0 || row + count > self.list.len() {
|
||||
// return false;
|
||||
// }
|
||||
// (self as &mut dyn QAbstractListModel)
|
||||
// .begin_remove_rows(row as i32, (row + count - 1) as i32);
|
||||
// self.list.drain(row..row + count);
|
||||
// (self as &mut dyn QAbstractListModel).end_remove_rows();
|
||||
// self.count_changed();
|
||||
// self.update_active_count();
|
||||
// true
|
||||
// }
|
||||
|
||||
#[allow(non_snake_case)]
|
||||
fn clearCompleted(&mut self) {
|
||||
(self as &mut dyn QAbstractListModel).begin_reset_model();
|
||||
self.list.retain(|i| !i.completed);
|
||||
(self as &mut dyn QAbstractListModel).end_reset_model();
|
||||
self.count_changed();
|
||||
}
|
||||
|
||||
// fn add(&mut self, description: String) {
|
||||
// let end = self.list.len();
|
||||
// (self as &mut dyn QAbstractListModel).begin_insert_rows(end as i32, end as i32);
|
||||
// self.list.insert(end, TodosItem { completed: false, description });
|
||||
// (self as &mut dyn QAbstractListModel).end_insert_rows();
|
||||
// self.activeCount += 1;
|
||||
// self.active_count_changed();
|
||||
// self.count_changed();
|
||||
// }
|
||||
|
||||
// fn remove(&mut self, index: u64) -> bool {
|
||||
// self.remove_rows(index as usize, 1)
|
||||
// }
|
||||
|
||||
// #[allow(non_snake_case)]
|
||||
// fn setAll(&mut self, completed: bool) {
|
||||
// for i in &mut self.list {
|
||||
// i.completed = completed;
|
||||
// }
|
||||
|
||||
// let idx1 = (self as &mut dyn QAbstractListModel).row_index(0);
|
||||
// let end = self.list.len() as i32;
|
||||
// let idx2 = (self as &mut dyn QAbstractListModel).row_index(end - 1);
|
||||
// (self as &mut dyn QAbstractListModel).data_changed(idx1, idx2);
|
||||
// self.update_active_count();
|
||||
// }
|
||||
}
|
||||
|
||||
impl QAbstractListModel for AdvoTracker {
|
||||
fn row_count(&self) -> i32 {
|
||||
self.list.len() as i32
|
||||
}
|
||||
fn data(&self, index: QModelIndex, role: i32) -> QVariant {
|
||||
let idx = index.row() as usize;
|
||||
if idx < self.list.len() {
|
||||
if role == USER_ROLE {
|
||||
self.list[idx].completed.into()
|
||||
} else if role == USER_ROLE + 1 {
|
||||
QString::from(self.list[idx].description.clone()).into()
|
||||
} else {
|
||||
QVariant::default()
|
||||
}
|
||||
} else {
|
||||
QVariant::default()
|
||||
}
|
||||
}
|
||||
// fn role_names(&self) -> HashMap<i32, QByteArray> {
|
||||
// let mut map = HashMap::new();
|
||||
// map.insert(USER_ROLE, "completed".into());
|
||||
// map.insert(USER_ROLE + 1, "description".into());
|
||||
// map
|
||||
// }
|
||||
}
|
||||
Reference in New Issue
Block a user