1use super::proxy_cpp_bridge::{QAbstractListModelProxyCpp, 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 QAbstractListModel : QObjectHolder<ProxyRust = QAbstractListModelProxyRust> {
13 fn index(&self, row: i32, column: i32, parent: &QModelIndex) -> QModelIndex {
14 let proxy = self.get_rust_proxy();
15 proxy.base_index(row, column, parent)
16 }
17 fn row_count(&self, parent: &QModelIndex) -> i32;
18 fn data(&self, index: &QModelIndex, role: i32) -> QVariant;
19 fn role_names(&self) -> QHash<i32, QByteArray> {
20 let proxy = self.get_rust_proxy();
21 proxy.base_role_names()
22 }
23 fn set_data(&mut self, index: &QModelIndex, value: &QVariant, role: i32) -> bool {
24 let proxy = self.get_rust_proxy_mut();
25 proxy.base_set_data(index, value, role)
26 }
27 fn remove_rows(&mut self, first: i32, count: i32, parent: &QModelIndex) -> bool {
28 let proxy = self.get_rust_proxy_mut();
29 proxy.base_remove_rows(first, count, parent)
30 }
31 fn sibling(&self, row: i32, column: i32, idx: &QModelIndex) -> QModelIndex {
32 let proxy = self.get_rust_proxy();
33 proxy.base_sibling(row, column, idx)
34 }
35}
36
37pub trait QAbstractListModelAdapter: DispatchMetaCall {
38 fn index(&self, row: i32, column: i32, parent: &QModelIndex) -> QModelIndex;
39 fn row_count(&self, parent: &QModelIndex) -> i32;
40 fn data(&self, index: &QModelIndex, role: i32) -> QVariant;
41 fn role_names(&self) -> QHash<i32, QByteArray>;
42 fn set_data(&mut self, index: &QModelIndex, value: &QVariant, role: i32) -> bool;
43 fn remove_rows(&mut self, first: i32, count: i32, parent: &QModelIndex) -> bool;
44 fn sibling(&self, row: i32, column: i32, idx: &QModelIndex) -> QModelIndex;
45}
46
47impl<T> QAbstractListModelAdapter for T
48where
49 T : QAbstractListModel +
50 QObjectHolder<ProxyRust = QAbstractListModelProxyRust>
51{
52 fn index(&self, row: i32, column: i32, parent: &QModelIndex) -> QModelIndex {
53 <Self as QAbstractListModel>::index(self, row, column, parent)
54 }
55 fn row_count(&self, parent: &QModelIndex) -> i32 {
56 <Self as QAbstractListModel>::row_count(self, parent)
57 }
58 fn data(&self, index: &QModelIndex, role: i32) -> QVariant {
59 <Self as QAbstractListModel>::data(self, index, role)
60 }
61 fn role_names(&self) -> QHash<i32, QByteArray> {
62 <Self as QAbstractListModel>::role_names(self)
63 }
64 fn set_data(&mut self, index: &QModelIndex, value: &QVariant, role: i32) -> bool {
65 <Self as QAbstractListModel>::set_data(self, index, value, role)
66 }
67 fn remove_rows(&mut self, first: i32, count: i32, parent: &QModelIndex) -> bool {
68 <Self as QAbstractListModel>::remove_rows(self, first, count, parent)
69 }
70 fn sibling(&self, row: i32, column: i32, idx: &QModelIndex) -> QModelIndex {
71 <Self as QAbstractListModel>::sibling(self, row, column, idx)
72 }
73}
74
75pub trait QAbstractListModelBase : QObjectHolder<ProxyRust = QAbstractListModelProxyRust> {
76 fn index(&self, row: i32, column: i32, parent: &QModelIndex) -> QModelIndex {
77 let proxy = self.get_rust_proxy();
78 proxy.base_index(row, column, parent)
79 }
80 fn role_names(&self) -> QHash<i32, QByteArray> {
81 let proxy = self.get_rust_proxy();
82 proxy.base_role_names()
83 }
84 fn set_data(&mut self, index: &QModelIndex, value: &QVariant, role: i32) -> bool {
85 let proxy = self.get_rust_proxy_mut();
86 proxy.base_set_data(index, value, role)
87 }
88 fn remove_rows(&mut self, first: i32, count: i32, parent: &QModelIndex) -> bool {
89 let proxy = self.get_rust_proxy_mut();
90 proxy.base_remove_rows(first, count, parent)
91 }
92 fn sibling(&self, row: i32, column: i32, idx: &QModelIndex) -> QModelIndex {
93 let proxy = self.get_rust_proxy();
94 proxy.base_sibling(row, column, idx)
95 }
96 fn data_changed(&mut self, top_left: &QModelIndex, bottom_right: &QModelIndex) {
97 let proxy = self.get_rust_proxy_mut();
98 proxy.base_data_changed(top_left, bottom_right);
99 }
100 fn begin_insert_rows(&mut self, parent: &QModelIndex, first: i32, last: i32) {
101 let proxy = self.get_rust_proxy_mut();
102 proxy.base_begin_insert_rows(parent, first, last);
103 }
104 fn end_insert_rows(&mut self) {
105 let proxy = self.get_rust_proxy_mut();
106 proxy.base_end_insert_rows();
107 }
108 fn begin_move_rows(&mut self, source_parent: &QModelIndex, source_first: i32, source_last: i32,
109 destination_parent: &QModelIndex, destination_child: i32) {
110 let proxy = self.get_rust_proxy_mut();
111 proxy.base_begin_move_rows(source_parent, source_first,
112 source_last, destination_parent, destination_child);
113 }
114 fn end_move_rows(&mut self) {
115 let proxy = self.get_rust_proxy_mut();
116 proxy.base_end_move_rows();
117 }
118 fn begin_remove_rows(&mut self, parent: &QModelIndex, first: i32, last: i32) {
119 let proxy = self.get_rust_proxy_mut();
120 proxy.base_begin_remove_rows(parent, first, last);
121 }
122 fn end_remove_rows(&mut self) {
123 let proxy = self.get_rust_proxy_mut();
124 proxy.base_end_remove_rows();
125 }
126 fn begin_reset_model(&mut self) {
127 let proxy = self.get_rust_proxy_mut();
128 proxy.base_begin_reset_model();
129 }
130 fn end_reset_model(&mut self) {
131 let proxy = self.get_rust_proxy_mut();
132 proxy.base_end_reset_model();
133 }
134}
135
136impl<T> QAbstractListModelBase for T
137where
138 T : QObjectHolder<ProxyRust = QAbstractListModelProxyRust> {}
139
140pub struct QAbstractListModelProxyRust {
141 cpp_proxy: *mut QAbstractListModelProxyCpp,
142 #[allow(dead_code)]
143 rust_obj: RustObjAccess<dyn QAbstractListModelAdapter>,
144 on_drop: Box<dyn FnOnce()>,
145}
146
147impl QRustProxy for QAbstractListModelProxyRust {
148 type ProxyCppType = QAbstractListModelProxyCpp;
149 type AdapterType = dyn QAbstractListModelAdapter;
150
151 fn new<OnDropFn: FnOnce() + 'static>(rust_obj: &Rc<RefCell<dyn QAbstractListModelAdapter>>, construct: ConstructionMode, on_drop: OnDropFn) -> *mut Self {
152 let boxed_self = Box::new(Self {
153 cpp_proxy: std::ptr::null_mut(),
154 rust_obj: match construct {
155 ConstructionMode::Strong | ConstructionMode::AtAddress(_) => RustObjAccess::new_strong(rust_obj.clone()),
156 ConstructionMode::Weak => RustObjAccess::new_weak(Rc::downgrade(rust_obj)),
157 },
158 on_drop: Box::new(on_drop),
159 });
160 let raw_self = Box::into_raw(boxed_self);
161
162
163 unsafe{ (*raw_self).cpp_proxy = match construct {
164 ConstructionMode::AtAddress(addr) => {
165 ffi::create_qabstract_list_model_proxy_cpp_at( addr, raw_self)
166 }
167 ConstructionMode::Strong | ConstructionMode::Weak => {
168 ffi::create_qabstract_list_model_proxy_cpp(raw_self)
169 }
170 }};
171 raw_self
172 }
173 fn get_static_meta_object() -> &'static QMetaObject {
174 ffi::static_qmeta_object_of_qabstract_list_model_proxy_cpp()
175 }
176 fn get_size_of_cpp_proxy() -> usize {
177 ffi::size_of_qabstract_list_model_proxy_cpp()
178 }
179 fn get_align_of_cpp_proxy() -> usize {
180 ffi::align_of_qabstract_list_model_proxy_cpp()
181 }
182 fn get_qmetatype_list_of_cpp_proxy() -> QMetaType {
183 ffi::qmetatype_list_of_qabstract_list_model_proxy_cpp()
184 }
185 fn get_cpp_proxy(&self) -> *const QAbstractListModelProxyCpp {
186 self.cpp_proxy as *const _
187 }
188 fn get_cpp_proxy_mut(&self) -> *mut QAbstractListModelProxyCpp {
189 self.cpp_proxy
190 }
191}
192
193impl QAbstractListModelProxyRust {
194 pub fn drop_self(self_ptr: *mut Self) {
195 let boxed_self = unsafe { Box::from_raw(self_ptr) };
196 (boxed_self.on_drop)();
197 }
198 pub fn index(&self, row: i32, column: i32, parent: &QModelIndex) -> QModelIndex {
199 call_rust_trait_impl!(self, index(row, column, parent))
200 }
201 pub fn row_count(&self, parent: &QModelIndex) -> i32 {
202 call_rust_trait_impl!(self, row_count(parent))
203 }
204 pub fn data(&self, index: &QModelIndex, role: i32) -> QVariant {
205 call_rust_trait_impl!(self, data(index, role))
206 }
207 pub fn role_names(&self) -> QHash<i32, QByteArray> {
208 call_rust_trait_impl!(self, role_names())
209 }
210 pub fn set_data(&mut self, index: &QModelIndex, value: &QVariant, role: i32) -> bool {
211 call_rust_trait_impl!(mut self, set_data(index, value, role))
212 }
213 pub fn remove_rows(&mut self, first: i32, count: i32, parent: &QModelIndex) -> bool {
214 call_rust_trait_impl!(mut self, remove_rows(first, count, parent))
215 }
216 pub fn sibling(&self, row: i32, column: i32, idx: &QModelIndex) -> QModelIndex {
217 call_rust_trait_impl!(self, sibling(row, column, idx))
218 }
219
220 pub fn invoke_slot(&self, slot_id: u32, inputs: &[*const u8], outputs: &[*mut u8]) {
221 call_rust_trait_impl!(self, invoke_slot(slot_id, inputs, outputs))
222 }
223 pub fn invoke_slot_mut(&mut self, slot_id: u32, inputs: &[*const u8], outputs: &[*mut u8]) {
224 call_rust_trait_impl!(mut self, invoke_slot_mut(slot_id, inputs, outputs))
225 }
226 pub fn read_property(&self, prop_id: u32) -> QVariant {
227 call_rust_trait_impl!(self, read_property(prop_id))
228 }
229 pub fn write_property(&mut self, prop_id: u32, value: &QVariant) {
230 call_rust_trait_impl!(mut self, write_property(prop_id, value))
231 }
232
233 pub fn base_index(&self, row: i32, column: i32, parent: &QModelIndex) -> QModelIndex {
234 call_cpp_impl!(self, base_index(row, column, parent))
235 }
236 pub fn base_role_names(&self) -> QHash<i32, QByteArray> {
237 call_cpp_impl!(self, base_role_names())
238 }
239 pub fn base_set_data(&mut self, index: &QModelIndex, value: &QVariant, role: i32) -> bool {
240 call_cpp_impl!(mut self, base_set_data(index, value, role))
241 }
242 pub fn base_remove_rows(&mut self, first: i32, count: i32, parent: &QModelIndex) -> bool {
243 call_cpp_impl!(mut self, base_remove_rows(first, count, parent))
244 }
245 pub fn base_sibling(&self, row: i32, column: i32, idx: &QModelIndex) -> QModelIndex {
246 call_cpp_impl!(self, base_sibling(row, column, idx))
247 }
248 pub fn base_data_changed(&mut self, top_left: &QModelIndex, bottom_right: &QModelIndex) {
249 call_cpp_impl!(mut self, base_data_changed(top_left, bottom_right))
250 }
251 pub fn base_begin_insert_rows(&mut self, parent: &QModelIndex, first: i32, last: i32) {
252 call_cpp_impl!(mut self, base_begin_insert_rows(parent, first, last))
253 }
254 pub fn base_end_insert_rows(&mut self) {
255 call_cpp_impl!(mut self, base_end_insert_rows())
256 }
257 pub fn base_begin_move_rows(&mut self, source_parent: &QModelIndex, source_first: i32, source_last: i32, destination_parent: &QModelIndex, destination_child: i32) {
258 call_cpp_impl!(mut self, base_begin_move_rows(source_parent, source_first, source_last, destination_parent, destination_child))
259 }
260 pub fn base_end_move_rows(&mut self) {
261 call_cpp_impl!(mut self, base_end_move_rows())
262 }
263 pub fn base_begin_remove_rows(&mut self, parent: &QModelIndex, first: i32, last: i32) {
264 call_cpp_impl!(mut self, base_begin_remove_rows(parent, first, last))
265 }
266 pub fn base_end_remove_rows(&mut self) {
267 call_cpp_impl!(mut self, base_end_remove_rows())
268 }
269 pub fn base_begin_reset_model(&mut self) {
270 call_cpp_impl!(mut self, base_begin_reset_model())
271 }
272 pub fn base_end_reset_model(&mut self) {
273 call_cpp_impl!(mut self, base_end_reset_model())
274 }
275}