OSDN Git Service

Have correct labels on worn items. Related to RAD-8
authorLatif Khalifa <latifer@streamgrid.net>
Sat, 5 Sep 2009 17:06:32 +0000 (17:06 +0000)
committerLatif Khalifa <latifer@streamgrid.net>
Sat, 5 Sep 2009 17:06:32 +0000 (17:06 +0000)
git-svn-id: https://radegast.googlecode.com/svn/trunk@197 f7a694da-4d33-11de-9ad6-1127a62b9fcd

Radegast/GUI/Consoles/Inventory/InventoryConsole.cs
Radegast/RadegastBuild.cs

index a2007d7..2220bf5 100644 (file)
@@ -83,6 +83,7 @@ namespace Radegast
         private Dictionary<UUID, TreeNode> UUID2NodeCache = new Dictionary<UUID, TreeNode>();\r
         private int updateInterval = 1000;\r
         private Thread InventoryUpdate;\r
+        private List<UUID> WornItems = new List<UUID>();\r
 \r
         #region Construction and disposal\r
         public InventoryConsole(RadegastInstance instance)\r
@@ -120,6 +121,7 @@ namespace Radegast
             Inventory.OnInventoryObjectRemoved += new Inventory.InventoryObjectRemoved(Store_OnInventoryObjectRemoved);\r
             client.Objects.OnNewAttachment += new ObjectManager.NewAttachmentCallback(Objects_OnNewAttachment);\r
             client.Objects.OnObjectKilled += new ObjectManager.KillObjectCallback(Objects_OnObjectKilled);\r
+            client.Appearance.OnAppearanceSet += new AppearanceManager.AppearanceSetCallback(Appearance_OnAppearanceSet);\r
         }\r
 \r
         void InventoryConsole_Disposed(object sender, EventArgs e)\r
@@ -129,10 +131,16 @@ namespace Radegast
             Inventory.OnInventoryObjectRemoved -= new Inventory.InventoryObjectRemoved(Store_OnInventoryObjectRemoved);\r
             client.Objects.OnNewAttachment -= new ObjectManager.NewAttachmentCallback(Objects_OnNewAttachment);\r
             client.Objects.OnObjectKilled -= new ObjectManager.KillObjectCallback(Objects_OnObjectKilled);\r
+            client.Appearance.OnAppearanceSet -= new AppearanceManager.AppearanceSetCallback(Appearance_OnAppearanceSet);\r
         }\r
         #endregion\r
 \r
         #region Network callbacks\r
+        void Appearance_OnAppearanceSet(bool success)\r
+        {\r
+            UpdateWornLabels();\r
+        }\r
+\r
         void Objects_OnObjectKilled(Simulator simulator, uint objectID)\r
         {\r
             AttachmentInfo attachment = null;\r
@@ -197,7 +205,7 @@ namespace Radegast
                         if (!attachments.ContainsKey(attachment.InventoryID))\r
                         {\r
                             attachments.Add(attachment.InventoryID, attachment);\r
-                            \r
+\r
                         }\r
                         else\r
                         {\r
@@ -612,6 +620,8 @@ namespace Radegast
             TreeUpdateInProgress = false;\r
             UpdateStatus("OK");\r
 \r
+            // Updated labels on clothes that we are wearing\r
+            UpdateWornLabels();\r
 \r
             // Update attachments now that we are done\r
             lock (attachments)\r
@@ -676,11 +686,11 @@ namespace Radegast
             {\r
                 try\r
                 {\r
-                Invoke(new MethodInvoker(delegate()\r
-                {\r
-                    TreeUpdateTimerTick(sender);\r
-                }\r
-                ));\r
+                    Invoke(new MethodInvoker(delegate()\r
+                    {\r
+                        TreeUpdateTimerTick(sender);\r
+                    }\r
+                    ));\r
                 }\r
                 catch (Exception) { }\r
                 return;\r
@@ -734,7 +744,7 @@ namespace Radegast
         private void btnProfile_Click(object sender, EventArgs e)\r
         {\r
             (new frmProfile(instance, txtCreator.Text, txtCreator.AgentID)).Show();\r
-            \r
+\r
         }\r
 \r
         void UpdateItemInfo(InventoryItem item)\r
@@ -766,7 +776,7 @@ namespace Radegast
                     image.Dock = DockStyle.Fill;\r
                     pnlDetail.Controls.Add(image);\r
                     break;\r
-                \r
+\r
                 case AssetType.Notecard:\r
                     Notecard note = new Notecard(instance, (InventoryNotecard)item);\r
                     note.Dock = DockStyle.Fill;\r
@@ -801,7 +811,7 @@ namespace Radegast
                 InventoryItem item = e.Node.Tag as InventoryItem;\r
                 switch (item.AssetType)\r
                 {\r
-                        \r
+\r
                     case AssetType.Landmark:\r
                         instance.TabConsole.DisplayNotificationInChat("Teleporting to " + item.Name);\r
                         client.Self.RequestTeleport(item.AssetUUID);\r
@@ -840,7 +850,14 @@ namespace Radegast
 \r
         public bool IsWorn(InventoryItem item)\r
         {\r
-            return client.Appearance.IsItemWorn(item) != WearableType.Invalid;\r
+            bool worn = client.Appearance.IsItemWorn(item) != WearableType.Invalid;\r
+\r
+            lock (WornItems)\r
+            {\r
+                if (worn && !WornItems.Contains(item.UUID))\r
+                    WornItems.Add(item.UUID);\r
+            }\r
+            return worn;\r
         }\r
 \r
         public AttachmentPoint AttachedTo(InventoryItem item)\r
@@ -986,24 +1003,25 @@ namespace Radegast
 \r
                         ctxInv.Items.Add(new ToolStripSeparator());\r
 \r
-                        ctxItem = new ToolStripMenuItem("Delete", null, OnInvContextClick);\r
-                        ctxItem.Name = "delete_folder";\r
-                        ctxInv.Items.Add(ctxItem);\r
-\r
-                        ctxInv.Items.Add(new ToolStripSeparator());\r
-\r
-                        ctxItem = new ToolStripMenuItem("Take off Items", null, OnInvContextClick);\r
-                        ctxItem.Name = "outfit_take_off";\r
-                        ctxInv.Items.Add(ctxItem);\r
-\r
-                        ctxItem = new ToolStripMenuItem("Add to Outfit", null, OnInvContextClick);\r
-                        ctxItem.Name = "outfit_add";\r
-                        ctxInv.Items.Add(ctxItem);\r
+                        if (!client.Appearance.ManagerBusy)\r
+                        {\r
+                            ctxItem = new ToolStripMenuItem("Take off Items", null, OnInvContextClick);\r
+                            ctxItem.Name = "outfit_take_off";\r
+                            ctxInv.Items.Add(ctxItem);\r
 \r
-                        ctxItem = new ToolStripMenuItem("Replace Outfit", null, OnInvContextClick);\r
-                        ctxItem.Name = "outfit_replace";\r
-                        ctxInv.Items.Add(ctxItem);\r
+                            ctxItem = new ToolStripMenuItem("Add to Outfit", null, OnInvContextClick);\r
+                            ctxItem.Name = "outfit_add";\r
+                            ctxInv.Items.Add(ctxItem);\r
 \r
+                            ctxItem = new ToolStripMenuItem("Replace Outfit", null, OnInvContextClick);\r
+                            ctxItem.Name = "outfit_replace";\r
+                            ctxInv.Items.Add(ctxItem);\r
+                        }\r
+                        else\r
+                        {\r
+                            ctxItem = new ToolStripMenuItem("Appearance in progress...");\r
+                            ctxInv.Items.Add(ctxItem);\r
+                        }\r
                     }\r
 \r
                     ctxInv.Show(invTree, new Point(e.X, e.Y));\r
@@ -1055,7 +1073,7 @@ namespace Radegast
                             if (!pt.ToString().StartsWith("HUD"))\r
                             {\r
                                 string name = pt.ToString();\r
-                                \r
+\r
                                 InventoryItem alreadyAttached = null;\r
                                 if ((alreadyAttached = AttachmentAt(pt)) != null)\r
                                 {\r
@@ -1077,7 +1095,7 @@ namespace Radegast
                                 {\r
                                     name += " (" + alreadyAttached.Name + ")";\r
                                 }\r
-                                \r
+\r
                                 ToolStripMenuItem ptItem = new ToolStripMenuItem(name, null, OnInvContextClick);\r
                                 ptItem.Name = pt.ToString();\r
                                 ptItem.Tag = pt;\r
@@ -1091,7 +1109,7 @@ namespace Radegast
                         ctxInv.Items.Add(ctxItem);\r
                     }\r
 \r
-                    if (item is InventoryWearable)\r
+                    if (item is InventoryWearable && !client.Appearance.ManagerBusy)\r
                     {\r
                         ctxInv.Items.Add(new ToolStripSeparator());\r
 \r
@@ -1108,6 +1126,12 @@ namespace Radegast
                             ctxInv.Items.Add(ctxItem);\r
                         }\r
                     }\r
+                    else if (item is InventoryWearable)\r
+                    {\r
+                        ctxInv.Items.Add(new ToolStripSeparator());\r
+                        ctxItem = new ToolStripMenuItem("Appearance in progress...");\r
+                        ctxInv.Items.Add(ctxItem);\r
+                    }\r
 \r
                     ctxInv.Show(invTree, new Point(e.X, e.Y));\r
 \r
@@ -1190,6 +1214,7 @@ namespace Radegast
                                 newOutfit.Add((InventoryItem)item);\r
                         }\r
                         client.Appearance.ReplaceOutfit(newOutfit);\r
+                        UpdateWornLabels();\r
                         break;\r
 \r
                     case "outfit_add":\r
@@ -1200,6 +1225,7 @@ namespace Radegast
                                 addToOutfit.Add((InventoryItem)item);\r
                         }\r
                         client.Appearance.AddToOutfit(addToOutfit);\r
+                        UpdateWornLabels();\r
                         break;\r
 \r
                     case "outfit_take_off":\r
@@ -1210,6 +1236,7 @@ namespace Radegast
                                 removeFromOutfit.Add((InventoryItem)item);\r
                         }\r
                         client.Appearance.RemoveFromOutfit(removeFromOutfit);\r
+                        UpdateWornLabels();\r
                         break;\r
                 }\r
                 #endregion\r
@@ -1219,7 +1246,7 @@ namespace Radegast
                 #region Item actions\r
                 InventoryItem item = (InventoryItem)invTree.SelectedNode.Tag;\r
 \r
-                switch(cmd)\r
+                switch (cmd)\r
                 {\r
                     case "delete_item":\r
                         client.Inventory.MoveItem(item.UUID, client.Inventory.FindFolderForType(AssetType.TrashFolder), item.Name);\r
@@ -1251,10 +1278,19 @@ namespace Radegast
 \r
                     case "item_take_off":\r
                         client.Appearance.RemoveFromOutfit(item);\r
+                        invTree.SelectedNode.Text = ItemLabel(item, false);\r
+                        lock (WornItems)\r
+                        {\r
+                            if (WornItems.Contains(item.UUID))\r
+                            {\r
+                                WornItems.Remove(item.UUID);\r
+                            }\r
+                        }\r
                         break;\r
 \r
                     case "item_wear":\r
                         client.Appearance.AddToOutfit(item);\r
+                        invTree.SelectedNode.Text = ItemLabel(item, false);\r
                         break;\r
                 }\r
                 #endregion\r
@@ -1262,6 +1298,34 @@ namespace Radegast
         }\r
         #endregion\r
 \r
+        private void UpdateWornLabels()\r
+        {\r
+            if (InvokeRequired)\r
+            {\r
+                BeginInvoke(new MethodInvoker(UpdateWornLabels));\r
+                return;\r
+            }\r
+\r
+            invTree.BeginUpdate();\r
+            foreach (UUID itemID in WornItems)\r
+            {\r
+                TreeNode node = findNodeForItem(itemID);\r
+                if (node != null)\r
+                {\r
+                    node.Text = ItemLabel((InventoryBase)node.Tag, false);\r
+                }\r
+            }\r
+            WornItems.Clear();\r
+            foreach (AppearanceManager.WearableData wearable in client.Appearance.GetWearables().Values)\r
+            {\r
+                TreeNode node = findNodeForItem(wearable.ItemID);\r
+                if (node != null)\r
+                {\r
+                    node.Text = ItemLabel((InventoryBase)node.Tag, false);\r
+                }\r
+            }\r
+            invTree.EndUpdate();\r
+        }\r
 \r
         void TreeView_AfterExpand(object sender, TreeViewEventArgs e)\r
         {\r
index 2ac7c9b..f9564d2 100644 (file)
@@ -1,5 +1,5 @@
 // Autogenerated: run updatebuildnr.bat/sh to update \r
 namespace Radegast \r
 { \r
-    public static class RadegastBuild { public static int CurrentRev = 167; } \r
+    public static class RadegastBuild { public static int CurrentRev = 197; } \r
 } \r