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");
using System.Diagnostics;
using System.Linq;
using Crow.IML;
+using System.Collections;
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 ();
}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);
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));
}
}
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 ())) {
// 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){
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) {
+
+ }
}
}