1use super::proxy_cpp_bridge::{QAbstractItemModelProxyCpp, ffi};
5use crate::{RustObjAccess, call_rust_trait_impl, call_cpp_impl};
6use qtbridge_runtime::qrustproxy::{QRustProxy, ConstructionMode};
7use qtbridge_runtime::{DispatchMetaCall, QObjectHolder};
8use qtbridge_type_lib::{QByteArray, QHash, QMetaObject, QMetaType, QModelIndex, QVariant};
9use std::cell::RefCell;
10use std::rc::Rc;
11
12pub trait QAbstractItemModelAdapter: DispatchMetaCall {
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_rows(&mut self, first: i32, count: i32, parent: &QModelIndex) -> bool;
21 fn sibling(&self, row: i32, column: i32, idx: &QModelIndex) -> QModelIndex;
22}
23
24impl<T> QAbstractItemModelAdapter for T
25where
26 T: QAbstractItemModel {
27 fn index(&self, row: i32, column: i32, parent: &QModelIndex) -> QModelIndex {
28 <Self as QAbstractItemModel>::index(self, row, column, parent)
29 }
30 fn parent(&self, child: &QModelIndex) -> QModelIndex {
31 <Self as QAbstractItemModel>::parent(self, child)
32 }
33 fn row_count(&self, parent: &QModelIndex) -> i32 {
34 <Self as QAbstractItemModel>::row_count(self, parent)
35 }
36 fn column_count(&self, parent: &QModelIndex) -> i32 {
37 <Self as QAbstractItemModel>::column_count(self, parent)
38 }
39 fn data(&self, index: &QModelIndex, role: i32) -> QVariant {
40 <Self as QAbstractItemModel>::data(self, index, role)
41 }
42 fn role_names(&self) -> QHash<i32, QByteArray> {
43 <Self as QAbstractItemModel>::role_names(self)
44 }
45 fn set_data(&mut self, index: &QModelIndex, value: &QVariant, role: i32) -> bool {
46 <Self as QAbstractItemModel>::set_data(self, index, value, role)
47 }
48 fn remove_rows(&mut self, first: i32, count: i32, parent: &QModelIndex) -> bool {
49 <Self as QAbstractItemModel>::remove_rows(self, first, count, parent)
50 }
51 fn sibling(&self, row: i32, column: i32, idx: &QModelIndex) -> QModelIndex {
52 <Self as QAbstractItemModel>::sibling(self, row, column, idx)
53 }
54}
55
56pub trait QAbstractItemModel : QObjectHolder<ProxyRust = QAbstractItemModelProxyRust> {
57 fn index(&self, row: i32, column: i32, parent: &QModelIndex) -> QModelIndex;
58 fn parent(&self, child: &QModelIndex) -> QModelIndex;
59 fn row_count(&self, parent: &QModelIndex) -> i32;
60 fn column_count(&self, parent: &QModelIndex) -> i32;
61 fn data(&self, index: &QModelIndex, role: i32) -> QVariant;
62 fn role_names(&self) -> QHash<i32, QByteArray> {
63 let proxy = self.get_rust_proxy();
64 proxy.base_role_names()
65 }
66 fn set_data(&mut self, index: &QModelIndex, value: &QVariant, role: i32) -> bool {
67 let proxy = self.get_rust_proxy_mut();
68 proxy.base_set_data(index, value, role)
69 }
70 fn remove_rows(&mut self, first: i32, count: i32, parent: &QModelIndex) -> bool {
71 let proxy = self.get_rust_proxy_mut();
72 proxy.base_remove_rows(first, count, parent)
73 }
74 fn sibling(&self, row: i32, column: i32, idx: &QModelIndex) -> QModelIndex {
75 let proxy = self.get_rust_proxy();
76 proxy.base_sibling(row, column, idx)
77 }
78}
79
80pub trait QAbstractItemModelBase : QObjectHolder<ProxyRust = QAbstractItemModelProxyRust> {
81fn role_names(&self) -> qtbridge_type_lib::QHash<i32, qtbridge_type_lib::QByteArray> {
82 let proxy = self.get_rust_proxy();
83 proxy.base_role_names()
84 }
85 fn set_data(
86 &mut self,
87 index: &qtbridge_type_lib::QModelIndex,
88 value: &qtbridge_type_lib::QVariant,
89 role: i32,
90 ) -> bool {
91 let proxy = self.get_rust_proxy_mut();
92 proxy.base_set_data(index, value, role)
93 }
94 fn remove_rows(
95 &mut self,
96 first: i32,
97 count: i32,
98 parent: &qtbridge_type_lib::QModelIndex,
99 ) -> bool {
100 let proxy = self.get_rust_proxy_mut();
101 proxy.base_remove_rows(first, count, parent)
102 }
103 fn sibling(
104 &self,
105 row: i32,
106 column: i32,
107 idx: &qtbridge_type_lib::QModelIndex,
108 ) -> qtbridge_type_lib::QModelIndex {
109 let proxy = self.get_rust_proxy();
110 proxy.base_sibling(row, column, idx)
111 }
112 fn data_changed(
113 &mut self,
114 top_left: &qtbridge_type_lib::QModelIndex,
115 bottom_right: &qtbridge_type_lib::QModelIndex,
116 ) {
117 let proxy = self.get_rust_proxy_mut();
118 proxy.base_data_changed(top_left, bottom_right)
119 }
120 fn begin_insert_columns(
121 &mut self,
122 parent: &qtbridge_type_lib::QModelIndex,
123 first: i32,
124 last: i32,
125 ) {
126 let proxy = self.get_rust_proxy_mut();
127 proxy.base_begin_insert_columns(parent, first, last)
128 }
129 fn end_insert_columns(&mut self) {
130 let proxy = self.get_rust_proxy_mut();
131 proxy.base_end_insert_columns()
132 }
133 fn begin_insert_rows(
134 &mut self,
135 parent: &qtbridge_type_lib::QModelIndex,
136 first: i32,
137 last: i32,
138 ) {
139 let proxy = self.get_rust_proxy_mut();
140 proxy.base_begin_insert_rows(parent, first, last)
141 }
142 fn end_insert_rows(&mut self) {
143 let proxy = self.get_rust_proxy_mut();
144 proxy.base_end_insert_rows()
145 }
146 fn begin_move_columns(
147 &mut self,
148 source_parent: &qtbridge_type_lib::QModelIndex,
149 source_first: i32,
150 source_last: i32,
151 destination_parent: &qtbridge_type_lib::QModelIndex,
152 destination_child: i32,
153 ) {
154 let proxy = self.get_rust_proxy_mut();
155 proxy
156 .base_begin_move_columns(
157 source_parent,
158 source_first,
159 source_last,
160 destination_parent,
161 destination_child,
162 )
163 }
164 fn end_move_columns(&mut self) {
165 let proxy = self.get_rust_proxy_mut();
166 proxy.base_end_move_columns()
167 }
168 fn begin_move_rows(
169 &mut self,
170 source_parent: &qtbridge_type_lib::QModelIndex,
171 source_first: i32,
172 source_last: i32,
173 destination_parent: &qtbridge_type_lib::QModelIndex,
174 destination_child: i32,
175 ) {
176 let proxy = self.get_rust_proxy_mut();
177 proxy
178 .base_begin_move_rows(
179 source_parent,
180 source_first,
181 source_last,
182 destination_parent,
183 destination_child,
184 )
185 }
186 fn end_move_rows(&mut self) {
187 let proxy = self.get_rust_proxy_mut();
188 proxy.base_end_move_rows()
189 }
190 fn begin_remove_columns(
191 &mut self,
192 parent: &qtbridge_type_lib::QModelIndex,
193 first: i32,
194 last: i32,
195 ) {
196 let proxy = self.get_rust_proxy_mut();
197 proxy.base_begin_remove_columns(parent, first, last)
198 }
199 fn end_remove_columns(&mut self) {
200 let proxy = self.get_rust_proxy_mut();
201 proxy.base_end_remove_columns()
202 }
203 fn begin_remove_rows(
204 &mut self,
205 parent: &qtbridge_type_lib::QModelIndex,
206 first: i32,
207 last: i32,
208 ) {
209 let proxy = self.get_rust_proxy_mut();
210 proxy.base_begin_remove_rows(parent, first, last)
211 }
212 fn end_remove_rows(&mut self) {
213 let proxy = self.get_rust_proxy_mut();
214 proxy.base_end_remove_rows()
215 }
216 fn begin_reset_model(&mut self) {
217 let proxy = self.get_rust_proxy_mut();
218 proxy.base_begin_reset_model()
219 }
220 fn end_reset_model(&mut self) {
221 let proxy = self.get_rust_proxy_mut();
222 proxy.base_end_reset_model()
223 }
224 fn create_index(
225 &self,
226 row: i32,
227 column: i32,
228 ptr: usize,
229 ) -> qtbridge_type_lib::QModelIndex {
230 let proxy = self.get_rust_proxy_mut();
231 unsafe { proxy.base_create_index(row, column, ptr) }
232 }
233}
234
235impl<T> QAbstractItemModelBase for T
236where T: QObjectHolder<ProxyRust = QAbstractItemModelProxyRust> {}
237
238pub struct QAbstractItemModelProxyRust {
239 cpp_proxy: *mut QAbstractItemModelProxyCpp,
240 #[allow(dead_code)]
241 rust_obj: RustObjAccess<dyn QAbstractItemModelAdapter>,
242 on_drop: Box<dyn FnOnce()>,
243}
244
245impl QRustProxy for QAbstractItemModelProxyRust {
246 type ProxyCppType = QAbstractItemModelProxyCpp;
247 type AdapterType = dyn QAbstractItemModelAdapter;
248
249 fn new<OnDropFn: FnOnce() + 'static>(rust_obj: &Rc<RefCell<dyn QAbstractItemModelAdapter>>, construct: ConstructionMode, on_drop: OnDropFn) -> *mut Self {
250 let boxed_self = Box::new(Self {
251 cpp_proxy: std::ptr::null_mut(),
252 rust_obj: match construct {
253 ConstructionMode::Strong | ConstructionMode::AtAddress(_) => RustObjAccess::new_strong(rust_obj.clone()),
254 ConstructionMode::Weak => RustObjAccess::new_weak(Rc::downgrade(rust_obj)),
255 },
256 on_drop: Box::new(on_drop),
257 });
258 let raw_self = Box::into_raw(boxed_self);
259
260 unsafe{ (*raw_self).cpp_proxy = match construct {
261 ConstructionMode::AtAddress(addr) => {
262 ffi::create_qabstract_item_model_proxy_cpp_at(addr, raw_self)
263 }
264 ConstructionMode::Strong | ConstructionMode::Weak => {
265 ffi::create_qabstract_item_model_proxy_cpp(raw_self)
266 }
267 }};
268 raw_self
269 }
270 fn get_static_meta_object() -> &'static QMetaObject {
271 ffi::static_qmeta_object_of_qabstract_item_model_proxy_cpp()
272 }
273 fn get_size_of_cpp_proxy() -> usize {
274 ffi::size_of_qabstract_item_model_proxy_cpp()
275 }
276 fn get_align_of_cpp_proxy() -> usize {
277 ffi::align_of_qabstract_item_model_proxy_cpp()
278 }
279 fn get_qmetatype_list_of_cpp_proxy() -> QMetaType {
280 ffi::qmetatype_list_of_qabstract_item_model_proxy_cpp()
281 }
282 fn get_cpp_proxy(&self) -> *const QAbstractItemModelProxyCpp {
283 self.cpp_proxy as *const _
284 }
285 fn get_cpp_proxy_mut(&self) -> *mut QAbstractItemModelProxyCpp {
286 self.cpp_proxy
287 }
288}
289
290impl QAbstractItemModelProxyRust {
291 pub fn drop_self(self_ptr: *mut Self) {
292 let boxed_self = unsafe { Box::from_raw(self_ptr) };
293 (boxed_self.on_drop)();
294 }
295 pub fn index(&self, row: i32, column: i32, parent: &QModelIndex) -> QModelIndex {
296 call_rust_trait_impl!(self, index(row, column, parent))
297 }
298 pub fn parent(&self, child: &QModelIndex) -> QModelIndex {
299 call_rust_trait_impl!(self, parent(child))
300 }
301 pub fn row_count(&self, parent: &QModelIndex) -> i32 {
302 call_rust_trait_impl!(self, row_count(parent))
303 }
304 pub fn column_count(&self, parent: &QModelIndex) -> i32 {
305 call_rust_trait_impl!(self, column_count(parent))
306 }
307 pub fn data(&self, index: &QModelIndex, role: i32) -> QVariant {
308 call_rust_trait_impl!(self, data(index, role))
309 }
310 pub fn role_names(&self) -> QHash<i32, QByteArray> {
311 call_rust_trait_impl!(self, role_names())
312 }
313 pub fn set_data(&mut self, index: &QModelIndex, value: &QVariant, role: i32) -> bool {
314 call_rust_trait_impl!(mut self, set_data(index, value, role))
315 }
316 pub fn remove_rows(&mut self, first: i32, count: i32, parent: &QModelIndex) -> bool {
317 call_rust_trait_impl!(mut self, remove_rows(first, count, parent))
318 }
319 pub fn sibling(&self, row: i32, column: i32, idx: &QModelIndex) -> QModelIndex {
320 call_rust_trait_impl!(self, sibling(row, column, idx))
321 }
322
323 pub fn invoke_slot(&self, slot_id: u32, inputs: &[*const u8], outputs: &[*mut u8]) {
324 call_rust_trait_impl!(self, invoke_slot(slot_id, inputs, outputs))
325 }
326 pub fn invoke_slot_mut(&mut self, slot_id: u32, inputs: &[*const u8], outputs: &[*mut u8]) {
327 call_rust_trait_impl!(mut self, invoke_slot_mut(slot_id, inputs, outputs))
328 }
329 pub fn read_property(&self, prop_id: u32) -> QVariant {
330 call_rust_trait_impl!(self, read_property(prop_id))
331 }
332 pub fn write_property(&mut self, prop_id: u32, value: &QVariant) {
333 call_rust_trait_impl!(mut self, write_property(prop_id, value))
334 }
335
336 pub fn base_role_names(&self) -> QHash<i32, QByteArray> {
337 call_cpp_impl!(self, base_role_names())
338 }
339 pub fn base_set_data(&mut self, index: &QModelIndex, value: &QVariant, role: i32) -> bool {
340 call_cpp_impl!(mut self, base_set_data(index, value, role))
341 }
342 pub fn base_remove_rows(&mut self, first: i32, count: i32, parent: &QModelIndex) -> bool {
343 call_cpp_impl!(mut self, base_remove_rows(first, count, parent))
344 }
345 pub fn base_sibling(&self, row: i32, column: i32, idx: &QModelIndex) -> QModelIndex {
346 call_cpp_impl!(self, base_sibling(row, column, idx))
347 }
348 pub fn base_data_changed(&mut self, top_left: &QModelIndex, bottom_right: &QModelIndex) {
349 call_cpp_impl!(mut self, base_data_changed(top_left, bottom_right))
350 }
351 pub fn base_begin_insert_columns(&mut self, parent: &QModelIndex, first: i32, last: i32) {
352 call_cpp_impl!(mut self, base_begin_insert_columns(parent, first, last))
353 }
354 pub fn base_end_insert_columns(&mut self) {
355 call_cpp_impl!(mut self, base_end_insert_columns())
356 }
357 pub fn base_begin_insert_rows(&mut self, parent: &QModelIndex, first: i32, last: i32) {
358 call_cpp_impl!(mut self, base_begin_insert_rows(parent, first, last))
359 }
360 pub fn base_end_insert_rows(&mut self) {
361 call_cpp_impl!(mut self, base_end_insert_rows())
362 }
363 pub fn base_begin_move_columns(
364 &mut self,
365 source_parent: &QModelIndex,
366 source_first: i32,
367 source_last: i32,
368 destination_parent: &QModelIndex,
369 destination_child: i32,
370 ) {
371 call_cpp_impl!(mut self, base_begin_move_columns(source_parent, source_first, source_last, destination_parent, destination_child))
372 }
373 pub fn base_end_move_columns(&mut self) {
374 call_cpp_impl!(mut self, base_end_move_columns())
375 }
376 pub fn base_begin_move_rows(&mut self, source_parent: &QModelIndex, source_first: i32, source_last: i32, destination_parent: &QModelIndex, destination_child: i32) {
377 call_cpp_impl!(mut self, base_begin_move_rows(source_parent, source_first, source_last, destination_parent, destination_child))
378 }
379 pub fn base_end_move_rows(&mut self) {
380 call_cpp_impl!(mut self, base_end_move_rows())
381 }
382 pub fn base_begin_remove_columns(&mut self, parent: &QModelIndex, first: i32, last: i32) {
383 call_cpp_impl!(mut self, base_begin_remove_columns(parent, first, last))
384 }
385 pub fn base_end_remove_columns(&mut self) {
386 call_cpp_impl!(mut self, base_end_remove_columns())
387 }
388 pub fn base_begin_remove_rows(&mut self, parent: &QModelIndex, first: i32, last: i32) {
389 call_cpp_impl!(mut self, base_begin_remove_rows(parent, first, last))
390 }
391 pub fn base_end_remove_rows(&mut self) {
392 call_cpp_impl!(mut self, base_end_remove_rows())
393 }
394 pub fn base_begin_reset_model(&mut self) {
395 call_cpp_impl!(mut self, base_begin_reset_model())
396 }
397 pub fn base_end_reset_model(&mut self) {
398 call_cpp_impl!(mut self, base_end_reset_model())
399 }
400 pub unsafe fn base_create_index(&self, row: i32, column: i32, ptr: usize) -> QModelIndex {
401 call_cpp_impl!(self, base_create_index(row, column, ptr))
402 }
403}