use cxx::UniquePtr;
use qtbridge_type_lib::{QGuiApplication, QQmlApplicationEngine, QString, QVariant, QVariantMap};
use crate::qml_register::QmlRegister;
pub struct QApp {
engine: UniquePtr<QQmlApplicationEngine>, #[allow(dead_code)]
app: UniquePtr<QGuiApplication>,
initial_properties: QVariantMap,
}
impl QApp {
pub fn new() -> Self {
let app = QGuiApplication::new();
let engine = QQmlApplicationEngine::new();
Self {
engine: engine,
app: app,
initial_properties: QVariantMap::default(),
}
}
pub fn run(&mut self) -> i32 {
QGuiApplication::exec()
}
pub fn add_initial_property(&mut self, id: &str, value: &QVariant) -> &mut Self {
self.initial_properties.insert(&QString::from(id), value);
self
}
pub fn with_initial_properties(&mut self, properties: &[(&str, QVariant)]) -> &mut Self {
self.engine.pin_mut().set_initial_properties(&properties.into());
self
}
pub fn load_qml(&mut self, code: &[u8]) -> &mut Self {
if !self.initial_properties.is_empty() {
self.engine.pin_mut().set_initial_properties(&self.initial_properties);
}
self.engine.pin_mut().load_data(code);
self
}
pub fn load_qml_from_file(&mut self, url: &str) -> &mut Self {
if !self.initial_properties.is_empty() {
self.engine.pin_mut().set_initial_properties(&self.initial_properties);
}
self.engine.pin_mut().load(url);
self
}
pub fn add_import_path(&mut self, path: &str) -> &mut Self {
self.engine.pin_mut().add_import_path(path);
self
}
pub fn register<T: QmlRegister>(&mut self) -> &mut Self {
T::register();
self
}
pub fn application_name(&mut self, name: &str) -> &mut Self {
QGuiApplication::set_application_name(name);
self
}
}