1use super::proxy_cpp_bridge::QTableModelProxyCpp;
5use crate::{call_rust_trait_impl, call_cpp_impl};
6use qtbridge_runtime::{DispatchMetaCall, QObjectHolder};
7use qtbridge_runtime::QModelItem;
8use crate::genericrustproxy::GenericRustProxy;
9use qtbridge_type_lib::{QByteArray, QHash_i32_QByteArray, QModelIndex, QVariant};
10
11#[doc(hidden)]
12pub trait QTableModelAdapter: DispatchMetaCall + 'static {
13 fn index(&self, row: i32, column: i32, parent: &QModelIndex) -> QModelIndex;
14 fn parent(&self, child: &QModelIndex) -> QModelIndex;
15 fn row_count(&self, parent: &QModelIndex) -> i32;
16 fn column_count(&self, parent: &QModelIndex) -> i32;
17 fn data(&self, index: &QModelIndex, role: i32) -> QVariant;
18 fn role_names(&self) -> QHash_i32_QByteArray;
19 fn set_data(&mut self, index: &QModelIndex, value: &QVariant, role: i32) -> bool;
20 fn remove_columns(&mut self, first: i32, count: i32, parent: &QModelIndex) -> bool;
21 fn remove_rows(&mut self, first: i32, count: i32, parent: &QModelIndex) -> bool;
22 fn sibling(&self, row: i32, column: i32, idx: &QModelIndex) -> QModelIndex;
23}
24
25impl<T> QTableModelAdapter for T
26where
27 T: QTableModel + QObjectHolder<ProxyRust = QTableModelProxyRust> {
28
29 fn index(&self, row: i32, column: i32, _: &QModelIndex) -> QModelIndex {
30 let proxy = self.try_get_rust_proxy_ptr().expect("No proxy");
31 unsafe { &*proxy }.base_create_index(self, row, column, 0)
32 }
33
34 fn parent(&self, _: &QModelIndex) -> QModelIndex {
35 QModelIndex::default()
36 }
37
38 fn row_count(&self, _: &QModelIndex) -> i32 {
39 self.row_count() as i32
40 }
41
42 fn column_count(&self, _: &QModelIndex) -> i32 {
43 <Self as QTableModel>::column_count(self) as i32
44 }
45
46 fn data(&self, index: &QModelIndex, role: i32) -> QVariant {
47 let Some(item) = self.get((index.row() as usize, index.column() as usize))
48 else {
49 return QVariant::default();
50 };
51 item.get_role(role)
52 }
53
54 fn role_names(&self) -> QHash_i32_QByteArray {
55 let names = T::Item::role_names();
56 let mut result = QHash_i32_QByteArray::default();
57 names.into_iter()
58 .for_each(|(k, v)| result.insert(k, QByteArray::from(&v)));
59 result
60 }
61
62 fn set_data(&mut self, index: &QModelIndex, value: &QVariant, role: i32) -> bool {
63 if !index.is_valid() {
64 return false;
65 }
66 let Some(mut item) = self.get((index.row() as usize, index.column() as usize))
67 .cloned()
68 else {
69 return false;
70 };
71 let updated = item.set_role(role, value);
72 if updated {
73 self.set_unnotified((index.row() as usize, index.column() as usize), item);
74 let proxy = self.try_get_rust_proxy_ptr().expect("No proxy");
75 unsafe { &mut *proxy }.base_data_changed(&mut *self, index, index);
76 }
77 updated
78 }
79
80 fn remove_columns(&mut self, first: i32, count: i32, parent: &QModelIndex) -> bool {
81 let first = first as usize;
82 let last = first + count as usize;
83 if last > self.column_count() {
84 return false;
85 }
86 let proxy = self.try_get_rust_proxy_ptr().expect("No proxy");
87 unsafe { &mut *proxy }.base_begin_remove_columns(&mut *self, parent, first as i32, (last - 1) as i32);
88 for index in (first..last).rev() {
89 self.remove_column_unnotified(index);
90 }
91 unsafe { &mut *proxy }.base_end_remove_columns(&mut *self);
92 true
93 }
94
95 fn remove_rows(&mut self, first: i32, count: i32, parent: &QModelIndex) -> bool {
96 let first = first as usize;
97 let last = first + count as usize;
98 if last > self.row_count() {
99 return false;
100 }
101 let proxy = self.try_get_rust_proxy_ptr().expect("No proxy");
102 unsafe { &mut *proxy }.base_begin_remove_rows(&mut *self, parent, first as i32, (last - 1) as i32);
103 for index in (first..last).rev() {
104 self.remove_row_unnotified(index);
105 }
106 unsafe { &mut *proxy }.base_end_remove_rows(&mut *self);
107 true
108 }
109
110 fn sibling(&self, row: i32, column: i32, idx: &QModelIndex) -> QModelIndex {
111 let proxy = self.try_get_rust_proxy_ptr().expect("No proxy");
112 unsafe { &*proxy }.base_sibling(self, row, column, idx)
113 }
114}
115
116
117pub trait QTableModel {
190 type Item: QModelItem + Default + Clone;
197
198 fn row_count(&self) -> usize;
200
201 fn column_count(&self) -> usize;
203
204 fn get(&self, index: (usize, usize)) -> Option<&Self::Item>;
207
208 fn set_unnotified(&mut self, _index: (usize, usize), _value: Self::Item) -> bool {
217 false
218 }
219
220 fn push_row_unnotified(&mut self, values: &[Self::Item]) {
230 self.insert_row_unnotified(self.row_count(), values);
231 }
232
233 fn push_column_unnotified(&mut self, values: &[Self::Item]) {
243 self.insert_column_unnotified(self.column_count(), values);
244 }
245
246 fn insert_row_unnotified(&mut self, _index: usize, _value: &[Self::Item]) {
256 panic!("In order to use insert, implement insert_unnotified")
257 }
258
259 fn insert_column_unnotified(&mut self, _index: usize, _value: &[Self::Item]) {
269 panic!("In order to use insert, implement insert_unnotified")
270 }
271
272 fn pop_row_unnotified(&mut self) -> Option<Vec<Self::Item>> {
282 (self.row_count() > 0)
283 .then(|| self.remove_row_unnotified(self.row_count() - 1))
284 }
285
286 fn pop_column_unnotified(&mut self) -> Option<Vec<Self::Item>> {
296 (self.column_count() > 0)
297 .then(|| self.remove_column_unnotified(self.column_count() - 1))
298 }
299
300 fn remove_row_unnotified(&mut self, _index: usize) -> Vec<Self::Item> {
310 panic!("In order to use remove, implement remove_unnotified")
311 }
312
313 fn remove_column_unnotified(&mut self, _index: usize) -> Vec<Self::Item> {
323 panic!("In order to use remove, implement remove_unnotified")
324 }
325
326 fn reset_unnotified(&mut self) {
336 panic!("In order to use reset, implement reset_unnotified")
337 }
338
339}
340
341pub trait QTableModelBase : QTableModel + QObjectHolder<ProxyRust = QTableModelProxyRust> {
369 fn set(&mut self, index: (usize, usize), value: <Self as QTableModel>::Item) -> bool {
378 if self.set_unnotified(index, value) {
379 if let Some(proxy) = self.try_get_rust_proxy_ptr() {
380 let model_index = unsafe { &*proxy }.base_create_index(self, index.0 as i32, index.1 as i32, 0);
381 unsafe { &mut *proxy }.base_data_changed(&mut *self, &model_index, &model_index);
382 }
383 true
384 } else {
385 false
386 }
387 }
388
389 fn push_row(&mut self, values: &[Self::Item]) {
394 let Some(proxy) = self.try_get_rust_proxy_ptr() else {
395 return self.push_row_unnotified(values);
396 };
397 let row_count = self.row_count() as i32;
398 unsafe { &mut *proxy }.base_begin_insert_rows(&mut *self, &QModelIndex::default(), row_count, row_count);
399 self.push_row_unnotified(values);
400 unsafe { &mut *proxy }.base_end_insert_rows(&mut *self);
401 }
402
403 fn push_column(&mut self, values: &[Self::Item]) {
408 let Some(proxy) = self.try_get_rust_proxy_ptr() else {
409 return self.push_column_unnotified(values);
410 };
411 let col_count = self.column_count() as i32;
412 unsafe { &mut *proxy }.base_begin_insert_columns(&mut *self, &QModelIndex::default(), col_count, col_count);
413 self.push_column_unnotified(values);
414 unsafe { &mut *proxy }.base_end_insert_columns(&mut *self);
415 }
416
417 fn insert_row(&mut self, index: usize, values: &[Self::Item]) {
422 let Some(proxy) = self.try_get_rust_proxy_ptr() else {
423 return self.insert_row_unnotified(index, values);
424 };
425 unsafe { &mut *proxy }.base_begin_insert_rows(&mut *self, &QModelIndex::default(), index as i32, index as i32);
426 self.insert_row_unnotified(index, values);
427 unsafe { &mut *proxy }.base_end_insert_rows(&mut *self);
428 }
429
430 fn insert_column(&mut self, index: usize, values: &[Self::Item]) {
435 let Some(proxy) = self.try_get_rust_proxy_ptr() else {
436 return self.insert_column_unnotified(index, values);
437 };
438 unsafe { &mut *proxy }.base_begin_insert_columns(&mut *self, &QModelIndex::default(), index as i32, index as i32);
439 self.insert_column_unnotified(index, values);
440 unsafe { &mut *proxy }.base_end_insert_columns(&mut *self);
441 }
442
443 fn pop_row(&mut self) -> Option<Vec<Self::Item>> {
451 if self.row_count() == 0 {
452 return None;
453 }
454 let Some(proxy) = self.try_get_rust_proxy_ptr() else {
455 return self.pop_row_unnotified();
456 };
457 let row_count = self.row_count() as i32;
458 unsafe { &mut *proxy }.base_begin_remove_rows(&mut *self, &QModelIndex::default(), row_count - 1, row_count - 1);
459 let values = self.pop_row_unnotified();
460 unsafe { &mut *proxy }.base_end_remove_rows(&mut *self);
461 values
462 }
463
464 fn pop_column(&mut self) -> Option<Vec<Self::Item>> {
472 if self.column_count() == 0 {
473 return None;
474 }
475 let Some(proxy) = self.try_get_rust_proxy_ptr() else {
476 return self.pop_column_unnotified();
477 };
478 let col_count = self.column_count() as i32;
479 unsafe { &mut *proxy }.base_begin_remove_columns(&mut *self, &QModelIndex::default(), col_count - 1, col_count - 1);
480 let values = self.pop_column_unnotified();
481 unsafe { &mut *proxy }.base_end_remove_columns(&mut *self);
482 values
483 }
484
485 fn remove_row(&mut self, index: usize) -> Vec<Self::Item> {
490 let Some(proxy) = self.try_get_rust_proxy_ptr() else {
491 return self.remove_row_unnotified(index);
492 };
493 unsafe { &mut *proxy }.base_begin_remove_rows(&mut *self, &QModelIndex::default(), index as i32, index as i32);
494 let values = self.remove_row_unnotified(index);
495 unsafe { &mut *proxy }.base_end_remove_rows(&mut *self);
496 values
497 }
498
499 fn remove_column(&mut self, index: usize) -> Vec<Self::Item> {
504 let Some(proxy) = self.try_get_rust_proxy_ptr() else {
505 return self.remove_column_unnotified(index);
506 };
507 unsafe { &mut *proxy }.base_begin_remove_columns(&mut *self, &QModelIndex::default(), index as i32, index as i32);
508 let values = self.remove_column_unnotified(index);
509 unsafe { &mut *proxy }.base_end_remove_columns(&mut *self);
510 values
511 }
512
513 fn reset(&mut self) {
517 let Some(proxy) = self.try_get_rust_proxy_ptr() else {
518 return self.reset_unnotified();
519 };
520 unsafe { &mut *proxy }.base_begin_reset_model(&mut *self);
521 self.reset_unnotified();
522 unsafe { &mut *proxy }.base_end_reset_model(&mut *self);
523 }
524}
525
526impl<T> QTableModelBase for T
527where T: QTableModel + QObjectHolder<ProxyRust = QTableModelProxyRust> { }
528
529pub type QTableModelProxyRust = GenericRustProxy<QTableModelProxyCpp, dyn QTableModelAdapter>;
530
531impl<T: QTableModelAdapter + 'static> qtbridge_runtime::qproxies::AdapterUpcast<T> for QTableModelProxyRust {
532 fn upcast(rc: std::rc::Rc<std::cell::RefCell<T>>) -> std::rc::Rc<std::cell::RefCell<dyn QTableModelAdapter>> {
533 rc
534 }
535}
536
537impl QTableModelProxyRust {
538 pub fn index(&self, row: i32, column: i32, parent: &QModelIndex) -> QModelIndex {
539 call_rust_trait_impl!(self, index(row, column, parent))
540 }
541 pub fn parent(&self, child: &QModelIndex) -> QModelIndex {
542 call_rust_trait_impl!(self, parent(child))
543 }
544 pub fn row_count(&self, parent: &QModelIndex) -> i32 {
545 call_rust_trait_impl!(self, row_count(parent))
546 }
547 pub fn column_count(&self, parent: &QModelIndex) -> i32 {
548 call_rust_trait_impl!(self, column_count(parent))
549 }
550 pub fn data(&self, index: &QModelIndex, role: i32) -> QVariant {
551 call_rust_trait_impl!(self, data(index, role))
552 }
553 pub fn role_names(&self) -> QHash_i32_QByteArray {
554 call_rust_trait_impl!(self, role_names())
555 }
556 pub fn set_data(&mut self, index: &QModelIndex, value: &QVariant, role: i32) -> bool {
557 call_rust_trait_impl!(mut self, set_data(index, value, role))
558 }
559 pub fn remove_columns(&mut self, first: i32, count: i32, parent: &QModelIndex) -> bool {
560 call_rust_trait_impl!(mut self, remove_columns(first, count, parent))
561 }
562 pub fn remove_rows(&mut self, first: i32, count: i32, parent: &QModelIndex) -> bool {
563 call_rust_trait_impl!(mut self, remove_rows(first, count, parent))
564 }
565 pub fn sibling(&self, row: i32, column: i32, idx: &QModelIndex) -> QModelIndex {
566 call_rust_trait_impl!(self, sibling(row, column, idx))
567 }
568
569 pub fn base_role_names(&self, reference: &dyn QTableModelAdapter) -> QHash_i32_QByteArray {
570 call_cpp_impl!(self, reference, base_role_names())
571 }
572 pub fn base_set_data(&mut self, mut_ref: &mut dyn QTableModelAdapter, index: &QModelIndex, value: &QVariant, role: i32) -> bool {
573 call_cpp_impl!(mut self, mut_ref, base_set_data(index, value, role))
574 }
575 pub fn base_remove_columns(&mut self, mut_ref: &mut dyn QTableModelAdapter, first: i32, count: i32, parent: &QModelIndex) -> bool {
576 call_cpp_impl!(mut self, mut_ref, base_remove_columns(first, count, parent))
577 }
578 pub fn base_remove_rows(&mut self, mut_ref: &mut dyn QTableModelAdapter, first: i32, count: i32, parent: &QModelIndex) -> bool {
579 call_cpp_impl!(mut self, mut_ref, base_remove_rows(first, count, parent))
580 }
581 pub fn base_sibling(&self, reference: &dyn QTableModelAdapter, row: i32, column: i32, idx: &QModelIndex) -> QModelIndex {
582 call_cpp_impl!(self, reference, base_sibling(row, column, idx))
583 }
584 pub fn base_data_changed(&mut self, mut_ref: &mut dyn QTableModelAdapter, top_left: &QModelIndex, bottom_right: &QModelIndex) {
585 call_cpp_impl!(mut self, mut_ref, base_data_changed(top_left, bottom_right))
586 }
587 pub fn base_begin_insert_columns(&mut self, mut_ref: &mut dyn QTableModelAdapter, parent: &QModelIndex, first: i32, last: i32) {
588 call_cpp_impl!(mut self, mut_ref, base_begin_insert_columns(parent, first, last))
589 }
590 pub fn base_end_insert_columns(&mut self, mut_ref: &mut dyn QTableModelAdapter) {
591 call_cpp_impl!(mut self, mut_ref, base_end_insert_columns())
592 }
593 pub fn base_begin_insert_rows(&mut self, mut_ref: &mut dyn QTableModelAdapter, parent: &QModelIndex, first: i32, last: i32) {
594 call_cpp_impl!(mut self, mut_ref, base_begin_insert_rows(parent, first, last))
595 }
596 pub fn base_end_insert_rows(&mut self, mut_ref: &mut dyn QTableModelAdapter) {
597 call_cpp_impl!(mut self, mut_ref, base_end_insert_rows())
598 }
599 pub fn base_begin_move_columns(
600 &mut self,
601 mut_ref: &mut dyn QTableModelAdapter,
602 source_parent: &QModelIndex,
603 source_first: i32,
604 source_last: i32,
605 destination_parent: &QModelIndex,
606 destination_child: i32,
607 ) {
608 call_cpp_impl!(mut self, mut_ref, base_begin_move_columns(source_parent, source_first, source_last, destination_parent, destination_child))
609 }
610 pub fn base_end_move_columns(&mut self, mut_ref: &mut dyn QTableModelAdapter) {
611 call_cpp_impl!(mut self, mut_ref, base_end_move_columns())
612 }
613 pub fn base_begin_move_rows(&mut self, mut_ref: &mut dyn QTableModelAdapter, source_parent: &QModelIndex, source_first: i32, source_last: i32, destination_parent: &QModelIndex, destination_child: i32) {
614 call_cpp_impl!(mut self, mut_ref, base_begin_move_rows(source_parent, source_first, source_last, destination_parent, destination_child))
615 }
616 pub fn base_end_move_rows(&mut self, mut_ref: &mut dyn QTableModelAdapter) {
617 call_cpp_impl!(mut self, mut_ref, base_end_move_rows())
618 }
619 pub fn base_begin_remove_columns(&mut self, mut_ref: &mut dyn QTableModelAdapter, parent: &QModelIndex, first: i32, last: i32) {
620 call_cpp_impl!(mut self, mut_ref, base_begin_remove_columns(parent, first, last))
621 }
622 pub fn base_end_remove_columns(&mut self, mut_ref: &mut dyn QTableModelAdapter) {
623 call_cpp_impl!(mut self, mut_ref, base_end_remove_columns())
624 }
625 pub fn base_begin_remove_rows(&mut self, mut_ref: &mut dyn QTableModelAdapter, parent: &QModelIndex, first: i32, last: i32) {
626 call_cpp_impl!(mut self, mut_ref, base_begin_remove_rows(parent, first, last))
627 }
628 pub fn base_end_remove_rows(&mut self, mut_ref: &mut dyn QTableModelAdapter) {
629 call_cpp_impl!(mut self, mut_ref, base_end_remove_rows())
630 }
631 pub fn base_begin_reset_model(&mut self, mut_ref: &mut dyn QTableModelAdapter) {
632 call_cpp_impl!(mut self, mut_ref, base_begin_reset_model())
633 }
634 pub fn base_end_reset_model(&mut self, mut_ref: &mut dyn QTableModelAdapter) {
635 call_cpp_impl!(mut self, mut_ref, base_end_reset_model())
636 }
637 pub fn base_create_index(&self, reference: &dyn QTableModelAdapter, row: i32, column: i32, ptr: usize) -> QModelIndex {
638 call_cpp_impl!(self, reference, base_create_index(row, column, ptr))
639 }
640}