using System; using System.Runtime.InteropServices; namespace Rive { /// /// An artboard that can be bound to view model properties. /// public class BindableArtboard : IDisposable { private IntPtr m_nativeBindableArtboard; private string m_artboardName; private bool m_isDisposed = false; private readonly ViewModelInstanceSafeHandle m_viewModelInstanceHandle; internal IntPtr NativeBindableArtboard { get { return m_nativeBindableArtboard; } } internal ViewModelInstanceSafeHandle ViewModelInstanceHandle { get { return m_viewModelInstanceHandle; } } /// /// Constructor for the BindableArtboard class. /// /// Pointer to the native bindable artboard. internal BindableArtboard(IntPtr nativeBindableArtboard) : this(nativeBindableArtboard, null) { } /// /// Constructor for the BindableArtboard class with an optional bound ViewModel instance. /// /// Pointer to the native bindable artboard. /// Optional ViewModel instance to bind to this artboard. internal BindableArtboard(IntPtr nativeBindableArtboard, ViewModelInstance viewModelInstance) { m_nativeBindableArtboard = nativeBindableArtboard; if (viewModelInstance != null && viewModelInstance.NativeSafeHandle != null && !viewModelInstance.NativeSafeHandle.IsInvalid) { m_viewModelInstanceHandle = viewModelInstance.NativeSafeHandle; } else { m_viewModelInstanceHandle = ViewModelInstanceSafeHandle.Null; } } /// /// Dispose of the BindableArtboard and release native resources. /// public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { if (!m_isDisposed) { if (m_nativeBindableArtboard != IntPtr.Zero) { unrefBindableArtboard(m_nativeBindableArtboard); m_nativeBindableArtboard = IntPtr.Zero; } m_isDisposed = true; } } ~BindableArtboard() { Dispose(false); } /// /// Gets the name of the artboard. /// public string Name { get { if (m_artboardName == null && !m_isDisposed) { m_artboardName = Marshal.PtrToStringAnsi(getBindableArtboardName(m_nativeBindableArtboard)); } return m_artboardName; } } #region Native Methods [DllImport(NativeLibrary.name)] private static extern void unrefBindableArtboard(IntPtr artboard); [DllImport(NativeLibrary.name)] private static extern IntPtr getBindableArtboardName(IntPtr artboard); #endregion } }