1use super::proxy_cpp_bridge::{QTableModelProxyCpp, ffi};
5use crate::{RustObjAccess, call_rust_trait_impl, call_cpp_impl};
6use qtbridge_runtime::qrustproxy::{QRustProxy, ConstructionMode};
7use qtbridge_runtime::{DispatchMetaCall, QObjectHolder};
8use qtbridge_runtime::QModelItem;
9use qtbridge_type_lib::{QByteArray, QHash, QMetaObject, QMetaType, QModelIndex, QVariant};
10use std::cell::RefCell;
11use std::rc::Rc;
12
13#[doc(hidden)]
14pub trait QTableModelAdapter: DispatchMetaCall {
15 fn index(&self, row: i32, column: i32, parent: &QModelIndex) -> QModelIndex;
16 fn parent(&self, child: &QModelIndex) -> QModelIndex;
17 fn row_count(&self, parent: &QModelIndex) -> i32;
18 fn column_count(&self, parent: &QModelIndex) -> i32;
19 fn data(&self, index: &QModelIndex, role: i32) -> QVariant;
20 fn role_names(&self) -> QHash<i32, QByteArray>;
21 fn set_data(&mut self, index: &QModelIndex, value: &QVariant, role: i32) -> bool;
22 fn remove_columns(&mut self, first: i32, count: i32, parent: &QModelIndex) -> bool;
23 fn remove_rows(&mut self, first: i32, count: i32, parent: &QModelIndex) -> bool;
24 fn sibling(&self, row: i32, column: i32, idx: &QModelIndex) -> QModelIndex;
25}
26
27impl<T> QTableModelAdapter for T
28where
29 T: QTableModel + QObjectHolder<ProxyRust = QTableModelProxyRust> {
30 fn index(&self, row: i32, column: i32, _: &QModelIndex) -> QModelIndex {
31 let proxy = <Self as QObjectHolder>::get_rust_proxy(self);
32 proxy.base_create_index(row, column, 0)
33 }
34 fn parent(&self, _: &QModelIndex) -> QModelIndex {
35 QModelIndex::default()
36 }
37 fn row_count(&self, _: &QModelIndex) -> i32 {
38 self.row_count() as i32
39 }
40 fn column_count(&self, _: &QModelIndex) -> i32 {
41 <Self as QTableModel>::column_count(&self) as i32
42 }
43 fn data(&self, index: &QModelIndex, role: i32) -> QVariant {
44 let Some(item) = self.get((index.row() as usize, index.column() as usize))
45 else {
46 return QVariant::default();
47 };
48 item.get_role(role)
49 }
50 fn role_names(&self) -> QHash<i32, QByteArray> {
51 let names = T::Item::role_names();
52 let mut result = QHash::default();
53 names.iter()
54 .for_each(|(k, v)| result.insert(k, &QByteArray::from(v)));
55 result
56 }
57 fn set_data(&mut self, index: &QModelIndex, value: &QVariant, role: i32) -> bool {
58 if !index.is_valid() {
59 return false;
60 }
61 let Some(mut item) = self.get((index.row() as usize, index.column() as usize))
62 .cloned()
63 else {
64 return false;
65 };
66 let updated = item.set_role(role, value);
67 if updated {
68 self.set_unnotified((index.row() as usize, index.column() as usize), item);
69 self.get_rust_proxy_mut().base_data_changed(index, index);
70 }
71 updated
72 }
73 fn remove_columns(&mut self, first: i32, count: i32, parent: &QModelIndex) -> bool {
74 let first = first as usize;
75 let last = first + count as usize;
76 if last > self.column_count() {
77 return false;
78 }
79 self.get_rust_proxy_mut().base_begin_remove_columns(parent, first as i32, (last - 1) as i32);
80 for index in (first..last).rev() {
81 self.remove_row_unnotified(index);
82 }
83 self.get_rust_proxy_mut().base_end_remove_columns();
84 true
85 }
86 fn remove_rows(&mut self, first: i32, count: i32, parent: &QModelIndex) -> bool {
87 let first = first as usize;
88 let last = first + count as usize;
89 if last > self.row_count() {
90 return false;
91 }
92 self.get_rust_proxy_mut().base_begin_remove_rows(parent, first as i32, (last - 1) as i32);
93 for index in (first..last).rev() {
94 self.remove_row_unnotified(index);
95 }
96 self.get_rust_proxy_mut().base_end_remove_rows();
97 true
98 }
99 fn sibling(&self, row: i32, column: i32, idx: &QModelIndex) -> QModelIndex {
100 let proxy = self.get_rust_proxy();
101 proxy.base_sibling(row, column, idx)
102 }
103}
104
105
106pub trait QTableModel {
179 type Item: QModelItem + Default + Clone;
186
187 fn row_count(&self) -> usize;
189
190 fn column_count(&self) -> usize;
192
193 fn get(&self, index: (usize, usize)) -> Option<&Self::Item>;
196
197 fn set_unnotified(&mut self, _index: (usize, usize), _value: Self::Item) -> bool {
206 false
207 }
208
209 fn push_row_unnotified(&mut self, values: &[Self::Item]) {
219 self.insert_row_unnotified(self.row_count(), values);
220 }
221
222 fn push_column_unnotified(&mut self, values: &[Self::Item]) {
232 self.insert_column_unnotified(self.column_count(), values);
233 }
234
235 fn insert_row_unnotified(&mut self, _index: usize, _value: &[Self::Item]) {
245 panic!("In order to use insert, implement insert_unnotified")
246 }
247
248 fn insert_column_unnotified(&mut self, _index: usize, _value: &[Self::Item]) {
258 panic!("In order to use insert, implement insert_unnotified")
259 }
260
261 fn pop_row_unnotified(&mut self) -> Option<Vec<Self::Item>> {
271 (self.row_count() > 0)
272 .then(|| self.remove_row_unnotified(self.row_count() - 1))
273 }
274
275 fn pop_column_unnotified(&mut self) -> Option<Vec<Self::Item>> {
285 (self.column_count() > 0)
286 .then(|| self.remove_column_unnotified(self.column_count() - 1))
287 }
288
289 fn remove_row_unnotified(&mut self, _index: usize) -> Vec<Self::Item> {
299 panic!("In order to use remove, implement remove_unnotified")
300 }
301
302 fn remove_column_unnotified(&mut self, _index: usize) -> Vec<Self::Item> {
312 panic!("In order to use remove, implement remove_unnotified")
313 }
314
315 fn reset_unnotified(&mut self) {
325 panic!("In order to use reset, implement reset_unnotified")
326 }
327
328}
329
330pub trait QTableModelBase : QTableModel + QObjectHolder<ProxyRust = QTableModelProxyRust> {
358 fn set(&mut self, index: (usize, usize), value: <Self as QTableModel>::Item) -> bool {
367 if self.set_unnotified(index, value) {
368 let model_index = self.get_rust_proxy().index(index.0 as i32, index.1 as i32 , &QModelIndex::default());
369 self.get_rust_proxy_mut().base_data_changed(&model_index, &model_index);
370 true
371 } else {
372 false
373 }
374 }
375
376 fn push_row(&mut self, values: &[Self::Item]) {
381 self.get_rust_proxy_mut().base_begin_insert_rows(&QModelIndex::default(), self.row_count() as i32, self.row_count() as i32);
382 self.push_row_unnotified(values);
383 self.get_rust_proxy_mut().base_end_insert_rows();
384 }
385
386 fn push_column(&mut self, values: &[Self::Item]) {
391 self.get_rust_proxy_mut().base_begin_insert_columns(&QModelIndex::default(), self.column_count() as i32, self.column_count() as i32);
392 self.push_column_unnotified(values);
393 self.get_rust_proxy_mut().base_end_insert_columns();
394 }
395
396 fn insert_row(&mut self, index: usize, values: &[Self::Item]) {
401 self.get_rust_proxy_mut().base_begin_insert_rows(&QModelIndex::default(), index as i32, index as i32);
402 self.insert_row_unnotified(index, values);
403 self.get_rust_proxy_mut().base_end_insert_rows();
404 }
405
406 fn insert_column(&mut self, index: usize, values: &[Self::Item]) {
411 self.get_rust_proxy_mut().base_begin_insert_columns(&QModelIndex::default(), index as i32, index as i32);
412 self.insert_column_unnotified(index, values);
413 self.get_rust_proxy_mut().base_end_insert_columns();
414 }
415
416 fn pop_row(&mut self) -> Option<Vec<Self::Item>> {
424 if self.row_count() == 0 {
425 return None;
426 }
427 self.get_rust_proxy_mut().base_begin_remove_rows(&QModelIndex::default(), self.row_count() as i32 - 1, self.row_count() as i32 - 1);
428 let values = self.pop_row_unnotified();
429 self.get_rust_proxy_mut().base_end_remove_rows();
430 values
431 }
432
433 fn pop_column(&mut self) -> Option<Vec<Self::Item>> {
441 if self.column_count() == 0 {
442 return None;
443 }
444 self.get_rust_proxy_mut().base_begin_remove_columns(&QModelIndex::default(), self.column_count() as i32 - 1, self.column_count() as i32 - 1);
445 let values = self.pop_column_unnotified();
446 self.get_rust_proxy_mut().base_end_remove_columns();
447 values
448 }
449
450 fn remove_row(&mut self, index: usize) -> Vec<Self::Item> {
455 self.get_rust_proxy_mut().base_begin_remove_rows(&QModelIndex::default(), index as i32, index as i32);
456 let values = self.remove_row_unnotified(index);
457 self.get_rust_proxy_mut().base_end_remove_rows();
458 values
459 }
460
461 fn remove_column(&mut self, index: usize) -> Vec<Self::Item> {
466 self.get_rust_proxy_mut().base_begin_remove_columns(&QModelIndex::default(), index as i32, index as i32);
467 let values = self.remove_column_unnotified(index);
468 self.get_rust_proxy_mut().base_end_remove_columns();
469 values
470 }
471
472 fn reset(&mut self) {
476 self.get_rust_proxy_mut().base_begin_reset_model();
477 self.reset_unnotified();
478 self.get_rust_proxy_mut().base_end_reset_model();
479 }
480}
481
482impl<T> QTableModelBase for T
483where T: QTableModel + QObjectHolder<ProxyRust = QTableModelProxyRust> { }
484
485pub struct QTableModelProxyRust {
486 cpp_proxy: *mut QTableModelProxyCpp,
487 #[allow(dead_code)]
488 rust_obj: RustObjAccess<dyn QTableModelAdapter>,
489 on_drop: Box<dyn FnOnce()>,
490}
491
492impl QRustProxy for QTableModelProxyRust {
493
494 type ProxyCppType = QTableModelProxyCpp;
495 type AdapterType = dyn QTableModelAdapter;
496
497 fn new<OnDropFn: FnOnce() + 'static>(rust_obj: &Rc<RefCell<dyn QTableModelAdapter>>, construct: ConstructionMode, on_drop: OnDropFn) -> *mut Self {
498 let boxed_self = Box::new(Self {
499 cpp_proxy: std::ptr::null_mut(),
500 rust_obj: match construct {
501 ConstructionMode::Strong | ConstructionMode::AtAddress(_) => RustObjAccess::new_strong(rust_obj.clone()),
502 ConstructionMode::Weak => RustObjAccess::new_weak(Rc::downgrade(rust_obj)),
503 },
504 on_drop: Box::new(on_drop),
505 });
506 let raw_self = Box::into_raw(boxed_self);
507
508 unsafe{ (*raw_self).cpp_proxy = match construct {
509 ConstructionMode::AtAddress(addr) => {
510 ffi::create_qtable_model_proxy_cpp_at(addr, raw_self)
511 }
512 ConstructionMode::Strong | ConstructionMode::Weak => {
513 ffi::create_qtable_model_proxy_cpp(raw_self)
514 }
515 }};
516 raw_self
517 }
518 fn get_static_meta_object() -> &'static QMetaObject {
519 ffi::static_qmeta_object_of_qtable_model_proxy_cpp()
520 }
521 fn get_size_of_cpp_proxy() -> usize {
522 ffi::size_of_qtable_model_proxy_cpp()
523 }
524 fn get_align_of_cpp_proxy() -> usize {
525 ffi::align_of_qtable_model_proxy_cpp()
526 }
527 fn get_qmetatype_list_of_cpp_proxy() -> QMetaType {
528 ffi::qmetatype_list_of_qtable_model_proxy_cpp()
529 }
530 fn get_cpp_proxy(&self) -> *const QTableModelProxyCpp {
531 self.cpp_proxy as *const _
532 }
533 fn get_cpp_proxy_mut(&self) -> *mut QTableModelProxyCpp {
534 self.cpp_proxy
535 }
536}
537
538impl QTableModelProxyRust {
539 pub fn drop_self(self_ptr: *mut Self) {
540 let boxed_self = unsafe { Box::from_raw(self_ptr) };
541 (boxed_self.on_drop)();
542 }
543 pub fn invoke_slot(&self, slot_id: u32, inputs: &[*const u8], outputs: &[*mut u8]) {
544 call_rust_trait_impl!(self, invoke_slot(slot_id, inputs, outputs))
545 }
546 pub fn invoke_slot_mut(&mut self, slot_id: u32, inputs: &[*const u8], outputs: &[*mut u8]) {
547 call_rust_trait_impl!(mut self, invoke_slot_mut(slot_id, inputs, outputs))
548 }
549 pub fn read_property(&self, prop_id: u32) -> QVariant {
550 call_rust_trait_impl!(self, read_property(prop_id))
551 }
552 pub fn write_property(&mut self, prop_id: u32, value: &QVariant) {
553 call_rust_trait_impl!(mut self, write_property(prop_id, value))
554 }
555 pub fn index(&self, row: i32, column: i32, parent: &QModelIndex) -> QModelIndex {
556 call_rust_trait_impl!(self, index(row, column, parent))
557 }
558 pub fn parent(&self, child: &QModelIndex) -> QModelIndex {
559 call_rust_trait_impl!(self, parent(child))
560 }
561 pub fn row_count(&self, parent: &QModelIndex) -> i32 {
562 call_rust_trait_impl!(self, row_count(parent))
563 }
564 pub fn column_count(&self, parent: &QModelIndex) -> i32 {
565 call_rust_trait_impl!(self, column_count(parent))
566 }
567 pub fn data(&self, index: &QModelIndex, role: i32) -> QVariant {
568 call_rust_trait_impl!(self, data(index, role))
569 }
570 pub fn role_names(&self) -> QHash<i32, QByteArray> {
571 call_rust_trait_impl!(self, role_names())
572 }
573 pub fn set_data(&mut self, index: &QModelIndex, value: &QVariant, role: i32) -> bool {
574 call_rust_trait_impl!(mut self, set_data(index, value, role))
575 }
576 pub fn remove_columns(&mut self, first: i32, count: i32, parent: &QModelIndex) -> bool {
577 call_rust_trait_impl!(mut self, remove_columns(first, count, parent))
578 }
579 pub fn remove_rows(&mut self, first: i32, count: i32, parent: &QModelIndex) -> bool {
580 call_rust_trait_impl!(mut self, remove_rows(first, count, parent))
581 }
582 pub fn sibling(&self, row: i32, column: i32, idx: &QModelIndex) -> QModelIndex {
583 call_rust_trait_impl!(self, sibling(row, column, idx))
584 }
585 pub fn base_role_names(&self) -> QHash<i32, QByteArray> {
586 call_cpp_impl!(self, base_role_names())
587 }
588 pub fn base_set_data(&mut self, index: &QModelIndex, value: &QVariant, role: i32) -> bool {
589 call_cpp_impl!(mut self, base_set_data(index, value, role))
590 }
591 pub fn base_remove_columns(&mut self, first: i32, count: i32, parent: &QModelIndex) -> bool {
592 call_cpp_impl!(mut self, base_remove_columns(first, count, parent))
593 }
594 pub fn base_remove_rows(&mut self, first: i32, count: i32, parent: &QModelIndex) -> bool {
595 call_cpp_impl!(mut self, base_remove_rows(first, count, parent))
596 }
597 pub fn base_sibling(&self, row: i32, column: i32, idx: &QModelIndex) -> QModelIndex {
598 call_cpp_impl!(self, base_sibling(row, column, idx))
599 }
600 pub fn base_data_changed(&mut self, top_left: &QModelIndex, bottom_right: &QModelIndex) {
601 call_cpp_impl!(mut self, base_data_changed(top_left, bottom_right))
602 }
603 pub fn base_begin_insert_columns(&mut self, parent: &QModelIndex, first: i32, last: i32) {
604 call_cpp_impl!(mut self, base_begin_insert_columns(parent, first, last))
605 }
606 pub fn base_end_insert_columns(&mut self) {
607 call_cpp_impl!(mut self, base_end_insert_columns())
608 }
609 pub fn base_begin_insert_rows(&mut self, parent: &QModelIndex, first: i32, last: i32) {
610 call_cpp_impl!(mut self, base_begin_insert_rows(parent, first, last))
611 }
612 pub fn base_end_insert_rows(&mut self) {
613 call_cpp_impl!(mut self, base_end_insert_rows())
614 }
615 pub fn base_begin_move_columns(
616 &mut self,
617 source_parent: &QModelIndex,
618 source_first: i32,
619 source_last: i32,
620 destination_parent: &QModelIndex,
621 destination_child: i32,
622 ) {
623 call_cpp_impl!(mut self, base_begin_move_columns(source_parent, source_first, source_last, destination_parent, destination_child))
624 }
625 pub fn base_end_move_columns(&mut self) {
626 call_cpp_impl!(mut self, base_end_move_columns())
627 }
628 pub fn base_begin_move_rows(&mut self, source_parent: &QModelIndex, source_first: i32, source_last: i32, destination_parent: &QModelIndex, destination_child: i32) {
629 call_cpp_impl!(mut self, base_begin_move_rows(source_parent, source_first, source_last, destination_parent, destination_child))
630 }
631 pub fn base_end_move_rows(&mut self) {
632 call_cpp_impl!(mut self, base_end_move_rows())
633 }
634 pub fn base_begin_remove_columns(&mut self, parent: &QModelIndex, first: i32, last: i32) {
635 call_cpp_impl!(mut self, base_begin_remove_columns(parent, first, last))
636 }
637 pub fn base_end_remove_columns(&mut self) {
638 call_cpp_impl!(mut self, base_end_remove_columns())
639 }
640 pub fn base_begin_remove_rows(&mut self, parent: &QModelIndex, first: i32, last: i32) {
641 call_cpp_impl!(mut self, base_begin_remove_rows(parent, first, last))
642 }
643 pub fn base_end_remove_rows(&mut self) {
644 call_cpp_impl!(mut self, base_end_remove_rows())
645 }
646 pub fn base_begin_reset_model(&mut self) {
647 call_cpp_impl!(mut self, base_begin_reset_model())
648 }
649 pub fn base_end_reset_model(&mut self) {
650 call_cpp_impl!(mut self, base_end_reset_model())
651 }
652 pub fn base_create_index(&self, row: i32, column: i32, ptr: usize) -> QModelIndex {
653 call_cpp_impl!(self, base_create_index(row, column, ptr))
654 }
655}