use objc::runtime::Object;
use objc::{class, msg_send, sel, sel_impl};
use objc_id::ShareId;
use crate::appkit::toolbar::ToolbarItem;
use crate::foundation::{id, nil, NSString};
use crate::layout::Layout;
use crate::utils::{os, Controller};
use crate::view::{View, ViewController, ViewDelegate};
#[derive(Debug)]
pub struct SplitViewItem<T> {
pub objc: ShareId<Object>,
pub view_controller: ViewController<T>
}
impl<T> SplitViewItem<T>
where
T: ViewDelegate + 'static
{
pub fn item(view: T) -> Self {
let view_controller = ViewController::new(view);
SplitViewItem {
objc: unsafe {
ShareId::from_ptr(msg_send![class!(NSSplitViewItem),
splitViewItemWithViewController:&*view_controller.objc
])
},
view_controller
}
}
pub fn sidebar(view: T) -> Self {
#[cfg(target_os = "macos")]
{
if !os::is_minimum_version(11) {
return Self::item(view);
}
let view_controller = ViewController::new(view);
SplitViewItem {
objc: unsafe {
ShareId::from_ptr(msg_send![class!(NSSplitViewItem),
sidebarWithViewController:&*view_controller.objc
])
},
view_controller
}
}
#[cfg(not(target_os = "macos"))]
Self::item(view)
}
#[cfg(feature = "appkit")]
pub fn set_titlebar_separator_style(&self, style: crate::foundation::NSInteger) {
#[cfg(target_os = "macos")]
if os::is_minimum_version(11) {
unsafe {
let _: () = msg_send![&*self.objc, setTitlebarSeparatorStyle: style];
}
}
}
}
#[derive(Debug)]
pub struct SplitViewController<Sidebar, Content, Details> {
pub objc: ShareId<Object>,
pub sidebar: SplitViewItem<Sidebar>,
pub content: SplitViewItem<Content>,
pub details: Option<SplitViewItem<Details>>
}
impl<Sidebar, Content, Details> SplitViewController<Sidebar, Content, Details>
where
Sidebar: ViewDelegate + 'static,
Content: ViewDelegate + 'static,
Details: ViewDelegate + 'static
{
pub fn new(sidebar: Sidebar, content: Content, details: Option<Details>) -> Self {
let sidebar = SplitViewItem::sidebar(sidebar);
let content = SplitViewItem::item(content);
let details = match details {
Some(vc) => Some(SplitViewItem::item(vc)),
None => None
};
let objc = unsafe {
let vc: id = msg_send![class!(NSSplitViewController), new];
let _: () = msg_send![vc, addSplitViewItem:&*sidebar.objc];
let _: () = msg_send![vc, addSplitViewItem:&*content.objc];
if let Some(details) = &details {
let _: () = msg_send![vc, addSplitViewItem:&*details.objc];
}
ShareId::from_ptr(vc)
};
SplitViewController {
objc,
sidebar,
content,
details
}
}
}
impl<Sidebar, Content, Details> SplitViewController<Sidebar, Content, Details> {
pub fn toggle_sidebar(&self) {
unsafe {
let _: () = msg_send![&*self.objc, toggleSidebar: nil];
}
}
pub fn set_autosave_name(&self, name: &str) {
let name = NSString::new(name);
unsafe {
let split_view: id = msg_send![&*self.objc, splitView];
let _: () = msg_send![split_view, setAutosaveName:&*name];
}
}
}
impl<Sidebar, Content, Details> Controller for SplitViewController<Sidebar, Content, Details> {
fn get_backing_node(&self) -> ShareId<Object> {
self.objc.clone()
}
}