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, 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::default();
57 names.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_row_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 let proxy = self.try_get_rust_proxy_ptr().expect("No proxy");
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 true
383 } else {
384 false
385 }
386 }
387
388 fn push_row(&mut self, values: &[Self::Item]) {
393 let proxy = self.try_get_rust_proxy_ptr().expect("No proxy");
394 let row_count = self.row_count() as i32;
395 unsafe { &mut *proxy }.base_begin_insert_rows(&mut *self, &QModelIndex::default(), row_count, row_count);
396 self.push_row_unnotified(values);
397 unsafe { &mut *proxy }.base_end_insert_rows(&mut *self);
398 }
399
400 fn push_column(&mut self, values: &[Self::Item]) {
405 let proxy = self.try_get_rust_proxy_ptr().expect("No proxy");
406 let col_count = self.column_count() as i32;
407 unsafe { &mut *proxy }.base_begin_insert_columns(&mut *self, &QModelIndex::default(), col_count, col_count);
408 self.push_column_unnotified(values);
409 unsafe { &mut *proxy }.base_end_insert_columns(&mut *self);
410 }
411
412 fn insert_row(&mut self, index: usize, values: &[Self::Item]) {
417 let proxy = self.try_get_rust_proxy_ptr().expect("No proxy");
418 unsafe { &mut *proxy }.base_begin_insert_rows(&mut *self, &QModelIndex::default(), index as i32, index as i32);
419 self.insert_row_unnotified(index, values);
420 unsafe { &mut *proxy }.base_end_insert_rows(&mut *self);
421 }
422
423 fn insert_column(&mut self, index: usize, values: &[Self::Item]) {
428 let proxy = self.try_get_rust_proxy_ptr().expect("No proxy");
429 unsafe { &mut *proxy }.base_begin_insert_columns(&mut *self, &QModelIndex::default(), index as i32, index as i32);
430 self.insert_column_unnotified(index, values);
431 unsafe { &mut *proxy }.base_end_insert_columns(&mut *self);
432 }
433
434 fn pop_row(&mut self) -> Option<Vec<Self::Item>> {
442 if self.row_count() == 0 {
443 return None;
444 }
445 let proxy = self.try_get_rust_proxy_ptr().expect("No proxy");
446 let row_count = self.row_count() as i32;
447 unsafe { &mut *proxy }.base_begin_remove_rows(&mut *self, &QModelIndex::default(), row_count - 1, row_count - 1);
448 let values = self.pop_row_unnotified();
449 unsafe { &mut *proxy }.base_end_remove_rows(&mut *self);
450 values
451 }
452
453 fn pop_column(&mut self) -> Option<Vec<Self::Item>> {
461 if self.column_count() == 0 {
462 return None;
463 }
464 let proxy = self.try_get_rust_proxy_ptr().expect("No proxy");
465 let col_count = self.column_count() as i32;
466 unsafe { &mut *proxy }.base_begin_remove_columns(&mut *self, &QModelIndex::default(), col_count - 1, col_count - 1);
467 let values = self.pop_column_unnotified();
468 unsafe { &mut *proxy }.base_end_remove_columns(&mut *self);
469 values
470 }
471
472 fn remove_row(&mut self, index: usize) -> Vec<Self::Item> {
477 let proxy = self.try_get_rust_proxy_ptr().expect("No proxy");
478 unsafe { &mut *proxy }.base_begin_remove_rows(&mut *self, &QModelIndex::default(), index as i32, index as i32);
479 let values = self.remove_row_unnotified(index);
480 unsafe { &mut *proxy }.base_end_remove_rows(&mut *self);
481 values
482 }
483
484 fn remove_column(&mut self, index: usize) -> Vec<Self::Item> {
489 let proxy = self.try_get_rust_proxy_ptr().expect("No proxy");
490 unsafe { &mut *proxy }.base_begin_remove_columns(&mut *self, &QModelIndex::default(), index as i32, index as i32);
491 let values = self.remove_column_unnotified(index);
492 unsafe { &mut *proxy }.base_end_remove_columns(&mut *self);
493 values
494 }
495
496 fn reset(&mut self) {
500 let proxy = self.try_get_rust_proxy_ptr().expect("No proxy");
501 unsafe { &mut *proxy }.base_begin_reset_model(&mut *self);
502 self.reset_unnotified();
503 unsafe { &mut *proxy }.base_end_reset_model(&mut *self);
504 }
505}
506
507impl<T> QTableModelBase for T
508where T: QTableModel + QObjectHolder<ProxyRust = QTableModelProxyRust> { }
509
510pub type QTableModelProxyRust = GenericRustProxy<QTableModelProxyCpp, dyn QTableModelAdapter>;
511
512impl QTableModelProxyRust {
513 pub fn index(&self, row: i32, column: i32, parent: &QModelIndex) -> QModelIndex {
514 call_rust_trait_impl!(self, index(row, column, parent))
515 }
516 pub fn parent(&self, child: &QModelIndex) -> QModelIndex {
517 call_rust_trait_impl!(self, parent(child))
518 }
519 pub fn row_count(&self, parent: &QModelIndex) -> i32 {
520 call_rust_trait_impl!(self, row_count(parent))
521 }
522 pub fn column_count(&self, parent: &QModelIndex) -> i32 {
523 call_rust_trait_impl!(self, column_count(parent))
524 }
525 pub fn data(&self, index: &QModelIndex, role: i32) -> QVariant {
526 call_rust_trait_impl!(self, data(index, role))
527 }
528 pub fn role_names(&self) -> QHash<i32, QByteArray> {
529 call_rust_trait_impl!(self, role_names())
530 }
531 pub fn set_data(&mut self, index: &QModelIndex, value: &QVariant, role: i32) -> bool {
532 call_rust_trait_impl!(mut self, set_data(index, value, role))
533 }
534 pub fn remove_columns(&mut self, first: i32, count: i32, parent: &QModelIndex) -> bool {
535 call_rust_trait_impl!(mut self, remove_columns(first, count, parent))
536 }
537 pub fn remove_rows(&mut self, first: i32, count: i32, parent: &QModelIndex) -> bool {
538 call_rust_trait_impl!(mut self, remove_rows(first, count, parent))
539 }
540 pub fn sibling(&self, row: i32, column: i32, idx: &QModelIndex) -> QModelIndex {
541 call_rust_trait_impl!(self, sibling(row, column, idx))
542 }
543
544 pub fn base_role_names(&self, reference: &dyn QTableModelAdapter) -> QHash<i32, QByteArray> {
545 call_cpp_impl!(self, reference, base_role_names())
546 }
547 pub fn base_set_data(&mut self, mut_ref: &mut dyn QTableModelAdapter, index: &QModelIndex, value: &QVariant, role: i32) -> bool {
548 call_cpp_impl!(mut self, mut_ref, base_set_data(index, value, role))
549 }
550 pub fn base_remove_columns(&mut self, mut_ref: &mut dyn QTableModelAdapter, first: i32, count: i32, parent: &QModelIndex) -> bool {
551 call_cpp_impl!(mut self, mut_ref, base_remove_columns(first, count, parent))
552 }
553 pub fn base_remove_rows(&mut self, mut_ref: &mut dyn QTableModelAdapter, first: i32, count: i32, parent: &QModelIndex) -> bool {
554 call_cpp_impl!(mut self, mut_ref, base_remove_rows(first, count, parent))
555 }
556 pub fn base_sibling(&self, reference: &dyn QTableModelAdapter, row: i32, column: i32, idx: &QModelIndex) -> QModelIndex {
557 call_cpp_impl!(self, reference, base_sibling(row, column, idx))
558 }
559 pub fn base_data_changed(&mut self, mut_ref: &mut dyn QTableModelAdapter, top_left: &QModelIndex, bottom_right: &QModelIndex) {
560 call_cpp_impl!(mut self, mut_ref, base_data_changed(top_left, bottom_right))
561 }
562 pub fn base_begin_insert_columns(&mut self, mut_ref: &mut dyn QTableModelAdapter, parent: &QModelIndex, first: i32, last: i32) {
563 call_cpp_impl!(mut self, mut_ref, base_begin_insert_columns(parent, first, last))
564 }
565 pub fn base_end_insert_columns(&mut self, mut_ref: &mut dyn QTableModelAdapter) {
566 call_cpp_impl!(mut self, mut_ref, base_end_insert_columns())
567 }
568 pub fn base_begin_insert_rows(&mut self, mut_ref: &mut dyn QTableModelAdapter, parent: &QModelIndex, first: i32, last: i32) {
569 call_cpp_impl!(mut self, mut_ref, base_begin_insert_rows(parent, first, last))
570 }
571 pub fn base_end_insert_rows(&mut self, mut_ref: &mut dyn QTableModelAdapter) {
572 call_cpp_impl!(mut self, mut_ref, base_end_insert_rows())
573 }
574 pub fn base_begin_move_columns(
575 &mut self,
576 mut_ref: &mut dyn QTableModelAdapter,
577 source_parent: &QModelIndex,
578 source_first: i32,
579 source_last: i32,
580 destination_parent: &QModelIndex,
581 destination_child: i32,
582 ) {
583 call_cpp_impl!(mut self, mut_ref, base_begin_move_columns(source_parent, source_first, source_last, destination_parent, destination_child))
584 }
585 pub fn base_end_move_columns(&mut self, mut_ref: &mut dyn QTableModelAdapter) {
586 call_cpp_impl!(mut self, mut_ref, base_end_move_columns())
587 }
588 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) {
589 call_cpp_impl!(mut self, mut_ref, base_begin_move_rows(source_parent, source_first, source_last, destination_parent, destination_child))
590 }
591 pub fn base_end_move_rows(&mut self, mut_ref: &mut dyn QTableModelAdapter) {
592 call_cpp_impl!(mut self, mut_ref, base_end_move_rows())
593 }
594 pub fn base_begin_remove_columns(&mut self, mut_ref: &mut dyn QTableModelAdapter, parent: &QModelIndex, first: i32, last: i32) {
595 call_cpp_impl!(mut self, mut_ref, base_begin_remove_columns(parent, first, last))
596 }
597 pub fn base_end_remove_columns(&mut self, mut_ref: &mut dyn QTableModelAdapter) {
598 call_cpp_impl!(mut self, mut_ref, base_end_remove_columns())
599 }
600 pub fn base_begin_remove_rows(&mut self, mut_ref: &mut dyn QTableModelAdapter, parent: &QModelIndex, first: i32, last: i32) {
601 call_cpp_impl!(mut self, mut_ref, base_begin_remove_rows(parent, first, last))
602 }
603 pub fn base_end_remove_rows(&mut self, mut_ref: &mut dyn QTableModelAdapter) {
604 call_cpp_impl!(mut self, mut_ref, base_end_remove_rows())
605 }
606 pub fn base_begin_reset_model(&mut self, mut_ref: &mut dyn QTableModelAdapter) {
607 call_cpp_impl!(mut self, mut_ref, base_begin_reset_model())
608 }
609 pub fn base_end_reset_model(&mut self, mut_ref: &mut dyn QTableModelAdapter) {
610 call_cpp_impl!(mut self, mut_ref, base_end_reset_model())
611 }
612 pub fn base_create_index(&self, reference: &dyn QTableModelAdapter, row: i32, column: i32, ptr: usize) -> QModelIndex {
613 call_cpp_impl!(self, reference, base_create_index(row, column, ptr))
614 }
615}