Skip to main content

qtbridge_interfaces/qabstract_item_model/
proxy_rust.rs

1// Copyright (C) 2025 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only
3
4use super::proxy_cpp_bridge::QAbstractItemModelProxyCpp;
5use crate::{call_rust_trait_impl, call_cpp_impl};
6use qtbridge_runtime::{DispatchMetaCall, QObjectHolder};
7use crate::genericrustproxy::GenericRustProxy;
8use qtbridge_type_lib::{QHash_i32_QByteArray, QModelIndex, QVariant};
9
10pub trait QAbstractItemModelAdapter: DispatchMetaCall + 'static {
11    fn index(&self, row: i32, column: i32, parent: &QModelIndex) -> QModelIndex;
12    fn parent(&self, child: &QModelIndex) -> QModelIndex;
13    fn row_count(&self, parent: &QModelIndex) -> i32;
14    fn column_count(&self, parent: &QModelIndex) -> i32;
15    fn data(&self, index: &QModelIndex, role: i32) -> QVariant;
16    fn role_names(&self) -> QHash_i32_QByteArray;
17    fn set_data(&mut self, index: &QModelIndex, value: &QVariant, role: i32) -> bool;
18    fn remove_rows(&mut self, first: i32, count: i32, parent: &QModelIndex) -> bool;
19    fn sibling(&self, row: i32, column: i32, idx: &QModelIndex) -> QModelIndex;
20}
21
22impl<T> QAbstractItemModelAdapter for T
23where
24    T: QAbstractItemModel {
25    fn index(&self, row: i32, column: i32, parent: &QModelIndex) -> QModelIndex {
26        <Self as QAbstractItemModel>::index(self, row, column, parent)
27    }
28    fn parent(&self, child: &QModelIndex) -> QModelIndex {
29        <Self as QAbstractItemModel>::parent(self, child)
30    }
31    fn row_count(&self, parent: &QModelIndex) -> i32 {
32        <Self as QAbstractItemModel>::row_count(self, parent)
33    }
34    fn column_count(&self, parent: &QModelIndex) -> i32 {
35        <Self as QAbstractItemModel>::column_count(self, parent)
36    }
37    fn data(&self, index: &QModelIndex, role: i32) -> QVariant {
38        <Self as QAbstractItemModel>::data(self, index, role)
39    }
40    fn role_names(&self) -> QHash_i32_QByteArray {
41        <Self as QAbstractItemModel>::role_names(self)
42    }
43    fn set_data(&mut self, index: &QModelIndex, value: &QVariant, role: i32) -> bool {
44        <Self as QAbstractItemModel>::set_data(self, index, value, role)
45    }
46    fn remove_rows(&mut self, first: i32, count: i32, parent: &QModelIndex) -> bool {
47        <Self as QAbstractItemModel>::remove_rows(self, first, count, parent)
48    }
49    fn sibling(&self, row: i32, column: i32, idx: &QModelIndex) -> QModelIndex {
50        <Self as QAbstractItemModel>::sibling(self, row, column, idx)
51    }
52}
53
54pub trait QAbstractItemModel : QObjectHolder<ProxyRust = QAbstractItemModelProxyRust> {
55    fn index(&self, row: i32, column: i32, parent: &QModelIndex) -> QModelIndex;
56    fn parent(&self, child: &QModelIndex) -> QModelIndex;
57    fn row_count(&self, parent: &QModelIndex) -> i32;
58    fn column_count(&self, parent: &QModelIndex) -> i32;
59    fn data(&self, index: &QModelIndex, role: i32) -> QVariant;
60    fn role_names(&self) -> QHash_i32_QByteArray {
61        let proxy = self.try_get_rust_proxy_ptr().expect("No proxy");
62        unsafe { &*proxy }.base_role_names(self)
63    }
64    fn set_data(&mut self, index: &QModelIndex, value: &QVariant, role: i32) -> bool {
65        let proxy = self.try_get_rust_proxy_ptr().expect("No proxy");
66        unsafe { &mut *proxy }.base_set_data(&mut *self, index, value, role)
67    }
68    fn remove_rows(&mut self, first: i32, count: i32, parent: &QModelIndex) -> bool {
69        let proxy = self.try_get_rust_proxy_ptr().expect("No proxy");
70        unsafe { &mut *proxy }.base_remove_rows(&mut *self, first, count, parent)
71    }
72    fn sibling(&self, row: i32, column: i32, idx: &QModelIndex) -> QModelIndex {
73        let proxy = self.try_get_rust_proxy_ptr().expect("No proxy");
74        unsafe { &*proxy }.base_sibling(self, row, column, idx)
75    }
76}
77
78pub trait QAbstractItemModelBase : QAbstractItemModel {
79    fn role_names(&self) -> QHash_i32_QByteArray {
80        let proxy = self.try_get_rust_proxy_ptr().expect("No proxy");
81        unsafe { &*proxy }.base_role_names(self)
82    }
83    fn set_data(
84        &mut self,
85        index: &QModelIndex,
86        value: &QVariant,
87        role: i32,
88    ) -> bool {
89        let proxy = self.try_get_rust_proxy_ptr().expect("No proxy");
90        unsafe { &mut *proxy }.base_set_data(&mut *self, index, value, role)
91    }
92    fn remove_rows(
93        &mut self,
94        first: i32,
95        count: i32,
96        parent: &QModelIndex,
97    ) -> bool {
98        let proxy = self.try_get_rust_proxy_ptr().expect("No proxy");
99        unsafe { &mut *proxy }.base_remove_rows(&mut *self, first, count, parent)
100    }
101    fn sibling(
102        &self,
103        row: i32,
104        column: i32,
105        idx: &QModelIndex,
106    ) -> QModelIndex {
107        let proxy = self.try_get_rust_proxy_ptr().expect("No proxy");
108        unsafe { &*proxy }.base_sibling(self, row, column, idx)
109    }
110    fn data_changed(
111        &mut self,
112        top_left: &QModelIndex,
113        bottom_right: &QModelIndex,
114    ) {
115        let Some(proxy) = self.try_get_rust_proxy_ptr() else { return };
116        unsafe { &mut *proxy }.base_data_changed(&mut *self, top_left, bottom_right)
117    }
118    fn begin_insert_columns(
119        &mut self,
120        parent: &QModelIndex,
121        first: i32,
122        last: i32,
123    ) {
124        let Some(proxy) = self.try_get_rust_proxy_ptr() else { return };
125        unsafe { &mut *proxy }.base_begin_insert_columns(&mut *self, parent, first, last)
126    }
127    fn end_insert_columns(&mut self) {
128        let Some(proxy) = self.try_get_rust_proxy_ptr() else { return };
129        unsafe { &mut *proxy }.base_end_insert_columns(&mut *self)
130    }
131    fn begin_insert_rows(
132        &mut self,
133        parent: &QModelIndex,
134        first: i32,
135        last: i32,
136    ) {
137        let Some(proxy) = self.try_get_rust_proxy_ptr() else { return };
138        unsafe { &mut *proxy }.base_begin_insert_rows(&mut *self, parent, first, last)
139    }
140    fn end_insert_rows(&mut self) {
141        let Some(proxy) = self.try_get_rust_proxy_ptr() else { return };
142        unsafe { &mut *proxy }.base_end_insert_rows(&mut *self)
143    }
144    fn begin_move_columns(
145        &mut self,
146        source_parent: &QModelIndex,
147        source_first: i32,
148        source_last: i32,
149        destination_parent: &QModelIndex,
150        destination_child: i32,
151    ) {
152        let Some(proxy) = self.try_get_rust_proxy_ptr() else { return };
153        unsafe { &mut *proxy }.base_begin_move_columns(
154            &mut *self,
155            source_parent,
156            source_first,
157            source_last,
158            destination_parent,
159            destination_child,
160        )
161    }
162    fn end_move_columns(&mut self) {
163        let Some(proxy) = self.try_get_rust_proxy_ptr() else { return };
164        unsafe { &mut *proxy }.base_end_move_columns(&mut *self)
165    }
166    fn begin_move_rows(
167        &mut self,
168        source_parent: &QModelIndex,
169        source_first: i32,
170        source_last: i32,
171        destination_parent: &QModelIndex,
172        destination_child: i32,
173    ) {
174        let Some(proxy) = self.try_get_rust_proxy_ptr() else { return };
175        unsafe { &mut *proxy }.base_begin_move_rows(
176            &mut *self,
177            source_parent,
178            source_first,
179            source_last,
180            destination_parent,
181            destination_child,
182        )
183    }
184    fn end_move_rows(&mut self) {
185        let Some(proxy) = self.try_get_rust_proxy_ptr() else { return };
186        unsafe { &mut *proxy }.base_end_move_rows(&mut *self)
187    }
188    fn begin_remove_columns(
189        &mut self,
190        parent: &QModelIndex,
191        first: i32,
192        last: i32,
193    ) {
194        let Some(proxy) = self.try_get_rust_proxy_ptr() else { return };
195        unsafe { &mut *proxy }.base_begin_remove_columns(&mut *self, parent, first, last)
196    }
197    fn end_remove_columns(&mut self) {
198        let Some(proxy) = self.try_get_rust_proxy_ptr() else { return };
199        unsafe { &mut *proxy }.base_end_remove_columns(&mut *self)
200    }
201    fn begin_remove_rows(
202        &mut self,
203        parent: &QModelIndex,
204        first: i32,
205        last: i32,
206    ) {
207        let Some(proxy) = self.try_get_rust_proxy_ptr() else { return };
208        unsafe { &mut *proxy }.base_begin_remove_rows(&mut *self, parent, first, last)
209    }
210    fn end_remove_rows(&mut self) {
211        let Some(proxy) = self.try_get_rust_proxy_ptr() else { return };
212        unsafe { &mut *proxy }.base_end_remove_rows(&mut *self)
213    }
214    fn begin_reset_model(&mut self) {
215        let Some(proxy) = self.try_get_rust_proxy_ptr() else { return };
216        unsafe { &mut *proxy }.base_begin_reset_model(&mut *self)
217    }
218    fn end_reset_model(&mut self) {
219        let Some(proxy) = self.try_get_rust_proxy_ptr() else { return };
220        unsafe { &mut *proxy }.base_end_reset_model(&mut *self)
221    }
222    fn create_index(
223        &self,
224        row: i32,
225        column: i32,
226        ptr: usize,
227    ) -> QModelIndex {
228        let proxy = self.try_get_rust_proxy_ptr().expect("No proxy");
229        unsafe { &*proxy }.base_create_index(self, row, column, ptr)
230    }
231}
232
233impl<T> QAbstractItemModelBase for T
234where T: QAbstractItemModel {}
235
236pub type QAbstractItemModelProxyRust = GenericRustProxy<QAbstractItemModelProxyCpp, dyn QAbstractItemModelAdapter>;
237
238impl<T: QAbstractItemModelAdapter + 'static> qtbridge_runtime::qproxies::AdapterUpcast<T> for QAbstractItemModelProxyRust {
239    fn upcast(rc: std::rc::Rc<std::cell::RefCell<T>>) -> std::rc::Rc<std::cell::RefCell<dyn QAbstractItemModelAdapter>> {
240        rc
241    }
242}
243
244impl QAbstractItemModelProxyRust {
245    pub fn index(&self, row: i32, column: i32, parent: &QModelIndex) -> QModelIndex {
246        call_rust_trait_impl!(self, index(row, column, parent))
247    }
248    pub fn parent(&self, child: &QModelIndex) -> QModelIndex {
249        call_rust_trait_impl!(self, parent(child))
250    }
251    pub fn row_count(&self, parent: &QModelIndex) -> i32 {
252        call_rust_trait_impl!(self, row_count(parent))
253    }
254    pub fn column_count(&self, parent: &QModelIndex) -> i32 {
255        call_rust_trait_impl!(self, column_count(parent))
256    }
257    pub fn data(&self, index: &QModelIndex, role: i32) -> QVariant {
258        call_rust_trait_impl!(self, data(index, role))
259    }
260    pub fn role_names(&self) -> QHash_i32_QByteArray {
261        call_rust_trait_impl!(self, role_names())
262    }
263    pub fn set_data(&mut self, index: &QModelIndex, value: &QVariant, role: i32) -> bool {
264        call_rust_trait_impl!(mut self, set_data(index, value, role))
265    }
266    pub fn remove_rows(&mut self, first: i32, count: i32, parent: &QModelIndex) -> bool {
267        call_rust_trait_impl!(mut self, remove_rows(first, count, parent))
268    }
269    pub fn sibling(&self, row: i32, column: i32, idx: &QModelIndex) -> QModelIndex {
270        call_rust_trait_impl!(self, sibling(row, column, idx))
271    }
272
273    pub fn base_role_names(&self, reference: &dyn QAbstractItemModelAdapter) -> QHash_i32_QByteArray {
274        call_cpp_impl!(self, reference, base_role_names())
275    }
276    pub fn base_set_data(&mut self, mut_ref: &mut dyn QAbstractItemModelAdapter, index: &QModelIndex, value: &QVariant, role: i32) -> bool {
277        call_cpp_impl!(mut self, mut_ref, base_set_data(index, value, role))
278    }
279    pub fn base_remove_rows(&mut self, mut_ref: &mut dyn QAbstractItemModelAdapter, first: i32, count: i32, parent: &QModelIndex) -> bool {
280        call_cpp_impl!(mut self, mut_ref, base_remove_rows(first, count, parent))
281    }
282    pub fn base_sibling(&self, reference: &dyn QAbstractItemModelAdapter, row: i32, column: i32, idx: &QModelIndex) -> QModelIndex {
283        call_cpp_impl!(self, reference, base_sibling(row, column, idx))
284    }
285    pub fn base_data_changed(&mut self, mut_ref: &mut dyn QAbstractItemModelAdapter, top_left: &QModelIndex, bottom_right: &QModelIndex) {
286        call_cpp_impl!(mut self, mut_ref, base_data_changed(top_left, bottom_right))
287    }
288    pub fn base_begin_insert_columns(&mut self, mut_ref: &mut dyn QAbstractItemModelAdapter, parent: &QModelIndex, first: i32, last: i32) {
289        call_cpp_impl!(mut self, mut_ref, base_begin_insert_columns(parent, first, last))
290    }
291    pub fn base_end_insert_columns(&mut self, mut_ref: &mut dyn QAbstractItemModelAdapter) {
292        call_cpp_impl!(mut self, mut_ref, base_end_insert_columns())
293    }
294    pub fn base_begin_insert_rows(&mut self, mut_ref: &mut dyn QAbstractItemModelAdapter, parent: &QModelIndex, first: i32, last: i32) {
295        call_cpp_impl!(mut self, mut_ref, base_begin_insert_rows(parent, first, last))
296    }
297    pub fn base_end_insert_rows(&mut self, mut_ref: &mut dyn QAbstractItemModelAdapter) {
298        call_cpp_impl!(mut self, mut_ref, base_end_insert_rows())
299    }
300    pub fn base_begin_move_columns(
301        &mut self,
302        mut_ref: &mut dyn QAbstractItemModelAdapter,
303        source_parent: &QModelIndex,
304        source_first: i32,
305        source_last: i32,
306        destination_parent: &QModelIndex,
307        destination_child: i32,
308    ) {
309        call_cpp_impl!(mut self, mut_ref, base_begin_move_columns(source_parent, source_first, source_last, destination_parent, destination_child))
310    }
311    pub fn base_end_move_columns(&mut self, mut_ref: &mut dyn QAbstractItemModelAdapter) {
312        call_cpp_impl!(mut self, mut_ref, base_end_move_columns())
313    }
314    pub fn base_begin_move_rows(
315        &mut self,
316        mut_ref: &mut dyn QAbstractItemModelAdapter,
317        source_parent: &QModelIndex,
318        source_first: i32,
319        source_last: i32,
320        destination_parent: &QModelIndex,
321        destination_child: i32,
322    ) {
323        call_cpp_impl!(mut self, mut_ref, base_begin_move_rows(source_parent, source_first, source_last, destination_parent, destination_child))
324    }
325    pub fn base_end_move_rows(&mut self, mut_ref: &mut dyn QAbstractItemModelAdapter) {
326        call_cpp_impl!(mut self, mut_ref, base_end_move_rows())
327    }
328    pub fn base_begin_remove_columns(&mut self, mut_ref: &mut dyn QAbstractItemModelAdapter, parent: &QModelIndex, first: i32, last: i32) {
329        call_cpp_impl!(mut self, mut_ref, base_begin_remove_columns(parent, first, last))
330    }
331    pub fn base_end_remove_columns(&mut self, mut_ref: &mut dyn QAbstractItemModelAdapter) {
332        call_cpp_impl!(mut self, mut_ref, base_end_remove_columns())
333    }
334    pub fn base_begin_remove_rows(&mut self, mut_ref: &mut dyn QAbstractItemModelAdapter, parent: &QModelIndex, first: i32, last: i32) {
335        call_cpp_impl!(mut self, mut_ref, base_begin_remove_rows(parent, first, last))
336    }
337    pub fn base_end_remove_rows(&mut self, mut_ref: &mut dyn QAbstractItemModelAdapter) {
338        call_cpp_impl!(mut self, mut_ref, base_end_remove_rows())
339    }
340    pub fn base_begin_reset_model(&mut self, mut_ref: &mut dyn QAbstractItemModelAdapter) {
341        call_cpp_impl!(mut self, mut_ref, base_begin_reset_model())
342    }
343    pub fn base_end_reset_model(&mut self, mut_ref: &mut dyn QAbstractItemModelAdapter) {
344        call_cpp_impl!(mut self, mut_ref, base_end_reset_model())
345    }
346    pub fn base_create_index(&self, reference: &dyn QAbstractItemModelAdapter, row: i32, column: i32, ptr: usize) -> QModelIndex {
347        call_cpp_impl!(self, reference, base_create_index(row, column, ptr))
348    }
349}