use crate::controls::UIElement;
use crate::error::Result;
use crate::events::{EventHandler, SelectionChangedEventArgs};
use parking_lot::RwLock;
use std::sync::Arc;
use windows::Win32::Foundation::*;
#[derive(Clone)]
pub struct ListView {
element: UIElement,
inner: Arc<ListViewInner>,
}
struct ListViewInner {
items: RwLock<Vec<String>>,
selected_index: RwLock<i32>,
selection_changed: EventHandler<SelectionChangedEventArgs>,
}
impl ListView {
pub fn new() -> Result<Self> {
let inner = Arc::new(ListViewInner {
items: RwLock::new(Vec::new()),
selected_index: RwLock::new(-1),
selection_changed: EventHandler::new(),
});
Ok(ListView {
element: UIElement::empty(),
inner,
})
}
pub fn items(&self) -> Vec<String> {
self.inner.items.read().clone()
}
pub fn add_item(&self, item: impl Into<String>) {
self.inner.items.write().push(item.into());
}
pub fn clear_items(&self) {
self.inner.items.write().clear();
}
pub fn selected_index(&self) -> i32 {
*self.inner.selected_index.read()
}
pub fn set_selected_index(&self, index: i32) {
*self.inner.selected_index.write() = index;
}
pub fn with_selected_index(self, index: i32) -> Self {
self.set_selected_index(index);
self
}
pub fn selection_changed(&self) -> &EventHandler<SelectionChangedEventArgs> {
&self.inner.selection_changed
}
pub fn element(&self) -> &UIElement {
&self.element
}
pub fn hwnd(&self) -> HWND {
self.element.hwnd()
}
}
impl Default for ListView {
fn default() -> Self {
Self::new().expect("Failed to create list view")
}
}
impl From<ListView> for UIElement {
fn from(listview: ListView) -> Self {
listview.element.clone()
}
}