diff --git a/Source/Core/Controls/ThingBrowserControl.cs b/Source/Core/Controls/ThingBrowserControl.cs index 30937207b6e9d93f3acf2d035cbd22ac14d27fb6..70d70321dda3f56b3708580c6c7a1ada32e4858f 100644 --- a/Source/Core/Controls/ThingBrowserControl.cs +++ b/Source/Core/Controls/ThingBrowserControl.cs @@ -455,14 +455,25 @@ namespace CodeImp.DoomBuilder.Controls validnodes.Clear(); string match = tbFilter.Text.ToUpperInvariant(); + HashSet<string> added = new HashSet<string>(StringComparer.OrdinalIgnoreCase); + + // First add nodes, which titles start with given text foreach(TreeNode node in nodes) { - if(node.Text.ToUpperInvariant().Contains(match)) + if(node.Text.ToUpperInvariant().StartsWith(match)) { typelist.Nodes.Add(node); + added.Add(node.Text); } } + // Then add nodes, which titles contain given text + foreach(TreeNode node in nodes) + { + if(!added.Contains(node.Text) && node.Text.ToUpperInvariant().Contains(match)) + typelist.Nodes.Add(node); + } + doupdatenode = true; doupdatetextbox = true; } diff --git a/Source/Core/Rendering/Renderer2D.cs b/Source/Core/Rendering/Renderer2D.cs index fd10e2818feecd07f09d442d229bd66a46e8c132..82ae9c9c72565ea2846ba296a6adcd62141ad3ba 100644 --- a/Source/Core/Rendering/Renderer2D.cs +++ b/Source/Core/Rendering/Renderer2D.cs @@ -1111,7 +1111,7 @@ namespace CodeImp.DoomBuilder.Rendering // Make alpha color Color4 alphacolor = new Color4(alpha, 1.0f, 1.0f, 1.0f); - byte bboxalpha = (byte)(alpha * (General.Editing.Mode.GetType().Name == "ThingsMode" ? 128 : 255)); + bool isthingsmode = (General.Editing.Mode.GetType().Name == "ThingsMode"); // Set renderstates for things rendering graphics.Device.SetRenderState(RenderState.CullMode, Cull.None); @@ -1160,6 +1160,7 @@ namespace CodeImp.DoomBuilder.Rendering // Create vertices PixelColor tc = fixedcolor ? c : DetermineThingColor(t); + byte bboxalpha = (byte)(alpha * ((!fixedcolor && !t.Selected && isthingsmode) ? 128 : 255)); if(CreateThingBoxVerts(t, ref verts, ref bboxes, thingsByPosition, buffercount * 6, tc, bboxalpha)) { buffercount++; diff --git a/Source/Core/Windows/ActionBrowserForm.cs b/Source/Core/Windows/ActionBrowserForm.cs index 12f2cbd97fc18982063405abb0aa0ee4be7bb1a3..85e0c46401663e5fc2c37a518cb6bf8e33a2ed2b 100644 --- a/Source/Core/Windows/ActionBrowserForm.cs +++ b/Source/Core/Windows/ActionBrowserForm.cs @@ -192,24 +192,40 @@ namespace CodeImp.DoomBuilder.Windows } //mxd - private void FilterActions(string p) + private void FilterActions(string text) { - List<TreeNode> filteredNodes = new List<TreeNode>(); + List<TreeNode> filterednodes = new List<TreeNode>(); + HashSet<string> added = new HashSet<string>(StringComparer.OrdinalIgnoreCase); + // First add nodes, which titles start with given text foreach(TreeNode n in allNodes) { foreach(TreeNode cn in n.Nodes) { LinedefActionInfo ai = cn.Tag as LinedefActionInfo; - if(ai.Title.ToLowerInvariant().IndexOf(p) != -1) - filteredNodes.Add(cn); + if(ai != null && ai.Title.ToUpperInvariant().StartsWith(text)) + { + filterednodes.Add(cn); + added.Add(ai.Title); + } + } + } + + // Then add nodes, which titles contain given text + foreach(TreeNode n in allNodes) + { + foreach(TreeNode cn in n.Nodes) + { + LinedefActionInfo ai = cn.Tag as LinedefActionInfo; + if(ai != null && !added.Contains(ai.Title) && ai.Title.ToUpperInvariant().Contains(text)) + filterednodes.Add(cn); } } actions.BeginUpdate(); actions.Nodes.Clear(); actions.ShowLines = false; - actions.Nodes.AddRange(filteredNodes.ToArray()); + actions.Nodes.AddRange(filterednodes.ToArray()); actions.EndUpdate(); } @@ -322,7 +338,7 @@ namespace CodeImp.DoomBuilder.Windows { if(!string.IsNullOrEmpty(tbFilter.Text.Trim())) { - FilterActions(tbFilter.Text); + FilterActions(tbFilter.Text.ToUpperInvariant()); } else { diff --git a/Source/Core/Windows/EffectBrowserForm.cs b/Source/Core/Windows/EffectBrowserForm.cs index 89d20e54c9e7fe97ad5ca1f425eb178b89933dab..00bc70683d13abef82beedecb5ac5549179bbff3 100644 --- a/Source/Core/Windows/EffectBrowserForm.cs +++ b/Source/Core/Windows/EffectBrowserForm.cs @@ -155,20 +155,36 @@ namespace CodeImp.DoomBuilder.Windows } //mxd - private void FilterEffects(string p) + private void FilterEffects(string text) { - List<ListViewItem> filteredItems = new List<ListViewItem>(); + List<ListViewItem> filtereditems = new List<ListViewItem>(); + HashSet<string> added = new HashSet<string>(StringComparer.OrdinalIgnoreCase); + // First add nodes, which titles start with given text foreach(ListViewItem i in allitems) { SectorEffectInfo si = i.Tag as SectorEffectInfo; - if(si.Title.ToLowerInvariant().IndexOf(p) != -1) - filteredItems.Add(i); + if(si != null && si.Title.ToUpperInvariant().StartsWith(text)) + { + filtereditems.Add(i); + added.Add(si.Title); + } + } + + // Then add nodes, which titles contain given text + foreach(ListViewItem i in allitems) + { + SectorEffectInfo si = i.Tag as SectorEffectInfo; + if(si != null && !added.Contains(si.Title) && si.Title.ToUpperInvariant().Contains(text)) + { + filtereditems.Add(i); + added.Add(si.Title); + } } effects.BeginUpdate(); effects.Items.Clear(); - effects.Items.AddRange(filteredItems.ToArray()); + effects.Items.AddRange(filtereditems.ToArray()); effects.EndUpdate(); } @@ -236,7 +252,7 @@ namespace CodeImp.DoomBuilder.Windows { if(!string.IsNullOrEmpty(tbFilter.Text.Trim())) { - FilterEffects(tbFilter.Text); + FilterEffects(tbFilter.Text.ToUpperInvariant()); } else { diff --git a/Source/Core/Windows/PreferencesForm.cs b/Source/Core/Windows/PreferencesForm.cs index 11203799a80b92ceb8be616a774b71f174e8b64c..78a53fb67484d4a611c95c5b81533471e3897c6a 100644 --- a/Source/Core/Windows/PreferencesForm.cs +++ b/Source/Core/Windows/PreferencesForm.cs @@ -39,8 +39,8 @@ namespace CodeImp.DoomBuilder.Windows private bool allowapplycontrol; private bool disregardshift; private bool disregardcontrol; - private readonly List<ListViewItem> actionListItems; //mxd - private readonly List<int> actionListItemsGroupIndices; //mxd + private readonly List<ListViewItem> allactionitems; //mxd + private readonly List<int> allactionitemsgroups; //mxd private bool reloadresources; @@ -148,8 +148,10 @@ namespace CodeImp.DoomBuilder.Windows // Fill list of actions Action[] actions = General.Actions.GetAllActions(); - actionListItems = new List<ListViewItem>(); //mxd - actionListItemsGroupIndices = new List<int>(); //mxd + allactionitems = new List<ListViewItem>(); //mxd + allactionitemsgroups = new List<int>(); //mxd + + listactions.BeginUpdate(); //mxd foreach(Action a in actions) { // Create item @@ -161,15 +163,16 @@ namespace CodeImp.DoomBuilder.Windows if(General.Actions.Categories.ContainsKey(a.Category)) { item.Group = listactions.Groups[a.Category]; - actionListItemsGroupIndices.Add(listactions.Groups.IndexOf(item.Group)); + allactionitemsgroups.Add(listactions.Groups.IndexOf(item.Group)); //mxd } else //mxd { - actionListItemsGroupIndices.Add(-1); + allactionitemsgroups.Add(-1); } - actionListItems.Add(item); //mxd + allactionitems.Add(item); //mxd } + listactions.EndUpdate(); //mxd // Set the colors // TODO: Make this automated by using the collection @@ -304,7 +307,7 @@ namespace CodeImp.DoomBuilder.Windows General.Settings.ScriptFontSize = fontsize; // Apply control keys to actions - foreach(ListViewItem item in actionListItems) //mxd + foreach(ListViewItem item in allactionitems) //mxd General.Actions[item.Name].SetShortcutKey((int)item.SubItems[1].Tag); // Apply the colors @@ -503,7 +506,7 @@ namespace CodeImp.DoomBuilder.Windows if(thiskey != 0) { // Find actions with same key - foreach(ListViewItem item in actionListItems) + foreach(ListViewItem item in allactionitems) { // Don't count the selected action if(item != listactions.SelectedItems[0]) @@ -665,6 +668,9 @@ namespace CodeImp.DoomBuilder.Windows // Item selected private void listactions_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e) { + //mxd. Leave when not allowed to update + if(!allowapplycontrol) return; + string disregardkeys = ""; // Anything selected? @@ -849,51 +855,61 @@ namespace CodeImp.DoomBuilder.Windows } //mxd - private void tbFilterActions_TextChanged(object sender, EventArgs e) + private void tbFilterActions_TextChanged(object sender, EventArgs e) { + ListViewItem curselection = (listactions.SelectedItems.Count > 0 ? listactions.SelectedItems[0] : null); + ListViewItem toselect = null; + + allowapplycontrol = false; listactions.BeginUpdate(); + listactions.Items.Clear(); - //restore everything - if(string.IsNullOrEmpty(tbFilterActions.Text)) + // Restore everything + if(string.IsNullOrEmpty(tbFilterActions.Text)) { - //restore items - listactions.Items.Clear(); - listactions.Items.AddRange(actionListItems.ToArray()); - - //restore groups - for(int i = 0; i < actionListItems.Count; i++) + // Restore items and groups + for(int i = 0; i < allactionitems.Count; i++) { - if(actionListItemsGroupIndices[i] != -1) - actionListItems[i].Group = listactions.Groups[actionListItemsGroupIndices[i]]; + if(allactionitemsgroups[i] != -1) + allactionitems[i].Group = listactions.Groups[allactionitemsgroups[i]]; + + // Item sould be added AFTER restoring it's group, otherwise item sorting will be screwed! + listactions.Items.Add(allactionitems[i]); + + // Restore selection? + if(allactionitems[i] == curselection) toselect = curselection; } - } - else //apply filtering - { + } + // Apply filtering + else + { string match = tbFilterActions.Text.ToUpperInvariant(); - for(int i = 0; i < actionListItems.Count; i++) + for(int i = 0; i < allactionitems.Count; i++) { - if(actionListItems[i].Text.ToUpperInvariant().Contains(match)) + if(allactionitems[i].Text.ToUpperInvariant().Contains(match)) { - //ensure visible - if(!listactions.Items.Contains(actionListItems[i])) - { - listactions.Items.Add(actionListItems[i]); + // Restore group + if(allactionitemsgroups[i] != -1) + allactionitems[i].Group = listactions.Groups[allactionitemsgroups[i]]; - //restore group - if(actionListItemsGroupIndices[i] != -1) - actionListItems[i].Group = listactions.Groups[actionListItemsGroupIndices[i]]; - } + // Add item + listactions.Items.Add(allactionitems[i]); + + // Restore selection? + if(allactionitems[i] == curselection) toselect = curselection; } - else if(listactions.Items.Contains(actionListItems[i])) - { - //ensure invisible - listactions.Items.Remove(actionListItems[i]); - } } } - listactions.Sort(); + // Restore selection? + if(toselect != null) + { + toselect.Selected = true; + listactions.EnsureVisible(toselect.Index); + } + listactions.EndUpdate(); + allowapplycontrol = true; } #endregion