From 9f8d946371f4a6dba7346052ca38011a101d3beb Mon Sep 17 00:00:00 2001 From: Ari Lotter Date: Mon, 10 Jul 2023 16:59:25 -0400 Subject: [PATCH] add haptics (#93) --- src/appkit/haptics.rs | 79 +++++++++++++++++++++++++++++++++++++++++++ src/appkit/mod.rs | 2 ++ 2 files changed, 81 insertions(+) create mode 100644 src/appkit/haptics.rs diff --git a/src/appkit/haptics.rs b/src/appkit/haptics.rs new file mode 100644 index 0000000..adf1356 --- /dev/null +++ b/src/appkit/haptics.rs @@ -0,0 +1,79 @@ +use std::convert::TryFrom; + +use objc::{class, msg_send, runtime::Object, sel, sel_impl}; +use objc_id::ShareId; + +use crate::foundation::NSUInteger; + +#[derive(Clone, Debug)] +pub struct HapticFeedbackPerformer(pub ShareId); + +impl HapticFeedbackPerformer { + pub fn perform(&self, pattern: FeedbackPattern, performance_time: PerformanceTime) { + unsafe { + let _: () = msg_send![&*self.0, performFeedbackPattern: pattern performanceTime: performance_time]; + } + } +} + +impl Default for HapticFeedbackPerformer { + /// Returns the default haptic feedback performer. + fn default() -> Self { + HapticFeedbackPerformer(unsafe { + let manager = msg_send![class!(NSHapticFeedbackManager), defaultPerformer]; + ShareId::from_ptr(manager) + }) + } +} + +#[derive(Clone, Copy, Debug)] +pub enum PerformanceTime { + Default = 0, + Now = 1, + DrawCompleted = 2 +} + +impl Default for PerformanceTime { + fn default() -> Self { + Self::Default + } +} + +impl TryFrom for PerformanceTime { + type Error = &'static str; + + fn try_from(value: f64) -> Result { + match value as u8 { + 0 => Ok(Self::Default), + 1 => Ok(Self::Now), + 2 => Ok(Self::DrawCompleted), + _ => Err("Invalid performance time") + } + } +} + +#[derive(Clone, Copy, Debug)] +pub enum FeedbackPattern { + Generic = 0, + Alignment = 1, + LevelChange = 2 +} + +impl Default for FeedbackPattern { + fn default() -> Self { + Self::Generic + } +} + +impl TryFrom for FeedbackPattern { + type Error = &'static str; + + fn try_from(value: f64) -> Result { + match value as u8 { + 0 => Ok(Self::Generic), + 1 => Ok(Self::Alignment), + 2 => Ok(Self::LevelChange), + _ => Err("Invalid feedback pattern") + } + } +} diff --git a/src/appkit/mod.rs b/src/appkit/mod.rs index c96c132..eab6a63 100644 --- a/src/appkit/mod.rs +++ b/src/appkit/mod.rs @@ -27,3 +27,5 @@ pub mod menu; pub mod printing; pub mod toolbar; pub mod window; + +pub mod haptics;