diff --git a/Source/Core/Controls/ImageBrowserControl.cs b/Source/Core/Controls/ImageBrowserControl.cs index d3518521e8e21c349ead0dedb2f70366680089fe..8a561bbd404b1ee1dca3f6487c748ac14ea46220 100755 --- a/Source/Core/Controls/ImageBrowserControl.cs +++ b/Source/Core/Controls/ImageBrowserControl.cs @@ -474,7 +474,11 @@ namespace CodeImp.DoomBuilder.Controls // C# not Java. public void AddItem(ImageData image, string tooltip = "") { - items.Add(new ImageBrowserItem(image, tooltip, uselongtexturenames)); + // check if there are already items with this texturename. + // remove them. + ImageBrowserItem newItem = new ImageBrowserItem(image, tooltip, uselongtexturenames); + items.RemoveAll(item => item.TextureName == newItem.TextureName); + items.Add(newItem); } // This fills the list based on the objectname filter @@ -596,18 +600,17 @@ namespace CodeImp.DoomBuilder.Controls // This validates an item private bool ValidateItem(ImageBrowserItem item, ImageBrowserItem previtem) { - //mxd. Don't show duplicate items - if(previtem != null && item.TextureName == previtem.TextureName) return false; //mxd - - //mxd. mixMode: 0 = All, 1 = Textures, 2 = Flats, 3 = Based on BrowseFlats - if(!splitter.Panel2Collapsed) + //mxd. mixMode: 0 = All, 1 = Textures, 2 = Flats, 3 = Based on BrowseFlats + //if (!splitter.Panel2Collapsed) { - if(texturetype == 1 && item.Icon.IsFlat) return false; - if(texturetype == 2 && !item.Icon.IsFlat) return false; - if(texturetype == 3 && (browseflats != item.Icon.IsFlat)) return false; + if (texturetype == 0 && previtem != null && item.TextureName == previtem.TextureName) return false; + if (texturetype == 1 && item.Icon.IsFlat) return false; + if (texturetype == 2 && !item.Icon.IsFlat) return false; + if (texturetype == 3 && (browseflats != item.Icon.IsFlat)) return false; } + //else if (previtem != null && item.TextureName == previtem.TextureName) return false; - return item.TextureName.ToUpperInvariant().Contains(objectname.Text.ToUpperInvariant()); + return item.TextureName.ToUpperInvariant().Contains(objectname.Text.ToUpperInvariant()); } //mxd. This validates an item's texture size diff --git a/Source/Core/Controls/ImageSelectorPanel.cs b/Source/Core/Controls/ImageSelectorPanel.cs index 5d1ed1f1fac25b12b5e4b76e35128e12a182dcbd..0c89a61a49c02e4079d9d5a9aff6a658b37f1d22 100755 --- a/Source/Core/Controls/ImageSelectorPanel.cs +++ b/Source/Core/Controls/ImageSelectorPanel.cs @@ -46,9 +46,10 @@ namespace CodeImp.DoomBuilder.Controls //mxd. Textures cache private static Dictionary<int, Dictionary<long, Image>> texturecache = new Dictionary<int, Dictionary<long, Image>>(); // <imagesize, < texture longname, preview image>> + private static Dictionary<int, Dictionary<long, Image>> flatcache = new Dictionary<int, Dictionary<long, Image>>(); // <imagesize, < texture longname, preview image>> - // Selection - private bool allowselection; + // Selection + private bool allowselection; private bool allowmultipleselection; #endregion @@ -206,7 +207,7 @@ namespace CodeImp.DoomBuilder.Controls selection.Clear(); this.items.AddRange(items); - OnSelectionChanged(selection); + OnSelectionChanged(selection); UpdateRectangles(); } @@ -654,13 +655,29 @@ namespace CodeImp.DoomBuilder.Controls #region ================== Image Caching + // [ZZ] used during resource reload. + public static void ClearCachedPreviews() + { + foreach (Dictionary<long, Image> imgdict in texturecache.Values) + foreach (Image img in imgdict.Values) + img.Dispose(); + foreach (Dictionary<long, Image> imgdict in flatcache.Values) + foreach (Image img in imgdict.Values) + img.Dispose(); + texturecache.Clear(); + flatcache.Clear(); + } + private static Image GetPreview(ImageBrowserItem item, int imagesize) { if(!item.IsPreviewLoaded) return item.Icon.GetPreview(); - if(!texturecache.ContainsKey(imagesize)) texturecache.Add(imagesize, new Dictionary<long, Image>()); + Dictionary<int, Dictionary<long, Image>> cache = item.Icon.IsFlat ? flatcache : texturecache; + + if(!cache.ContainsKey(imagesize)) cache.Add(imagesize, new Dictionary<long, Image>()); // Generate preview? - if(!texturecache[imagesize].ContainsKey(item.Icon.LongName)) + // [ZZ] how does this work when texture images change? + if(!cache[imagesize].ContainsKey(item.Icon.LongName)) { Image img = item.Icon.GetPreview(); @@ -695,11 +712,11 @@ namespace CodeImp.DoomBuilder.Controls g.DrawImage(img, new Rectangle(0, 0, previewwidth, previewheight)); } - texturecache[imagesize][item.Icon.LongName] = preview; + cache[imagesize][item.Icon.LongName] = preview; } // Get preview - return texturecache[imagesize][item.Icon.LongName]; + return cache[imagesize][item.Icon.LongName]; } #endregion diff --git a/Source/Core/Data/DataManager.cs b/Source/Core/Data/DataManager.cs index a237951f6bf518ffc4692ff2f7646136f24cb4e8..0eb854963cd34af88e4e08df2e4fc506d072bce7 100755 --- a/Source/Core/Data/DataManager.cs +++ b/Source/Core/Data/DataManager.cs @@ -39,6 +39,7 @@ using CodeImp.DoomBuilder.ZDoom; using SlimDX; using SlimDX.Direct3D9; using Matrix = SlimDX.Matrix; +using CodeImp.DoomBuilder.Controls; #endregion @@ -588,6 +589,9 @@ namespace CodeImp.DoomBuilder.Data //mxd. Create skybox texture(s) SetupSkybox(); + + // [ZZ] clear texture/flat cache in ImageSelectorPanel + ImageSelectorPanel.ClearCachedPreviews(); // Start background loading StartBackgroundLoader();