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 { &*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 { &*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 { &*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 { &*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 { &*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 { &*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 { &*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 { &*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 { &*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 { &*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 { &*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 { &*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 { &*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 { &*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 { &*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 { &*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 { &*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 { &*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 { &*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
238// SAFETY: `upcast` is an unsizing coercion of the same allocation.
239unsafe impl<T: QAbstractItemModelAdapter + 'static> qtbridge_runtime::qproxies::AdapterUpcast<T> for QAbstractItemModelProxyRust {
240    fn upcast(rc: std::rc::Rc<std::cell::RefCell<T>>) -> std::rc::Rc<std::cell::RefCell<dyn QAbstractItemModelAdapter>> {
241        rc
242    }
243}
244
245impl QAbstractItemModelProxyRust {
246    pub fn index(&self, row: i32, column: i32, parent: &QModelIndex) -> QModelIndex {
247        call_rust_trait_impl!(self, index(row, column, parent))
248    }
249    pub fn parent(&self, child: &QModelIndex) -> QModelIndex {
250        call_rust_trait_impl!(self, parent(child))
251    }
252    pub fn row_count(&self, parent: &QModelIndex) -> i32 {
253        call_rust_trait_impl!(self, row_count(parent))
254    }
255    pub fn column_count(&self, parent: &QModelIndex) -> i32 {
256        call_rust_trait_impl!(self, column_count(parent))
257    }
258    pub fn data(&self, index: &QModelIndex, role: i32) -> QVariant {
259        call_rust_trait_impl!(self, data(index, role))
260    }
261    pub fn role_names(&self) -> QHash_i32_QByteArray {
262        call_rust_trait_impl!(self, role_names())
263    }
264    pub fn set_data(&mut self, index: &QModelIndex, value: &QVariant, role: i32) -> bool {
265        call_rust_trait_impl!(mut self, set_data(index, value, role))
266    }
267    pub fn remove_rows(&mut self, first: i32, count: i32, parent: &QModelIndex) -> bool {
268        call_rust_trait_impl!(mut self, remove_rows(first, count, parent))
269    }
270    pub fn sibling(&self, row: i32, column: i32, idx: &QModelIndex) -> QModelIndex {
271        call_rust_trait_impl!(self, sibling(row, column, idx))
272    }
273
274    pub fn base_role_names(&self, reference: &dyn QAbstractItemModelAdapter) -> QHash_i32_QByteArray {
275        call_cpp_impl!(self, reference, base_role_names())
276    }
277    pub fn base_set_data(&self, mut_ref: &mut dyn QAbstractItemModelAdapter, index: &QModelIndex, value: &QVariant, role: i32) -> bool {
278        call_cpp_impl!(mut self, mut_ref, base_set_data(index, value, role))
279    }
280    pub fn base_remove_rows(&self, mut_ref: &mut dyn QAbstractItemModelAdapter, first: i32, count: i32, parent: &QModelIndex) -> bool {
281        call_cpp_impl!(mut self, mut_ref, base_remove_rows(first, count, parent))
282    }
283    pub fn base_sibling(&self, reference: &dyn QAbstractItemModelAdapter, row: i32, column: i32, idx: &QModelIndex) -> QModelIndex {
284        call_cpp_impl!(self, reference, base_sibling(row, column, idx))
285    }
286    pub fn base_data_changed(&self, mut_ref: &mut dyn QAbstractItemModelAdapter, top_left: &QModelIndex, bottom_right: &QModelIndex) {
287        call_cpp_impl!(mut self, mut_ref, base_data_changed(top_left, bottom_right))
288    }
289    pub fn base_begin_insert_columns(&self, mut_ref: &mut dyn QAbstractItemModelAdapter, parent: &QModelIndex, first: i32, last: i32) {
290        call_cpp_impl!(mut self, mut_ref, base_begin_insert_columns(parent, first, last))
291    }
292    pub fn base_end_insert_columns(&self, mut_ref: &mut dyn QAbstractItemModelAdapter) {
293        call_cpp_impl!(mut self, mut_ref, base_end_insert_columns())
294    }
295    pub fn base_begin_insert_rows(&self, mut_ref: &mut dyn QAbstractItemModelAdapter, parent: &QModelIndex, first: i32, last: i32) {
296        call_cpp_impl!(mut self, mut_ref, base_begin_insert_rows(parent, first, last))
297    }
298    pub fn base_end_insert_rows(&self, mut_ref: &mut dyn QAbstractItemModelAdapter) {
299        call_cpp_impl!(mut self, mut_ref, base_end_insert_rows())
300    }
301    pub fn base_begin_move_columns(
302        &self,
303        mut_ref: &mut dyn QAbstractItemModelAdapter,
304        source_parent: &QModelIndex,
305        source_first: i32,
306        source_last: i32,
307        destination_parent: &QModelIndex,
308        destination_child: i32,
309    ) {
310        call_cpp_impl!(mut self, mut_ref, base_begin_move_columns(source_parent, source_first, source_last, destination_parent, destination_child))
311    }
312    pub fn base_end_move_columns(&self, mut_ref: &mut dyn QAbstractItemModelAdapter) {
313        call_cpp_impl!(mut self, mut_ref, base_end_move_columns())
314    }
315    pub fn base_begin_move_rows(
316        &self,
317        mut_ref: &mut dyn QAbstractItemModelAdapter,
318        source_parent: &QModelIndex,
319        source_first: i32,
320        source_last: i32,
321        destination_parent: &QModelIndex,
322        destination_child: i32,
323    ) {
324        call_cpp_impl!(mut self, mut_ref, base_begin_move_rows(source_parent, source_first, source_last, destination_parent, destination_child))
325    }
326    pub fn base_end_move_rows(&self, mut_ref: &mut dyn QAbstractItemModelAdapter) {
327        call_cpp_impl!(mut self, mut_ref, base_end_move_rows())
328    }
329    pub fn base_begin_remove_columns(&self, mut_ref: &mut dyn QAbstractItemModelAdapter, parent: &QModelIndex, first: i32, last: i32) {
330        call_cpp_impl!(mut self, mut_ref, base_begin_remove_columns(parent, first, last))
331    }
332    pub fn base_end_remove_columns(&self, mut_ref: &mut dyn QAbstractItemModelAdapter) {
333        call_cpp_impl!(mut self, mut_ref, base_end_remove_columns())
334    }
335    pub fn base_begin_remove_rows(&self, mut_ref: &mut dyn QAbstractItemModelAdapter, parent: &QModelIndex, first: i32, last: i32) {
336        call_cpp_impl!(mut self, mut_ref, base_begin_remove_rows(parent, first, last))
337    }
338    pub fn base_end_remove_rows(&self, mut_ref: &mut dyn QAbstractItemModelAdapter) {
339        call_cpp_impl!(mut self, mut_ref, base_end_remove_rows())
340    }
341    pub fn base_begin_reset_model(&self, mut_ref: &mut dyn QAbstractItemModelAdapter) {
342        call_cpp_impl!(mut self, mut_ref, base_begin_reset_model())
343    }
344    pub fn base_end_reset_model(&self, mut_ref: &mut dyn QAbstractItemModelAdapter) {
345        call_cpp_impl!(mut self, mut_ref, base_end_reset_model())
346    }
347    pub fn base_create_index(&self, reference: &dyn QAbstractItemModelAdapter, row: i32, column: i32, ptr: usize) -> QModelIndex {
348        call_cpp_impl!(self, reference, base_create_index(row, column, ptr))
349    }
350}