From 7d11b0dd2726e2fb353a205f2c2084c06b3047d7 Mon Sep 17 00:00:00 2001
From: biwa <6475593+biwa@users.noreply.github.com>
Date: Sun, 6 Feb 2022 13:55:37 +0100
Subject: [PATCH] Linedefs Mode: fixed a problem where sector labels and
 linedef selection labels were not shown

---
 .../BuilderModes/ClassicModes/LinedefsMode.cs | 224 +++++++++---------
 1 file changed, 110 insertions(+), 114 deletions(-)

diff --git a/Source/Plugins/BuilderModes/ClassicModes/LinedefsMode.cs b/Source/Plugins/BuilderModes/ClassicModes/LinedefsMode.cs
index 9b058af0e..84bac16e1 100755
--- a/Source/Plugins/BuilderModes/ClassicModes/LinedefsMode.cs
+++ b/Source/Plugins/BuilderModes/ClassicModes/LinedefsMode.cs
@@ -466,6 +466,105 @@ namespace CodeImp.DoomBuilder.BuilderModes
 			blockmap.AddLinedefsSet(General.Map.Map.Linedefs);
 		}
 
+		/// <summary>
+		/// Renders the overlay with the (selection) labels and insert vertex preview.
+		/// </summary>
+		private void RenderOverlay()
+		{
+			if (renderer.StartOverlay(true))
+			{
+				if (!selecting) //mxd
+				{
+					if ((highlighted != null) && !highlighted.IsDisposed) highlightasso.Render(); //mxd
+				}
+				else
+				{
+					RenderMultiSelection();
+				}
+
+				//mxd. Render vertex insert preview
+				if (insertpreview.IsFinite())
+				{
+					double dist = Math.Min(Vector2D.Distance(mousemappos, insertpreview), BuilderPlug.Me.HighlightRange);
+					byte alpha = (byte)(255 - (dist / BuilderPlug.Me.HighlightRange) * 128);
+					float vsize = (renderer.VertexSize + 1.0f) / renderer.Scale;
+					renderer.RenderRectangleFilled(new RectangleF((float)(insertpreview.x - vsize), (float)(insertpreview.y - vsize), vsize * 2.0f, vsize * 2.0f), General.Colors.InfoLine.WithAlpha(alpha), true);
+				}
+
+				//mxd. Render sector tag labels
+				if (BuilderPlug.Me.ViewSelectionEffects)
+				{
+					List<ITextLabel> torender = new List<ITextLabel>(sectorlabels.Count);
+					foreach (KeyValuePair<Sector, string[]> group in sectortexts)
+					{
+						// Pick which text variant to use
+						TextLabel[] labelarray = sectorlabels[group.Key];
+						for (int i = 0; i < group.Key.Labels.Count; i++)
+						{
+							TextLabel l = labelarray[i];
+
+							// Render only when enough space for the label to see
+							if (!textlabelsizecache.ContainsKey(group.Value[0]))
+								textlabelsizecache[group.Value[0]] = General.Interface.MeasureString(group.Value[0], l.Font).Width;
+
+							float requiredsize = textlabelsizecache[group.Value[0]] / 2 / renderer.Scale;
+
+							if (requiredsize > group.Key.Labels[i].radius)
+							{
+								if (!textlabelsizecache.ContainsKey(group.Value[1]))
+									textlabelsizecache[group.Value[1]] = General.Interface.MeasureString(group.Value[1], l.Font).Width;
+
+								requiredsize = textlabelsizecache[group.Value[1]] / 2 / renderer.Scale;
+
+								string newtext;
+
+								if (requiredsize > group.Key.Labels[i].radius)
+									newtext = (requiredsize > group.Key.Labels[i].radius * 4 ? string.Empty : "+");
+								else
+									newtext = group.Value[1];
+
+								if (l.Text != newtext)
+									l.Text = newtext;
+							}
+							else
+							{
+								if (group.Value[0] != l.Text)
+									l.Text = group.Value[0];
+							}
+
+							if (!string.IsNullOrEmpty(l.Text)) torender.Add(l);
+						}
+					}
+
+					// Render labels
+					renderer.RenderText(torender);
+				}
+
+				//mxd. Render selection labels
+				if (BuilderPlug.Me.ViewSelectionNumbers)
+				{
+					List<ITextLabel> torender = new List<ITextLabel>(labels.Count);
+					foreach (KeyValuePair<Linedef, SelectionLabel> group in labels)
+					{
+						// Render only when enough space for the label to see
+						group.Value.Move(group.Key.Start.Position, group.Key.End.Position);
+						float requiredsize = (group.Value.TextSize.Width) / renderer.Scale;
+						if (group.Key.Length > requiredsize)
+						{
+							torender.Add(group.Value.TextLabel);
+						}
+					}
+
+					renderer.RenderText(torender);
+				}
+
+				//mxd. Render comments
+				if (General.Map.UDMF && General.Settings.RenderComments) foreach (Linedef l in General.Map.Map.Linedefs) RenderComment(l);
+
+				renderer.Finish();
+			}
+		}
+
 		#endregion
 
 		#region ================== Events
@@ -600,99 +699,8 @@ namespace CodeImp.DoomBuilder.BuilderModes
 				renderer.Finish();
 			}
 
-			// Render selection
-			if(renderer.StartOverlay(true))
-			{
-				if(!selecting) //mxd
-				{ 
-					if ((highlighted != null) && !highlighted.IsDisposed) highlightasso.Render(); //mxd
-				}
-				else
-				{
-					RenderMultiSelection();
-				}
-
-				//mxd. Render vertex insert preview
-				if(insertpreview.IsFinite())
-				{
-					double dist = Math.Min(Vector2D.Distance(mousemappos, insertpreview), BuilderPlug.Me.HighlightRange);
-					byte alpha = (byte)(255 - (dist / BuilderPlug.Me.HighlightRange) * 128);
-					float vsize = (renderer.VertexSize + 1.0f) / renderer.Scale;
-					renderer.RenderRectangleFilled(new RectangleF((float)(insertpreview.x - vsize), (float)(insertpreview.y - vsize), vsize * 2.0f, vsize * 2.0f), General.Colors.InfoLine.WithAlpha(alpha), true);
-				}
-
-				//mxd. Render sector tag labels
-				if(BuilderPlug.Me.ViewSelectionEffects)
-				{
-					List<ITextLabel> torender = new List<ITextLabel>(sectorlabels.Count);
-					foreach(KeyValuePair<Sector, string[]> group in sectortexts)
-					{
-						// Pick which text variant to use
-						TextLabel[] labelarray = sectorlabels[group.Key];
-						for(int i = 0; i < group.Key.Labels.Count; i++)
-						{
-							TextLabel l = labelarray[i];
-
-							// Render only when enough space for the label to see
-							if (!textlabelsizecache.ContainsKey(group.Value[0]))
-								textlabelsizecache[group.Value[0]] = General.Interface.MeasureString(group.Value[0], l.Font).Width;
-
-							float requiredsize = textlabelsizecache[group.Value[0]] / 2 / renderer.Scale;
-
-							if (requiredsize > group.Key.Labels[i].radius)
-							{
-								if (!textlabelsizecache.ContainsKey(group.Value[1]))
-									textlabelsizecache[group.Value[1]] = General.Interface.MeasureString(group.Value[1], l.Font).Width;
-
-								requiredsize = textlabelsizecache[group.Value[1]] / 2 / renderer.Scale;
-
-								string newtext;
-
-								if (requiredsize > group.Key.Labels[i].radius)
-									newtext = (requiredsize > group.Key.Labels[i].radius * 4 ? string.Empty : "+");
-								else
-									newtext = group.Value[1];
-
-								if (l.Text != newtext)
-									l.Text = newtext;
-							}
-							else
-							{
-								if (group.Value[0] != l.Text)
-									l.Text = group.Value[0];
-							}
-
-							if(!string.IsNullOrEmpty(l.Text)) torender.Add(l);
-						}
-					}
-
-					// Render labels
-					renderer.RenderText(torender);
-				}
-
-				//mxd. Render selection labels
-				if(BuilderPlug.Me.ViewSelectionNumbers)
-				{
-					List<ITextLabel> torender = new List<ITextLabel>(labels.Count);
-					foreach(KeyValuePair<Linedef, SelectionLabel> group in labels)
-					{
-						// Render only when enough space for the label to see
-						group.Value.Move(group.Key.Start.Position, group.Key.End.Position);
-						float requiredsize = (group.Value.TextSize.Width) / renderer.Scale;
-						if(group.Key.Length > requiredsize)
-						{
-							torender.Add(group.Value.TextLabel);
-						}
-					}
-
-					renderer.RenderText(torender);
-				}
-
-				//mxd. Render comments
-				if(General.Map.UDMF && General.Settings.RenderComments) foreach(Linedef l in General.Map.Map.Linedefs) RenderComment(l);
-
-				renderer.Finish();
-			}
+			// Render the overlay with the text labels and ve
+			RenderOverlay();
 
 			renderer.Present();
 		}
@@ -986,36 +994,24 @@ namespace CodeImp.DoomBuilder.BuilderModes
 					{
 						insertpreview = v;
 
-						// Render preview. Do not redraw the whole display for performance reasons
-						if(renderer.StartOverlay(true))
-						{
-							double dist = Math.Min(Vector2D.Distance(mousemappos, insertpreview), BuilderPlug.Me.HighlightRange);
-							byte alpha = (byte)(255 - (dist / BuilderPlug.Me.HighlightRange) * 128);
-							float vsize = (renderer.VertexSize + 1.0f) / renderer.Scale;
-							renderer.RenderRectangleFilled(new RectangleF((float)(insertpreview.x - vsize), (float)(insertpreview.y - vsize), vsize * 2.0f, vsize * 2.0f), General.Colors.InfoLine.WithAlpha(alpha), true);
-							renderer.Finish();
-							renderer.Present();
-						}
+						// Render overlay to show the new insert preview. Do not redraw the whole display for performance reasons.
+						// We need to present ourselves because RenderOverlay does not do it
+						RenderOverlay();
+						renderer.Present();
 					}
 				} 
 				else if(insertpreview.IsFinite()) 
 				{
 					insertpreview.x = float.NaN;
 
-					// Render preview. Do not redraw the whole display for performance reasons
-					if (renderer.StartOverlay(true))
-					{
-						double dist = Math.Min(Vector2D.Distance(mousemappos, insertpreview), BuilderPlug.Me.HighlightRange);
-						byte alpha = (byte)(255 - (dist / BuilderPlug.Me.HighlightRange) * 128);
-						float vsize = (renderer.VertexSize + 1.0f) / renderer.Scale;
-						renderer.RenderRectangleFilled(new RectangleF((float)(insertpreview.x - vsize), (float)(insertpreview.y - vsize), vsize * 2.0f, vsize * 2.0f), General.Colors.InfoLine.WithAlpha(alpha), true);
-						renderer.Finish();
-						renderer.Present();
-					}
+					// Render overlay to show the new insert preview. Do not redraw the whole display for performance reasons
+					// We need to present ourselves because RenderOverlay does not do it
+					RenderOverlay();
+					renderer.Present();
 				}
 
 				// Highlight if not the same
-				if(l != highlighted) Highlight(l);
+				if (l != highlighted) Highlight(l);
 
 				//mxd. Show tooltip?
 				if(General.Map.UDMF && General.Settings.RenderComments && mouselastpos != mousepos && highlighted != null && !highlighted.IsDisposed && highlighted.Fields.ContainsKey("comment"))
-- 
GitLab