use std::ffi::{c_char, c_void, CString};
use qtrs::*;
unsafe extern "C" {
unsafe fn qmlBackend_setCallback(
cb: Option<unsafe extern "C" fn(*const c_char, *const c_char)>,
);
unsafe fn qmlBackend_register(engine: *mut c_void);
unsafe fn qmlBackend_emitResult(success: bool, message: *const c_char);
}
const VALID_USER: &str = "admin";
const VALID_PASS: &str = "123456";
unsafe extern "C" fn on_login(username: *const c_char, password: *const c_char) {
let user = unsafe { std::ffi::CStr::from_ptr(username) }
.to_str()
.unwrap_or("");
let pass = unsafe { std::ffi::CStr::from_ptr(password) }
.to_str()
.unwrap_or("");
let (success, msg) = if user == VALID_USER && pass == VALID_PASS {
(true, format!("Welcome, {}!", user))
} else {
(false, "Invalid username or password".into())
};
let c_msg = CString::new(msg).unwrap();
unsafe { qmlBackend_emitResult(success, c_msg.as_ptr()) };
}
fn main() {
let app = Application::new();
let engine = QmlEngine::new();
unsafe {
qmlBackend_setCallback(Some(on_login));
qmlBackend_register(engine.raw_ptr());
}
engine.load("examples/login.qml");
app.exec();
}