Add model management and macOS integration
This commit is contained in:
90
src/native_menu.rs
Normal file
90
src/native_menu.rs
Normal file
@@ -0,0 +1,90 @@
|
||||
use muda::accelerator::{Accelerator, Code, Modifiers};
|
||||
use muda::{Menu, MenuEvent, MenuItem, PredefinedMenuItem, Submenu};
|
||||
|
||||
const PREFERENCES: &str = "preferences";
|
||||
const MODEL_MANAGER: &str = "model-manager";
|
||||
|
||||
pub(crate) struct NativeMenu {
|
||||
_menu: Menu,
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, Debug)]
|
||||
pub(crate) enum NativeMenuEvent {
|
||||
Preferences,
|
||||
ModelManager,
|
||||
}
|
||||
|
||||
pub(crate) fn install() -> Result<NativeMenu, String> {
|
||||
let menu = Menu::new();
|
||||
let application = Submenu::new("DS4Server", true);
|
||||
let edit = Submenu::new("Edit", true);
|
||||
let window = Submenu::new("Window", true);
|
||||
let preferences = MenuItem::with_id(
|
||||
PREFERENCES,
|
||||
"Preferences…",
|
||||
true,
|
||||
Some(Accelerator::new(Some(Modifiers::SUPER), Code::Comma)),
|
||||
);
|
||||
let model_manager = MenuItem::with_id(
|
||||
MODEL_MANAGER,
|
||||
"Model Manager…",
|
||||
true,
|
||||
Some(Accelerator::new(
|
||||
Some(Modifiers::SUPER | Modifiers::SHIFT),
|
||||
Code::KeyM,
|
||||
)),
|
||||
);
|
||||
|
||||
application
|
||||
.append_items(&[
|
||||
&PredefinedMenuItem::about(None, None),
|
||||
&PredefinedMenuItem::separator(),
|
||||
&preferences,
|
||||
&PredefinedMenuItem::separator(),
|
||||
&PredefinedMenuItem::services(None),
|
||||
&PredefinedMenuItem::separator(),
|
||||
&PredefinedMenuItem::hide(None),
|
||||
&PredefinedMenuItem::hide_others(None),
|
||||
&PredefinedMenuItem::show_all(None),
|
||||
&PredefinedMenuItem::separator(),
|
||||
&PredefinedMenuItem::quit(None),
|
||||
])
|
||||
.map_err(|error| error.to_string())?;
|
||||
edit.append_items(&[
|
||||
&PredefinedMenuItem::undo(None),
|
||||
&PredefinedMenuItem::redo(None),
|
||||
&PredefinedMenuItem::separator(),
|
||||
&PredefinedMenuItem::cut(None),
|
||||
&PredefinedMenuItem::copy(None),
|
||||
&PredefinedMenuItem::paste(None),
|
||||
&PredefinedMenuItem::select_all(None),
|
||||
])
|
||||
.map_err(|error| error.to_string())?;
|
||||
window
|
||||
.append_items(&[
|
||||
&model_manager,
|
||||
&PredefinedMenuItem::separator(),
|
||||
&PredefinedMenuItem::minimize(None),
|
||||
&PredefinedMenuItem::maximize(None),
|
||||
&PredefinedMenuItem::close_window(None),
|
||||
&PredefinedMenuItem::bring_all_to_front(None),
|
||||
])
|
||||
.map_err(|error| error.to_string())?;
|
||||
menu.append_items(&[&application, &edit, &window])
|
||||
.map_err(|error| error.to_string())?;
|
||||
menu.init_for_nsapp();
|
||||
window.set_as_windows_menu_for_nsapp();
|
||||
Ok(NativeMenu { _menu: menu })
|
||||
}
|
||||
|
||||
pub(crate) fn next_event() -> Option<NativeMenuEvent> {
|
||||
while let Ok(event) = MenuEvent::receiver().try_recv() {
|
||||
if event.id == PREFERENCES {
|
||||
return Some(NativeMenuEvent::Preferences);
|
||||
}
|
||||
if event.id == MODEL_MANAGER {
|
||||
return Some(NativeMenuEvent::ModelManager);
|
||||
}
|
||||
}
|
||||
None
|
||||
}
|
||||
Reference in New Issue
Block a user