use nappgui_sys::{
splitview_get_pos, splitview_horizontal, splitview_minsize0, splitview_minsize1,
splitview_panel, splitview_pos, splitview_splitview, splitview_textview, splitview_vertical,
splitview_view, splitview_visible0, splitview_visible1, splitview_webview,
};
use crate::{
gui::{control::impl_control, impl_layout, PanelTrait, TextViewTrait, ViewTrait, WebViewTrait},
types::SplitMode,
};
pub trait SplitViewTrait {
fn as_ptr(&self) -> *mut nappgui_sys::SplitView;
fn view<T>(&self, view: T, tabstop: bool)
where
T: ViewTrait,
{
unsafe { splitview_view(self.as_ptr(), view.as_ptr(), tabstop as _) }
}
fn textview<T>(&self, view: T, tabstop: bool)
where
T: TextViewTrait,
{
unsafe { splitview_textview(self.as_ptr(), view.as_ptr(), tabstop as _) }
}
fn webview<T>(&self, view: T, tabstop: bool)
where
T: WebViewTrait,
{
unsafe { splitview_webview(self.as_ptr(), view.as_ptr(), tabstop as _) }
}
fn splitview<T>(&self, child: T)
where
T: SplitViewTrait,
{
unsafe { splitview_splitview(self.as_ptr(), child.as_ptr()) }
}
fn panel<T>(&self, panel: T)
where
T: PanelTrait,
{
unsafe { splitview_panel(self.as_ptr(), panel.as_ptr()) }
}
fn position(&self, mode: SplitMode, pos: f32) {
unsafe { splitview_pos(self.as_ptr(), mode as _, pos) }
}
fn get_position(&self, mode: SplitMode) -> f32 {
unsafe { splitview_get_pos(self.as_ptr(), mode as _) }
}
fn visible_front(&self, visible: bool) {
unsafe { splitview_visible0(self.as_ptr(), visible as _) }
}
fn visible_back(&self, visible: bool) {
unsafe { splitview_visible1(self.as_ptr(), visible as _) }
}
fn min_size_front(&self, size: f32) {
unsafe { splitview_minsize0(self.as_ptr(), size) }
}
fn min_size_back(&self, size: f32) {
unsafe { splitview_minsize1(self.as_ptr(), size) }
}
}
#[repr(transparent)]
#[derive(Clone, Copy, Debug)]
pub struct SplitView {
pub(crate) inner: *mut nappgui_sys::SplitView,
}
impl SplitViewTrait for SplitView {
fn as_ptr(&self) -> *mut nappgui_sys::SplitView {
self.inner
}
}
impl SplitView {
pub fn new_horizontal() -> Self {
let splitview = unsafe { splitview_horizontal() };
Self { inner: splitview }
}
pub fn new_vertical() -> Self {
let splitview = unsafe { splitview_vertical() };
Self { inner: splitview }
}
}
impl_control!(SplitView, guicontrol_splitview);
impl_layout!(SplitView, SplitViewTrait, layout_splitview);