From af75526e0ba507bad1b32963437491a4f752330e Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jean-Philippe=20Bruy=C3=A8re?= Date: Sat, 10 Apr 2021 02:15:15 +0200 Subject: [PATCH] registerSubData in TemplatedGroup to handle IObservableList in TreeView nodes, experimental feature! --- Crow/src/IML/CompilerServices.cs | 1 + Crow/src/ItemTemplate.cs | 22 ++++++++++++++++-- Crow/src/Widgets/TemplatedGroup.cs | 37 ++++++++++++++++++++---------- 3 files changed, 46 insertions(+), 14 deletions(-) diff --git a/Crow/src/IML/CompilerServices.cs b/Crow/src/IML/CompilerServices.cs index 11779999..fc22d1e1 100644 --- a/Crow/src/IML/CompilerServices.cs +++ b/Crow/src/IML/CompilerServices.cs @@ -84,6 +84,7 @@ namespace Crow.IML internal static MethodInfo miGetITempFromDic = typeof(Dictionary).GetMethod ("get_Item", new Type[] { typeof(string) }); internal static FieldInfo fldItemTemplates = typeof(TemplatedGroup).GetField("ItemTemplates"); internal static MethodInfo miLoadPage = typeof(TemplatedGroup).GetMethod ("loadPage", BindingFlags.Instance | BindingFlags.NonPublic| BindingFlags.Public); + internal static MethodInfo miRegisterSubData = typeof(TemplatedGroup).GetMethod ("registerSubData", BindingFlags.Instance | BindingFlags.NonPublic); internal static MethodInfo miIsAlreadyExpanded = typeof(TemplatedGroup).GetMethod("emitHelperIsAlreadyExpanded", BindingFlags.Instance | BindingFlags.NonPublic); internal static MethodInfo miCreateExpDel = typeof(ItemTemplate).GetMethod ("CreateExpandDelegate"); diff --git a/Crow/src/ItemTemplate.cs b/Crow/src/ItemTemplate.cs index d1c28e2b..e4fc2d8e 100644 --- a/Crow/src/ItemTemplate.cs +++ b/Crow/src/ItemTemplate.cs @@ -13,6 +13,7 @@ using System.Collections.Generic; using System.Diagnostics; using System.Linq; using Crow.IML; +using System.Collections; namespace Crow { @@ -136,14 +137,16 @@ namespace Crow //DM is bound to templatedGroup root (arg0) //arg1 is the sender of the expand event DynamicMethod dm = new DynamicMethod ("dyn_expand_" + fetchMethodName, - typeof (void), args,typeof(TemplatedGroup), true); + typeof (void), args, typeof(TemplatedGroup), true); System.Reflection.Emit.Label gotoEnd; System.Reflection.Emit.Label ifDataIsNull; System.Reflection.Emit.Label gotoItemsContainerNotFound; - ILGenerator il = dm.GetILGenerator (256); + ILGenerator il = dm.GetILGenerator (256); + il.DeclareLocal(typeof(Widget)); + il.DeclareLocal(typeof(IEnumerable)); gotoEnd = il.DefineLabel (); ifDataIsNull = il.DefineLabel (); @@ -181,11 +184,26 @@ namespace Crow }else emitGetSubData(il, dataType); } + il.Emit (OpCodes.Stloc_1);//save and reload datas IEnumerable for registering IObsList + il.Emit (OpCodes.Ldloc_1); + //set 'return' from the fetch method as 'data' of the list //il.Emit (OpCodes.Callvirt, piData.GetSetMethod ()); il.Emit (OpCodes.Ldloc_0);//load second arg of loadPage, the sender node il.Emit (OpCodes.Ldstr, dataTest);//load 3rd arg, dataTest kind on subitems il.Emit (OpCodes.Callvirt, CompilerServices.miLoadPage); + + //try register Observable list events + il.Emit (OpCodes.Ldarg_0);//root templated group + il.Emit (OpCodes.Ldloc_1);//datas enumerable + il.Emit (OpCodes.Ldstr, dataTest);//load dataTest kind on subitems + il.Emit (OpCodes.Ldloc_0);//load items container + //load datas parent + /*il.Emit (OpCodes.Ldarg_0);//push root TemplatedGroup into the stack + il.Emit (OpCodes.Ldarg_1);//load sender node of expand + il.Emit (OpCodes.Callvirt, CompilerServices.miGetDataSource);*/ + il.Emit (OpCodes.Call, CompilerServices.miRegisterSubData); + il.Emit (OpCodes.Br, gotoEnd); il.MarkLabel(gotoItemsContainerNotFound); diff --git a/Crow/src/Widgets/TemplatedGroup.cs b/Crow/src/Widgets/TemplatedGroup.cs index d4132672..aea5c78d 100644 --- a/Crow/src/Widgets/TemplatedGroup.cs +++ b/Crow/src/Widgets/TemplatedGroup.cs @@ -133,9 +133,15 @@ namespace Crow { set { if (SelectedItem == value) return; - + + if (selectedItem is ISelectable oldItem) + oldItem.IsSelected = false; + selectedItem = value; + if (selectedItem is ISelectable newItem) + newItem.IsSelected = true; + NotifyValueChanged ("SelectedItem", SelectedItem); SelectedItemChanged.Raise (this, new SelectionChangeEventArgs (SelectedItem)); } @@ -374,11 +380,6 @@ namespace Crow { } void loadPage(IEnumerable _data, Group page, string _dataTest) { - #if DEBUG_LOAD - Stopwatch loadingTime = Stopwatch.StartNew (); - #endif - - // if (typeof(TabView).IsAssignableFrom (items.GetType ())|| // typeof(Menu).IsAssignableFrom (this.GetType())|| // typeof(Wrapper).IsAssignableFrom (items.GetType ())) { @@ -416,12 +417,6 @@ namespace Crow { // lock (CurrentInterface.LayoutMutex) // items.AddChild (page); -#if DEBUG_LOAD - loadingTime.Stop (); - using (StreamWriter sw = new StreamWriter ("loading.log", true)) { - sw.WriteLine ($"NEW ;{this.ToString(),-50};{loadingTime.ElapsedTicks,8};{loadingTime.ElapsedMilliseconds,8}"); - } -#endif } protected void loadItem(object o, Group page, string _dataTest){ @@ -587,5 +582,23 @@ namespace Crow { if (data is IObservableList) (data as IObservableList).RaiseEdit (); } + + + void registerSubData (IEnumerable datas, string dataTest, Group itemsContainer){//, object dataParent) { + /*if (dataParent is IValueChange vc) { + + }*/ + if (datas is IObservableList ol) { + ol.ListAdd += (sender, e) => loadItem (e.Element, itemsContainer, dataTest); + ol.ListRemove += (sender, e) => itemsContainer.DeleteChild (e.Index); + ol.ListEdit += (sender, e) => itemsContainer.Children [e.Index].DataSource = e.Element; + ol.ListClear += (sender, e) => { lock (IFace.UpdateMutex) + itemsContainer.ClearChildren ();}; + + } + } + void onDatasChanged (object sender, ValueChangeEventArgs e) { + + } } } -- 2.47.3