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 { &*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 { &*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 { &*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 { &*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 { &*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 { &*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 { &*proxy }.base_begin_insert_rows(&mut *self, &QModelIndex::default(), row_count, row_count);
399 self.push_row_unnotified(values);
400 unsafe { &*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 { &*proxy }.base_begin_insert_columns(&mut *self, &QModelIndex::default(), col_count, col_count);
413 self.push_column_unnotified(values);
414 unsafe { &*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 { &*proxy }.base_begin_insert_rows(&mut *self, &QModelIndex::default(), index as i32, index as i32);
426 self.insert_row_unnotified(index, values);
427 unsafe { &*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 { &*proxy }.base_begin_insert_columns(&mut *self, &QModelIndex::default(), index as i32, index as i32);
439 self.insert_column_unnotified(index, values);
440 unsafe { &*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 { &*proxy }.base_begin_remove_rows(&mut *self, &QModelIndex::default(), row_count - 1, row_count - 1);
459 let values = self.pop_row_unnotified();
460 unsafe { &*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 { &*proxy }.base_begin_remove_columns(&mut *self, &QModelIndex::default(), col_count - 1, col_count - 1);
480 let values = self.pop_column_unnotified();
481 unsafe { &*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 { &*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 { &*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 { &*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 { &*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 { &*proxy }.base_begin_reset_model(&mut *self);
521 self.reset_unnotified();
522 unsafe { &*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
531unsafe impl<T: QTableModelAdapter + 'static> qtbridge_runtime::qproxies::AdapterUpcast<T> for QTableModelProxyRust {
533 fn upcast(rc: std::rc::Rc<std::cell::RefCell<T>>) -> std::rc::Rc<std::cell::RefCell<dyn QTableModelAdapter>> {
534 rc
535 }
536}
537
538impl QTableModelProxyRust {
539 pub fn index(&self, row: i32, column: i32, parent: &QModelIndex) -> QModelIndex {
540 call_rust_trait_impl!(self, index(row, column, parent))
541 }
542 pub fn parent(&self, child: &QModelIndex) -> QModelIndex {
543 call_rust_trait_impl!(self, parent(child))
544 }
545 pub fn row_count(&self, parent: &QModelIndex) -> i32 {
546 call_rust_trait_impl!(self, row_count(parent))
547 }
548 pub fn column_count(&self, parent: &QModelIndex) -> i32 {
549 call_rust_trait_impl!(self, column_count(parent))
550 }
551 pub fn data(&self, index: &QModelIndex, role: i32) -> QVariant {
552 call_rust_trait_impl!(self, data(index, role))
553 }
554 pub fn role_names(&self) -> QHash_i32_QByteArray {
555 call_rust_trait_impl!(self, role_names())
556 }
557 pub fn set_data(&self, index: &QModelIndex, value: &QVariant, role: i32) -> bool {
558 call_rust_trait_impl!(mut self, set_data(index, value, role))
559 }
560 pub fn remove_columns(&self, first: i32, count: i32, parent: &QModelIndex) -> bool {
561 call_rust_trait_impl!(mut self, remove_columns(first, count, parent))
562 }
563 pub fn remove_rows(&self, first: i32, count: i32, parent: &QModelIndex) -> bool {
564 call_rust_trait_impl!(mut self, remove_rows(first, count, parent))
565 }
566 pub fn sibling(&self, row: i32, column: i32, idx: &QModelIndex) -> QModelIndex {
567 call_rust_trait_impl!(self, sibling(row, column, idx))
568 }
569
570 pub fn base_role_names(&self, reference: &dyn QTableModelAdapter) -> QHash_i32_QByteArray {
571 call_cpp_impl!(self, reference, base_role_names())
572 }
573 pub fn base_set_data(&self, mut_ref: &mut dyn QTableModelAdapter, index: &QModelIndex, value: &QVariant, role: i32) -> bool {
574 call_cpp_impl!(mut self, mut_ref, base_set_data(index, value, role))
575 }
576 pub fn base_remove_columns(&self, mut_ref: &mut dyn QTableModelAdapter, first: i32, count: i32, parent: &QModelIndex) -> bool {
577 call_cpp_impl!(mut self, mut_ref, base_remove_columns(first, count, parent))
578 }
579 pub fn base_remove_rows(&self, mut_ref: &mut dyn QTableModelAdapter, first: i32, count: i32, parent: &QModelIndex) -> bool {
580 call_cpp_impl!(mut self, mut_ref, base_remove_rows(first, count, parent))
581 }
582 pub fn base_sibling(&self, reference: &dyn QTableModelAdapter, row: i32, column: i32, idx: &QModelIndex) -> QModelIndex {
583 call_cpp_impl!(self, reference, base_sibling(row, column, idx))
584 }
585 pub fn base_data_changed(&self, mut_ref: &mut dyn QTableModelAdapter, top_left: &QModelIndex, bottom_right: &QModelIndex) {
586 call_cpp_impl!(mut self, mut_ref, base_data_changed(top_left, bottom_right))
587 }
588 pub fn base_begin_insert_columns(&self, mut_ref: &mut dyn QTableModelAdapter, parent: &QModelIndex, first: i32, last: i32) {
589 call_cpp_impl!(mut self, mut_ref, base_begin_insert_columns(parent, first, last))
590 }
591 pub fn base_end_insert_columns(&self, mut_ref: &mut dyn QTableModelAdapter) {
592 call_cpp_impl!(mut self, mut_ref, base_end_insert_columns())
593 }
594 pub fn base_begin_insert_rows(&self, mut_ref: &mut dyn QTableModelAdapter, parent: &QModelIndex, first: i32, last: i32) {
595 call_cpp_impl!(mut self, mut_ref, base_begin_insert_rows(parent, first, last))
596 }
597 pub fn base_end_insert_rows(&self, mut_ref: &mut dyn QTableModelAdapter) {
598 call_cpp_impl!(mut self, mut_ref, base_end_insert_rows())
599 }
600 pub fn base_begin_move_columns(
601 &mut self,
602 mut_ref: &mut dyn QTableModelAdapter,
603 source_parent: &QModelIndex,
604 source_first: i32,
605 source_last: i32,
606 destination_parent: &QModelIndex,
607 destination_child: i32,
608 ) {
609 call_cpp_impl!(mut self, mut_ref, base_begin_move_columns(source_parent, source_first, source_last, destination_parent, destination_child))
610 }
611 pub fn base_end_move_columns(&self, mut_ref: &mut dyn QTableModelAdapter) {
612 call_cpp_impl!(mut self, mut_ref, base_end_move_columns())
613 }
614 pub fn base_begin_move_rows(&self, mut_ref: &mut dyn QTableModelAdapter, source_parent: &QModelIndex, source_first: i32, source_last: i32, destination_parent: &QModelIndex, destination_child: i32) {
615 call_cpp_impl!(mut self, mut_ref, base_begin_move_rows(source_parent, source_first, source_last, destination_parent, destination_child))
616 }
617 pub fn base_end_move_rows(&self, mut_ref: &mut dyn QTableModelAdapter) {
618 call_cpp_impl!(mut self, mut_ref, base_end_move_rows())
619 }
620 pub fn base_begin_remove_columns(&self, mut_ref: &mut dyn QTableModelAdapter, parent: &QModelIndex, first: i32, last: i32) {
621 call_cpp_impl!(mut self, mut_ref, base_begin_remove_columns(parent, first, last))
622 }
623 pub fn base_end_remove_columns(&self, mut_ref: &mut dyn QTableModelAdapter) {
624 call_cpp_impl!(mut self, mut_ref, base_end_remove_columns())
625 }
626 pub fn base_begin_remove_rows(&self, mut_ref: &mut dyn QTableModelAdapter, parent: &QModelIndex, first: i32, last: i32) {
627 call_cpp_impl!(mut self, mut_ref, base_begin_remove_rows(parent, first, last))
628 }
629 pub fn base_end_remove_rows(&self, mut_ref: &mut dyn QTableModelAdapter) {
630 call_cpp_impl!(mut self, mut_ref, base_end_remove_rows())
631 }
632 pub fn base_begin_reset_model(&self, mut_ref: &mut dyn QTableModelAdapter) {
633 call_cpp_impl!(mut self, mut_ref, base_begin_reset_model())
634 }
635 pub fn base_end_reset_model(&self, mut_ref: &mut dyn QTableModelAdapter) {
636 call_cpp_impl!(mut self, mut_ref, base_end_reset_model())
637 }
638 pub fn base_create_index(&self, reference: &dyn QTableModelAdapter, row: i32, column: i32, ptr: usize) -> QModelIndex {
639 call_cpp_impl!(self, reference, base_create_index(row, column, ptr))
640 }
641}