]> O.S.I.I.S - jp/crow.git/commitdiff
registerSubData in TemplatedGroup to handle IObservableList in TreeView nodes, experi...
authorJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Sat, 10 Apr 2021 00:15:15 +0000 (02:15 +0200)
committerJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Sat, 10 Apr 2021 00:15:15 +0000 (02:15 +0200)
Crow/src/IML/CompilerServices.cs
Crow/src/ItemTemplate.cs
Crow/src/Widgets/TemplatedGroup.cs

index 11779999750d8c0f495ddf150bd98bc90c1d45a3..fc22d1e1582f2528e7305ee54ab2783adb361824 100644 (file)
@@ -84,6 +84,7 @@ namespace Crow.IML
                internal static MethodInfo miGetITempFromDic = typeof(Dictionary<string, ItemTemplate>).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");
index d1c28e2b2f7674e1218113b75452190523823429..e4fc2d8e87d345c2807c2bf84ddb2a1133db259b 100644 (file)
@@ -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);
index d41326727d126ca119c607715f702fd45f85a03a..aea5c78db02b98b642edd4d4974c8433ab2f8e1a 100644 (file)
@@ -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) {
+                       
+               }
        }
 }