/// <summary> /// Gets a <see cref="GlobalPersistentContext{T}"/> object and creates a <see cref="LocalPersistentContext{T}"/> object for it. /// </summary> /// <typeparam name="TValue">The type of the value of the context.</typeparam> /// <param name="drawer">The instance of the drawer.</param> /// <param name="key">The key for the context.</param> /// <param name="defaultValue">The default value for the context.</param> public LocalPersistentContext <TValue> GetPersistent <TValue>(OdinDrawer drawer, string key, TValue defaultValue) { PropertyContext <LocalPersistentContext <TValue> > context; if (this.Get <LocalPersistentContext <TValue> >(drawer, key, out context)) { context.Value = LocalPersistentContext <TValue> .Create(PersistentContext.Get( TwoWaySerializationBinder.Default.BindToName(drawer.GetType()), TwoWaySerializationBinder.Default.BindToName(this.property.Tree.TargetType), this.property.Path, new DrawerStateSignature(this.property.RecursiveDrawDepth, InlineEditorAttributeDrawer.CurrentInlineEditorDrawDepth, this.property.DrawerChainIndex), key, defaultValue)); } return(context.Value); }
/// <summary> /// Gets a persistent value that will survive past multiple Unity Editor Application sessions. /// The value is stored in the PersistentContextCache, which has a customizable max cache size. /// </summary> public static LocalPersistentContext <T> GetPersistentValue <T>(this OdinDrawer drawer, string key, T defaultValue = default(T)) { var a = TwoWaySerializationBinder.Default.BindToName(drawer.GetType()); var b = TwoWaySerializationBinder.Default.BindToName(drawer.Property.Tree.TargetType); var c = drawer.Property.Path; var d = new DrawerStateSignature(drawer.Property.RecursiveDrawDepth, InlineEditorAttributeDrawer.CurrentInlineEditorDrawDepth, drawer.Property.DrawerChainIndex); var e = key; GlobalPersistentContext <T> global; if (PersistentContext.Get(a, b, c, d, e, out global)) { global.Value = defaultValue; } return(LocalPersistentContext <T> .Create(global)); }
/// <summary> /// Gets a <see cref="GlobalPersistentContext{T}"/> object and creates a <see cref="LocalPersistentContext{T}"/> object for it. /// Returns <c>true</c> when the <see cref="GlobalPersistentContext{T}"/> is first created. Otherwise <c>false</c>. /// </summary> /// <typeparam name="TValue">The type of the value of the context.</typeparam> /// <param name="drawer">The instance of the drawer.</param> /// <param name="key">The key for the context.</param> /// <param name="context">The <see cref="LocalPersistentContext{T}"/> object.</param> /// <returns>Returns <c>true</c> when the <see cref="GlobalPersistentContext{T}"/> is first created. Otherwise <c>false</c>.</returns> public bool GetPersistent <TValue>(OdinDrawer drawer, string key, out LocalPersistentContext <TValue> context) { bool isNew = false; PropertyContext <LocalPersistentContext <TValue> > propertyContext; if (this.Get <LocalPersistentContext <TValue> >(drawer, key, out propertyContext)) { GlobalPersistentContext <TValue> global; isNew = PersistentContext.Get( TwoWaySerializationBinder.Default.BindToName(drawer.GetType()), TwoWaySerializationBinder.Default.BindToName(this.property.Tree.TargetType), this.property.Path, new DrawerStateSignature(this.property.RecursiveDrawDepth, InlineEditorAttributeDrawer.CurrentInlineEditorDrawDepth, this.property.DrawerChainIndex), key, out global); propertyContext.Value = LocalPersistentContext <TValue> .Create(global); } context = propertyContext.Value; return(isNew); }