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
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
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
if (!attachments.ContainsKey(attachment.InventoryID))\r
{\r
attachments.Add(attachment.InventoryID, attachment);\r
- \r
+\r
}\r
else\r
{\r
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
{\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
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
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
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
\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
\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
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
{\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
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
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
newOutfit.Add((InventoryItem)item);\r
}\r
client.Appearance.ReplaceOutfit(newOutfit);\r
+ UpdateWornLabels();\r
break;\r
\r
case "outfit_add":\r
addToOutfit.Add((InventoryItem)item);\r
}\r
client.Appearance.AddToOutfit(addToOutfit);\r
+ UpdateWornLabels();\r
break;\r
\r
case "outfit_take_off":\r
removeFromOutfit.Add((InventoryItem)item);\r
}\r
client.Appearance.RemoveFromOutfit(removeFromOutfit);\r
+ UpdateWornLabels();\r
break;\r
}\r
#endregion\r
#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
\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
}\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