]> O.S.I.I.S - jp/crow.git/commitdiff
TemplatedGroup: cancelLoadingThread on obsList.add, ISelectable.Selected=>tg.Selected...
authorJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Sat, 27 Mar 2021 17:44:47 +0000 (18:44 +0100)
committerJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Sat, 27 Mar 2021 17:44:47 +0000 (18:44 +0100)
Crow/src/Widgets/MenuItem.cs
Crow/src/Widgets/TemplatedGroup.cs
Crow/src/Widgets/TreeView.cs

index 08db92915283e3dd7562dc5e89ecb60114d6fe21..62a00cb69f93f080cd270ea4253bc95e70ee8845 100644 (file)
@@ -134,7 +134,7 @@ namespace Crow
                        Menu menu = LogicalParent as Menu;
                        if (menu == null)
                                return;
-                       if (menu.AutomaticOpening && items.Children.Count>0)
+                       if (menu.AutomaticOpening && itemsContainer.Children.Count>0)
                                IsOpened = true;
                }
                public override void onMouseLeave (object sender, MouseMoveEventArgs e)
index 713f4979431fd8702dee54ee56426c34384b82cf..7c84f5459c763b9669a18e09b72a89e065993965 100644 (file)
@@ -37,7 +37,7 @@ namespace Crow {
                protected TemplatedGroup (Interface iface, string style = null) : base (iface, style) { }
                #endregion
 
-               protected Group items;
+               protected Group itemsContainer;
                string _itemTemplate, dataTest;
 
                #region events
@@ -89,10 +89,11 @@ namespace Crow {
                {
                        base.loadTemplate (template);
 
-                       items = this.child.FindByName ("ItemsContainer") as Group;
-                       if (items == null)
+                       itemsContainer = this.child.FindByName ("ItemsContainer") as Group;
+                       if (itemsContainer == null)
                                throw new Exception ("TemplatedGroup template Must contain a Group named 'ItemsContainer'");
-                       if (items.Children.Count == 0)
+                       NotifyValueChanged ("Items", Items);
+                       if (itemsContainer.Children.Count == 0)
                                NotifyValueChanged ("HasChildren", false);
                        else
                                NotifyValueChanged ("HasChildren", true);
@@ -105,7 +106,7 @@ namespace Crow {
                /// <value>The data property test.</value>
                [DefaultValue("TypeOf")]
                public string DataTest {
-                       get { return dataTest; }
+                       get => dataTest;
                        set {
                                if (value == dataTest)
                                        return;
@@ -119,8 +120,8 @@ namespace Crow {
 
                public virtual List<Widget> Items{
                        get {
-                               return isPaged ? items.Children.SelectMany(x => (x as Group).Children).ToList()
-                               : items.Children;
+                               return isPaged ? itemsContainer?.Children.SelectMany(x => (x as Group).Children).ToList()
+                               : itemsContainer?.Children;
                        }
                }
 
@@ -175,6 +176,13 @@ namespace Crow {
                                if (data == null)
                                        return;
 
+                               if (data is ICollection c) {
+                                       if (c.Count == 0) {
+                                               NotifyValueChanged ("HasItems", false);         
+                                               return;
+                                       }
+                               }
+
                                loadingThread = new CrowThread (this, loading);
                                loadingThread.Finished += (object sender, EventArgs e) => (sender as TemplatedGroup).Loaded.Raise (sender, e);
                                loadingThread.Start ();
@@ -187,29 +195,31 @@ namespace Crow {
 
                void Ol_ListRemove (object sender, ListChangedEventArg e)
                {
+                       cancelLoadingThread ();
                        if (this.isPaged) {
                                int p = e.Index / itemPerPage;
                                int i = e.Index % itemPerPage;
-                               (items.Children [p] as Group).DeleteChild (i);
+                               (itemsContainer.Children [p] as Group).DeleteChild (i);
                        } else
-                               items.DeleteChild (e.Index);
+                               itemsContainer.DeleteChild (e.Index);
                }
 
                void Ol_ListAdd (object sender, ListChangedEventArg e)
                {
+                       cancelLoadingThread ();
                        if (this.isPaged) {
                                throw new NotImplementedException();
 //                             int p = e.Index / itemPerPage;
 //                             int i = e.Index % itemPerPage;
 //                             (items.Children [p] as Group).InsertChild (i, e.Element);
                        } else
-                               loadItem (e.Element, items, dataTest);
+                               loadItem (e.Element, itemsContainer, dataTest);
                }
-               void Ol_ListEdit (object sender, ListChangedEventArg e) {
+               void Ol_ListEdit (object sender, ListChangedEventArg e) {                       
                        if (this.isPaged) {
                                throw new NotImplementedException ();
                        } else
-                               items.Children [e.Index].DataSource = e.Element;
+                               itemsContainer.Children [e.Index].DataSource = e.Element;
 
                }
 
@@ -220,15 +230,16 @@ namespace Crow {
 
 
                public virtual void AddItem(Widget g){
-                       items.AddChild (g);
+                       
+                       itemsContainer.AddChild (g);
                        g.LogicalParent = this;
                        NotifyValueChanged ("HasChildren", true);
                }
                public virtual void RemoveItem(Widget g)
-               {
+               {                               
                        g.LogicalParent = null;
-                       items.DeleteChild (g);
-                       if (items.Children.Count == 0)
+                       itemsContainer.DeleteChild (g);
+                       if (itemsContainer.Children.Count == 0)
                                NotifyValueChanged ("HasChildren", false);
                }
 
@@ -237,7 +248,7 @@ namespace Crow {
                        selectedItemContainer = null;
                        SelectedItem = null;
 
-                       items.ClearChildren ();
+                       itemsContainer.ClearChildren ();
                        NotifyValueChanged ("HasChildren", false);
                }
 
@@ -299,7 +310,7 @@ namespace Crow {
                        DbgLogger.StartEvent (DbgEvtType.TGLoadingThread, this);
 
                        try {
-                               loadPage (data, items, dataTest);
+                               loadPage (data, itemsContainer, dataTest);
                        } catch (Exception ex) {
                                if (Monitor.IsEntered (IFace.LayoutMutex))
                                        Monitor.Exit (IFace.LayoutMutex);
@@ -340,6 +351,7 @@ namespace Crow {
                        if (updateMx)
                                Monitor.Enter (IFace.UpdateMutex);
 
+                       loadingThread = null;
                }
                void loadPage(IEnumerable _data, Group page, string _dataTest)
                {
@@ -428,8 +440,12 @@ namespace Crow {
                                if (iTemp == null)
                                        iTemp = ItemTemplates ["default"];
                        }
-
-                       Monitor.Enter (IFace.LayoutMutex);
+                       while (!Monitor.TryEnter(IFace.LayoutMutex)) {
+                               if (loadingThread.cancelRequested)
+                                       return;
+                               Thread.Sleep(1);
+                       }
+                       
                                g = iTemp.CreateInstance();
                                #if DESIGN_MODE
                                g.design_isTGItem = true;
@@ -466,7 +482,7 @@ namespace Crow {
                        if (selectedItemContainer is ISelectable li)
                                li.IsSelected = false;
                        selectedItemContainer = sender as Widget;
-
+                       SelectedItem = selectedItemContainer.DataSource;
                        SelectedItemContainerChanged.Raise (this, new SelectionChangeEventArgs (sender));
                }
 
@@ -486,7 +502,7 @@ namespace Crow {
                        get {
                                if (data == null)
                                        return -1;
-                               GenericStack page1 = items.FindByName ("page1") as GenericStack;
+                               GenericStack page1 = itemsContainer.FindByName ("page1") as GenericStack;
                                if (page1 == null)
                                        return -1;
 
@@ -502,10 +518,11 @@ namespace Crow {
                internal virtual void itemClick(object sender, MouseButtonEventArgs e){
                        //SelectedIndex = (int)((IList)data)?.IndexOf((sender as Widget).DataSource);
                        
-                       if (sender is ISelectable nli)
+                       if (sender is ISelectable nli) {
                                nli.IsSelected = true;
-                       else
-                               selectedItemContainer = sender as Widget;
+                               return;
+                       }
+                       selectedItemContainer = sender as Widget;
                        if (selectedItemContainer == null)
                                return;
                        SelectedItem = selectedItemContainer.DataSource;
index 3e2fd9de07b66c111f102751a06cfad210ad191c..2993a12b5fd4e78d2667b03057b0e7106e8739b2 100644 (file)
@@ -39,7 +39,7 @@ namespace Crow
                }
 
                public void ExpandAll(){
-                       foreach (Group grp in items.Children) {
+                       foreach (Group grp in itemsContainer.Children) {
                                foreach (Widget go in grp.Children) {
                                        Expandable exp = go as Expandable;
                                        if (exp == null)