From cf892c3e853b4077560b206db80d911596a96ec2 Mon Sep 17 00:00:00 2001
From: spherallic <spherallic@gmail.com>
Date: Fri, 12 Jul 2024 13:37:14 +0200
Subject: [PATCH] Add actions to toggle slope skewing and midtexture pegging

---
 .../BuilderModes/Resources/Actions.cfg        | 20 +++++++
 .../VisualModes/BaseVisualGeometrySector.cs   |  3 +
 .../VisualModes/BaseVisualGeometrySidedef.cs  | 59 ++++++++++++++++++-
 .../VisualModes/BaseVisualMode.cs             | 26 ++++++++
 .../VisualModes/BaseVisualSlope.cs            |  3 +
 .../VisualModes/BaseVisualThing.cs            |  3 +
 .../VisualModes/BaseVisualVertex.cs           |  3 +
 .../VisualModes/IVisualEventReceiver.cs       |  6 +-
 .../VisualModes/NullVisualEventReceiver.cs    |  4 ++
 9 files changed, 124 insertions(+), 3 deletions(-)

diff --git a/Source/Plugins/BuilderModes/Resources/Actions.cfg b/Source/Plugins/BuilderModes/Resources/Actions.cfg
index 820f4671f..1b4235948 100755
--- a/Source/Plugins/BuilderModes/Resources/Actions.cfg
+++ b/Source/Plugins/BuilderModes/Resources/Actions.cfg
@@ -1135,6 +1135,26 @@ togglelowerunpegged
 	allowscroll = true;
 }
 
+togglepegmidtexture
+{
+	title = "Toggle Peg Midtexture";
+	category = "visual";
+	description = "Toggles the Peg Midtexture setting on the selected or targeted linedef.";
+	allowkeys = true;
+	allowmouse = true;
+	allowscroll = true;
+}
+
+toggleslopeskew
+{
+	title = "Toggle Slope Skew";
+	category = "visual";
+	description = "Toggles the Slope Skew setting on the selected or targeted linedef.";
+	allowkeys = true;
+	allowmouse = true;
+	allowscroll = true;
+}
+
 togglegravity
 {
 	title = "Toggle Gravity";
diff --git a/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySector.cs b/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySector.cs
index 54deed468..7747022d5 100755
--- a/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySector.cs
+++ b/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySector.cs
@@ -390,6 +390,8 @@ namespace CodeImp.DoomBuilder.BuilderModes
 		public virtual void OnTextureFit(FitTextureOptions options) { } //mxd
 		public virtual void OnToggleUpperUnpegged() { }
 		public virtual void OnToggleLowerUnpegged() { }
+		public virtual void OnTogglePegMidtexture() { }
+		public virtual void OnToggleSlopeSkew() { }
 		public virtual void OnResetTextureOffset() { }
 		public virtual void OnResetLocalTextureOffset() { } //mxd
 		public virtual void OnCopyTextureOffsets() { }
@@ -398,6 +400,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
 		protected virtual void SetTexture(string texturename) { }
 		public virtual void ApplyUpperUnpegged(bool set) { }
 		public virtual void ApplyLowerUnpegged(bool set) { }
+		public virtual void ApplyLineFlag(Linedef line, string flag, string name) { }
 		protected abstract void MoveTextureOffset(int offsetx, int offsety);
 		protected abstract Point GetTextureOffset();
 		public virtual void OnPaintSelectEnd() { } // biwa
diff --git a/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySidedef.cs b/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySidedef.cs
index f49bb2904..8e8f18688 100755
--- a/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySidedef.cs
+++ b/Source/Plugins/BuilderModes/VisualModes/BaseVisualGeometrySidedef.cs
@@ -1060,7 +1060,32 @@ namespace CodeImp.DoomBuilder.BuilderModes
 			}
 		}
 
-		
+		// Toggle midtexture pegging
+		public virtual void OnTogglePegMidtexture()
+		{
+			mode.ApplyLineFlag(this.Sidedef.Line, "midpeg", "Peg Midtexture");
+		}
+
+		// Toggle slope skew
+		public virtual void OnToggleSlopeSkew()
+		{
+			switch (this.GeometryType)
+			{
+				case VisualGeometryType.WALL_LOWER:
+				case VisualGeometryType.WALL_UPPER:
+					mode.ApplyLineFlag(this.Sidedef.Line, "skewtd", "Slope Skew");
+					break;
+
+				case VisualGeometryType.WALL_MIDDLE_3D:
+					mode.ApplyLineFlag(this.GetControlLinedef(), "skewtd", "Slope Skew");
+					break;
+
+				case VisualGeometryType.WALL_MIDDLE:
+					mode.ApplyLineFlag(this.Sidedef.Line, "noskew", "No Midtexture Skew");
+					break;
+			}
+		}
+
 		// This sets the Upper Unpegged flag
 		public virtual void ApplyUpperUnpegged(bool set)
 		{
@@ -1092,7 +1117,6 @@ namespace CodeImp.DoomBuilder.BuilderModes
 			}
 		}
 		
-		
 		// This sets the Lower Unpegged flag
 		public virtual void ApplyLowerUnpegged(bool set)
 		{
@@ -1124,6 +1148,37 @@ namespace CodeImp.DoomBuilder.BuilderModes
 			}
 		}
 
+		// This sets a specified flag
+		public virtual void ApplyLineFlag(Linedef line, string flag, string name)
+		{
+			if (line.IsFlagSet(flag))
+			{
+				// Remove flag
+				mode.CreateUndo("Remove " + name + " flag");
+				mode.SetActionResult("Removed " + name + " flag.");
+				line.SetFlag(flag, false);
+			}
+			else
+			{
+				// Add flag
+				mode.CreateUndo("Set " + name + " flag");
+				mode.SetActionResult("Set " + name + " flag.");
+				line.SetFlag(flag, true);
+			}
+
+			// Update sidedef geometry
+			VisualSidedefParts parts = Sector.GetSidedefParts(Sidedef);
+			parts.SetupAllParts();
+
+			// Update other sidedef geometry
+			if (Sidedef.Other != null)
+			{
+				BaseVisualSector othersector = (BaseVisualSector)mode.GetVisualSector(Sidedef.Other.Sector);
+				parts = othersector.GetSidedefParts(Sidedef.Other);
+				parts.SetupAllParts();
+			}
+		}
+
 
 		// Flood-fill textures
 		public virtual void OnTextureFloodfill()
diff --git a/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs b/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs
index 5ac9e80e6..4ccf56e68 100644
--- a/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs
+++ b/Source/Plugins/BuilderModes/VisualModes/BaseVisualMode.cs
@@ -2248,6 +2248,16 @@ namespace CodeImp.DoomBuilder.BuilderModes
 			}
 		}
 
+		// Apply specified flag
+		public void ApplyLineFlag(Linedef line, string flag, string name)
+		{
+			List<IVisualEventReceiver> objs = GetSelectedObjects(false, true, false, false, false);
+			foreach (IVisualEventReceiver i in objs)
+			{
+				i.ApplyLineFlag(line, flag, name);
+			}
+		}
+
 		// Apply texture change
 		public void ApplySelectTexture(string texture, bool flat)
 		{
@@ -3775,6 +3785,22 @@ namespace CodeImp.DoomBuilder.BuilderModes
 			PostAction();
 		}
 
+		[BeginAction("togglepegmidtexture")]
+		public void TogglePegMidtexture()
+		{
+			PreAction(UndoGroup.None);
+			GetTargetEventReceiver(false).OnTogglePegMidtexture();
+			PostAction();
+		}
+
+		[BeginAction("toggleslopeskew")]
+		public void ToggleSlopeSkew()
+		{
+			PreAction(UndoGroup.None);
+			GetTargetEventReceiver(false).OnToggleSlopeSkew();
+			PostAction();
+		}
+
 		[BeginAction("togglegravity")]
 		public void ToggleGravity()
 		{
diff --git a/Source/Plugins/BuilderModes/VisualModes/BaseVisualSlope.cs b/Source/Plugins/BuilderModes/VisualModes/BaseVisualSlope.cs
index 1a8536b5e..c544c4304 100644
--- a/Source/Plugins/BuilderModes/VisualModes/BaseVisualSlope.cs
+++ b/Source/Plugins/BuilderModes/VisualModes/BaseVisualSlope.cs
@@ -120,6 +120,8 @@ namespace CodeImp.DoomBuilder.VisualModes
 		public void OnTextureAlign(bool alignx, bool aligny) { }
 		public void OnToggleUpperUnpegged() { }
 		public void OnToggleLowerUnpegged() { }
+		public void OnTogglePegMidtexture() { }
+		public void OnToggleSlopeSkew() { }
 		public void OnProcess(long deltatime) { }
 		public void OnTextureFloodfill() { }
 		public void OnInsert() { }
@@ -127,6 +129,7 @@ namespace CodeImp.DoomBuilder.VisualModes
 		public void ApplyTexture(string texture) { }
 		public void ApplyUpperUnpegged(bool set) { }
 		public void ApplyLowerUnpegged(bool set) { }
+		public void ApplyLineFlag(Linedef line, string flag, string name) { }
 		public void SelectNeighbours(bool select, bool withSameTexture, bool withSameHeight, bool stopatselected) { } //mxd
 		public virtual void OnPaintSelectEnd() { } // biwa
 		public void OnChangeScale(int x, int y) { }
diff --git a/Source/Plugins/BuilderModes/VisualModes/BaseVisualThing.cs b/Source/Plugins/BuilderModes/VisualModes/BaseVisualThing.cs
index 0abe1d45b..ec81c7aea 100644
--- a/Source/Plugins/BuilderModes/VisualModes/BaseVisualThing.cs
+++ b/Source/Plugins/BuilderModes/VisualModes/BaseVisualThing.cs
@@ -714,6 +714,8 @@ namespace CodeImp.DoomBuilder.BuilderModes
 		public void OnTextureAlign(bool alignx, bool aligny) { }
 		public void OnToggleUpperUnpegged() { }
 		public void OnToggleLowerUnpegged() { }
+		public void OnTogglePegMidtexture() { }
+		public void OnToggleSlopeSkew() { }
 		public void OnProcess(long deltatime) { }
 		public void OnTextureFloodfill() { }
 		public void OnInsert() { }
@@ -721,6 +723,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
 		public void ApplyTexture(string texture) { }
 		public void ApplyUpperUnpegged(bool set) { }
 		public void ApplyLowerUnpegged(bool set) { }
+		public void ApplyLineFlag(Linedef line, string flag, string name) { }
 		public void SelectNeighbours(bool select, bool withSameTexture, bool withSameHeight, bool stopatselected) { } //mxd
 		public virtual void OnPaintSelectEnd() { } // biwa
 
diff --git a/Source/Plugins/BuilderModes/VisualModes/BaseVisualVertex.cs b/Source/Plugins/BuilderModes/VisualModes/BaseVisualVertex.cs
index 575805ca1..6526d8273 100644
--- a/Source/Plugins/BuilderModes/VisualModes/BaseVisualVertex.cs
+++ b/Source/Plugins/BuilderModes/VisualModes/BaseVisualVertex.cs
@@ -252,6 +252,8 @@ namespace CodeImp.DoomBuilder.BuilderModes
 		public void OnTextureFit(FitTextureOptions options) { } //mxd
 		public void OnToggleUpperUnpegged() { }
 		public void OnToggleLowerUnpegged() { }
+		public void OnTogglePegMidtexture() { }
+		public void OnToggleSlopeSkew() { }
 		public void OnResetTextureOffset() { }
 		public void OnResetLocalTextureOffset() { } //mxd
 		public void OnProcess(long deltatime) { }
@@ -260,6 +262,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
 		public void ApplyTexture(string texture) { }
 		public void ApplyUpperUnpegged(bool set) { }
 		public void ApplyLowerUnpegged(bool set) { }
+		public void ApplyLineFlag(Linedef line, string flag, string name) { }
 		public string GetTextureName() { return ""; }
 		public void SelectNeighbours(bool select, bool withSameTexture, bool withSameHeight, bool stopatselected) { } //mxd
 		public virtual void OnPaintSelectBegin() { } // biwa
diff --git a/Source/Plugins/BuilderModes/VisualModes/IVisualEventReceiver.cs b/Source/Plugins/BuilderModes/VisualModes/IVisualEventReceiver.cs
index 587b381e3..b280b32f6 100644
--- a/Source/Plugins/BuilderModes/VisualModes/IVisualEventReceiver.cs
+++ b/Source/Plugins/BuilderModes/VisualModes/IVisualEventReceiver.cs
@@ -16,6 +16,7 @@
 
 #region ================== Namespaces
 
+using CodeImp.DoomBuilder.Map;
 using System.Windows.Forms;
 
 #endregion
@@ -51,6 +52,8 @@ namespace CodeImp.DoomBuilder.BuilderModes
 		void OnTextureFloodfill();
 		void OnToggleUpperUnpegged();
 		void OnToggleLowerUnpegged();
+		void OnTogglePegMidtexture();
+		void OnToggleSlopeSkew();
 		void OnProcess(long deltatime);
 		void OnInsert();
 		void OnDelete();
@@ -61,7 +64,8 @@ namespace CodeImp.DoomBuilder.BuilderModes
 		void ApplyTexture(string texture);
 		void ApplyUpperUnpegged(bool set);
 		void ApplyLowerUnpegged(bool set);
-		
+		void ApplyLineFlag(Linedef line, string flag, string name);
+
 		// Other methods
 		string GetTextureName();
 		void SelectNeighbours(bool select, bool matchtexture, bool matchheight, bool stopatselected); //mxd
diff --git a/Source/Plugins/BuilderModes/VisualModes/NullVisualEventReceiver.cs b/Source/Plugins/BuilderModes/VisualModes/NullVisualEventReceiver.cs
index e04ce6a79..5e35629c2 100644
--- a/Source/Plugins/BuilderModes/VisualModes/NullVisualEventReceiver.cs
+++ b/Source/Plugins/BuilderModes/VisualModes/NullVisualEventReceiver.cs
@@ -16,6 +16,7 @@
 
 #region ================== Namespaces
 
+using CodeImp.DoomBuilder.Map;
 using System.Windows.Forms;
 
 #endregion
@@ -50,6 +51,8 @@ namespace CodeImp.DoomBuilder.BuilderModes
 		public void OnTextureFloodfill() { }
 		public void OnToggleUpperUnpegged()	{ }
 		public void OnToggleLowerUnpegged()	{ }
+		public void OnTogglePegMidtexture() { }
+		public void OnToggleSlopeSkew() { }
 		public void OnProcess(long deltatime) { }
 		public void OnInsert() { }
 		public void OnDelete() { }
@@ -58,6 +61,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
 		public void ApplyTexture(string texture) { }
 		public void ApplyUpperUnpegged(bool set) { }
 		public void ApplyLowerUnpegged(bool set) { }
+		public void ApplyLineFlag(Linedef line, string flag, string name) { }
 		public string GetTextureName() { return "";	}
 		public void SelectNeighbours(bool select, bool withSameTexture, bool withSameHeight, bool stopatselected) { } //mxd
 	}
-- 
GitLab