diff options
Diffstat (limited to 'src/GraphicObjects/TemplatedGroup.cs')
| -rw-r--r-- | src/GraphicObjects/TemplatedGroup.cs | 142 |
1 files changed, 75 insertions, 67 deletions
diff --git a/src/GraphicObjects/TemplatedGroup.cs b/src/GraphicObjects/TemplatedGroup.cs index ef099f93..c72bfbcb 100644 --- a/src/GraphicObjects/TemplatedGroup.cs +++ b/src/GraphicObjects/TemplatedGroup.cs @@ -34,6 +34,7 @@ using System.Collections; using System.Threading; using System.Linq; using Crow.IML; +using System.Diagnostics; namespace Crow { @@ -45,7 +46,7 @@ namespace Crow #endregion protected Group items; - string _itemTemplate, _dataTest; + string _itemTemplate, dataTest; #region events public event EventHandler<SelectionChangeEventArgs> SelectedItemChanged; @@ -67,6 +68,11 @@ namespace Crow public Dictionary<string, ItemTemplate> ItemTemplates = new Dictionary<string, Crow.ItemTemplate>(); /// <summary> + /// Keep track of expanded subnodes and closed time to unload + /// </summary> + //Dictionary<GraphicObject, Stopwatch> nodes = new Dictionary<GraphicObject, Stopwatch>(); + internal List<GraphicObject> nodes = new List<GraphicObject>(); + /// <summary> /// Item templates file path, on disk or embedded. /// /// ItemTemplate file may contains either a single template without the @@ -106,14 +112,14 @@ namespace Crow /// <value>The data property test.</value> [XmlAttributeAttribute][DefaultValue("TypeOf")] public string DataTest { - get { return _dataTest; } + get { return dataTest; } set { - if (value == _dataTest) + if (value == dataTest) return; - _dataTest = value; + dataTest = value; - NotifyValueChanged("DataTest", _dataTest); + NotifyValueChanged("DataTest", dataTest); } } #endregion @@ -170,7 +176,7 @@ namespace Crow if (value == data) return; - cancelLoadingThread (); + //cancelLoadingThread (); if (data is IObservableList) { IObservableList ol = data as IObservableList; @@ -188,15 +194,17 @@ namespace Crow NotifyValueChanged ("Data", data); - lock (CurrentInterface.LayoutMutex) + //lock (CurrentInterface.LayoutMutex) ClearItems (); if (data == null) return; - loadingThread = new CrowThread (this, loading); - loadingThread.Finished += (object sender, EventArgs e) => (sender as TemplatedGroup).Loaded.Raise (sender, e); - loadingThread.Start (); +// loadingThread = new CrowThread (this, loading); +// loadingThread.Finished += (object sender, EventArgs e) => (sender as TemplatedGroup).Loaded.Raise (sender, e); +// loadingThread.Start (); + + loadPage (data, items, dataTest); NotifyValueChanged ("SelectedIndex", _selectedIndex); NotifyValueChanged ("SelectedItem", SelectedItem); @@ -223,7 +231,7 @@ namespace Crow // int i = e.Index % itemPerPage; // (items.Children [p] as Group).InsertChild (i, e.Element); } else - loadItem (e.Index, items); + loadItem (e.Element, items, dataTest); } [XmlAttributeAttribute][DefaultValue("SteelBlue")] @@ -319,69 +327,62 @@ namespace Crow /// <summary> /// Items loading thread /// </summary> - void loading(){ - //if (!ItemTemplates.ContainsKey ("default")) - // ItemTemplates ["default"] = Interface.GetItemTemplate (ItemTemplate); - - for (int i = 1; i <= (data.Count / itemPerPage) + 1; i++) { - if ((bool)loadingThread?.cancelRequested) { - this.Dispose (); - return; - } - loadPage (i); - Thread.Sleep (1); - } - } +// void loading(){ +// //if (!ItemTemplates.ContainsKey ("default")) +// // ItemTemplates ["default"] = Interface.GetItemTemplate (ItemTemplate); +// +// for (int i = 1; i <= (data.Count / itemPerPage) + 1; i++) { +// if ((bool)loadingThread?.cancelRequested) { +// this.Dispose (); +// return; +// } +// loadPage (i); +// Thread.Sleep (1); +// } +// } void cancelLoadingThread(){ if (loadingThread != null) loadingThread.Cancel (); } - void loadPage(int pageNum) + void loadPage(IList _data, Group page, string _dataTest) { #if DEBUG_LOAD Stopwatch loadingTime = new Stopwatch (); loadingTime.Start (); #endif - Group page; - if (typeof(TabView).IsAssignableFrom (items.GetType ())|| - typeof(Menu).IsAssignableFrom (this.GetType())|| - typeof(Wrapper).IsAssignableFrom (items.GetType ())) { - page = items; - itemPerPage = int.MaxValue; - } else if (typeof(GenericStack).IsAssignableFrom (items.GetType ())) { - GenericStack gs = new GenericStack (items.CurrentInterface); - gs.Orientation = (items as GenericStack).Orientation; - gs.Width = items.Width; - gs.Height = items.Height; - gs.VerticalAlignment = items.VerticalAlignment; - gs.HorizontalAlignment = items.HorizontalAlignment; - page = gs; - page.Name = "page" + pageNum; - isPaged = true; - } else { - page = Activator.CreateInstance (items.GetType ()) as Group; - page.CurrentInterface = items.CurrentInterface; - page.Initialize (); - page.Name = "page" + pageNum; - isPaged = true; - } - for (int i = (pageNum - 1) * itemPerPage; i < pageNum * itemPerPage; i++) { - if (i >= data.Count) - break; - if ((bool)loadingThread?.cancelRequested) { - page.Dispose (); - return; - } +// if (typeof(TabView).IsAssignableFrom (items.GetType ())|| +// typeof(Menu).IsAssignableFrom (this.GetType())|| +// typeof(Wrapper).IsAssignableFrom (items.GetType ())) { + //page = items; + itemPerPage = int.MaxValue; +// } else if (typeof(GenericStack).IsAssignableFrom (items.GetType ())) { +// GenericStack gs = new GenericStack (items.CurrentInterface); +// gs.Orientation = (items as GenericStack).Orientation; +// gs.Width = items.Width; +// gs.Height = items.Height; +// gs.VerticalAlignment = items.VerticalAlignment; +// gs.HorizontalAlignment = items.HorizontalAlignment; +// page = gs; +// page.Name = "page" + pageNum; +// isPaged = true; +// } else { +// page = Activator.CreateInstance (items.GetType ()) as Group; +// page.CurrentInterface = items.CurrentInterface; +// page.Initialize (); +// page.Name = "page" + pageNum; +// isPaged = true; +// } - loadItem (i, page); + for (int i = 0; i < _data.Count; i++) { + loadItem (_data[i], page, _dataTest); } - if (page == items) - return; - lock (CurrentInterface.LayoutMutex) - items.AddChild (page); +// if (page == items) +// return; +// lock (CurrentInterface.LayoutMutex) +// items.AddChild (page); #if DEBUG_LOAD loadingTime.Stop (); @@ -390,23 +391,23 @@ namespace Crow loadingTime.ElapsedMilliseconds, this.ToString()); #endif } - string getItempKey(Type dataType, object o){ + string getItempKey(Type dataType, object o, string propertyName){ try { - return dataType.GetProperty (_dataTest).GetGetMethod ().Invoke (o, null)?.ToString(); + return dataType.GetProperty (propertyName).GetGetMethod ().Invoke (o, null)?.ToString(); } catch { return dataType.FullName; } } - protected void loadItem(int i, Group page){ - if (data [i] == null)//TODO:surely a threading sync problem + protected void loadItem(object o, Group page, string _dataTest){ + if (o == null)//TODO:surely a threading sync problem return; GraphicObject g = null; ItemTemplate iTemp = null; - Type dataType = data [i].GetType (); + Type dataType = o.GetType (); string itempKey = dataType.FullName; if (_dataTest != "TypeOf") - itempKey = getItempKey (dataType, data [i]); + itempKey = getItempKey (dataType, o, _dataTest); if (ItemTemplates.ContainsKey (itempKey)) iTemp = ItemTemplates [itempKey]; @@ -437,7 +438,7 @@ namespace Crow (g as Expandable).GetIsExpandable = iTemp.HasSubItems; } - g.DataSource = data [i]; + g.DataSource = o; } protected virtual void registerItemClick(GraphicObject g){ g.MouseClick += itemClick; @@ -475,6 +476,13 @@ namespace Crow SelectedIndex = data.IndexOf((sender as GraphicObject).DataSource); } + bool emitHelperIsAlreadyExpanded (GraphicObject go){ + if (nodes.Contains (go)) + return true; + nodes.Add (go); + return false; + } + protected override void Dispose (bool disposing) { if (disposing && loadingThread != null) |