use super::proxy_cpp_bridge::QTableModelProxyCpp;
use crate::{call_rust_trait_impl, call_cpp_impl};
use qtbridge_runtime::{DispatchMetaCall, QObjectHolder};
use qtbridge_runtime::QModelItem;
use crate::genericrustproxy::GenericRustProxy;
use qtbridge_type_lib::{QByteArray, QHash, QModelIndex, QVariant};
#[doc(hidden)]
pub trait QTableModelAdapter: DispatchMetaCall + 'static {
fn index(&self, row: i32, column: i32, parent: &QModelIndex) -> QModelIndex;
fn parent(&self, child: &QModelIndex) -> QModelIndex;
fn row_count(&self, parent: &QModelIndex) -> i32;
fn column_count(&self, parent: &QModelIndex) -> i32;
fn data(&self, index: &QModelIndex, role: i32) -> QVariant;
fn role_names(&self) -> QHash<i32, QByteArray>;
fn set_data(&mut self, index: &QModelIndex, value: &QVariant, role: i32) -> bool;
fn remove_columns(&mut self, first: i32, count: i32, parent: &QModelIndex) -> bool;
fn remove_rows(&mut self, first: i32, count: i32, parent: &QModelIndex) -> bool;
fn sibling(&self, row: i32, column: i32, idx: &QModelIndex) -> QModelIndex;
}
impl<T> QTableModelAdapter for T
where
T: QTableModel + QObjectHolder<ProxyRust = QTableModelProxyRust> {
fn index(&self, row: i32, column: i32, _: &QModelIndex) -> QModelIndex {
let proxy = self.try_get_rust_proxy_ptr().expect("No proxy");
unsafe { &*proxy }.base_create_index(self, row, column, 0)
}
fn parent(&self, _: &QModelIndex) -> QModelIndex {
QModelIndex::default()
}
fn row_count(&self, _: &QModelIndex) -> i32 {
self.row_count() as i32
}
fn column_count(&self, _: &QModelIndex) -> i32 {
<Self as QTableModel>::column_count(&self) as i32
}
fn data(&self, index: &QModelIndex, role: i32) -> QVariant {
let Some(item) = self.get((index.row() as usize, index.column() as usize))
else {
return QVariant::default();
};
item.get_role(role)
}
fn role_names(&self) -> QHash<i32, QByteArray> {
let names = T::Item::role_names();
let mut result = QHash::default();
names.iter()
.for_each(|(k, v)| result.insert(k, &QByteArray::from(v)));
result
}
fn set_data(&mut self, index: &QModelIndex, value: &QVariant, role: i32) -> bool {
if !index.is_valid() {
return false;
}
let Some(mut item) = self.get((index.row() as usize, index.column() as usize))
.cloned()
else {
return false;
};
let updated = item.set_role(role, value);
if updated {
self.set_unnotified((index.row() as usize, index.column() as usize), item);
let proxy = self.try_get_rust_proxy_ptr().expect("No proxy");
unsafe { &mut *proxy }.base_data_changed(&mut *self, index, index);
}
updated
}
fn remove_columns(&mut self, first: i32, count: i32, parent: &QModelIndex) -> bool {
let first = first as usize;
let last = first + count as usize;
if last > self.column_count() {
return false;
}
let proxy = self.try_get_rust_proxy_ptr().expect("No proxy");
unsafe { &mut *proxy }.base_begin_remove_columns(&mut *self, parent, first as i32, (last - 1) as i32);
for index in (first..last).rev() {
self.remove_row_unnotified(index);
}
unsafe { &mut *proxy }.base_end_remove_columns(&mut *self);
true
}
fn remove_rows(&mut self, first: i32, count: i32, parent: &QModelIndex) -> bool {
let first = first as usize;
let last = first + count as usize;
if last > self.row_count() {
return false;
}
let proxy = self.try_get_rust_proxy_ptr().expect("No proxy");
unsafe { &mut *proxy }.base_begin_remove_rows(&mut *self, parent, first as i32, (last - 1) as i32);
for index in (first..last).rev() {
self.remove_row_unnotified(index);
}
unsafe { &mut *proxy }.base_end_remove_rows(&mut *self);
true
}
fn sibling(&self, row: i32, column: i32, idx: &QModelIndex) -> QModelIndex {
let proxy = self.try_get_rust_proxy_ptr().expect("No proxy");
unsafe { &*proxy }.base_sibling(self, row, column, idx)
}
}
pub trait QTableModel {
type Item: QModelItem + Default + Clone;
fn row_count(&self) -> usize;
fn column_count(&self) -> usize;
fn get(&self, index: (usize, usize)) -> Option<&Self::Item>;
fn set_unnotified(&mut self, _index: (usize, usize), _value: Self::Item) -> bool {
false
}
fn push_row_unnotified(&mut self, values: &[Self::Item]) {
self.insert_row_unnotified(self.row_count(), values);
}
fn push_column_unnotified(&mut self, values: &[Self::Item]) {
self.insert_column_unnotified(self.column_count(), values);
}
fn insert_row_unnotified(&mut self, _index: usize, _value: &[Self::Item]) {
panic!("In order to use insert, implement insert_unnotified")
}
fn insert_column_unnotified(&mut self, _index: usize, _value: &[Self::Item]) {
panic!("In order to use insert, implement insert_unnotified")
}
fn pop_row_unnotified(&mut self) -> Option<Vec<Self::Item>> {
(self.row_count() > 0)
.then(|| self.remove_row_unnotified(self.row_count() - 1))
}
fn pop_column_unnotified(&mut self) -> Option<Vec<Self::Item>> {
(self.column_count() > 0)
.then(|| self.remove_column_unnotified(self.column_count() - 1))
}
fn remove_row_unnotified(&mut self, _index: usize) -> Vec<Self::Item> {
panic!("In order to use remove, implement remove_unnotified")
}
fn remove_column_unnotified(&mut self, _index: usize) -> Vec<Self::Item> {
panic!("In order to use remove, implement remove_unnotified")
}
fn reset_unnotified(&mut self) {
panic!("In order to use reset, implement reset_unnotified")
}
}
pub trait QTableModelBase : QTableModel + QObjectHolder<ProxyRust = QTableModelProxyRust> {
fn set(&mut self, index: (usize, usize), value: <Self as QTableModel>::Item) -> bool {
if self.set_unnotified(index, value) {
let proxy = self.try_get_rust_proxy_ptr().expect("No proxy");
let model_index = unsafe { &*proxy }.base_create_index(self, index.0 as i32, index.1 as i32, 0);
unsafe { &mut *proxy }.base_data_changed(&mut *self, &model_index, &model_index);
true
} else {
false
}
}
fn push_row(&mut self, values: &[Self::Item]) {
let proxy = self.try_get_rust_proxy_ptr().expect("No proxy");
let row_count = self.row_count() as i32;
unsafe { &mut *proxy }.base_begin_insert_rows(&mut *self, &QModelIndex::default(), row_count, row_count);
self.push_row_unnotified(values);
unsafe { &mut *proxy }.base_end_insert_rows(&mut *self);
}
fn push_column(&mut self, values: &[Self::Item]) {
let proxy = self.try_get_rust_proxy_ptr().expect("No proxy");
let col_count = self.column_count() as i32;
unsafe { &mut *proxy }.base_begin_insert_columns(&mut *self, &QModelIndex::default(), col_count, col_count);
self.push_column_unnotified(values);
unsafe { &mut *proxy }.base_end_insert_columns(&mut *self);
}
fn insert_row(&mut self, index: usize, values: &[Self::Item]) {
let proxy = self.try_get_rust_proxy_ptr().expect("No proxy");
unsafe { &mut *proxy }.base_begin_insert_rows(&mut *self, &QModelIndex::default(), index as i32, index as i32);
self.insert_row_unnotified(index, values);
unsafe { &mut *proxy }.base_end_insert_rows(&mut *self);
}
fn insert_column(&mut self, index: usize, values: &[Self::Item]) {
let proxy = self.try_get_rust_proxy_ptr().expect("No proxy");
unsafe { &mut *proxy }.base_begin_insert_columns(&mut *self, &QModelIndex::default(), index as i32, index as i32);
self.insert_column_unnotified(index, values);
unsafe { &mut *proxy }.base_end_insert_columns(&mut *self);
}
fn pop_row(&mut self) -> Option<Vec<Self::Item>> {
if self.row_count() == 0 {
return None;
}
let proxy = self.try_get_rust_proxy_ptr().expect("No proxy");
let row_count = self.row_count() as i32;
unsafe { &mut *proxy }.base_begin_remove_rows(&mut *self, &QModelIndex::default(), row_count - 1, row_count - 1);
let values = self.pop_row_unnotified();
unsafe { &mut *proxy }.base_end_remove_rows(&mut *self);
values
}
fn pop_column(&mut self) -> Option<Vec<Self::Item>> {
if self.column_count() == 0 {
return None;
}
let proxy = self.try_get_rust_proxy_ptr().expect("No proxy");
let col_count = self.column_count() as i32;
unsafe { &mut *proxy }.base_begin_remove_columns(&mut *self, &QModelIndex::default(), col_count - 1, col_count - 1);
let values = self.pop_column_unnotified();
unsafe { &mut *proxy }.base_end_remove_columns(&mut *self);
values
}
fn remove_row(&mut self, index: usize) -> Vec<Self::Item> {
let proxy = self.try_get_rust_proxy_ptr().expect("No proxy");
unsafe { &mut *proxy }.base_begin_remove_rows(&mut *self, &QModelIndex::default(), index as i32, index as i32);
let values = self.remove_row_unnotified(index);
unsafe { &mut *proxy }.base_end_remove_rows(&mut *self);
values
}
fn remove_column(&mut self, index: usize) -> Vec<Self::Item> {
let proxy = self.try_get_rust_proxy_ptr().expect("No proxy");
unsafe { &mut *proxy }.base_begin_remove_columns(&mut *self, &QModelIndex::default(), index as i32, index as i32);
let values = self.remove_column_unnotified(index);
unsafe { &mut *proxy }.base_end_remove_columns(&mut *self);
values
}
fn reset(&mut self) {
let proxy = self.try_get_rust_proxy_ptr().expect("No proxy");
unsafe { &mut *proxy }.base_begin_reset_model(&mut *self);
self.reset_unnotified();
unsafe { &mut *proxy }.base_end_reset_model(&mut *self);
}
}
impl<T> QTableModelBase for T
where T: QTableModel + QObjectHolder<ProxyRust = QTableModelProxyRust> { }
pub type QTableModelProxyRust = GenericRustProxy<QTableModelProxyCpp, dyn QTableModelAdapter>;
impl QTableModelProxyRust {
pub fn index(&self, row: i32, column: i32, parent: &QModelIndex) -> QModelIndex {
call_rust_trait_impl!(self, index(row, column, parent))
}
pub fn parent(&self, child: &QModelIndex) -> QModelIndex {
call_rust_trait_impl!(self, parent(child))
}
pub fn row_count(&self, parent: &QModelIndex) -> i32 {
call_rust_trait_impl!(self, row_count(parent))
}
pub fn column_count(&self, parent: &QModelIndex) -> i32 {
call_rust_trait_impl!(self, column_count(parent))
}
pub fn data(&self, index: &QModelIndex, role: i32) -> QVariant {
call_rust_trait_impl!(self, data(index, role))
}
pub fn role_names(&self) -> QHash<i32, QByteArray> {
call_rust_trait_impl!(self, role_names())
}
pub fn set_data(&mut self, index: &QModelIndex, value: &QVariant, role: i32) -> bool {
call_rust_trait_impl!(mut self, set_data(index, value, role))
}
pub fn remove_columns(&mut self, first: i32, count: i32, parent: &QModelIndex) -> bool {
call_rust_trait_impl!(mut self, remove_columns(first, count, parent))
}
pub fn remove_rows(&mut self, first: i32, count: i32, parent: &QModelIndex) -> bool {
call_rust_trait_impl!(mut self, remove_rows(first, count, parent))
}
pub fn sibling(&self, row: i32, column: i32, idx: &QModelIndex) -> QModelIndex {
call_rust_trait_impl!(self, sibling(row, column, idx))
}
pub fn base_role_names(&self, reference: &dyn QTableModelAdapter) -> QHash<i32, QByteArray> {
call_cpp_impl!(self, reference, base_role_names())
}
pub fn base_set_data(&mut self, mut_ref: &mut dyn QTableModelAdapter, index: &QModelIndex, value: &QVariant, role: i32) -> bool {
call_cpp_impl!(mut self, mut_ref, base_set_data(index, value, role))
}
pub fn base_remove_columns(&mut self, mut_ref: &mut dyn QTableModelAdapter, first: i32, count: i32, parent: &QModelIndex) -> bool {
call_cpp_impl!(mut self, mut_ref, base_remove_columns(first, count, parent))
}
pub fn base_remove_rows(&mut self, mut_ref: &mut dyn QTableModelAdapter, first: i32, count: i32, parent: &QModelIndex) -> bool {
call_cpp_impl!(mut self, mut_ref, base_remove_rows(first, count, parent))
}
pub fn base_sibling(&self, reference: &dyn QTableModelAdapter, row: i32, column: i32, idx: &QModelIndex) -> QModelIndex {
call_cpp_impl!(self, reference, base_sibling(row, column, idx))
}
pub fn base_data_changed(&mut self, mut_ref: &mut dyn QTableModelAdapter, top_left: &QModelIndex, bottom_right: &QModelIndex) {
call_cpp_impl!(mut self, mut_ref, base_data_changed(top_left, bottom_right))
}
pub fn base_begin_insert_columns(&mut self, mut_ref: &mut dyn QTableModelAdapter, parent: &QModelIndex, first: i32, last: i32) {
call_cpp_impl!(mut self, mut_ref, base_begin_insert_columns(parent, first, last))
}
pub fn base_end_insert_columns(&mut self, mut_ref: &mut dyn QTableModelAdapter) {
call_cpp_impl!(mut self, mut_ref, base_end_insert_columns())
}
pub fn base_begin_insert_rows(&mut self, mut_ref: &mut dyn QTableModelAdapter, parent: &QModelIndex, first: i32, last: i32) {
call_cpp_impl!(mut self, mut_ref, base_begin_insert_rows(parent, first, last))
}
pub fn base_end_insert_rows(&mut self, mut_ref: &mut dyn QTableModelAdapter) {
call_cpp_impl!(mut self, mut_ref, base_end_insert_rows())
}
pub fn base_begin_move_columns(
&mut self,
mut_ref: &mut dyn QTableModelAdapter,
source_parent: &QModelIndex,
source_first: i32,
source_last: i32,
destination_parent: &QModelIndex,
destination_child: i32,
) {
call_cpp_impl!(mut self, mut_ref, base_begin_move_columns(source_parent, source_first, source_last, destination_parent, destination_child))
}
pub fn base_end_move_columns(&mut self, mut_ref: &mut dyn QTableModelAdapter) {
call_cpp_impl!(mut self, mut_ref, base_end_move_columns())
}
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) {
call_cpp_impl!(mut self, mut_ref, base_begin_move_rows(source_parent, source_first, source_last, destination_parent, destination_child))
}
pub fn base_end_move_rows(&mut self, mut_ref: &mut dyn QTableModelAdapter) {
call_cpp_impl!(mut self, mut_ref, base_end_move_rows())
}
pub fn base_begin_remove_columns(&mut self, mut_ref: &mut dyn QTableModelAdapter, parent: &QModelIndex, first: i32, last: i32) {
call_cpp_impl!(mut self, mut_ref, base_begin_remove_columns(parent, first, last))
}
pub fn base_end_remove_columns(&mut self, mut_ref: &mut dyn QTableModelAdapter) {
call_cpp_impl!(mut self, mut_ref, base_end_remove_columns())
}
pub fn base_begin_remove_rows(&mut self, mut_ref: &mut dyn QTableModelAdapter, parent: &QModelIndex, first: i32, last: i32) {
call_cpp_impl!(mut self, mut_ref, base_begin_remove_rows(parent, first, last))
}
pub fn base_end_remove_rows(&mut self, mut_ref: &mut dyn QTableModelAdapter) {
call_cpp_impl!(mut self, mut_ref, base_end_remove_rows())
}
pub fn base_begin_reset_model(&mut self, mut_ref: &mut dyn QTableModelAdapter) {
call_cpp_impl!(mut self, mut_ref, base_begin_reset_model())
}
pub fn base_end_reset_model(&mut self, mut_ref: &mut dyn QTableModelAdapter) {
call_cpp_impl!(mut self, mut_ref, base_end_reset_model())
}
pub fn base_create_index(&self, reference: &dyn QTableModelAdapter, row: i32, column: i32, ptr: usize) -> QModelIndex {
call_cpp_impl!(self, reference, base_create_index(row, column, ptr))
}
}