Merge debug/animation-timings; support ability for drawing sublayers as one and control of layer redraw policy
This commit is contained in:
parent
d417289f92
commit
186a9a6c3f
|
@ -7,7 +7,7 @@
|
||||||
|
|
||||||
use cacao::color::Color;
|
use cacao::color::Color;
|
||||||
use cacao::layout::{Layout, LayoutConstraint, LayoutConstraintAnimatorProxy};
|
use cacao::layout::{Layout, LayoutConstraint, LayoutConstraintAnimatorProxy};
|
||||||
use cacao::view::{View, ViewAnimatorProxy};
|
use cacao::view::{View, ViewAnimatorProxy, LayerContentsRedrawPolicy};
|
||||||
|
|
||||||
use cacao::appkit::menu::Menu;
|
use cacao::appkit::menu::Menu;
|
||||||
use cacao::appkit::window::{Window, WindowConfig, WindowDelegate};
|
use cacao::appkit::window::{Window, WindowConfig, WindowDelegate};
|
||||||
|
@ -104,8 +104,15 @@ impl WindowDelegate for AppWindow {
|
||||||
window.set_title("Animation Example (Use W/A/S/D to change state!)");
|
window.set_title("Animation Example (Use W/A/S/D to change state!)");
|
||||||
window.set_minimum_content_size(300., 300.);
|
window.set_minimum_content_size(300., 300.);
|
||||||
|
|
||||||
|
self.blue.set_contents_redraw_policy(LayerContentsRedrawPolicy::OnSetNeedsDisplay);
|
||||||
|
self.red.set_contents_redraw_policy(LayerContentsRedrawPolicy::OnSetNeedsDisplay);
|
||||||
|
self.green.set_contents_redraw_policy(LayerContentsRedrawPolicy::OnSetNeedsDisplay);
|
||||||
|
self.content.set_contents_redraw_policy(LayerContentsRedrawPolicy::OnSetNeedsDisplay);
|
||||||
|
|
||||||
window.set_content_view(&self.content);
|
window.set_content_view(&self.content);
|
||||||
|
|
||||||
|
self.content.set_can_draw_subviews_into_layer(true);
|
||||||
|
|
||||||
let blue_frame = apply_styles(&self.blue, &self.content, Color::SystemBlue, 0);
|
let blue_frame = apply_styles(&self.blue, &self.content, Color::SystemBlue, 0);
|
||||||
let red_frame = apply_styles(&self.red, &self.content, Color::SystemRed, 1);
|
let red_frame = apply_styles(&self.red, &self.content, Color::SystemRed, 1);
|
||||||
let green_frame = apply_styles(&self.green, &self.content, Color::SystemGreen, 2);
|
let green_frame = apply_styles(&self.green, &self.content, Color::SystemGreen, 2);
|
||||||
|
|
|
@ -46,7 +46,7 @@ use objc::runtime::{Class, Object};
|
||||||
use objc::{msg_send, sel, sel_impl};
|
use objc::{msg_send, sel, sel_impl};
|
||||||
|
|
||||||
use crate::color::Color;
|
use crate::color::Color;
|
||||||
use crate::foundation::{id, nil, NSArray, NSString, NO, YES};
|
use crate::foundation::{id, nil, NSArray, NSInteger, NSString, NO, YES};
|
||||||
use crate::layer::Layer;
|
use crate::layer::Layer;
|
||||||
use crate::layout::Layout;
|
use crate::layout::Layout;
|
||||||
use crate::objc_access::ObjcAccess;
|
use crate::objc_access::ObjcAccess;
|
||||||
|
@ -318,6 +318,32 @@ impl<T> View<T> {
|
||||||
let _: () = msg_send![&*obj, setBackgroundColor: color];
|
let _: () = msg_send![&*obj, setBackgroundColor: color];
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// A setter for `[NSView layerContentsRedrawPolicy]`.
|
||||||
|
///
|
||||||
|
/// For more information, consult:
|
||||||
|
///
|
||||||
|
/// [https://developer.apple.com/documentation/appkit/nsview/1483514-layercontentsredrawpolicy?language=objc](https://developer.apple.com/documentation/appkit/nsview/1483514-layercontentsredrawpolicy?language=objc)
|
||||||
|
#[cfg(feature = "appkit")]
|
||||||
|
pub fn set_contents_redraw_policy(&self, policy: LayerContentsRedrawPolicy) {
|
||||||
|
self.objc.with_mut(|obj| unsafe {
|
||||||
|
let policy = policy.to_nsinteger();
|
||||||
|
let _: () = msg_send![obj, setLayerContentsRedrawPolicy:policy];
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Mark all child layers as being able to be drawn into a single CALayer. This can be useful
|
||||||
|
/// for moments when you need to lower your total layer count, which can impair composition
|
||||||
|
/// time.
|
||||||
|
#[cfg(feature = "appkit")]
|
||||||
|
pub fn set_can_draw_subviews_into_layer(&self, can: bool) {
|
||||||
|
self.objc.with_mut(|obj| unsafe {
|
||||||
|
let _: () = msg_send![&*obj, setCanDrawSubviewsIntoLayer:match can {
|
||||||
|
true => YES,
|
||||||
|
false => NO
|
||||||
|
}];
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T> ObjcAccess for View<T> {
|
impl<T> ObjcAccess for View<T> {
|
||||||
|
@ -347,3 +373,28 @@ impl<T> Drop for View<T> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Variants describing what an underlying NSView layer redraw policy should be.
|
||||||
|
#[cfg(feature = "appkit")]
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub enum LayerContentsRedrawPolicy {
|
||||||
|
Never,
|
||||||
|
OnSetNeedsDisplay,
|
||||||
|
DuringViewResize,
|
||||||
|
BeforeViewResize,
|
||||||
|
Crossfade
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "appkit")]
|
||||||
|
impl LayerContentsRedrawPolicy {
|
||||||
|
/// Mapping required for ObjC setters.
|
||||||
|
pub fn to_nsinteger(&self) -> NSInteger {
|
||||||
|
match self {
|
||||||
|
Self::Never => 0,
|
||||||
|
Self::OnSetNeedsDisplay => 1,
|
||||||
|
Self::DuringViewResize => 2,
|
||||||
|
Self::BeforeViewResize => 3,
|
||||||
|
Self::Crossfade => 4
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue