use crate::co;
use crate::decl::*;
use crate::gui::*;
use crate::msg::*;
use crate::prelude::*;
pub struct TreeViewItems<'a, T: 'static> {
owner: &'a TreeView<T>,
}
impl<'a, T> TreeViewItems<'a, T> {
#[must_use]
pub(in crate::gui) const fn new(owner: &'a TreeView<T>) -> Self {
Self { owner }
}
pub fn add_root(
&self,
text: &str,
icon_index: Option<u32>,
data: T,
) -> SysResult<TreeViewItem<'a, T>> {
self.owner.raw_insert_item(None, text, icon_index, data)
}
pub fn delete_all(&self) -> SysResult<()> {
unsafe {
self.owner
.hwnd()
.SendMessage(tvm::DeleteItem { hitem: &HTREEITEM::NULL })
}
}
#[must_use]
pub fn count(&self) -> u32 {
unsafe { self.owner.hwnd().SendMessage(tvm::GetCount {}) }
}
#[must_use]
pub fn count_visible(&self) -> u32 {
unsafe { self.owner.hwnd().SendMessage(tvm::GetVisibleCount {}) }
}
pub fn end_edit_label_now(&self, save: bool) -> SysResult<()> {
unsafe { self.owner.hwnd().SendMessage(tvm::EndEditLabelNow { save }) }
}
#[must_use]
pub fn get(&self, hitem: &HTREEITEM) -> TreeViewItem<'a, T> {
TreeViewItem::new(self.owner, unsafe { hitem.raw_copy() })
}
#[must_use]
pub fn iter_selected(&self) -> impl Iterator<Item = TreeViewItem<'a, T>> + 'a {
TreeViewItemIter::new(self.owner, None, co::TVGN::CARET)
}
#[must_use]
pub fn iter_root(&self) -> impl Iterator<Item = TreeViewItem<'a, T>> + 'a {
TreeViewChildItemIter::new(self.owner, None)
}
}
pub(in crate::gui) struct TreeViewItemIter<'a, T: 'static> {
owner: &'a TreeView<T>,
current: Option<TreeViewItem<'a, T>>,
relationship: co::TVGN,
}
impl<'a, T> Iterator for TreeViewItemIter<'a, T> {
type Item = TreeViewItem<'a, T>;
fn next(&mut self) -> Option<Self::Item> {
self.current = unsafe {
self.owner.hwnd().SendMessage(tvm::GetNextItem {
relationship: self.relationship,
hitem: self.current.as_ref().map(|tvi| tvi.htreeitem()),
})
}
.map(|hitem| self.owner.items().get(&hitem));
self.current
.as_ref()
.map(|tvi| TreeViewItem::new(self.owner, unsafe { tvi.htreeitem().raw_copy() }))
}
}
impl<'a, T> TreeViewItemIter<'a, T> {
#[must_use]
pub(in crate::gui) const fn new(
owner: &'a TreeView<T>,
current: Option<TreeViewItem<'a, T>>,
relationship: co::TVGN,
) -> Self {
Self { owner, current, relationship }
}
}
pub(in crate::gui) struct TreeViewChildItemIter<'a, T: 'static> {
owner: &'a TreeView<T>,
current: Option<TreeViewItem<'a, T>>,
first_call: bool,
}
impl<'a, T> Iterator for TreeViewChildItemIter<'a, T> {
type Item = TreeViewItem<'a, T>;
fn next(&mut self) -> Option<Self::Item> {
if self.first_call {
self.current = unsafe {
self.owner.hwnd().SendMessage(tvm::GetNextItem {
relationship: co::TVGN::CHILD,
hitem: self.current.as_ref().map(|tvi| tvi.htreeitem()),
})
}
.map(|hitem| self.owner.items().get(&hitem));
self.first_call = false;
} else {
self.current = unsafe {
self.owner.hwnd().SendMessage(tvm::GetNextItem {
relationship: co::TVGN::NEXT,
hitem: self.current.as_ref().map(|tvi| tvi.htreeitem()),
})
}
.map(|hitem| self.owner.items().get(&hitem));
}
self.current
.as_ref()
.map(|tvi| TreeViewItem::new(self.owner, unsafe { tvi.htreeitem().raw_copy() }))
}
}
impl<'a, T> TreeViewChildItemIter<'a, T> {
#[must_use]
pub(in crate::gui) fn new(
owner: &'a TreeView<T>,
current: Option<TreeViewItem<'a, T>>,
) -> Self {
Self { owner, current, first_call: true }
}
}