diff --git a/Source/Builder.csproj b/Source/Builder.csproj index 51789d46..07edea61 100644 --- a/Source/Builder.csproj +++ b/Source/Builder.csproj @@ -46,8 +46,10 @@ --> + + @@ -60,6 +62,7 @@ + diff --git a/Source/Config/DefinedTextureSet.cs b/Source/Config/DefinedTextureSet.cs new file mode 100644 index 00000000..d65146a9 --- /dev/null +++ b/Source/Config/DefinedTextureSet.cs @@ -0,0 +1,159 @@ + +#region ================== Copyright (c) 2007 Pascal vd Heiden + +/* + * Copyright (c) 2007 Pascal vd Heiden, www.codeimp.com + * This program is released under GNU General Public License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#endregion + +#region ================== Namespaces + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Globalization; +using System.Text; +using CodeImp.DoomBuilder.IO; +using CodeImp.DoomBuilder.Data; +using System.IO; +using System.Diagnostics; +using System.Windows.Forms; +using System.Text.RegularExpressions; +using System.Collections.Specialized; + +#endregion + +namespace CodeImp.DoomBuilder.Config +{ + internal class DefinedTextureSet : TextureSet + { + #region ================== Variables + + // Never stored, only used at run-time + private Regex regex; + + #endregion + + #region ================== Constructor / Destructor + + // Texture set from configuration + public DefinedTextureSet(Configuration cfg, string path) + { + // Read the name + name = cfg.ReadSetting(path + ".name", "Unnamed Set"); + + // Read the filters + IDictionary dic = cfg.ReadSetting(path, new Hashtable()); + filters = new List(dic.Count); + foreach(DictionaryEntry de in dic) + { + // If not the name of this texture set, add value as filter + if(de.Key.ToString() != "name") filters.Add(de.Value.ToString()); + } + } + + // New texture set constructor + public DefinedTextureSet(string name) + { + this.name = name; + this.filters = new List(); + } + + #endregion + + #region ================== Methods + + // This writes the texture set to configuration + internal override void WriteToConfig(Configuration cfg, string path) + { + IDictionary dic; + + // Fill structure + dic = new ListDictionary(); + + // Add name + dic.Add("name", name); + + for(int i = 0; i < filters.Count; i++) + { + // Add filters + dic.Add(i.ToString(), filters[i]); + } + + // Write to config + cfg.WriteSetting(path, dic); + } + + // This resets the matches and recreates the regex + internal override void Reset() + { + base.Reset(); + + // Make the regex string that handles all filters + StringBuilder regexstr = new StringBuilder(""); + foreach(string s in filters) + { + // Replace the * with the regex code + string ss = s.Replace("*", ".*?"); + + // Escape other regex characters, except the ? + ss = ss.Replace("+", "\\+"); + ss = ss.Replace("\\", "\\\\"); + ss = ss.Replace("|", "\\|"); + ss = ss.Replace("{", "\\{"); + ss = ss.Replace("[", "\\["); + ss = ss.Replace("(", "\\("); + ss = ss.Replace(")", "\\)"); + ss = ss.Replace("^", "\\^"); + ss = ss.Replace("$", "\\$"); + ss = ss.Replace(".", "\\."); + ss = ss.Replace("#", "\\#"); + ss = ss.Replace(" ", "\\ "); + + // When a filter has already added, insert a conditional OR operator + if(regexstr.Length > 0) regexstr.Append("|"); + + // Open group without backreferencing + regexstr.Append("(?:"); + + // Add the filter + regexstr.Append(ss); + + // Close group + regexstr.Append(")"); + } + + // Make the regex + regex = new Regex(regexstr.ToString(), RegexOptions.Compiled | + RegexOptions.CultureInvariant | + RegexOptions.IgnoreCase); + } + + // This matches a name against the regex and adds a texture to + // the list if it matches. Returns true when matched and added. + internal virtual bool Add(ImageData image) + { + // Check against regex + if(regex.IsMatch(image.Name)) + { + // Matches! Add it. + return base.Add(image); + } + else + { + // Doesn't match + return false; + } + } + + #endregion + } +} diff --git a/Source/Config/OthersTextureSet.cs b/Source/Config/OthersTextureSet.cs new file mode 100644 index 00000000..f1a16824 --- /dev/null +++ b/Source/Config/OthersTextureSet.cs @@ -0,0 +1,63 @@ + +#region ================== Copyright (c) 2007 Pascal vd Heiden + +/* + * Copyright (c) 2007 Pascal vd Heiden, www.codeimp.com + * This program is released under GNU General Public License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#endregion + +#region ================== Namespaces + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Globalization; +using System.Text; +using CodeImp.DoomBuilder.IO; +using CodeImp.DoomBuilder.Data; +using System.IO; +using System.Diagnostics; +using System.Windows.Forms; +using System.Text.RegularExpressions; +using System.Collections.Specialized; + +#endregion + +namespace CodeImp.DoomBuilder.Config +{ + internal class OthersTextureSet : TextureSet + { + #region ================== Constants + + public const string NAME = "Other"; + + #endregion + + #region ================== Constructor / Destructor + + // New texture set constructor + public OthersTextureSet() + { + this.name = NAME; + } + + #endregion + + #region ================== Methods + + // This does absolutely nothing + internal override void WriteToConfig(Configuration cfg, string path) + { + } + + #endregion + } +} diff --git a/Source/Config/TextureSet.cs b/Source/Config/TextureSet.cs new file mode 100644 index 00000000..f06cee2d --- /dev/null +++ b/Source/Config/TextureSet.cs @@ -0,0 +1,108 @@ + +#region ================== Copyright (c) 2007 Pascal vd Heiden + +/* + * Copyright (c) 2007 Pascal vd Heiden, www.codeimp.com + * This program is released under GNU General Public License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#endregion + +#region ================== Namespaces + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Globalization; +using System.Text; +using CodeImp.DoomBuilder.IO; +using CodeImp.DoomBuilder.Data; +using System.IO; +using System.Diagnostics; +using System.Windows.Forms; +using System.Text.RegularExpressions; +using System.Collections.Specialized; + +#endregion + +namespace CodeImp.DoomBuilder.Config +{ + internal abstract class TextureSet + { + #region ================== Variables + + protected string name; + protected List filters; + + // Never stored, only used at run-time + protected Dictionary matches; + + #endregion + + #region ================== Properties + + public string Name { get { return name; } set { name = value; } } + internal List Filters { get { return filters; } } + + #endregion + + #region ================== Constructor / Destructor + + public TextureSet() + { + this.name = "Unnamed Set"; + this.filters = new List(); + } + + #endregion + + #region ================== Methods + + // This writes the texture set to configuration + internal abstract void WriteToConfig(Configuration cfg, string path); + + // This resets the matches and recreates the regex + internal virtual void Reset() + { + // Clear matches + matches = new Dictionary(); + } + + // This adds a texture to this set + internal virtual bool Add(ImageData image) + { + // Can we add it? + if(!matches.ContainsKey(image.LongName)) + { + // Add it + matches.Add(image.LongName, image); + return true; + } + else + { + // Can't add it + return false; + } + } + + // This tests if a texture is in this texturset + public virtual bool Exists(long longname) + { + return matches.ContainsKey(longname); + } + + // This returns the name + public override string ToString() + { + return name; + } + + #endregion + } +} diff --git a/Source/Windows/ConfigForm.Designer.cs b/Source/Windows/ConfigForm.Designer.cs index 746602eb..b11effb5 100644 --- a/Source/Windows/ConfigForm.Designer.cs +++ b/Source/Windows/ConfigForm.Designer.cs @@ -37,6 +37,7 @@ namespace CodeImp.DoomBuilder.Windows System.Windows.Forms.Label label9; System.Windows.Forms.Label label1; System.Windows.Forms.Label label8; + System.Windows.Forms.Label label4; this.labelparameters = new System.Windows.Forms.Label(); this.cancel = new System.Windows.Forms.Button(); this.apply = new System.Windows.Forms.Button(); @@ -58,6 +59,14 @@ namespace CodeImp.DoomBuilder.Windows this.listconfigs = new System.Windows.Forms.ListView(); this.columnname = new System.Windows.Forms.ColumnHeader(); this.testprogramdialog = new System.Windows.Forms.OpenFileDialog(); + this.tabtextures = new System.Windows.Forms.TabPage(); + this.listtextures = new System.Windows.Forms.ListBox(); + this.addtextureset = new System.Windows.Forms.Button(); + this.removetextureset = new System.Windows.Forms.Button(); + this.copytexturesets = new System.Windows.Forms.Button(); + this.pastetexturesets = new System.Windows.Forms.Button(); + this.edittextureset = new System.Windows.Forms.Button(); + this.restoretexturesets = new System.Windows.Forms.Button(); label5 = new System.Windows.Forms.Label(); label6 = new System.Windows.Forms.Label(); label3 = new System.Windows.Forms.Label(); @@ -66,10 +75,12 @@ namespace CodeImp.DoomBuilder.Windows label9 = new System.Windows.Forms.Label(); label1 = new System.Windows.Forms.Label(); label8 = new System.Windows.Forms.Label(); + label4 = new System.Windows.Forms.Label(); this.tabs.SuspendLayout(); this.tabresources.SuspendLayout(); this.tabnodebuilder.SuspendLayout(); this.tabtesting.SuspendLayout(); + this.tabtextures.SuspendLayout(); this.SuspendLayout(); // // label5 @@ -193,9 +204,10 @@ namespace CodeImp.DoomBuilder.Windows this.tabs.Controls.Add(this.tabresources); this.tabs.Controls.Add(this.tabnodebuilder); this.tabs.Controls.Add(this.tabtesting); + this.tabs.Controls.Add(this.tabtextures); this.tabs.Enabled = false; this.tabs.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.tabs.ItemSize = new System.Drawing.Size(110, 19); + this.tabs.ItemSize = new System.Drawing.Size(100, 19); this.tabs.Location = new System.Drawing.Point(256, 12); this.tabs.Name = "tabs"; this.tabs.SelectedIndex = 0; @@ -417,6 +429,107 @@ namespace CodeImp.DoomBuilder.Windows this.testprogramdialog.Filter = "Executable Files (*.exe)|*.exe|Batch Files (*.bat)|*.bat"; this.testprogramdialog.Title = "Browse Test Program"; // + // tabtextures + // + this.tabtextures.Controls.Add(this.restoretexturesets); + this.tabtextures.Controls.Add(this.edittextureset); + this.tabtextures.Controls.Add(this.pastetexturesets); + this.tabtextures.Controls.Add(this.copytexturesets); + this.tabtextures.Controls.Add(this.removetextureset); + this.tabtextures.Controls.Add(this.addtextureset); + this.tabtextures.Controls.Add(this.listtextures); + this.tabtextures.Controls.Add(label4); + this.tabtextures.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.tabtextures.Location = new System.Drawing.Point(4, 23); + this.tabtextures.Name = "tabtextures"; + this.tabtextures.Size = new System.Drawing.Size(415, 318); + this.tabtextures.TabIndex = 3; + this.tabtextures.Text = "Textures"; + this.tabtextures.UseVisualStyleBackColor = true; + // + // label4 + // + label4.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + label4.AutoEllipsis = true; + label4.Location = new System.Drawing.Point(12, 15); + label4.Name = "label4"; + label4.Size = new System.Drawing.Size(394, 75); + label4.TabIndex = 24; + label4.Text = resources.GetString("label4.Text"); + // + // listtextures + // + this.listtextures.ColumnWidth = 120; + this.listtextures.IntegralHeight = false; + this.listtextures.ItemHeight = 14; + this.listtextures.Location = new System.Drawing.Point(15, 93); + this.listtextures.MultiColumn = true; + this.listtextures.Name = "listtextures"; + this.listtextures.ScrollAlwaysVisible = true; + this.listtextures.SelectionMode = System.Windows.Forms.SelectionMode.MultiExtended; + this.listtextures.Size = new System.Drawing.Size(382, 138); + this.listtextures.Sorted = true; + this.listtextures.TabIndex = 25; + // + // addtextureset + // + this.addtextureset.Location = new System.Drawing.Point(15, 237); + this.addtextureset.Name = "addtextureset"; + this.addtextureset.Size = new System.Drawing.Size(67, 24); + this.addtextureset.TabIndex = 26; + this.addtextureset.Text = "Add..."; + this.addtextureset.UseVisualStyleBackColor = true; + // + // removetextureset + // + this.removetextureset.Enabled = false; + this.removetextureset.Location = new System.Drawing.Point(161, 237); + this.removetextureset.Name = "removetextureset"; + this.removetextureset.Size = new System.Drawing.Size(68, 24); + this.removetextureset.TabIndex = 27; + this.removetextureset.Text = "Remove"; + this.removetextureset.UseVisualStyleBackColor = true; + // + // copytexturesets + // + this.copytexturesets.Enabled = false; + this.copytexturesets.Location = new System.Drawing.Point(275, 237); + this.copytexturesets.Name = "copytexturesets"; + this.copytexturesets.Size = new System.Drawing.Size(58, 24); + this.copytexturesets.TabIndex = 28; + this.copytexturesets.Text = "Copy"; + this.copytexturesets.UseVisualStyleBackColor = true; + // + // pastetexturesets + // + this.pastetexturesets.Enabled = false; + this.pastetexturesets.Location = new System.Drawing.Point(339, 237); + this.pastetexturesets.Name = "pastetexturesets"; + this.pastetexturesets.Size = new System.Drawing.Size(58, 24); + this.pastetexturesets.TabIndex = 29; + this.pastetexturesets.Text = "Paste"; + this.pastetexturesets.UseVisualStyleBackColor = true; + // + // edittextureset + // + this.edittextureset.Enabled = false; + this.edittextureset.Location = new System.Drawing.Point(88, 237); + this.edittextureset.Name = "edittextureset"; + this.edittextureset.Size = new System.Drawing.Size(67, 24); + this.edittextureset.TabIndex = 30; + this.edittextureset.Text = "Edit..."; + this.edittextureset.UseVisualStyleBackColor = true; + // + // restoretexturesets + // + this.restoretexturesets.Location = new System.Drawing.Point(15, 275); + this.restoretexturesets.Name = "restoretexturesets"; + this.restoretexturesets.Size = new System.Drawing.Size(140, 24); + this.restoretexturesets.TabIndex = 31; + this.restoretexturesets.Text = "Add Default Categories"; + this.restoretexturesets.UseVisualStyleBackColor = true; + // // ConfigForm // this.AcceptButton = this.apply; @@ -444,6 +557,7 @@ namespace CodeImp.DoomBuilder.Windows this.tabnodebuilder.PerformLayout(); this.tabtesting.ResumeLayout(false); this.tabtesting.PerformLayout(); + this.tabtextures.ResumeLayout(false); this.ResumeLayout(false); } @@ -471,5 +585,13 @@ namespace CodeImp.DoomBuilder.Windows private System.Windows.Forms.CheckBox customparameters; private CodeImp.DoomBuilder.Controls.ActionSelectorControl skill; private System.Windows.Forms.Label labelparameters; + private System.Windows.Forms.TabPage tabtextures; + private System.Windows.Forms.Button addtextureset; + private System.Windows.Forms.ListBox listtextures; + private System.Windows.Forms.Button restoretexturesets; + private System.Windows.Forms.Button edittextureset; + private System.Windows.Forms.Button pastetexturesets; + private System.Windows.Forms.Button copytexturesets; + private System.Windows.Forms.Button removetextureset; } } \ No newline at end of file diff --git a/Source/Windows/ConfigForm.resx b/Source/Windows/ConfigForm.resx index 51375355..f2b7d3b0 100644 --- a/Source/Windows/ConfigForm.resx +++ b/Source/Windows/ConfigForm.resx @@ -222,6 +222,39 @@ True + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + True + + + False + + + Texture Sets are a way to group textures and flats into categories, so that you can easily find a texture for the specific style or purpose you need by selecting one of the categories. Textures that are not in any category are automatically shown in the "Others" category. + True