From 679bb6980f14cd182e0c7bd57fd97d97f80c3e0f Mon Sep 17 00:00:00 2001 From: codeimp Date: Thu, 27 Dec 2007 01:24:11 +0000 Subject: [PATCH] lots of changes/additions --- Build/Configurations/Boom.cfg | 3 +- Build/Configurations/Doom.cfg | 3 +- Build/Configurations/Doom2.cfg | 3 +- Build/Configurations/Edge.cfg | 3 +- Build/Configurations/Eternity.cfg | 3 +- Build/Configurations/Heretic.cfg | 3 +- Build/Configurations/Hexen.cfg | 3 +- Build/Configurations/Legacy.cfg | 3 +- Build/Configurations/Risen3D.cfg | 3 +- Build/Configurations/Skulltag_Doom.cfg | 3 +- Build/Configurations/Skulltag_DoomHexen.cfg | 3 +- Build/Configurations/Strife.cfg | 3 +- Build/Configurations/UltDoom.cfg | 3 +- Build/Configurations/ZDoom_Doom.cfg | 3 +- Build/Configurations/ZDoom_DoomHexen.cfg | 3 +- Build/Configurations/ZDoom_HereticHexen.cfg | 3 +- Build/Configurations/ZDoom_Hexen.cfg | 3 +- Build/Configurations/ZDoom_StrifeHexen.cfg | 3 +- Build/Configurations/jDoom.cfg | 3 +- Source/Builder.csproj | 3 + Source/Config/GameConfiguration.cs | 3 + Source/Data/DataManager.cs | 14 +- Source/General/General.cs | 6 +- .../ActionSelectorControl.Designer.cs | 4 +- Source/Interface/AutoSelectTextbox.cs | 94 +++++++ Source/Interface/FlatSelectorControl.cs | 19 +- .../ImageSelectorControl.Designer.cs | 9 +- Source/Interface/ImageSelectorControl.cs | 25 +- Source/Interface/LinedefEditForm.Designer.cs | 107 +++++--- Source/Interface/LinedefEditForm.cs | 239 ++++++++++++++++-- Source/Interface/LinedefEditForm.resx | 24 +- Source/Interface/LinedefInfoPanel.Designer.cs | 4 +- Source/Interface/NumericTextbox.cs | 137 +++++++++- Source/Interface/SectorInfoPanel.Designer.cs | 52 ++-- Source/Interface/SectorInfoPanel.cs | 1 + Source/Interface/SectorInfoPanel.resx | 17 +- Source/Interface/TextureSelectorControl.cs | 19 +- Source/Map/Linedef.cs | 6 +- Source/Map/MapSet.cs | 85 ++++++- Source/Map/Sector.cs | 12 +- Source/Map/Sidedef.cs | 20 +- Source/Map/Thing.cs | 1 + Source/Rendering/Renderer2D.cs | 5 +- 43 files changed, 818 insertions(+), 145 deletions(-) create mode 100644 Source/Interface/AutoSelectTextbox.cs diff --git a/Build/Configurations/Boom.cfg b/Build/Configurations/Boom.cfg index a958b14d..3864787a 100644 --- a/Build/Configurations/Boom.cfg +++ b/Build/Configurations/Boom.cfg @@ -15,6 +15,7 @@ formatinterface = "DoomMapSetIO"; soundlinedefflags = 64; // See linedefflags singlesidedflags = 1; // See linedefflags doublesidedflags = 4; // See linedefflags +impassableflags = 1; // No generalized types generalizedlinedefs = true; @@ -339,7 +340,7 @@ gen_sectortypes // LINEDEF FLAGS linedefflags { - 1 = "Impassible"; + 1 = "Impassable"; 2 = "Block Monster"; 4 = "Double Sided"; 8 = "Upper Unpegged"; diff --git a/Build/Configurations/Doom.cfg b/Build/Configurations/Doom.cfg index bdd72bf3..601a0371 100644 --- a/Build/Configurations/Doom.cfg +++ b/Build/Configurations/Doom.cfg @@ -15,6 +15,7 @@ formatinterface = "DoomMapSetIO"; soundlinedefflags = 64; // See linedefflags singlesidedflags = 1; // See linedefflags doublesidedflags = 4; // See linedefflags +impassableflags = 1; // No generalized types generalizedlinedefs = false; @@ -290,7 +291,7 @@ sectortypes // LINEDEF FLAGS linedefflags { - 1 = "Impassible"; + 1 = "Impassable"; 2 = "Block Monster"; 4 = "Double Sided"; 8 = "Upper Unpegged"; diff --git a/Build/Configurations/Doom2.cfg b/Build/Configurations/Doom2.cfg index 56d3b9ca..b374d6d9 100644 --- a/Build/Configurations/Doom2.cfg +++ b/Build/Configurations/Doom2.cfg @@ -15,6 +15,7 @@ formatinterface = "DoomMapSetIO"; soundlinedefflags = 64; // See linedefflags singlesidedflags = 1; // See linedefflags doublesidedflags = 4; // See linedefflags +impassableflags = 1; // No generalized types generalizedlinedefs = false; @@ -291,7 +292,7 @@ sectortypes // LINEDEF FLAGS linedefflags { - 1 = "Impassible"; + 1 = "Impassable"; 2 = "Block Monster"; 4 = "Double Sided"; 8 = "Upper Unpegged"; diff --git a/Build/Configurations/Edge.cfg b/Build/Configurations/Edge.cfg index e9a2be68..8548e989 100644 --- a/Build/Configurations/Edge.cfg +++ b/Build/Configurations/Edge.cfg @@ -18,6 +18,7 @@ formatinterface = "DoomMapSetIO"; soundlinedefflags = 64; // See linedefflags singlesidedflags = 1; // See linedefflags doublesidedflags = 4; // See linedefflags +impassableflags = 1; // No generalized types generalizedlinedefs = false; @@ -347,7 +348,7 @@ sectortypes // LINEDEF FLAGS linedefflags { - 1 = "Impassible"; + 1 = "Impassable"; 2 = "Block Monster"; 4 = "Double Sided"; 8 = "Upper Unpegged"; diff --git a/Build/Configurations/Eternity.cfg b/Build/Configurations/Eternity.cfg index f2b8eb38..48ceedcf 100644 --- a/Build/Configurations/Eternity.cfg +++ b/Build/Configurations/Eternity.cfg @@ -15,6 +15,7 @@ formatinterface = "DoomMapSetIO"; soundlinedefflags = 64; // See linedefflags singlesidedflags = 1; // See linedefflags doublesidedflags = 4; // See linedefflags +impassableflags = 1; // No generalized types generalizedlinedefs = true; @@ -346,7 +347,7 @@ gen_sectortypes // LINEDEF FLAGS linedefflags { - 1 = "Impassible"; + 1 = "Impassable"; 2 = "Block Monster"; 4 = "Double Sided"; 8 = "Upper Unpegged"; diff --git a/Build/Configurations/Heretic.cfg b/Build/Configurations/Heretic.cfg index 61a6e21e..f4525f95 100644 --- a/Build/Configurations/Heretic.cfg +++ b/Build/Configurations/Heretic.cfg @@ -15,6 +15,7 @@ formatinterface = "DoomMapSetIO"; soundlinedefflags = 64; // See linedefflags singlesidedflags = 1; // See linedefflags doublesidedflags = 4; // See linedefflags +impassableflags = 1; // No generalized types generalizedlinedefs = false; @@ -315,7 +316,7 @@ sectortypes // LINEDEF FLAGS linedefflags { - 1 = "Impassible"; + 1 = "Impassable"; 2 = "Block Monster"; 4 = "Double Sided"; 8 = "Upper Unpegged"; diff --git a/Build/Configurations/Hexen.cfg b/Build/Configurations/Hexen.cfg index 72537646..3fa5076c 100644 --- a/Build/Configurations/Hexen.cfg +++ b/Build/Configurations/Hexen.cfg @@ -15,6 +15,7 @@ formatinterface = "HexenMapSetIO"; soundlinedefflags = 64; // See linedefflags singlesidedflags = 1; // See linedefflags doublesidedflags = 4; // See linedefflags +impassableflags = 1; // No generalized types generalizedlinedefs = false; @@ -323,7 +324,7 @@ sectortypes // LINEDEF FLAGS linedefflags { - 1 = "Impassible"; + 1 = "Impassable"; 2 = "Block Monster"; 4 = "Double Sided"; 8 = "Upper Unpegged"; diff --git a/Build/Configurations/Legacy.cfg b/Build/Configurations/Legacy.cfg index 4464418d..6d93b98b 100644 --- a/Build/Configurations/Legacy.cfg +++ b/Build/Configurations/Legacy.cfg @@ -15,6 +15,7 @@ formatinterface = "DoomMapSetIO"; soundlinedefflags = 64; // See linedefflags singlesidedflags = 1; // See linedefflags doublesidedflags = 4; // See linedefflags +impassableflags = 1; // No generalized types generalizedlinedefs = true; @@ -323,7 +324,7 @@ gen_sectortypes // LINEDEF FLAGS linedefflags { - 1 = "Impassible"; + 1 = "Impassable"; 2 = "Block Monster"; 4 = "Double Sided"; 8 = "Upper Unpegged"; diff --git a/Build/Configurations/Risen3D.cfg b/Build/Configurations/Risen3D.cfg index 4a49c4de..84422eb0 100644 --- a/Build/Configurations/Risen3D.cfg +++ b/Build/Configurations/Risen3D.cfg @@ -15,6 +15,7 @@ formatinterface = "DoomMapSetIO"; soundlinedefflags = 64; // See linedefflags singlesidedflags = 1; // See linedefflags doublesidedflags = 4; // See linedefflags +impassableflags = 1; // No generalized types generalizedlinedefs = true; @@ -356,7 +357,7 @@ gen_sectortypes // LINEDEF FLAGS linedefflags { - 1 = "Impassible"; + 1 = "Impassable"; 2 = "Block Monster"; 4 = "Double Sided"; 8 = "Upper Unpegged"; diff --git a/Build/Configurations/Skulltag_Doom.cfg b/Build/Configurations/Skulltag_Doom.cfg index 314de695..b88d6f70 100644 --- a/Build/Configurations/Skulltag_Doom.cfg +++ b/Build/Configurations/Skulltag_Doom.cfg @@ -15,6 +15,7 @@ formatinterface = "DoomMapSetIO"; soundlinedefflags = 64; // See linedefflags singlesidedflags = 1; // See linedefflags doublesidedflags = 4; // See linedefflags +impassableflags = 1; // No generalized types generalizedlinedefs = true; @@ -358,7 +359,7 @@ gen_sectortypes // LINEDEF FLAGS linedefflags { - 1 = "Impassible"; + 1 = "Impassable"; 2 = "Block Monster"; 4 = "Double Sided"; 8 = "Upper Unpegged"; diff --git a/Build/Configurations/Skulltag_DoomHexen.cfg b/Build/Configurations/Skulltag_DoomHexen.cfg index ea995cdb..af567404 100644 --- a/Build/Configurations/Skulltag_DoomHexen.cfg +++ b/Build/Configurations/Skulltag_DoomHexen.cfg @@ -15,6 +15,7 @@ formatinterface = "HexenMapSetIO"; soundlinedefflags = 64; // See linedefflags singlesidedflags = 1; // See linedefflags doublesidedflags = 4; // See linedefflags +impassableflags = 1; // No generalized types generalizedlinedefs = false; @@ -350,7 +351,7 @@ sectortypes // LINEDEF FLAGS linedefflags { - 1 = "Impassible"; + 1 = "Impassable"; 2 = "Block Monster"; 4 = "Double Sided"; 8 = "Upper Unpegged"; diff --git a/Build/Configurations/Strife.cfg b/Build/Configurations/Strife.cfg index 43248442..31675aca 100644 --- a/Build/Configurations/Strife.cfg +++ b/Build/Configurations/Strife.cfg @@ -15,6 +15,7 @@ formatinterface = "DoomMapSetIO"; soundlinedefflags = 64; // See linedefflags singlesidedflags = 1; // See linedefflags doublesidedflags = 4; // See linedefflags +impassableflags = 1; // No generalized types generalizedlinedefs = false; @@ -293,7 +294,7 @@ sectortypes // LINEDEF FLAGS linedefflags { - 1 = "Impassible"; + 1 = "Impassable"; 2 = "Block Monster"; 4 = "Double Sided"; 8 = "Upper Unpegged"; diff --git a/Build/Configurations/UltDoom.cfg b/Build/Configurations/UltDoom.cfg index ce630044..49631bb1 100644 --- a/Build/Configurations/UltDoom.cfg +++ b/Build/Configurations/UltDoom.cfg @@ -15,6 +15,7 @@ formatinterface = "DoomMapSetIO"; soundlinedefflags = 64; // See linedefflags singlesidedflags = 1; // See linedefflags doublesidedflags = 4; // See linedefflags +impassableflags = 1; // No generalized types generalizedlinedefs = false; @@ -291,7 +292,7 @@ sectortypes // LINEDEF FLAGS linedefflags { - 1 = "Impassible"; + 1 = "Impassable"; 2 = "Block Monster"; 4 = "Double Sided"; 8 = "Upper Unpegged"; diff --git a/Build/Configurations/ZDoom_Doom.cfg b/Build/Configurations/ZDoom_Doom.cfg index 85e98f85..3359e624 100644 --- a/Build/Configurations/ZDoom_Doom.cfg +++ b/Build/Configurations/ZDoom_Doom.cfg @@ -15,6 +15,7 @@ formatinterface = "DoomMapSetIO"; soundlinedefflags = 64; // See linedefflags singlesidedflags = 1; // See linedefflags doublesidedflags = 4; // See linedefflags +impassableflags = 1; // Engine specific features mixtexturesflats = true; @@ -357,7 +358,7 @@ gen_sectortypes // LINEDEF FLAGS linedefflags { - 1 = "Impassible"; + 1 = "Impassable"; 2 = "Block Monster"; 4 = "Double Sided"; 8 = "Upper Unpegged"; diff --git a/Build/Configurations/ZDoom_DoomHexen.cfg b/Build/Configurations/ZDoom_DoomHexen.cfg index 23f85083..3ae2bbb8 100644 --- a/Build/Configurations/ZDoom_DoomHexen.cfg +++ b/Build/Configurations/ZDoom_DoomHexen.cfg @@ -15,6 +15,7 @@ formatinterface = "HexenMapSetIO"; soundlinedefflags = 64; // See linedefflags singlesidedflags = 1; // See linedefflags doublesidedflags = 4; // See linedefflags +impassableflags = 1; // No generalized types generalizedlinedefs = false; @@ -511,7 +512,7 @@ gen_sectortypes // LINEDEF FLAGS linedefflags { - 1 = "Impassible"; + 1 = "Impassable"; 2 = "Block Monster"; 4 = "Double Sided"; 8 = "Upper Unpegged"; diff --git a/Build/Configurations/ZDoom_HereticHexen.cfg b/Build/Configurations/ZDoom_HereticHexen.cfg index 2e0f1d87..e382a747 100644 --- a/Build/Configurations/ZDoom_HereticHexen.cfg +++ b/Build/Configurations/ZDoom_HereticHexen.cfg @@ -15,6 +15,7 @@ formatinterface = "HexenMapSetIO"; soundlinedefflags = 64; // See linedefflags singlesidedflags = 1; // See linedefflags doublesidedflags = 4; // See linedefflags +impassableflags = 1; // No generalized types generalizedlinedefs = false; @@ -505,7 +506,7 @@ gen_sectortypes // LINEDEF FLAGS linedefflags { - 1 = "Impassible"; + 1 = "Impassable"; 2 = "Block Monster"; 4 = "Double Sided"; 8 = "Upper Unpegged"; diff --git a/Build/Configurations/ZDoom_Hexen.cfg b/Build/Configurations/ZDoom_Hexen.cfg index 11cdd0c9..3db573ee 100644 --- a/Build/Configurations/ZDoom_Hexen.cfg +++ b/Build/Configurations/ZDoom_Hexen.cfg @@ -15,6 +15,7 @@ formatinterface = "HexenMapSetIO"; soundlinedefflags = 64; // See linedefflags singlesidedflags = 1; // See linedefflags doublesidedflags = 4; // See linedefflags +impassableflags = 1; // No generalized types generalizedlinedefs = false; @@ -350,7 +351,7 @@ sectortypes // LINEDEF FLAGS linedefflags { - 1 = "Impassible"; + 1 = "Impassable"; 2 = "Block Monster"; 4 = "Double Sided"; 8 = "Upper Unpegged"; diff --git a/Build/Configurations/ZDoom_StrifeHexen.cfg b/Build/Configurations/ZDoom_StrifeHexen.cfg index 0f27a46f..f008cba0 100644 --- a/Build/Configurations/ZDoom_StrifeHexen.cfg +++ b/Build/Configurations/ZDoom_StrifeHexen.cfg @@ -15,6 +15,7 @@ formatinterface = "HexenMapSetIO"; soundlinedefflags = 64; // See linedefflags singlesidedflags = 1; // See linedefflags doublesidedflags = 4; // See linedefflags +impassableflags = 1; // No generalized types generalizedlinedefs = false; @@ -510,7 +511,7 @@ gen_sectortypes // LINEDEF FLAGS linedefflags { - 1 = "Impassible"; + 1 = "Impassable"; 2 = "Block Monster"; 4 = "Double Sided"; 8 = "Upper Unpegged"; diff --git a/Build/Configurations/jDoom.cfg b/Build/Configurations/jDoom.cfg index 143be1a6..c4f577d2 100644 --- a/Build/Configurations/jDoom.cfg +++ b/Build/Configurations/jDoom.cfg @@ -15,6 +15,7 @@ formatinterface = "DoomMapSetIO"; soundlinedefflags = 64; // See linedefflags singlesidedflags = 1; // See linedefflags doublesidedflags = 4; // See linedefflags +impassableflags = 1; // No generalized types generalizedlinedefs = false; @@ -313,7 +314,7 @@ sectortypes // LINEDEF FLAGS linedefflags { - 1 = "Impassible"; + 1 = "Impassable"; 2 = "Block Monster"; 4 = "Double Sided"; 8 = "Upper Unpegged"; diff --git a/Source/Builder.csproj b/Source/Builder.csproj index b0e90e08..1d3f8ec3 100644 --- a/Source/Builder.csproj +++ b/Source/Builder.csproj @@ -107,6 +107,9 @@ ActionSelectorControl.cs + + Component + UserControl diff --git a/Source/Config/GameConfiguration.cs b/Source/Config/GameConfiguration.cs index 400adbb8..9c2eb619 100644 --- a/Source/Config/GameConfiguration.cs +++ b/Source/Config/GameConfiguration.cs @@ -49,6 +49,7 @@ namespace CodeImp.DoomBuilder.Config private int soundlinedefflags; private int singlesidedflags; private int doublesidedflags; + private int impassableflags; private bool mixtexturesflats; // Map lumps @@ -80,6 +81,7 @@ namespace CodeImp.DoomBuilder.Config public int SoundLinedefFlags { get { return soundlinedefflags; } } public int SingleSidedFlags { get { return singlesidedflags; } } public int DoubleSidedFlags { get { return doublesidedflags; } } + public int ImpassableFlags { get { return impassableflags; } } public bool MixTexturesFlats { get { return mixtexturesflats; } } // Map lumps @@ -124,6 +126,7 @@ namespace CodeImp.DoomBuilder.Config soundlinedefflags = cfg.ReadSetting("soundlinedefflags", 0); singlesidedflags = cfg.ReadSetting("singlesidedflags", 0); doublesidedflags = cfg.ReadSetting("doublesidedflags", 0); + impassableflags = cfg.ReadSetting("impassableflags", 0); mixtexturesflats = cfg.ReadSetting("mixtexturesflats", false); // Get map lumps diff --git a/Source/Data/DataManager.cs b/Source/Data/DataManager.cs index 061fb8e2..2a4affe7 100644 --- a/Source/Data/DataManager.cs +++ b/Source/Data/DataManager.cs @@ -50,9 +50,11 @@ namespace CodeImp.DoomBuilder.Data // Textures private Dictionary textures; + private List texturenames; // Flats private Dictionary flats; + private List flatnames; // Sprites private Dictionary sprites; @@ -70,6 +72,8 @@ namespace CodeImp.DoomBuilder.Data public Playpal Palette { get { return palette; } } public ICollection Textures { get { return textures.Values; } } public ICollection Flats { get { return flats.Values; } } + public List TextureNames { get { return texturenames; } } + public List FlatNames { get { return flatnames; } } public bool IsDisposed { get { return isdisposed; } } public bool IsLoading { get { return (backgroundloader != null) && backgroundloader.IsAlive; } } @@ -127,6 +131,8 @@ namespace CodeImp.DoomBuilder.Data textures = new Dictionary(); flats = new Dictionary(); sprites = new Dictionary(); + texturenames = new List(); + flatnames = new List(); // Go for all locations foreach(DataLocation dl in locations) @@ -195,7 +201,7 @@ namespace CodeImp.DoomBuilder.Data foreach(KeyValuePair i in flats) i.Value.Dispose(); foreach(KeyValuePair i in sprites) i.Value.Dispose(); palette = null; - + // Dispose containers foreach(DataReader c in containers) c.Dispose(); containers.Clear(); @@ -402,12 +408,14 @@ namespace CodeImp.DoomBuilder.Data foreach(ImageData img in images) { // Add or replace in textures list + if(!textures.ContainsKey(img.LongName)) texturenames.Add(img.Name); textures.Remove(img.LongName); textures.Add(img.LongName, img); - + // Also add as flat when using mixed resources if(General.Map.Config.MixTexturesFlats) { + if(!flats.ContainsKey(img.LongName)) flatnames.Add(img.Name); flats.Remove(img.LongName); flats.Add(img.LongName, img); } @@ -514,12 +522,14 @@ namespace CodeImp.DoomBuilder.Data foreach(ImageData img in images) { // Add or replace in flats list + if(!flats.ContainsKey(img.LongName)) flatnames.Add(img.Name); flats.Remove(img.LongName); flats.Add(img.LongName, img); // Also add as texture when using mixed resources if(General.Map.Config.MixTexturesFlats) { + if(!textures.ContainsKey(img.LongName)) texturenames.Add(img.Name); textures.Remove(img.LongName); textures.Add(img.LongName, img); } diff --git a/Source/General/General.cs b/Source/General/General.cs index 39f8c444..0134aabb 100644 --- a/Source/General/General.cs +++ b/Source/General/General.cs @@ -760,7 +760,8 @@ namespace CodeImp.DoomBuilder Console.WriteLine(line); // Write to log file - File.AppendAllText(logfile, line + Environment.NewLine); + try { File.AppendAllText(logfile, line + Environment.NewLine); } + catch(Exception) { } } // This outputs log information @@ -770,7 +771,8 @@ namespace CodeImp.DoomBuilder Console.Write(text); // Write to log file - File.AppendAllText(logfile, text); + try { File.AppendAllText(logfile, text); } + catch(Exception) { } } #endregion diff --git a/Source/Interface/ActionSelectorControl.Designer.cs b/Source/Interface/ActionSelectorControl.Designer.cs index 2f299f95..835fe190 100644 --- a/Source/Interface/ActionSelectorControl.Designer.cs +++ b/Source/Interface/ActionSelectorControl.Designer.cs @@ -28,7 +28,7 @@ namespace CodeImp.DoomBuilder.Interface /// private void InitializeComponent() { - this.number = new System.Windows.Forms.TextBox(); + this.number = new CodeImp.DoomBuilder.Interface.AutoSelectTextbox(); this.list = new System.Windows.Forms.ComboBox(); this.numberpanel = new System.Windows.Forms.Panel(); this.numberpanel.SuspendLayout(); @@ -91,7 +91,7 @@ namespace CodeImp.DoomBuilder.Interface #endregion - private System.Windows.Forms.TextBox number; + private CodeImp.DoomBuilder.Interface.AutoSelectTextbox number; private System.Windows.Forms.ComboBox list; private System.Windows.Forms.Panel numberpanel; } diff --git a/Source/Interface/AutoSelectTextbox.cs b/Source/Interface/AutoSelectTextbox.cs new file mode 100644 index 00000000..0af73f47 --- /dev/null +++ b/Source/Interface/AutoSelectTextbox.cs @@ -0,0 +1,94 @@ + +#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.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Text; +using System.Globalization; +using System.Windows.Forms; +using CodeImp.DoomBuilder.Controls; +using CodeImp.DoomBuilder.Geometry; +using CodeImp.DoomBuilder.Rendering; +using CodeImp.DoomBuilder.Editing; + +#endregion + +namespace CodeImp.DoomBuilder.Interface +{ + public class AutoSelectTextbox : TextBox + { + #region ================== Constants + + #endregion + + #region ================== Variables + + private int eventcount = 0; + + #endregion + + #region ================== Properties + + #endregion + + #region ================== Constructor / Disposer + + #endregion + + #region ================== Methods + + // When gaining focus + protected override void OnGotFocus(EventArgs e) + { + base.OnGotFocus(e); + + // Reset counter + eventcount = 0; + } + + // When losing focus + protected override void OnLostFocus(EventArgs e) + { + base.OnLostFocus(e); + + // Reset counter + eventcount = 0; + } + + // When mouse pressed down + protected override void OnMouseDown(MouseEventArgs e) + { + base.OnMouseDown(e); + + // Select all text when this mouseclick gives focus + if(eventcount == 0) this.SelectAll(); + eventcount++; + } + + // When key is pressed + protected override void OnKeyDown(KeyEventArgs e) + { + base.OnKeyDown(e); + eventcount++; + } + + #endregion + } +} diff --git a/Source/Interface/FlatSelectorControl.cs b/Source/Interface/FlatSelectorControl.cs index c42aec53..a68b82db 100644 --- a/Source/Interface/FlatSelectorControl.cs +++ b/Source/Interface/FlatSelectorControl.cs @@ -39,11 +39,18 @@ namespace CodeImp.DoomBuilder.Interface { public class FlatSelectorControl : ImageSelectorControl { + // Setup + public void Initialize() + { + // Fill autocomplete list + name.AutoCompleteCustomSource.AddRange(General.Map.Data.FlatNames.ToArray()); + } + // This finds the image we need for the given flat name - protected override Image FindImage(string name) + protected override Image FindImage(string imagename) { // Check if name is a "none" texture - if((name.Length < 1) || (name[0] == '-')) + if((imagename.Length < 1) || (imagename[0] == '-')) { // Flat required! return CodeImp.DoomBuilder.Properties.Resources.MissingTexture; @@ -51,18 +58,18 @@ namespace CodeImp.DoomBuilder.Interface else { // Set the image - return General.Map.Data.GetFlatBitmap(name); + return General.Map.Data.GetFlatBitmap(imagename); } } // This browses for a flat - protected override string BrowseImage(string name) + protected override string BrowseImage(string imagename) { string result; // Browse for texture - result = FlatBrowserForm.Browse(this.ParentForm, name); - if(result != null) return result; else return name; + result = FlatBrowserForm.Browse(this.ParentForm, imagename); + if(result != null) return result; else return imagename; } } } diff --git a/Source/Interface/ImageSelectorControl.Designer.cs b/Source/Interface/ImageSelectorControl.Designer.cs index 183c7fd0..ac4b1069 100644 --- a/Source/Interface/ImageSelectorControl.Designer.cs +++ b/Source/Interface/ImageSelectorControl.Designer.cs @@ -29,7 +29,7 @@ namespace CodeImp.DoomBuilder.Interface private void InitializeComponent() { this.preview = new System.Windows.Forms.Panel(); - this.name = new System.Windows.Forms.TextBox(); + this.name = new CodeImp.DoomBuilder.Interface.AutoSelectTextbox(); this.SuspendLayout(); // // preview @@ -45,6 +45,8 @@ namespace CodeImp.DoomBuilder.Interface // // name // + this.name.AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.Suggest; + this.name.AutoCompleteSource = System.Windows.Forms.AutoCompleteSource.CustomSource; this.name.CharacterCasing = System.Windows.Forms.CharacterCasing.Upper; this.name.Location = new System.Drawing.Point(0, 64); this.name.Name = "name"; @@ -67,7 +69,8 @@ namespace CodeImp.DoomBuilder.Interface #endregion - private System.Windows.Forms.Panel preview; - private System.Windows.Forms.TextBox name; + protected System.Windows.Forms.Panel preview; + protected CodeImp.DoomBuilder.Interface.AutoSelectTextbox name; + } } diff --git a/Source/Interface/ImageSelectorControl.cs b/Source/Interface/ImageSelectorControl.cs index 6a4b27a7..125c9862 100644 --- a/Source/Interface/ImageSelectorControl.cs +++ b/Source/Interface/ImageSelectorControl.cs @@ -38,9 +38,6 @@ namespace CodeImp.DoomBuilder.Interface { public abstract partial class ImageSelectorControl : UserControl { - // Events - public event EventHandler ImageClicked; - // Properties public string TextureName { get { return name.Text; } set { name.Text = value; } } @@ -50,7 +47,7 @@ namespace CodeImp.DoomBuilder.Interface // Initialize InitializeComponent(); } - + // When resized private void ImageSelectorControl_Resize(object sender, EventArgs e) { @@ -71,9 +68,25 @@ namespace CodeImp.DoomBuilder.Interface } // This must determine and return the image to show - protected abstract Image FindImage(string name); + protected abstract Image FindImage(string imagename); // This must show the image browser and return the selected texture name - protected abstract string BrowseImage(string name); + protected abstract string BrowseImage(string imagename); + + // This determines the result value + public string GetResult(string original) + { + // Anyting entered? + if(name.Text.Trim().Length > 0) + { + // Return the new value + return name.Text; + } + else + { + // Nothing given, keep original value + return original; + } + } } } diff --git a/Source/Interface/LinedefEditForm.Designer.cs b/Source/Interface/LinedefEditForm.Designer.cs index 79d4fdad..818cdd4c 100644 --- a/Source/Interface/LinedefEditForm.Designer.cs +++ b/Source/Interface/LinedefEditForm.Designer.cs @@ -38,6 +38,8 @@ namespace CodeImp.DoomBuilder.Interface System.Windows.Forms.Label label8; System.Windows.Forms.Label label9; System.Windows.Forms.Label label10; + System.Windows.Forms.Label label11; + System.Windows.Forms.Label label12; this.cancel = new System.Windows.Forms.Button(); this.apply = new System.Windows.Forms.Button(); this.actiongroup = new System.Windows.Forms.GroupBox(); @@ -53,20 +55,20 @@ namespace CodeImp.DoomBuilder.Interface this.tabPage2 = new System.Windows.Forms.TabPage(); this.backside = new System.Windows.Forms.CheckBox(); this.backgroup = new System.Windows.Forms.GroupBox(); + this.backsector = new CodeImp.DoomBuilder.Interface.NumericTextbox(); this.backlow = new CodeImp.DoomBuilder.Interface.TextureSelectorControl(); this.backmid = new CodeImp.DoomBuilder.Interface.TextureSelectorControl(); this.backhigh = new CodeImp.DoomBuilder.Interface.TextureSelectorControl(); this.backoffsety = new CodeImp.DoomBuilder.Interface.NumericTextbox(); this.backoffsetx = new CodeImp.DoomBuilder.Interface.NumericTextbox(); - this.backsector = new System.Windows.Forms.Button(); this.frontside = new System.Windows.Forms.CheckBox(); this.frontgroup = new System.Windows.Forms.GroupBox(); + this.frontsector = new CodeImp.DoomBuilder.Interface.NumericTextbox(); this.frontlow = new CodeImp.DoomBuilder.Interface.TextureSelectorControl(); this.frontmid = new CodeImp.DoomBuilder.Interface.TextureSelectorControl(); this.fronthigh = new CodeImp.DoomBuilder.Interface.TextureSelectorControl(); this.frontoffsety = new CodeImp.DoomBuilder.Interface.NumericTextbox(); this.frontoffsetx = new CodeImp.DoomBuilder.Interface.NumericTextbox(); - this.frontsector = new System.Windows.Forms.Button(); label2 = new System.Windows.Forms.Label(); label1 = new System.Windows.Forms.Label(); label3 = new System.Windows.Forms.Label(); @@ -77,6 +79,8 @@ namespace CodeImp.DoomBuilder.Interface label8 = new System.Windows.Forms.Label(); label9 = new System.Windows.Forms.Label(); label10 = new System.Windows.Forms.Label(); + label11 = new System.Windows.Forms.Label(); + label12 = new System.Windows.Forms.Label(); this.actiongroup.SuspendLayout(); this.settingsgroup.SuspendLayout(); this.tabs.SuspendLayout(); @@ -134,7 +138,7 @@ namespace CodeImp.DoomBuilder.Interface // label6 // label6.AutoSize = true; - label6.Location = new System.Drawing.Point(16, 104); + label6.Location = new System.Drawing.Point(16, 79); label6.Name = "label6"; label6.Size = new System.Drawing.Size(81, 14); label6.TabIndex = 7; @@ -143,7 +147,7 @@ namespace CodeImp.DoomBuilder.Interface // label7 // label7.AutoSize = true; - label7.Location = new System.Drawing.Point(16, 104); + label7.Location = new System.Drawing.Point(16, 79); label7.Name = "label7"; label7.Size = new System.Drawing.Size(81, 14); label7.TabIndex = 7; @@ -176,6 +180,24 @@ namespace CodeImp.DoomBuilder.Interface label10.Text = "Upper"; label10.TextAlign = System.Drawing.ContentAlignment.TopCenter; // + // label11 + // + label11.AutoSize = true; + label11.Location = new System.Drawing.Point(26, 40); + label11.Name = "label11"; + label11.Size = new System.Drawing.Size(71, 14); + label11.TabIndex = 13; + label11.Text = "Sector Index:"; + // + // label12 + // + label12.AutoSize = true; + label12.Location = new System.Drawing.Point(26, 40); + label12.Name = "label12"; + label12.Size = new System.Drawing.Size(71, 14); + label12.TabIndex = 16; + label12.Text = "Sector Index:"; + // // cancel // this.cancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); @@ -186,6 +208,7 @@ namespace CodeImp.DoomBuilder.Interface this.cancel.TabIndex = 17; this.cancel.Text = "Cancel"; this.cancel.UseVisualStyleBackColor = true; + this.cancel.Click += new System.EventHandler(this.cancel_Click); // // apply // @@ -196,6 +219,7 @@ namespace CodeImp.DoomBuilder.Interface this.apply.TabIndex = 16; this.apply.Text = "OK"; this.apply.UseVisualStyleBackColor = true; + this.apply.Click += new System.EventHandler(this.apply_Click); // // actiongroup // @@ -222,9 +246,12 @@ namespace CodeImp.DoomBuilder.Interface this.newtag.TabIndex = 8; this.newtag.Text = "New Tag"; this.newtag.UseVisualStyleBackColor = true; + this.newtag.Click += new System.EventHandler(this.newtag_Click); // // tag // + this.tag.AllowNegative = false; + this.tag.AllowRelative = true; this.tag.Location = new System.Drawing.Point(62, 75); this.tag.Name = "tag"; this.tag.Size = new System.Drawing.Size(68, 20); @@ -336,19 +363,22 @@ namespace CodeImp.DoomBuilder.Interface this.backside.TabIndex = 2; this.backside.Text = "Back Side"; this.backside.UseVisualStyleBackColor = true; + this.backside.CheckStateChanged += new System.EventHandler(this.backside_CheckStateChanged); // // backgroup // + this.backgroup.Controls.Add(this.backsector); + this.backgroup.Controls.Add(label12); this.backgroup.Controls.Add(this.backlow); this.backgroup.Controls.Add(this.backmid); this.backgroup.Controls.Add(this.backhigh); this.backgroup.Controls.Add(this.backoffsety); this.backgroup.Controls.Add(this.backoffsetx); this.backgroup.Controls.Add(label7); - this.backgroup.Controls.Add(this.backsector); this.backgroup.Controls.Add(label8); this.backgroup.Controls.Add(label9); this.backgroup.Controls.Add(label10); + this.backgroup.Enabled = false; this.backgroup.Location = new System.Drawing.Point(8, 157); this.backgroup.Name = "backgroup"; this.backgroup.Size = new System.Drawing.Size(499, 140); @@ -356,6 +386,16 @@ namespace CodeImp.DoomBuilder.Interface this.backgroup.TabStop = false; this.backgroup.Text = " "; // + // backsector + // + this.backsector.AllowNegative = false; + this.backsector.AllowRelative = false; + this.backsector.Location = new System.Drawing.Point(103, 37); + this.backsector.Name = "backsector"; + this.backsector.Size = new System.Drawing.Size(94, 20); + this.backsector.TabIndex = 17; + this.backsector.Enter += new System.EventHandler(this.SelectAllText); + // // backlow // this.backlow.Location = new System.Drawing.Point(416, 37); @@ -385,26 +425,23 @@ namespace CodeImp.DoomBuilder.Interface // // backoffsety // - this.backoffsety.Location = new System.Drawing.Point(154, 101); + this.backoffsety.AllowNegative = true; + this.backoffsety.AllowRelative = true; + this.backoffsety.Location = new System.Drawing.Point(152, 76); this.backoffsety.Name = "backoffsety"; this.backoffsety.Size = new System.Drawing.Size(45, 20); this.backoffsety.TabIndex = 9; + this.backoffsety.Enter += new System.EventHandler(this.SelectAllText); // // backoffsetx // - this.backoffsetx.Location = new System.Drawing.Point(103, 101); + this.backoffsetx.AllowNegative = true; + this.backoffsetx.AllowRelative = true; + this.backoffsetx.Location = new System.Drawing.Point(103, 76); this.backoffsetx.Name = "backoffsetx"; this.backoffsetx.Size = new System.Drawing.Size(45, 20); this.backoffsetx.TabIndex = 8; - // - // backsector - // - this.backsector.Location = new System.Drawing.Point(103, 37); - this.backsector.Name = "backsector"; - this.backsector.Size = new System.Drawing.Size(96, 24); - this.backsector.TabIndex = 6; - this.backsector.Text = "Select Sector"; - this.backsector.UseVisualStyleBackColor = true; + this.backoffsetx.Enter += new System.EventHandler(this.SelectAllText); // // frontside // @@ -415,19 +452,22 @@ namespace CodeImp.DoomBuilder.Interface this.frontside.TabIndex = 0; this.frontside.Text = "Front Side"; this.frontside.UseVisualStyleBackColor = true; + this.frontside.CheckStateChanged += new System.EventHandler(this.frontside_CheckStateChanged); // // frontgroup // + this.frontgroup.Controls.Add(this.frontsector); + this.frontgroup.Controls.Add(label11); this.frontgroup.Controls.Add(this.frontlow); this.frontgroup.Controls.Add(this.frontmid); this.frontgroup.Controls.Add(this.fronthigh); this.frontgroup.Controls.Add(this.frontoffsety); this.frontgroup.Controls.Add(this.frontoffsetx); this.frontgroup.Controls.Add(label6); - this.frontgroup.Controls.Add(this.frontsector); this.frontgroup.Controls.Add(label5); this.frontgroup.Controls.Add(label4); this.frontgroup.Controls.Add(label3); + this.frontgroup.Enabled = false; this.frontgroup.Location = new System.Drawing.Point(8, 8); this.frontgroup.Name = "frontgroup"; this.frontgroup.Size = new System.Drawing.Size(499, 140); @@ -435,6 +475,16 @@ namespace CodeImp.DoomBuilder.Interface this.frontgroup.TabStop = false; this.frontgroup.Text = " "; // + // frontsector + // + this.frontsector.AllowNegative = false; + this.frontsector.AllowRelative = false; + this.frontsector.Location = new System.Drawing.Point(103, 37); + this.frontsector.Name = "frontsector"; + this.frontsector.Size = new System.Drawing.Size(94, 20); + this.frontsector.TabIndex = 14; + this.frontsector.Enter += new System.EventHandler(this.SelectAllText); + // // frontlow // this.frontlow.Location = new System.Drawing.Point(416, 37); @@ -464,26 +514,23 @@ namespace CodeImp.DoomBuilder.Interface // // frontoffsety // - this.frontoffsety.Location = new System.Drawing.Point(154, 101); + this.frontoffsety.AllowNegative = true; + this.frontoffsety.AllowRelative = true; + this.frontoffsety.Location = new System.Drawing.Point(152, 76); this.frontoffsety.Name = "frontoffsety"; this.frontoffsety.Size = new System.Drawing.Size(45, 20); this.frontoffsety.TabIndex = 9; + this.frontoffsety.Enter += new System.EventHandler(this.SelectAllText); // // frontoffsetx // - this.frontoffsetx.Location = new System.Drawing.Point(103, 101); + this.frontoffsetx.AllowNegative = true; + this.frontoffsetx.AllowRelative = true; + this.frontoffsetx.Location = new System.Drawing.Point(103, 76); this.frontoffsetx.Name = "frontoffsetx"; this.frontoffsetx.Size = new System.Drawing.Size(45, 20); this.frontoffsetx.TabIndex = 8; - // - // frontsector - // - this.frontsector.Location = new System.Drawing.Point(103, 37); - this.frontsector.Name = "frontsector"; - this.frontsector.Size = new System.Drawing.Size(96, 24); - this.frontsector.TabIndex = 6; - this.frontsector.Text = "Select Sector"; - this.frontsector.UseVisualStyleBackColor = true; + this.frontoffsetx.Enter += new System.EventHandler(this.SelectAllText); // // LinedefEditForm // @@ -535,19 +582,19 @@ namespace CodeImp.DoomBuilder.Interface private System.Windows.Forms.TabPage tabPage2; private System.Windows.Forms.GroupBox frontgroup; private System.Windows.Forms.CheckBox frontside; - private System.Windows.Forms.Button frontsector; private NumericTextbox frontoffsety; private NumericTextbox frontoffsetx; private System.Windows.Forms.CheckBox backside; private System.Windows.Forms.GroupBox backgroup; private NumericTextbox backoffsety; private NumericTextbox backoffsetx; - private System.Windows.Forms.Button backsector; private TextureSelectorControl frontlow; private TextureSelectorControl frontmid; private TextureSelectorControl fronthigh; private TextureSelectorControl backlow; private TextureSelectorControl backmid; private TextureSelectorControl backhigh; + private NumericTextbox backsector; + private NumericTextbox frontsector; } } \ No newline at end of file diff --git a/Source/Interface/LinedefEditForm.cs b/Source/Interface/LinedefEditForm.cs index 64037519..129bba9d 100644 --- a/Source/Interface/LinedefEditForm.cs +++ b/Source/Interface/LinedefEditForm.cs @@ -27,6 +27,7 @@ using CodeImp.DoomBuilder.Data; using CodeImp.DoomBuilder.IO; using System.IO; using CodeImp.DoomBuilder.Config; +using CodeImp.DoomBuilder.Editing; #endregion @@ -48,39 +49,245 @@ namespace CodeImp.DoomBuilder.Interface // Fill linedef actions list action.AddInfo(General.Map.Config.SortedLinedefActions.ToArray()); + + // Initialize image selectors + fronthigh.Initialize(); + frontmid.Initialize(); + frontlow.Initialize(); + backhigh.Initialize(); + backmid.Initialize(); + backlow.Initialize(); } // This sets up the form to edit the given lines public void Setup(ICollection lines) { + Linedef fl; + // Keep this list this.lines = lines; - // Go for all flags + //////////////////////////////////////////////////////////////////////// + // Set all options to the first linedef properties + //////////////////////////////////////////////////////////////////////// + + // Get first line + fl = General.GetByIndex(lines, 0); + + // Flags foreach(CheckBox c in flags.Checkboxes) + c.Checked = (fl.Flags & (int)c.Tag) != 0; + + // Action/activation/tags + action.Value = fl.Action; + tag.Text = fl.Tag.ToString(); + + // Front side and back side checkboxes + frontside.Checked = (fl.Front != null); + backside.Checked = (fl.Back != null); + + // Front settings + if(fl.Front != null) { - // Set the option with the first line's setting - c.Checked = (General.GetByIndex(lines, 0).Flags & (int)c.Tag) != 0; - - // Go for all lines - foreach(Linedef l in lines) - { - // Make the option gray if it is different - if(((l.Flags & (int)c.Tag) != 0) != c.Checked) - c.CheckState = CheckState.Indeterminate; - } + fronthigh.TextureName = fl.Front.HighTexture; + frontmid.TextureName = fl.Front.MiddleTexture; + frontlow.TextureName = fl.Front.LowTexture; + frontsector.Text = fl.Front.Sector.Index.ToString(); + frontoffsetx.Text = fl.Front.OffsetX.ToString(); + frontoffsety.Text = fl.Front.OffsetY.ToString(); } - // Set the action to the first line's action - action.Value = General.GetByIndex(lines, 0).Action; + // Back settings + if(fl.Back != null) + { + backhigh.TextureName = fl.Back.HighTexture; + backmid.TextureName = fl.Back.MiddleTexture; + backlow.TextureName = fl.Back.LowTexture; + backsector.Text = fl.Back.Sector.Index.ToString(); + backoffsetx.Text = fl.Back.OffsetX.ToString(); + backoffsety.Text = fl.Back.OffsetY.ToString(); + } + + //////////////////////////////////////////////////////////////////////// + // Now go for all lines and change the options when a setting is different + //////////////////////////////////////////////////////////////////////// // Go for all lines foreach(Linedef l in lines) { - // Erase the option if it is different - if(l.Action != action.Value) - action.Empty = true; + // Flags + foreach(CheckBox c in flags.Checkboxes) + { + if(((l.Flags & (int)c.Tag) != 0) != c.Checked) + { + c.ThreeState = true; + c.CheckState = CheckState.Indeterminate; + } + } + + // Action/activation/tags + if(l.Action != action.Value) action.Empty = true; + if(l.Tag.ToString() != tag.Text) tag.Text = ""; + + // Front side checkbox + if((l.Front != null) != frontside.Checked) + { + frontside.ThreeState = true; + frontside.CheckState = CheckState.Indeterminate; + frontside.AutoCheck = false; + } + + // Back side checkbox + if((l.Back != null) != backside.Checked) + { + backside.ThreeState = true; + backside.CheckState = CheckState.Indeterminate; + backside.AutoCheck = false; + } + + // Front settings + if(l.Front != null) + { + if(fronthigh.TextureName != l.Front.HighTexture) fronthigh.TextureName = ""; + if(frontmid.TextureName != l.Front.MiddleTexture) frontmid.TextureName = ""; + if(frontlow.TextureName != l.Front.LowTexture) frontlow.TextureName = ""; + if(frontsector.Text != l.Front.Sector.Index.ToString()) frontsector.Text = ""; + if(frontoffsetx.Text != l.Front.OffsetX.ToString()) frontoffsetx.Text = ""; + if(frontoffsety.Text != l.Front.OffsetY.ToString()) frontoffsety.Text = ""; + } + + // Back settings + if(l.Back != null) + { + if(backhigh.TextureName != l.Back.HighTexture) backhigh.TextureName = ""; + if(backmid.TextureName != l.Back.MiddleTexture) backmid.TextureName = ""; + if(backlow.TextureName != l.Back.LowTexture) backlow.TextureName = ""; + if(backsector.Text != l.Back.Sector.Index.ToString()) backsector.Text = ""; + if(backoffsetx.Text != l.Back.OffsetX.ToString()) backoffsetx.Text = ""; + if(backoffsety.Text != l.Back.OffsetY.ToString()) backoffsety.Text = ""; + } } } + + // Front side (un)checked + private void frontside_CheckStateChanged(object sender, EventArgs e) + { + // Enable/disable panel + // NOTE: Also enabled when checkbox is grayed! + frontgroup.Enabled = (frontside.CheckState != CheckState.Unchecked); + } + + // Back side (un)checked + private void backside_CheckStateChanged(object sender, EventArgs e) + { + // Enable/disable panel + // NOTE: Also enabled when checkbox is grayed! + backgroup.Enabled = (backside.CheckState != CheckState.Unchecked); + } + + // This selects all text in a textbox + private void SelectAllText(object sender, EventArgs e) + { + (sender as TextBox).SelectAll(); + } + + // Apply clicked + private void apply_Click(object sender, EventArgs e) + { + string undodesc = "linedef"; + Sector s; + int index; + + // Make undo + if(lines.Count > 1) undodesc = lines.Count + " linedefs"; + General.Map.UndoRedo.CreateUndo("edit " + undodesc, UndoGroup.None, 0, false); + + // Go for all the lines + foreach(Linedef l in lines) + { + // Apply all flags + foreach(CheckBox c in flags.Checkboxes) + { + if(c.CheckState == CheckState.Checked) l.Flags |= (int)c.Tag; + else if(c.CheckState == CheckState.Unchecked) l.Flags &= ~(int)c.Tag; + } + + // Action/activation/tags + if(!action.Empty) l.Action = action.Value; + l.Tag = tag.GetResult(l.Tag); + + // Remove front side? + if((l.Front != null) && (frontside.CheckState == CheckState.Unchecked)) + { + l.Front.Dispose(); + } + // Create or modify front side? + if(frontside.CheckState == CheckState.Checked) + { + // Make sure we have a valid sector (make a new one if needed) + if(l.Front != null) index = l.Front.Sector.Index; else index = -1; + s = General.Map.Map.GetSectorByIndex(frontsector.GetResult(index)); + if(s == null) s = General.Map.Map.CreateSector(); + + // Create new sidedef? + if(l.Front == null) General.Map.Map.CreateSidedef(l, true, s); + + // Change sector? + if(l.Front.Sector != s) l.Front.ChangeSector(s); + + // Apply settings + l.Front.OffsetX = frontoffsetx.GetResult(l.Front.OffsetX); + l.Front.OffsetY = frontoffsety.GetResult(l.Front.OffsetY); + l.Front.SetTextureHigh(fronthigh.GetResult(l.Front.HighTexture)); + l.Front.SetTextureMid(frontmid.GetResult(l.Front.MiddleTexture)); + l.Front.SetTextureLow(frontlow.GetResult(l.Front.LowTexture)); + } + + // Remove back side? + if((l.Back != null) && (backside.CheckState == CheckState.Unchecked)) + { + l.Back.Dispose(); + } + // Create or modify back side? + if(backside.CheckState == CheckState.Checked) + { + // Make sure we have a valid sector (make a new one if needed) + if(l.Back != null) index = l.Back.Sector.Index; else index = -1; + s = General.Map.Map.GetSectorByIndex(backsector.GetResult(index)); + if(s == null) s = General.Map.Map.CreateSector(); + + // Create new sidedef? + if(l.Back == null) General.Map.Map.CreateSidedef(l, false, s); + + // Change sector? + if(l.Back.Sector != s) l.Back.ChangeSector(s); + + // Apply settings + l.Back.OffsetX = backoffsetx.GetResult(l.Back.OffsetX); + l.Back.OffsetY = backoffsety.GetResult(l.Back.OffsetY); + l.Back.SetTextureHigh(backhigh.GetResult(l.Back.HighTexture)); + l.Back.SetTextureMid(backmid.GetResult(l.Back.MiddleTexture)); + l.Back.SetTextureLow(backlow.GetResult(l.Back.LowTexture)); + } + } + + // Done + this.DialogResult = DialogResult.OK; + this.Close(); + } + + // Cancel clicked + private void cancel_Click(object sender, EventArgs e) + { + // Be gone + this.DialogResult = DialogResult.Cancel; + this.Close(); + } + + // This finds a new (unused) tag + private void newtag_Click(object sender, EventArgs e) + { + tag.Text = General.Map.Map.GetNewTag().ToString(); + } } } diff --git a/Source/Interface/LinedefEditForm.resx b/Source/Interface/LinedefEditForm.resx index 410fc85a..c3d5c63e 100644 --- a/Source/Interface/LinedefEditForm.resx +++ b/Source/Interface/LinedefEditForm.resx @@ -177,6 +177,18 @@ False + + True + + + False + + + True + + + False + True @@ -222,6 +234,9 @@ True + + True + True @@ -237,15 +252,15 @@ True - - True - True True + + True + True @@ -261,9 +276,6 @@ True - - True - True diff --git a/Source/Interface/LinedefInfoPanel.Designer.cs b/Source/Interface/LinedefInfoPanel.Designer.cs index c5e74b8f..2967206e 100644 --- a/Source/Interface/LinedefInfoPanel.Designer.cs +++ b/Source/Interface/LinedefInfoPanel.Designer.cs @@ -189,10 +189,10 @@ namespace CodeImp.DoomBuilder.Interface // // action // - this.action.AutoSize = true; + this.action.AutoEllipsis = true; this.action.Location = new System.Drawing.Point(55, 19); this.action.Name = "action"; - this.action.Size = new System.Drawing.Size(190, 14); + this.action.Size = new System.Drawing.Size(197, 14); this.action.TabIndex = 1; this.action.Text = "0 - Big Door that goes Wobbly Wobbly"; // diff --git a/Source/Interface/NumericTextbox.cs b/Source/Interface/NumericTextbox.cs index 47b5bb46..f784413f 100644 --- a/Source/Interface/NumericTextbox.cs +++ b/Source/Interface/NumericTextbox.cs @@ -32,7 +32,7 @@ using CodeImp.DoomBuilder.Editing; namespace CodeImp.DoomBuilder.Interface { - internal class NumericTextbox : TextBox + internal class NumericTextbox : AutoSelectTextbox { #region ================== Constants @@ -40,10 +40,16 @@ namespace CodeImp.DoomBuilder.Interface #region ================== Variables + private bool allownegative = false; // Allow negative numbers + private bool allowrelative = false; // Allow ++ and -- prefix for relative changes + #endregion #region ================== Properties + public bool AllowNegative { get { return allownegative; } set { allownegative = value; } } + public bool AllowRelative { get { return allowrelative; } set { allowrelative = value; } } + #endregion #region ================== Constructor / Disposer @@ -55,17 +61,142 @@ namespace CodeImp.DoomBuilder.Interface // When a key is pressed protected override void OnKeyPress(KeyPressEventArgs e) { - // Not numeric or control key? - if("-+0123456789\b".IndexOf(e.KeyChar) == -1) + string allowedchars = "0123456789\b"; + string nonselectedtext; + string textpart; + int selectionpos; + int numprefixes; + char otherprefix; + + // Determine allowed chars + if(allownegative) allowedchars += "-"; + if(allowrelative) allowedchars += "+-"; + + // Check if key is not allowed + if(allowedchars.IndexOf(e.KeyChar) == -1) { // Cancel this e.Handled = true; } + else + { + // Check if + or - is pressed + if((e.KeyChar == '+') || (e.KeyChar == '-')) + { + // Determine non-selected text + if(this.SelectionLength > 0) + { + nonselectedtext = this.Text.Substring(0, this.SelectionStart) + + this.Text.Substring(this.SelectionStart + this.SelectionLength); + } + else if(this.SelectionLength < 0) + { + nonselectedtext = this.Text.Substring(0, this.SelectionStart + this.SelectionLength) + + this.Text.Substring(this.SelectionStart); + } + else + { + nonselectedtext = this.Text; + } + + // Not at the start? + selectionpos = this.SelectionStart - 1; + if(this.SelectionLength < 0) selectionpos = (this.SelectionStart + this.SelectionLength) - 1; + if(selectionpos > -1) + { + // Find any other characters before the insert position + textpart = this.Text.Substring(0, selectionpos + 1); + textpart = textpart.Replace("+", ""); + textpart = textpart.Replace("-", ""); + if(textpart.Length > 0) + { + // Cancel this + e.Handled = true; + } + } + // Determine other prefix + if(e.KeyChar == '+') otherprefix = '-'; else otherprefix = '+'; + + // Limit the number of + and - allowed + numprefixes = nonselectedtext.Split(e.KeyChar, otherprefix).Length; + if(numprefixes > 2) + { + // Can't have more than 2 prefixes + e.Handled = true; + } + else if(numprefixes > 1) + { + // Must have 2 the same prefixes + if(this.Text.IndexOf(e.KeyChar) == -1) e.Handled = true; + + // Double prefix must be allowed + if(!allowrelative) e.Handled = true; + } + } + } + // Call base base.OnKeyPress(e); } + // Validate contents + protected override void OnValidating(CancelEventArgs e) + { + string textpart = this.Text; + + // Strip prefixes + textpart = textpart.Replace("+", ""); + textpart = textpart.Replace("-", ""); + + // No numbers left? + if(textpart.Length == 0) + { + // Make the textbox empty + this.Text = ""; + } + + // Call base + base.OnValidating(e); + } + + // This determines the result value + public int GetResult(int original) + { + string textpart = this.Text; + + // Strip prefixes + textpart = textpart.Replace("+", ""); + textpart = textpart.Replace("-", ""); + + // Any numbers left? + if(textpart.Length > 0) + { + // Prefixed with ++? + if(this.Text.StartsWith("++")) + { + // Add number to original + return original + int.Parse(textpart); + } + // Prefixed with --? + else if(this.Text.StartsWith("--")) + { + // Subtract number from original + return original - int.Parse(textpart); + } + else + { + // Return the new value + return int.Parse(this.Text); + } + } + else + { + // Nothing given, keep original value + return original; + } + } + #endregion } } diff --git a/Source/Interface/SectorInfoPanel.Designer.cs b/Source/Interface/SectorInfoPanel.Designer.cs index 3e1b3f0e..b4d60c04 100644 --- a/Source/Interface/SectorInfoPanel.Designer.cs +++ b/Source/Interface/SectorInfoPanel.Designer.cs @@ -28,13 +28,13 @@ namespace CodeImp.DoomBuilder.Interface /// private void InitializeComponent() { - System.Windows.Forms.GroupBox groupBox1; System.Windows.Forms.Label label13; System.Windows.Forms.Label label5; System.Windows.Forms.Label label4; System.Windows.Forms.Label label3; System.Windows.Forms.Label label2; System.Windows.Forms.Label label1; + this.sectorinfo = new System.Windows.Forms.GroupBox(); this.brightness = new System.Windows.Forms.Label(); this.height = new System.Windows.Forms.Label(); this.tag = new System.Windows.Forms.Label(); @@ -47,40 +47,39 @@ namespace CodeImp.DoomBuilder.Interface this.floorpanel = new System.Windows.Forms.GroupBox(); this.floorname = new System.Windows.Forms.Label(); this.floortex = new System.Windows.Forms.Panel(); - groupBox1 = new System.Windows.Forms.GroupBox(); label13 = new System.Windows.Forms.Label(); label5 = new System.Windows.Forms.Label(); label4 = new System.Windows.Forms.Label(); label3 = new System.Windows.Forms.Label(); label2 = new System.Windows.Forms.Label(); label1 = new System.Windows.Forms.Label(); - groupBox1.SuspendLayout(); + this.sectorinfo.SuspendLayout(); this.ceilingpanel.SuspendLayout(); this.floorpanel.SuspendLayout(); this.SuspendLayout(); // - // groupBox1 + // sectorinfo // - groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + this.sectorinfo.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left))); - groupBox1.Controls.Add(this.brightness); - groupBox1.Controls.Add(label13); - groupBox1.Controls.Add(this.height); - groupBox1.Controls.Add(label5); - groupBox1.Controls.Add(this.tag); - groupBox1.Controls.Add(this.floor); - groupBox1.Controls.Add(this.ceiling); - groupBox1.Controls.Add(label4); - groupBox1.Controls.Add(label3); - groupBox1.Controls.Add(label2); - groupBox1.Controls.Add(this.effect); - groupBox1.Controls.Add(label1); - groupBox1.Location = new System.Drawing.Point(0, 0); - groupBox1.Name = "groupBox1"; - groupBox1.Size = new System.Drawing.Size(230, 100); - groupBox1.TabIndex = 2; - groupBox1.TabStop = false; - groupBox1.Text = " Sector "; + this.sectorinfo.Controls.Add(this.brightness); + this.sectorinfo.Controls.Add(label13); + this.sectorinfo.Controls.Add(this.height); + this.sectorinfo.Controls.Add(label5); + this.sectorinfo.Controls.Add(this.tag); + this.sectorinfo.Controls.Add(this.floor); + this.sectorinfo.Controls.Add(this.ceiling); + this.sectorinfo.Controls.Add(label4); + this.sectorinfo.Controls.Add(label3); + this.sectorinfo.Controls.Add(label2); + this.sectorinfo.Controls.Add(this.effect); + this.sectorinfo.Controls.Add(label1); + this.sectorinfo.Location = new System.Drawing.Point(0, 0); + this.sectorinfo.Name = "sectorinfo"; + this.sectorinfo.Size = new System.Drawing.Size(230, 100); + this.sectorinfo.TabIndex = 2; + this.sectorinfo.TabStop = false; + this.sectorinfo.Text = " Sector "; // // brightness // @@ -259,14 +258,14 @@ namespace CodeImp.DoomBuilder.Interface this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; this.Controls.Add(this.floorpanel); this.Controls.Add(this.ceilingpanel); - this.Controls.Add(groupBox1); + this.Controls.Add(this.sectorinfo); this.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.MaximumSize = new System.Drawing.Size(10000, 100); this.MinimumSize = new System.Drawing.Size(100, 100); this.Name = "SectorInfoPanel"; this.Size = new System.Drawing.Size(450, 100); - groupBox1.ResumeLayout(false); - groupBox1.PerformLayout(); + this.sectorinfo.ResumeLayout(false); + this.sectorinfo.PerformLayout(); this.ceilingpanel.ResumeLayout(false); this.floorpanel.ResumeLayout(false); this.ResumeLayout(false); @@ -287,5 +286,6 @@ namespace CodeImp.DoomBuilder.Interface private System.Windows.Forms.GroupBox floorpanel; private System.Windows.Forms.Label floorname; private System.Windows.Forms.Panel floortex; + private System.Windows.Forms.GroupBox sectorinfo; } } diff --git a/Source/Interface/SectorInfoPanel.cs b/Source/Interface/SectorInfoPanel.cs index 56832f02..c87e3821 100644 --- a/Source/Interface/SectorInfoPanel.cs +++ b/Source/Interface/SectorInfoPanel.cs @@ -48,6 +48,7 @@ namespace CodeImp.DoomBuilder.Interface // TODO: Lookup effect description in config // Sector info + sectorinfo.Text = " Sector " + s.Index.ToString() + " "; effect.Text = s.Effect.ToString(); ceiling.Text = s.CeilHeight.ToString(); floor.Text = s.FloorHeight.ToString(); diff --git a/Source/Interface/SectorInfoPanel.resx b/Source/Interface/SectorInfoPanel.resx index 1b1c426e..a644af27 100644 --- a/Source/Interface/SectorInfoPanel.resx +++ b/Source/Interface/SectorInfoPanel.resx @@ -117,10 +117,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - False - - + True @@ -186,6 +183,12 @@ True + + True + + + True + True @@ -195,6 +198,12 @@ True + + True + + + True + True diff --git a/Source/Interface/TextureSelectorControl.cs b/Source/Interface/TextureSelectorControl.cs index c97589f9..27279230 100644 --- a/Source/Interface/TextureSelectorControl.cs +++ b/Source/Interface/TextureSelectorControl.cs @@ -45,11 +45,18 @@ namespace CodeImp.DoomBuilder.Interface // Properties public bool Required { get { return required; } set { required = value; } } + // Setup + public void Initialize() + { + // Fill autocomplete list + name.AutoCompleteCustomSource.AddRange(General.Map.Data.TextureNames.ToArray()); + } + // This finds the image we need for the given texture name - protected override Image FindImage(string name) + protected override Image FindImage(string imagename) { // Check if name is a "none" texture - if((name.Length < 1) || (name[0] == '-')) + if((imagename.Length < 1) || (imagename[0] == '-')) { // Determine image to show if(required) @@ -60,18 +67,18 @@ namespace CodeImp.DoomBuilder.Interface else { // Set the image - return General.Map.Data.GetTextureBitmap(name); + return General.Map.Data.GetTextureBitmap(imagename); } } // This browses for a texture - protected override string BrowseImage(string name) + protected override string BrowseImage(string imagename) { string result; // Browse for texture - result = TextureBrowserForm.Browse(this.ParentForm, name); - if(result != null) return result; else return name; + result = TextureBrowserForm.Browse(this.ParentForm, imagename); + if(result != null) return result; else return imagename; } } } diff --git a/Source/Map/Linedef.cs b/Source/Map/Linedef.cs index 4f281992..3d43eeac 100644 --- a/Source/Map/Linedef.cs +++ b/Source/Map/Linedef.cs @@ -87,9 +87,9 @@ namespace CodeImp.DoomBuilder.Map public Sidedef Front { get { return front; } } public Sidedef Back { get { return back; } } public bool IsDisposed { get { return isdisposed; } } - public int Flags { get { return flags; } } - public int Action { get { return action; } } - public int Tag { get { return tag; } } + public int Flags { get { return flags; } set { flags = value; } } + public int Action { get { return action; } set { action = value; } } + public int Tag { get { return tag; } set { tag = value; if((tag < 0) || (tag > MapSet.HIGHEST_TAG)) throw new ArgumentOutOfRangeException("Tag", "Invalid tag number"); } } public bool Selected { get { return selected; } set { selected = value; } } public float LengthSq { get { return lengthsq; } } public float Length { get { return length; } } diff --git a/Source/Map/MapSet.cs b/Source/Map/MapSet.cs index 8860165f..0b27bf4e 100644 --- a/Source/Map/MapSet.cs +++ b/Source/Map/MapSet.cs @@ -34,8 +34,19 @@ namespace CodeImp.DoomBuilder.Map { public sealed class MapSet : IDisposable { + #region ================== Constants + + // Highest tag + public const int HIGHEST_TAG = 65534; + + #endregion + #region ================== Variables + // Sector indexing + private List indexholes; + private int lastsectorindex; + // Map structures private LinkedList vertices; private LinkedList linedefs; @@ -70,7 +81,9 @@ namespace CodeImp.DoomBuilder.Map sidedefs = new LinkedList(); sectors = new LinkedList(); things = new LinkedList(); - + indexholes = new List(); + lastsectorindex = 0; + // We have no destructor GC.SuppressFinalize(this); } @@ -112,6 +125,7 @@ namespace CodeImp.DoomBuilder.Map sidedefs = null; sectors = null; things = null; + indexholes = null; // Done isdisposed = true; @@ -259,6 +273,28 @@ namespace CodeImp.DoomBuilder.Map // This creates a new sector public Sector CreateSector() + { + int index; + + // Do we have any index holes we can use? + if(indexholes.Count > 0) + { + // Take one of the index holes + index = indexholes[indexholes.Count - 1]; + indexholes.RemoveAt(indexholes.Count - 1); + } + else + { + // Make a new index + index = lastsectorindex++; + } + + // Make the sector + return CreateSector(index); + } + + // This creates a new sector + public Sector CreateSector(int index) { LinkedListNode listitem; Sector s; @@ -267,7 +303,7 @@ namespace CodeImp.DoomBuilder.Map listitem = new LinkedListNode(null); // Make the sector - s = new Sector(this, listitem); + s = new Sector(this, listitem, index); listitem.Value = s; // Add sector to the list @@ -297,6 +333,12 @@ namespace CodeImp.DoomBuilder.Map return t; } + // This adds a sector index hole + public void AddSectorIndexHole(int index) + { + indexholes.Add(index); + } + #endregion #region ================== Updating @@ -960,6 +1002,45 @@ namespace CodeImp.DoomBuilder.Map #region ================== Tools + // This returns the next unused tag number + public int GetNewTag() + { + bool[] usedtags = new bool[HIGHEST_TAG+1]; + usedtags.Initialize(); + + // Check all sectors + foreach(Sector s in sectors) usedtags[s.Tag] = true; + + // Check all lines + foreach(Linedef l in linedefs) usedtags[l.Tag] = true; + + // Check all things + foreach(Thing t in things) usedtags[t.Tag] = true; + + // Now find the first unused index + for(int i = 1; i <= HIGHEST_TAG; i++) + if(usedtags[i] == false) return i; + + // Problem: all tags used! + // Lets ignore this problem for now, who needs 65-thousand tags?! + return 0; + } + + // This returns the sector with the given index or null when the index is not in use + // TODO: Speed this up by keeping sector references with indices in a dictionary? + public Sector GetSectorByIndex(int index) + { + // Go for all sectors + foreach(Sector s in sectors) + { + // Return sector when index matches + if(s.Index == index) return s; + } + + // Nothing found + return null; + } + // This makes a list of lines related to vertex selection // A line is unstable when one vertex is selected and the other isn't. public ICollection LinedefsFromSelectedVertices(bool includeunselected, bool includestable, bool includeunstable) diff --git a/Source/Map/Sector.cs b/Source/Map/Sector.cs index a19b4f4b..97f36721 100644 --- a/Source/Map/Sector.cs +++ b/Source/Map/Sector.cs @@ -48,6 +48,7 @@ namespace CodeImp.DoomBuilder.Map private LinkedList things; // Properties + private int index; private int floorheight; private int ceilheight; private string floortexname; @@ -75,6 +76,7 @@ namespace CodeImp.DoomBuilder.Map public ICollection Sidedefs { get { return sidedefs; } } public ICollection Things { get { return things; } } public bool IsDisposed { get { return isdisposed; } } + public int Index { get { return index; } } public int FloorHeight { get { return floorheight; } } public int CeilHeight { get { return ceilheight; } } public string FloorTexture { get { return floortexname; } } @@ -82,7 +84,7 @@ namespace CodeImp.DoomBuilder.Map public long LongFloorTexture { get { return longfloortexname; } } public long LongCeilTexture { get { return longceiltexname; } } public int Effect { get { return effect; } } - public int Tag { get { return tag; } } + public int Tag { get { return tag; } set { tag = value; if((tag < 0) || (tag > MapSet.HIGHEST_TAG)) throw new ArgumentOutOfRangeException("Tag", "Invalid tag number"); } } public int Brightness { get { return brightness; } } public bool Selected { get { return selected; } set { selected = value; } } public Sector Clone { get { return clone; } set { clone = value; } } @@ -92,13 +94,16 @@ namespace CodeImp.DoomBuilder.Map #region ================== Constructor / Disposer // Constructor - public Sector(MapSet map, LinkedListNode listitem) + public Sector(MapSet map, LinkedListNode listitem, int index) { // Initialize this.map = map; this.mainlistitem = listitem; this.sidedefs = new LinkedList(); this.things = new LinkedList(); + this.index = index; + SetCeilTexture("-"); + SetFloorTexture("-"); // We have no destructor GC.SuppressFinalize(this); @@ -115,6 +120,9 @@ namespace CodeImp.DoomBuilder.Map // Remove from main list mainlistitem.List.Remove(mainlistitem); + + // Register the index as free + map.AddSectorIndexHole(index); // Dispose the sidedefs that are attached to this sector // because a sidedef cannot exist without reference to its sector. diff --git a/Source/Map/Sidedef.cs b/Source/Map/Sidedef.cs index 7dd7caa9..c08e3165 100644 --- a/Source/Map/Sidedef.cs +++ b/Source/Map/Sidedef.cs @@ -71,8 +71,8 @@ namespace CodeImp.DoomBuilder.Map public Sidedef Other { get { if(this == linedef.Front) return linedef.Back; else return linedef.Front; } } public Sector Sector { get { return sector; } } public bool IsDisposed { get { return isdisposed; } } - public int OffsetX { get { return offsetx; } } - public int OffsetY { get { return offsety; } } + public int OffsetX { get { return offsetx; } set { offsetx = value; } } + public int OffsetY { get { return offsety; } set { offsety = value; } } public string HighTexture { get { return texnamehigh; } } public string MiddleTexture { get { return texnamemid; } } public string LowTexture { get { return texnamelow; } } @@ -92,6 +92,9 @@ namespace CodeImp.DoomBuilder.Map this.mainlistitem = listitem; this.linedef = l; this.sector = s; + SetTextureHigh("-"); + SetTextureMid("-"); + SetTextureLow("-"); // Attach to the linedef if(front) l.AttachFront(this); else l.AttachBack(this); @@ -276,6 +279,19 @@ namespace CodeImp.DoomBuilder.Map longtexnamelow = Lump.MakeLongName(name); } + // This changes sector + public void ChangeSector(Sector newsector) + { + // Detach from sector + sector.DetachSidedef(sectorlistitem); + + // Change sector + sector = newsector; + + // Attach to sector + sectorlistitem = sector.AttachSidedef(this); + } + #endregion } } diff --git a/Source/Map/Thing.cs b/Source/Map/Thing.cs index 0e2facc3..bdaa1355 100644 --- a/Source/Map/Thing.cs +++ b/Source/Map/Thing.cs @@ -90,6 +90,7 @@ namespace CodeImp.DoomBuilder.Map public int X { get { return x; } } public int Y { get { return y; } } public int ZOffset { get { return zoffset; } } + public int Tag { get { return tag; } set { tag = value; if((tag < 0) || (tag > MapSet.HIGHEST_TAG)) throw new ArgumentOutOfRangeException("Tag", "Invalid tag number"); } } public Sector Sector { get { return sector; } } #endregion diff --git a/Source/Rendering/Renderer2D.cs b/Source/Rendering/Renderer2D.cs index b512ba6c..51986b3f 100644 --- a/Source/Rendering/Renderer2D.cs +++ b/Source/Rendering/Renderer2D.cs @@ -611,15 +611,14 @@ namespace CodeImp.DoomBuilder.Rendering // This returns the color for a linedef public PixelColor DetermineLinedefColor(Linedef l) { - // Sinlgesided lines - if((l.Back == null) || (l.Front == null)) + // Impassable lines + if((l.Flags & General.Map.Config.ImpassableFlags) != 0) { // Determine color if(l.Selected) return General.Colors.Selection; else if(l.Action != 0) return General.Colors.Actions; else return General.Colors.Linedefs; } - // Doublesided lines else { // Determine color