aboutsummaryrefslogtreecommitdiffstatsci
diff options
context:
space:
mode:
authorJean-Philippe Bruyère <jp_bruyere@hotmail.com>2021-04-10 02:15:15 +0200
committerJean-Philippe Bruyère <jp_bruyere@hotmail.com>2021-04-10 02:15:15 +0200
commitaf75526e0ba507bad1b32963437491a4f752330e (patch)
tree403ff1c5e8152b2d434cf7e0539de60e89df4443
parentba4e19bd5a09ac02a81db47f804af11ef2821014 (diff)
registerSubData in TemplatedGroup to handle IObservableList in TreeView nodes, experimental feature!
-rw-r--r--Crow/src/IML/CompilerServices.cs1
-rw-r--r--Crow/src/ItemTemplate.cs22
-rw-r--r--Crow/src/Widgets/TemplatedGroup.cs37
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<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");
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) {
+
+ }
}
}