Skip to content

Commit e9a65bb

Browse files
authored
Auto merge of #454 - zed-industries:nsopenpanel, r=jdm
Add bindings for NSOpenPanel This PR adds bindings for the main `NSOpenPanel` APIs, which let you present a modal for selecting files or directories. Usage: ```rust let panel = NSOpenPanel::openPanel(nil); panel.setCanChooseDirectories_(YES); panel.setCanChooseFiles_(NO); panel.setAllowsMultipleSelection_(YES); let response = panel.runModal(); if response == NSModalResponse::NSModalResponseOk { let urls = panel.URLs(); for i in 0..urls.count() { let url_ptr = urls.objectAtIndex(i).absoluteString().UTF8String(); let url = CStr::from_ptr(url_ptr).to_string_lossy(); eprintln!("You picked URL {}", url); } } ```
2 parents 927fa8d + 52b7bc0 commit e9a65bb

File tree

1 file changed

+46
-0
lines changed

1 file changed

+46
-0
lines changed

cocoa/src/appkit.rs

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1774,6 +1774,52 @@ impl NSWindow for id {
17741774
// TODO: Constraint-Based Layouts
17751775
}
17761776

1777+
#[repr(i64)]
1778+
#[derive(Clone, Copy, Debug, PartialEq)]
1779+
pub enum NSModalResponse {
1780+
NSModalResponseOk = 1,
1781+
NSModalResponseCancel = 0,
1782+
}
1783+
1784+
pub trait NSOpenPanel: Sized {
1785+
unsafe fn openPanel(_: Self) -> id {
1786+
msg_send![class!(NSOpenPanel), openPanel]
1787+
}
1788+
1789+
unsafe fn setCanChooseFiles_(self, canChooseFiles: BOOL);
1790+
unsafe fn setCanChooseDirectories_(self, canChooseDirectories: BOOL);
1791+
unsafe fn setResolvesAliases_(self, resolvesAliases: BOOL);
1792+
unsafe fn setAllowsMultipleSelection_(self, allowsMultipleSelection: BOOL);
1793+
unsafe fn URLs(self) -> id;
1794+
unsafe fn runModal(self) -> NSModalResponse;
1795+
}
1796+
1797+
impl NSOpenPanel for id {
1798+
unsafe fn setCanChooseFiles_(self, canChooseFiles: BOOL) {
1799+
msg_send![self, setCanChooseFiles: canChooseFiles]
1800+
}
1801+
1802+
unsafe fn setCanChooseDirectories_(self, canChooseDirectories: BOOL) {
1803+
msg_send![self, setCanChooseDirectories: canChooseDirectories]
1804+
}
1805+
1806+
unsafe fn setResolvesAliases_(self, resolvesAliases: BOOL) {
1807+
msg_send![self, setResolvesAliases: resolvesAliases]
1808+
}
1809+
1810+
unsafe fn setAllowsMultipleSelection_(self, allowsMultipleSelection: BOOL) {
1811+
msg_send![self, setAllowsMultipleSelection: allowsMultipleSelection]
1812+
}
1813+
1814+
unsafe fn URLs(self) -> id {
1815+
msg_send![self, URLs]
1816+
}
1817+
1818+
unsafe fn runModal(self) -> NSModalResponse {
1819+
msg_send![self, runModal]
1820+
}
1821+
}
1822+
17771823
#[repr(usize)]
17781824
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
17791825
pub enum NSViewLayerContentsPlacement {

0 commit comments

Comments
 (0)