use cxx::let_cxx_string;
use crate::ffi;
use crate::signal::{self, SignalHandle};
pub const HORIZONTAL: i32 = 1;
pub const VERTICAL: i32 = 2;
pub struct StandardItemModel {
ptr: *mut ffi::QStandardItemModel,
signal_handles: Vec<SignalHandle>,
}
impl StandardItemModel {
pub fn new() -> Builder { Builder::new() }
pub fn row_count(&self) -> i32 {
debug_assert!(!self.ptr.is_null());
unsafe { ffi::QStandardItemModel_rowCount(self.ptr) }
}
pub fn column_count(&self) -> i32 {
debug_assert!(!self.ptr.is_null());
unsafe { ffi::QStandardItemModel_columnCount(self.ptr) }
}
pub fn set_row_count(&self, rows: i32) {
debug_assert!(!self.ptr.is_null());
unsafe { ffi::QStandardItemModel_setRowCount(self.ptr, rows); }
}
pub fn set_column_count(&self, cols: i32) {
debug_assert!(!self.ptr.is_null());
unsafe { ffi::QStandardItemModel_setColumnCount(self.ptr, cols); }
}
pub fn set_data(&self, row: i32, col: i32, value: &str) {
debug_assert!(!self.ptr.is_null());
let_cxx_string!(c_value = value);
unsafe { ffi::QStandardItemModel_setData(self.ptr, row, col, &c_value); }
}
pub fn data(&self, row: i32, col: i32) -> String {
debug_assert!(!self.ptr.is_null());
unsafe { ffi::QStandardItemModel_data(self.ptr, row, col) }
}
pub fn set_header_data(&self, section: i32, orientation: i32, value: &str) {
debug_assert!(!self.ptr.is_null());
let_cxx_string!(c_value = value);
unsafe {
ffi::QStandardItemModel_setHeaderData(self.ptr, section, orientation, &c_value);
}
}
pub fn header_data(&self, section: i32, orientation: i32) -> String {
debug_assert!(!self.ptr.is_null());
unsafe { ffi::QStandardItemModel_headerData(self.ptr, section, orientation) }
}
pub fn insert_row(&self, row: i32) {
debug_assert!(!self.ptr.is_null());
unsafe { ffi::QStandardItemModel_insertRow(self.ptr, row); }
}
pub fn remove_row(&self, row: i32) {
debug_assert!(!self.ptr.is_null());
unsafe { ffi::QStandardItemModel_removeRow(self.ptr, row); }
}
pub fn insert_column(&self, column: i32) {
debug_assert!(!self.ptr.is_null());
unsafe { ffi::QStandardItemModel_insertColumn(self.ptr, column); }
}
pub fn remove_column(&self, column: i32) {
debug_assert!(!self.ptr.is_null());
unsafe { ffi::QStandardItemModel_removeColumn(self.ptr, column); }
}
pub fn clear(&self) {
debug_assert!(!self.ptr.is_null());
unsafe { ffi::QStandardItemModel_clear(self.ptr); }
}
pub fn append_row(&self, texts: &[&str]) {
debug_assert!(!self.ptr.is_null());
let vec: Vec<String> = texts.iter().map(|s| s.to_string()).collect();
unsafe { ffi::QStandardItemModel_appendRow(self.ptr, vec); }
}
pub fn connect_model_reset<F: Fn()>(&mut self, f: F) {
debug_assert!(!self.ptr.is_null());
let handle = signal::leak_void(f);
unsafe { ffi::QStandardItemModel_onModelReset(self.ptr, handle.token); }
self.signal_handles.push(handle);
}
pub fn connect_data_changed<F: Fn()>(&mut self, f: F) {
debug_assert!(!self.ptr.is_null());
let handle = signal::leak_void(f);
unsafe { ffi::QStandardItemModel_onDataChanged(self.ptr, handle.token); }
self.signal_handles.push(handle);
}
pub fn connect_rows_inserted<F: Fn()>(&mut self, f: F) {
debug_assert!(!self.ptr.is_null());
let handle = signal::leak_void(f);
unsafe { ffi::QStandardItemModel_onRowsInserted(self.ptr, handle.token); }
self.signal_handles.push(handle);
}
pub fn connect_rows_removed<F: Fn()>(&mut self, f: F) {
debug_assert!(!self.ptr.is_null());
let handle = signal::leak_void(f);
unsafe { ffi::QStandardItemModel_onRowsRemoved(self.ptr, handle.token); }
self.signal_handles.push(handle);
}
#[doc(hidden)]
pub fn raw_ptr(&self) -> *mut ffi::QStandardItemModel { self.ptr }
}
impl Drop for StandardItemModel {
fn drop(&mut self) {
if self.ptr.is_null() { return; }
for h in self.signal_handles.drain(..) {
unsafe { h.reclaim(); }
}
unsafe { ffi::QStandardItemModel_delete(self.ptr); }
self.ptr = std::ptr::null_mut();
}
}
pub struct Builder {
rows: i32,
cols: i32,
parent: Option<*mut ffi::QObject>,
}
impl Builder {
fn new() -> Self {
Self { rows: 0, cols: 0, parent: None }
}
pub fn rows(mut self, rows: i32) -> Self { self.rows = rows; self }
pub fn cols(mut self, cols: i32) -> Self { self.cols = cols; self }
pub fn parent(mut self, parent: *mut ffi::QObject) -> Self {
self.parent = Some(parent);
self
}
pub fn build(self) -> StandardItemModel {
let ptr = unsafe {
ffi::QStandardItemModel_new(self.parent.unwrap_or(std::ptr::null_mut()))
};
assert!(!ptr.is_null(), "QStandardItemModel_new returned null");
let model = StandardItemModel { ptr, signal_handles: Vec::new() };
if self.rows > 0 { model.set_row_count(self.rows); }
if self.cols > 0 { model.set_column_count(self.cols); }
model
}
}