From ce91d27ad28e4d311309038c19641c69b604550a Mon Sep 17 00:00:00 2001 From: MaxED Date: Mon, 26 Sep 2016 12:53:50 +0000 Subject: [PATCH] Added: guidelines color is now configurable. Added: guidelines can now be enabled in Draw Rectangle/Ellipse/Grid modes. Changed, Draw Lines mode: perpendicular guidelines are now drawn for horizontal/vertical lines. Updated, Draw Ellipse mode: the shape now always touches all sides of the bounding box. Updated ZDoom_ACS.cfg. Updated ZDoom_DECORATE.cfg. Updated ZDoom ACC. --- Build/Compilers/ZDoom/acc.exe | Bin 67072 -> 67072 bytes Build/Scripting/ZDoom_ACS.cfg | 4 +- Build/Scripting/ZDoom_DECORATE.cfg | 36 ++++- Source/Core/Rendering/ColorCollection.cs | 7 +- Source/Core/Windows/DelayedForm.cs | 3 + .../Core/Windows/PreferencesForm.Designer.cs | 65 +++----- Source/Core/Windows/PreferencesForm.cs | 2 + Source/Core/Windows/PreferencesForm.resx | 6 - .../ClassicModes/DrawEllipseMode.cs | 57 +++++++ .../ClassicModes/DrawGeometryMode.cs | 152 ++++++++++-------- .../BuilderModes/ClassicModes/DrawGridMode.cs | 25 ++- .../ClassicModes/DrawRectangleMode.cs | 49 ++++-- .../DrawEllipseOptionsPanel.Designer.cs | 18 ++- .../Interface/DrawEllipseOptionsPanel.cs | 10 ++ .../DrawGridOptionsPanel.Designer.cs | 16 +- .../Interface/DrawGridOptionsPanel.cs | 9 ++ .../DrawLineOptionsPanel.Designer.cs | 4 +- .../DrawRectangleOptionsPanel.Designer.cs | 40 +++-- .../Interface/DrawRectangleOptionsPanel.cs | 10 ++ 19 files changed, 358 insertions(+), 155 deletions(-) diff --git a/Build/Compilers/ZDoom/acc.exe b/Build/Compilers/ZDoom/acc.exe index a295df1d5995775c500cee526358f6410a266d00..c122f69bd00e657f32d1bbf84e1bd2ee95d0f51b 100644 GIT binary patch delta 25149 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 YSH_p0jeWJ~xzh@@;stex!XNto0g5tBb^rhX delta 25818 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 False - - False - - - False - False diff --git a/Source/Plugins/BuilderModes/ClassicModes/DrawEllipseMode.cs b/Source/Plugins/BuilderModes/ClassicModes/DrawEllipseMode.cs index 3a56a9d..583d6d9 100644 --- a/Source/Plugins/BuilderModes/ClassicModes/DrawEllipseMode.cs +++ b/Source/Plugins/BuilderModes/ClassicModes/DrawEllipseMode.cs @@ -67,9 +67,11 @@ namespace CodeImp.DoomBuilder.BuilderModes panel.Subdivisions = subdivisions; panel.OnValueChanged += OptionsPanelOnValueChanged; panel.OnContinuousDrawingChanged += OnContinuousDrawingChanged; + panel.OnShowGuidelinesChanged += OnShowGuidelinesChanged; // Needs to be set after adding the OnContinuousDrawingChanged event... panel.ContinuousDrawing = General.Settings.ReadPluginSetting("drawellipsemode.continuousdrawing", false); + panel.ShowGuidelines = General.Settings.ReadPluginSetting("drawellipsemode.showguidelines", false); } override protected void AddInterface() @@ -84,6 +86,7 @@ namespace CodeImp.DoomBuilder.BuilderModes General.Settings.WritePluginSetting("drawellipsemode.bevelwidth", bevelwidth); General.Settings.WritePluginSetting("drawellipsemode.angle", panel.Angle); General.Settings.WritePluginSetting("drawellipsemode.continuousdrawing", panel.ContinuousDrawing); + General.Settings.WritePluginSetting("drawellipsemode.showguidelines", panel.ShowGuidelines); // Remove the buttons panel.Unregister(); @@ -139,6 +142,60 @@ namespace CodeImp.DoomBuilder.BuilderModes // Add final point shape[subdivisions] = shape[0]; + + // Now fit it inside the bounding box + float minx = float.MaxValue; + float miny = float.MaxValue; + float maxx = float.MinValue; + float maxy = float.MinValue; + + // Calculate shape extents + foreach(Vector2D v in shape) + { + if(v.x < minx) minx = v.x; + if(v.x > maxx) maxx = v.x; + if(v.y < miny) miny = v.y; + if(v.y > maxy) maxy = v.y; + } + + // Calculate scalers + float scalerx = 1.0f; + float scalery = 1.0f; + + if(minx != pStart.x || maxx != pEnd.x) + scalerx = (pEnd.x - pStart.x) / (maxx - minx); + if(miny != pStart.y) + scalery = (pEnd.y - pStart.y) / (maxy - miny); + + // Apply scalers + if(scalerx != 1.0f || scalery != 1.0f) + { + for(int i = 0; i < shape.Length; i++) + { + shape[i].x = ((center.x - shape[i].x) * scalerx + center.x); + shape[i].y = ((center.y - shape[i].y) * scalery + center.y); + } + } + + // Calculate shape extents again... + minx = float.MaxValue; + miny = float.MaxValue; + foreach(Vector2D v in shape) + { + if(v.x < minx) minx = v.x; + if(v.y < miny) miny = v.y; + } + + // Calculate shape offset... + Vector2D offset = new Vector2D(); + if(minx != pStart.x) offset.x = pStart.x - minx; + if(miny != pStart.y) offset.y = pStart.y - miny; + + // Apply offset... + if(offset.x != 0.0f || offset.y != 0.0f) + for(int i = 0; i < shape.Length; i++) shape[i] += offset; + + // Done return shape; } diff --git a/Source/Plugins/BuilderModes/ClassicModes/DrawGeometryMode.cs b/Source/Plugins/BuilderModes/ClassicModes/DrawGeometryMode.cs index 6be918a..17e6321 100644 --- a/Source/Plugins/BuilderModes/ClassicModes/DrawGeometryMode.cs +++ b/Source/Plugins/BuilderModes/ClassicModes/DrawGeometryMode.cs @@ -65,7 +65,7 @@ namespace CodeImp.DoomBuilder.BuilderModes protected bool continuousdrawing; //mxd. Restart after finishing drawing? protected bool autoclosedrawing; //mxd. Finish drawing when new points and existing geometry form a closed shape protected bool drawingautoclosed; //mxd - private bool showguidelines; //mxd + protected bool showguidelines; //mxd //mxd. Map area bounds private Line2D top, bottom, left, right; @@ -177,69 +177,8 @@ namespace CodeImp.DoomBuilder.BuilderModes if(showguidelines) { Vector2D prevp = points[points.Count - 1].pos; - PixelColor c = General.Colors.InfoLine.WithAlpha(80); - if(curp.pos.x != prevp.x && curp.pos.y != prevp.y) - { - renderguidelabels = true; - - Vector2D tr = new Vector2D(Math.Max(curp.pos.x, prevp.x), Math.Max(curp.pos.y, prevp.y)); - Vector2D bl = new Vector2D(Math.Min(curp.pos.x, prevp.x), Math.Min(curp.pos.y, prevp.y)); - - // Create guidelines - Line3D[] lines = new Line3D[5]; - lines[0] = new Line3D(new Vector2D(tr.x, General.Map.Config.TopBoundary), new Vector2D(tr.x, General.Map.Config.BottomBoundary), c, false); - lines[1] = new Line3D(new Vector2D(bl.x, General.Map.Config.TopBoundary), new Vector2D(bl.x, General.Map.Config.BottomBoundary), c, false); - lines[2] = new Line3D(new Vector2D(General.Map.Config.LeftBoundary, tr.y), new Vector2D(General.Map.Config.RightBoundary, tr.y), c, false); - lines[3] = new Line3D(new Vector2D(General.Map.Config.LeftBoundary, bl.y), new Vector2D(General.Map.Config.RightBoundary, bl.y), c, false); - - // Create current line extent. Make sure v1 is to the left of v2 - Line2D current = (curp.pos.x < prevp.x ? new Line2D(curp.pos, prevp) : new Line2D(prevp, curp.pos)); - - Vector2D extentstart, extentend; - if(current.v1.y < current.v2.y) // Start is lower - { - // Start point can hit left or bottom boundaries - extentstart = Line2D.GetIntersectionPoint(left, current, false); - if(extentstart.y < General.Map.Config.BottomBoundary) extentstart = Line2D.GetIntersectionPoint(bottom, current, false); - - // End point can hit right or top boundaries - extentend = Line2D.GetIntersectionPoint(right, current, false); - if(extentend.y > General.Map.Config.TopBoundary) extentend = Line2D.GetIntersectionPoint(top, current, false); - } - else // Start is higher - { - // Start point can hit left or top boundaries - extentstart = Line2D.GetIntersectionPoint(left, current, false); - if(extentstart.y > General.Map.Config.TopBoundary) extentstart = Line2D.GetIntersectionPoint(top, current, false); - - // End point can hit right or bottom boundaries - extentend = Line2D.GetIntersectionPoint(right, current, false); - if(extentend.y < General.Map.Config.BottomBoundary) extentend = Line2D.GetIntersectionPoint(bottom, current, false); - } - - lines[4] = new Line3D(extentstart, extentend, c, false); - - // Render them - renderer.RenderArrows(lines); - - // Update horiz/vert length labels - guidelabels[0].Move(tr, new Vector2D(tr.x, bl.y)); - guidelabels[1].Move(new Vector2D(bl.x, tr.y), tr); - guidelabels[2].Move(new Vector2D(tr.x, bl.y), bl); - guidelabels[3].Move(bl, new Vector2D(bl.x, tr.y)); - } - // Render horizontal line - else if(curp.pos.x != prevp.x) - { - Line3D l = new Line3D(new Vector2D(General.Map.Config.LeftBoundary, curp.pos.y), new Vector2D(General.Map.Config.RightBoundary, curp.pos.y), c, false); - renderer.RenderArrows(new List{ l }); - } - // Render vertical line - else if(curp.pos.y != prevp.y) - { - Line3D l = new Line3D(new Vector2D(curp.pos.x, General.Map.Config.TopBoundary), new Vector2D(curp.pos.x, General.Map.Config.BottomBoundary), c, false); - renderer.RenderArrows(new List { l }); - } + renderguidelabels = (curp.pos.x != prevp.x && curp.pos.y != prevp.y); + RenderGuidelines(prevp, curp.pos, General.Colors.Guideline.WithAlpha(80)); } // Render lines @@ -294,6 +233,89 @@ namespace CodeImp.DoomBuilder.BuilderModes renderer.Present(); } + //mxd + protected void RenderGuidelines(Vector2D start, Vector2D end, PixelColor c) + { + if(end.x != start.x && end.y != start.y) + { + Vector2D tr = new Vector2D(Math.Max(end.x, start.x), Math.Max(end.y, start.y)); + Vector2D bl = new Vector2D(Math.Min(end.x, start.x), Math.Min(end.y, start.y)); + + // Create guidelines + Line3D[] lines = new Line3D[5]; + lines[0] = new Line3D(new Vector2D(tr.x, General.Map.Config.TopBoundary), new Vector2D(tr.x, General.Map.Config.BottomBoundary), c, false); + lines[1] = new Line3D(new Vector2D(bl.x, General.Map.Config.TopBoundary), new Vector2D(bl.x, General.Map.Config.BottomBoundary), c, false); + lines[2] = new Line3D(new Vector2D(General.Map.Config.LeftBoundary, tr.y), new Vector2D(General.Map.Config.RightBoundary, tr.y), c, false); + lines[3] = new Line3D(new Vector2D(General.Map.Config.LeftBoundary, bl.y), new Vector2D(General.Map.Config.RightBoundary, bl.y), c, false); + + // Create current line extent. Make sure v1 is to the left of v2 + Line2D current = (end.x < start.x ? new Line2D(end, start) : new Line2D(start, end)); + + Vector2D extentstart, extentend; + if(current.v1.y < current.v2.y) // Start is lower + { + // Start point can hit left or bottom boundaries + extentstart = Line2D.GetIntersectionPoint(left, current, false); + if(extentstart.y < General.Map.Config.BottomBoundary) + extentstart = Line2D.GetIntersectionPoint(bottom, current, false); + + // End point can hit right or top boundaries + extentend = Line2D.GetIntersectionPoint(right, current, false); + if(extentend.y > General.Map.Config.TopBoundary) + extentend = Line2D.GetIntersectionPoint(top, current, false); + } + else // Start is higher + { + // Start point can hit left or top boundaries + extentstart = Line2D.GetIntersectionPoint(left, current, false); + if(extentstart.y > General.Map.Config.TopBoundary) + extentstart = Line2D.GetIntersectionPoint(top, current, false); + + // End point can hit right or bottom boundaries + extentend = Line2D.GetIntersectionPoint(right, current, false); + if(extentend.y < General.Map.Config.BottomBoundary) + extentend = Line2D.GetIntersectionPoint(bottom, current, false); + } + + lines[4] = new Line3D(extentstart, extentend, c, false); + + // Render them + renderer.RenderArrows(lines); + + // Update horiz/vert length labels + if(guidelabels != null) + { + guidelabels[0].Move(tr, new Vector2D(tr.x, bl.y)); + guidelabels[1].Move(new Vector2D(bl.x, tr.y), tr); + guidelabels[2].Move(new Vector2D(tr.x, bl.y), bl); + guidelabels[3].Move(bl, new Vector2D(bl.x, tr.y)); + } + } + // Render horizontal line + 2 vertical guidelines + else if(end.x != start.x) + { + Line3D l = new Line3D(new Vector2D(General.Map.Config.LeftBoundary, end.y), new Vector2D(General.Map.Config.RightBoundary, end.y), c, false); + Line3D gs = new Line3D(new Vector2D(start.x, General.Map.Config.TopBoundary), new Vector2D(start.x, General.Map.Config.BottomBoundary), c, false); + Line3D ge = new Line3D(new Vector2D(end.x, General.Map.Config.TopBoundary), new Vector2D(end.x, General.Map.Config.BottomBoundary), c, false); + renderer.RenderArrows(new List { l, gs, ge }); + } + // Render vertical line + 2 horizontal guidelines + else if(end.y != start.y) + { + Line3D l = new Line3D(new Vector2D(end.x, General.Map.Config.TopBoundary), new Vector2D(end.x, General.Map.Config.BottomBoundary), c, false); + Line3D gs = new Line3D(new Vector2D(General.Map.Config.LeftBoundary, start.y), new Vector2D(General.Map.Config.RightBoundary, start.y), c, false); + Line3D ge = new Line3D(new Vector2D(General.Map.Config.LeftBoundary, end.y), new Vector2D(General.Map.Config.RightBoundary, end.y), c, false); + renderer.RenderArrows(new List {l, gs, ge}); + } + // Start and end match. Render a cross + else + { + Line3D gs = new Line3D(new Vector2D(General.Map.Config.LeftBoundary, start.y), new Vector2D(General.Map.Config.RightBoundary, start.y), c, false); + Line3D ge = new Line3D(new Vector2D(start.x, General.Map.Config.TopBoundary), new Vector2D(start.x, General.Map.Config.BottomBoundary), c, false); + renderer.RenderArrows(new List { gs, ge }); + } + } + //mxd private void RenderLinedefDirectionIndicator(Vector2D start, Vector2D end, PixelColor color) { @@ -891,7 +913,7 @@ namespace CodeImp.DoomBuilder.BuilderModes } //mxd - private void OnShowGuidelinesChanged(object value, EventArgs e) + protected void OnShowGuidelinesChanged(object value, EventArgs e) { showguidelines = (bool)value; General.Interface.RedrawDisplay(); diff --git a/Source/Plugins/BuilderModes/ClassicModes/DrawGridMode.cs b/Source/Plugins/BuilderModes/ClassicModes/DrawGridMode.cs index ddd3e94..9814431 100644 --- a/Source/Plugins/BuilderModes/ClassicModes/DrawGridMode.cs +++ b/Source/Plugins/BuilderModes/ClassicModes/DrawGridMode.cs @@ -227,6 +227,10 @@ namespace CodeImp.DoomBuilder.BuilderModes UpdateReferencePoints(points[0], curp); List shapes = GetShapes(start, end); + // Render guidelines + if(showguidelines) + RenderGuidelines(start, end, General.Colors.Guideline.WithAlpha(80)); + //render shape foreach(Vector2D[] shape in shapes) { @@ -242,11 +246,21 @@ namespace CodeImp.DoomBuilder.BuilderModes } //and labels - Vector2D[] labelCoords = new[] { start, new Vector2D(end.x, start.y), end, new Vector2D(start.x, end.y), start }; - for(int i = 1; i < 5; i++) + if(width == 0 || height == 0) { - labels[i - 1].Move(labelCoords[i], labelCoords[i - 1]); - renderer.RenderText(labels[i - 1].TextLabel); + // Render label for line + labels[0].Move(start, end); + renderer.RenderText(labels[0].TextLabel); + } + else + { + // Render labels for grid + Vector2D[] labelCoords = { start, new Vector2D(end.x, start.y), end, new Vector2D(start.x, end.y), start }; + for(int i = 1; i < 5; i++) + { + labels[i - 1].Move(labelCoords[i], labelCoords[i - 1]); + renderer.RenderText(labels[i - 1].TextLabel); + } } //render hint @@ -511,9 +525,11 @@ namespace CodeImp.DoomBuilder.BuilderModes panel.OnValueChanged += OptionsPanelOnValueChanged; panel.OnGridLockModeChanged += OptionsPanelOnGridLockChanged; panel.OnContinuousDrawingChanged += OnContinuousDrawingChanged; + panel.OnShowGuidelinesChanged += OnShowGuidelinesChanged; // Needs to be set after adding the OnContinuousDrawingChanged event... panel.ContinuousDrawing = General.Settings.ReadPluginSetting("drawgridmode.continuousdrawing", false); + panel.ShowGuidelines = General.Settings.ReadPluginSetting("drawgridmode.showguidelines", false); } protected override void AddInterface() @@ -534,6 +550,7 @@ namespace CodeImp.DoomBuilder.BuilderModes General.Settings.WritePluginSetting("drawgridmode.horizontalinterpolation", (int)horizontalinterpolation); General.Settings.WritePluginSetting("drawgridmode.verticalinterpolation", (int)verticalinterpolation); General.Settings.WritePluginSetting("drawgridmode.continuousdrawing", panel.ContinuousDrawing); + General.Settings.WritePluginSetting("drawgridmode.showguidelines", panel.ShowGuidelines); // Remove docker General.Interface.RemoveDocker(docker); diff --git a/Source/Plugins/BuilderModes/ClassicModes/DrawRectangleMode.cs b/Source/Plugins/BuilderModes/ClassicModes/DrawRectangleMode.cs index 37f6512..0fa25ff 100644 --- a/Source/Plugins/BuilderModes/ClassicModes/DrawRectangleMode.cs +++ b/Source/Plugins/BuilderModes/ClassicModes/DrawRectangleMode.cs @@ -98,9 +98,11 @@ namespace CodeImp.DoomBuilder.BuilderModes panel.Subdivisions = subdivisions; panel.OnValueChanged += OptionsPanelOnValueChanged; panel.OnContinuousDrawingChanged += OnContinuousDrawingChanged; + panel.OnShowGuidelinesChanged += OnShowGuidelinesChanged; // Needs to be set after adding the OnContinuousDrawingChanged event... panel.ContinuousDrawing = General.Settings.ReadPluginSetting("drawrectanglemode.continuousdrawing", false); + panel.ShowGuidelines = General.Settings.ReadPluginSetting("drawrectanglemode.showguidelines", false); } protected override void AddInterface() @@ -114,6 +116,7 @@ namespace CodeImp.DoomBuilder.BuilderModes General.Settings.WritePluginSetting("drawrectanglemode.subdivisions", subdivisions); General.Settings.WritePluginSetting("drawrectanglemode.bevelwidth", bevelwidth); General.Settings.WritePluginSetting("drawrectanglemode.continuousdrawing", panel.ContinuousDrawing); + General.Settings.WritePluginSetting("drawrectanglemode.showguidelines", panel.ShowGuidelines); // Remove the buttons panel.Unregister(); @@ -145,6 +148,10 @@ namespace CodeImp.DoomBuilder.BuilderModes UpdateReferencePoints(points[0], curp); Vector2D[] shape = GetShape(start, end); + // Render guidelines + if(showguidelines) + RenderGuidelines(start, end, General.Colors.Guideline.WithAlpha(80)); + //render shape for(int i = 1; i < shape.Length; i++) renderer.RenderLine(shape[i - 1], shape[i], LINE_THICKNESS, color, true); @@ -154,27 +161,37 @@ namespace CodeImp.DoomBuilder.BuilderModes renderer.RenderRectangleFilled(new RectangleF(shape[i].x - vsize, shape[i].y - vsize, vsize * 2.0f, vsize * 2.0f), color, true); //and labels - Vector2D[] labelCoords = new[] { start, new Vector2D(end.x, start.y), end, new Vector2D(start.x, end.y), start }; - for(int i = 1; i < 5; i++) + if(shape.Length == 2) { - labels[i - 1].Move(labelCoords[i], labelCoords[i - 1]); - renderer.RenderText(labels[i - 1].TextLabel); + // Render label for line + labels[0].Move(start, end); + renderer.RenderText(labels[0].TextLabel); } - - //got beveled corners? - if(alwaysrendershapehints || shape.Length > minpointscount + 1) + else if(shape.Length > 3) { - //render hint - if(width > 64 * vsize && height > 16 * vsize) + // Render labels for rectangle + Vector2D[] labelCoords = { start, new Vector2D(end.x, start.y), end, new Vector2D(start.x, end.y), start }; + for(int i = 1; i < 5; i++) { - hintlabel.Move(start, end); - hintlabel.Text = GetHintText(); - renderer.RenderText(hintlabel.TextLabel); + labels[i - 1].Move(labelCoords[i], labelCoords[i - 1]); + renderer.RenderText(labels[i - 1].TextLabel); + } + + //got beveled corners? + if(alwaysrendershapehints || shape.Length > minpointscount + 1) + { + //render hint + if(width > 64 * vsize && height > 16 * vsize) + { + hintlabel.Move(start, end); + hintlabel.Text = GetHintText(); + renderer.RenderText(hintlabel.TextLabel); + } + + //and shape corners + for(int i = 0; i < 4; i++) + renderer.RenderRectangleFilled(new RectangleF(labelCoords[i].x - vsize, labelCoords[i].y - vsize, vsize * 2.0f, vsize * 2.0f), General.Colors.InfoLine, true); } - - //and shape corners - for(int i = 0; i < 4; i++) - renderer.RenderRectangleFilled(new RectangleF(labelCoords[i].x - vsize, labelCoords[i].y - vsize, vsize * 2.0f, vsize * 2.0f), General.Colors.InfoLine, true); } } else diff --git a/Source/Plugins/BuilderModes/Interface/DrawEllipseOptionsPanel.Designer.cs b/Source/Plugins/BuilderModes/Interface/DrawEllipseOptionsPanel.Designer.cs index b95825f..24f3128 100644 --- a/Source/Plugins/BuilderModes/Interface/DrawEllipseOptionsPanel.Designer.cs +++ b/Source/Plugins/BuilderModes/Interface/DrawEllipseOptionsPanel.Designer.cs @@ -38,6 +38,7 @@ this.anglelabel = new System.Windows.Forms.ToolStripLabel(); this.angle = new CodeImp.DoomBuilder.Controls.ToolStripNumericUpDown(); this.reset = new System.Windows.Forms.ToolStripButton(); + this.showguidelines = new System.Windows.Forms.ToolStripButton(); this.toolStrip1.SuspendLayout(); this.SuspendLayout(); // @@ -45,6 +46,7 @@ // this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.continuousdrawing, + this.showguidelines, this.toolStripSeparator1, this.subdivslabel, this.subdivs, @@ -55,7 +57,7 @@ this.reset}); this.toolStrip1.Location = new System.Drawing.Point(0, 0); this.toolStrip1.Name = "toolStrip1"; - this.toolStrip1.Size = new System.Drawing.Size(582, 25); + this.toolStrip1.Size = new System.Drawing.Size(646, 25); this.toolStrip1.TabIndex = 6; this.toolStrip1.Text = "toolStrip1"; // @@ -171,13 +173,24 @@ this.reset.Text = "Reset"; this.reset.Click += new System.EventHandler(this.reset_Click); // + // showguidelines + // + this.showguidelines.CheckOnClick = true; + this.showguidelines.Image = global::CodeImp.DoomBuilder.BuilderModes.Properties.Resources.Guidelines; + this.showguidelines.ImageTransparentColor = System.Drawing.Color.Magenta; + this.showguidelines.Margin = new System.Windows.Forms.Padding(2, 1, 0, 2); + this.showguidelines.Name = "showguidelines"; + this.showguidelines.Size = new System.Drawing.Size(82, 22); + this.showguidelines.Text = "Guidelines"; + this.showguidelines.CheckedChanged += new System.EventHandler(this.showguidelines_CheckedChanged); + // // DrawEllipseOptionsPanel // this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; this.Controls.Add(this.toolStrip1); this.Name = "DrawEllipseOptionsPanel"; - this.Size = new System.Drawing.Size(582, 60); + this.Size = new System.Drawing.Size(646, 60); this.toolStrip1.ResumeLayout(false); this.toolStrip1.PerformLayout(); this.ResumeLayout(false); @@ -197,5 +210,6 @@ private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; private System.Windows.Forms.ToolStripLabel anglelabel; private CodeImp.DoomBuilder.Controls.ToolStripNumericUpDown angle; + private System.Windows.Forms.ToolStripButton showguidelines; } } diff --git a/Source/Plugins/BuilderModes/Interface/DrawEllipseOptionsPanel.cs b/Source/Plugins/BuilderModes/Interface/DrawEllipseOptionsPanel.cs index eee4b7e..ae9c75c 100644 --- a/Source/Plugins/BuilderModes/Interface/DrawEllipseOptionsPanel.cs +++ b/Source/Plugins/BuilderModes/Interface/DrawEllipseOptionsPanel.cs @@ -7,6 +7,8 @@ namespace CodeImp.DoomBuilder.BuilderModes { public event EventHandler OnValueChanged; public event EventHandler OnContinuousDrawingChanged; + public event EventHandler OnShowGuidelinesChanged; + private bool blockevents; public int Spikiness { get { return (int)spikiness.Value; } set { blockevents = true; spikiness.Value = value; blockevents = false; } } @@ -17,6 +19,7 @@ namespace CodeImp.DoomBuilder.BuilderModes public int MaxSpikiness { get { return (int)spikiness.Maximum; } set { spikiness.Maximum = value; } } public int MinSpikiness { get { return (int)spikiness.Minimum; } set { spikiness.Minimum = value; } } public bool ContinuousDrawing { get { return continuousdrawing.Checked; } set { continuousdrawing.Checked = value; } } + public bool ShowGuidelines { get { return showguidelines.Checked; } set { showguidelines.Checked = value; } } public DrawEllipseOptionsPanel() { @@ -30,6 +33,7 @@ namespace CodeImp.DoomBuilder.BuilderModes angle.ValueChanged += ValueChanged; General.Interface.AddButton(continuousdrawing); + General.Interface.AddButton(showguidelines); General.Interface.AddButton(toolStripSeparator1); General.Interface.AddButton(subdivslabel); General.Interface.AddButton(subdivs); @@ -50,6 +54,7 @@ namespace CodeImp.DoomBuilder.BuilderModes General.Interface.RemoveButton(subdivs); General.Interface.RemoveButton(subdivslabel); General.Interface.RemoveButton(toolStripSeparator1); + General.Interface.RemoveButton(showguidelines); General.Interface.RemoveButton(continuousdrawing); } @@ -75,5 +80,10 @@ namespace CodeImp.DoomBuilder.BuilderModes { if(OnContinuousDrawingChanged != null) OnContinuousDrawingChanged(continuousdrawing.Checked, EventArgs.Empty); } + + private void showguidelines_CheckedChanged(object sender, EventArgs e) + { + if(OnShowGuidelinesChanged != null) OnShowGuidelinesChanged(showguidelines.Checked, EventArgs.Empty); + } } } diff --git a/Source/Plugins/BuilderModes/Interface/DrawGridOptionsPanel.Designer.cs b/Source/Plugins/BuilderModes/Interface/DrawGridOptionsPanel.Designer.cs index ad2e5fd..4e7a0c0 100644 --- a/Source/Plugins/BuilderModes/Interface/DrawGridOptionsPanel.Designer.cs +++ b/Source/Plugins/BuilderModes/Interface/DrawGridOptionsPanel.Designer.cs @@ -43,6 +43,7 @@ this.label3 = new System.Windows.Forms.Label(); this.label4 = new System.Windows.Forms.Label(); this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.showguidelines = new System.Windows.Forms.CheckBox(); this.continuousdrawing = new System.Windows.Forms.CheckBox(); this.groupBox1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.slicesV)).BeginInit(); @@ -214,14 +215,26 @@ // this.groupBox3.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); + this.groupBox3.Controls.Add(this.showguidelines); this.groupBox3.Controls.Add(this.continuousdrawing); this.groupBox3.Location = new System.Drawing.Point(3, 225); this.groupBox3.Name = "groupBox3"; - this.groupBox3.Size = new System.Drawing.Size(200, 55); + this.groupBox3.Size = new System.Drawing.Size(200, 71); this.groupBox3.TabIndex = 11; this.groupBox3.TabStop = false; this.groupBox3.Text = "Additional options"; // + // showguidelines + // + this.showguidelines.AutoSize = true; + this.showguidelines.Location = new System.Drawing.Point(20, 47); + this.showguidelines.Name = "showguidelines"; + this.showguidelines.Size = new System.Drawing.Size(75, 17); + this.showguidelines.TabIndex = 16; + this.showguidelines.Text = "Guidelines"; + this.showguidelines.UseVisualStyleBackColor = true; + this.showguidelines.CheckedChanged += new System.EventHandler(this.showguidelines_CheckedChanged); + // // continuousdrawing // this.continuousdrawing.AutoSize = true; @@ -272,5 +285,6 @@ private System.Windows.Forms.CheckBox continuousdrawing; private System.Windows.Forms.ComboBox gridlockmode; private System.Windows.Forms.Label label5; + private System.Windows.Forms.CheckBox showguidelines; } } diff --git a/Source/Plugins/BuilderModes/Interface/DrawGridOptionsPanel.cs b/Source/Plugins/BuilderModes/Interface/DrawGridOptionsPanel.cs index f9476fc..7b838bd 100644 --- a/Source/Plugins/BuilderModes/Interface/DrawGridOptionsPanel.cs +++ b/Source/Plugins/BuilderModes/Interface/DrawGridOptionsPanel.cs @@ -10,6 +10,8 @@ namespace CodeImp.DoomBuilder.BuilderModes public event EventHandler OnValueChanged; public event EventHandler OnGridLockModeChanged; public event EventHandler OnContinuousDrawingChanged; + public event EventHandler OnShowGuidelinesChanged; + private bool blockevents; public bool Triangulate { get { return triangulate.Checked; } set { blockevents = true; triangulate.Checked = value; blockevents = false; } } @@ -19,6 +21,8 @@ namespace CodeImp.DoomBuilder.BuilderModes public int VerticalSlices { get { return (int)slicesV.Value; } set { blockevents = true; slicesV.Value = value; blockevents = false; } } public int MaxVerticalSlices { get { return (int)slicesV.Maximum; } set { slicesV.Maximum = value; } } public bool ContinuousDrawing { get { return continuousdrawing.Checked; } set { continuousdrawing.Checked = value; } } + public bool ShowGuidelines { get { return showguidelines.Checked; } set { showguidelines.Checked = value; } } + public InterpolationMode HorizontalInterpolationMode { get @@ -89,5 +93,10 @@ namespace CodeImp.DoomBuilder.BuilderModes { if(OnContinuousDrawingChanged != null) OnContinuousDrawingChanged(continuousdrawing.Checked, EventArgs.Empty); } + + private void showguidelines_CheckedChanged(object sender, EventArgs e) + { + if(OnShowGuidelinesChanged != null) OnShowGuidelinesChanged(showguidelines.Checked, EventArgs.Empty); + } } } diff --git a/Source/Plugins/BuilderModes/Interface/DrawLineOptionsPanel.Designer.cs b/Source/Plugins/BuilderModes/Interface/DrawLineOptionsPanel.Designer.cs index f441e34..1ba2a40 100644 --- a/Source/Plugins/BuilderModes/Interface/DrawLineOptionsPanel.Designer.cs +++ b/Source/Plugins/BuilderModes/Interface/DrawLineOptionsPanel.Designer.cs @@ -75,8 +75,8 @@ this.showguidelines.ImageTransparentColor = System.Drawing.Color.Magenta; this.showguidelines.Margin = new System.Windows.Forms.Padding(2, 1, 0, 2); this.showguidelines.Name = "showguidelines"; - this.showguidelines.Size = new System.Drawing.Size(113, 22); - this.showguidelines.Text = "Show guidelines"; + this.showguidelines.Size = new System.Drawing.Size(82, 22); + this.showguidelines.Text = "Guidelines"; this.showguidelines.CheckedChanged += new System.EventHandler(this.showguidelines_CheckedChanged); // // DrawLineOptionsPanel diff --git a/Source/Plugins/BuilderModes/Interface/DrawRectangleOptionsPanel.Designer.cs b/Source/Plugins/BuilderModes/Interface/DrawRectangleOptionsPanel.Designer.cs index 9cf045d..098b70b 100644 --- a/Source/Plugins/BuilderModes/Interface/DrawRectangleOptionsPanel.Designer.cs +++ b/Source/Plugins/BuilderModes/Interface/DrawRectangleOptionsPanel.Designer.cs @@ -29,12 +29,13 @@ private void InitializeComponent() { this.toolStrip1 = new System.Windows.Forms.ToolStrip(); + this.continuousdrawing = new System.Windows.Forms.ToolStripButton(); + this.showguidelines = new System.Windows.Forms.ToolStripButton(); this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); this.radiuslabel = new System.Windows.Forms.ToolStripLabel(); this.radius = new CodeImp.DoomBuilder.Controls.ToolStripNumericUpDown(); this.subdivslabel = new System.Windows.Forms.ToolStripLabel(); this.subdivs = new CodeImp.DoomBuilder.Controls.ToolStripNumericUpDown(); - this.continuousdrawing = new System.Windows.Forms.ToolStripButton(); this.reset = new System.Windows.Forms.ToolStripButton(); this.toolStrip1.SuspendLayout(); this.SuspendLayout(); @@ -43,6 +44,7 @@ // this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.continuousdrawing, + this.showguidelines, this.toolStripSeparator1, this.radiuslabel, this.radius, @@ -51,10 +53,31 @@ this.reset}); this.toolStrip1.Location = new System.Drawing.Point(0, 0); this.toolStrip1.Name = "toolStrip1"; - this.toolStrip1.Size = new System.Drawing.Size(488, 25); + this.toolStrip1.Size = new System.Drawing.Size(750, 25); this.toolStrip1.TabIndex = 7; this.toolStrip1.Text = "toolStrip1"; // + // continuousdrawing + // + this.continuousdrawing.CheckOnClick = true; + this.continuousdrawing.Image = global::CodeImp.DoomBuilder.BuilderModes.Properties.Resources.Repeat; + this.continuousdrawing.ImageTransparentColor = System.Drawing.Color.Magenta; + this.continuousdrawing.Name = "continuousdrawing"; + this.continuousdrawing.Size = new System.Drawing.Size(135, 22); + this.continuousdrawing.Text = "Continuous drawing"; + this.continuousdrawing.CheckedChanged += new System.EventHandler(this.continuousdrawing_CheckedChanged); + // + // showguidelines + // + this.showguidelines.CheckOnClick = true; + this.showguidelines.Image = global::CodeImp.DoomBuilder.BuilderModes.Properties.Resources.Guidelines; + this.showguidelines.ImageTransparentColor = System.Drawing.Color.Magenta; + this.showguidelines.Margin = new System.Windows.Forms.Padding(2, 1, 0, 2); + this.showguidelines.Name = "showguidelines"; + this.showguidelines.Size = new System.Drawing.Size(82, 22); + this.showguidelines.Text = "Guidelines"; + this.showguidelines.CheckedChanged += new System.EventHandler(this.showguidelines_CheckedChanged); + // // toolStripSeparator1 // this.toolStripSeparator1.Name = "toolStripSeparator1"; @@ -117,16 +140,6 @@ 0, 0, 0}); - // - // continuousdrawing - // - this.continuousdrawing.CheckOnClick = true; - this.continuousdrawing.Image = global::CodeImp.DoomBuilder.BuilderModes.Properties.Resources.Repeat; - this.continuousdrawing.ImageTransparentColor = System.Drawing.Color.Magenta; - this.continuousdrawing.Name = "continuousdrawing"; - this.continuousdrawing.Size = new System.Drawing.Size(135, 22); - this.continuousdrawing.Text = "Continuous drawing"; - this.continuousdrawing.CheckedChanged += new System.EventHandler(this.continuousdrawing_CheckedChanged); // // reset // @@ -144,7 +157,7 @@ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; this.Controls.Add(this.toolStrip1); this.Name = "DrawRectangleOptionsPanel"; - this.Size = new System.Drawing.Size(488, 60); + this.Size = new System.Drawing.Size(750, 60); this.toolStrip1.ResumeLayout(false); this.toolStrip1.PerformLayout(); this.ResumeLayout(false); @@ -162,5 +175,6 @@ private System.Windows.Forms.ToolStripButton reset; private System.Windows.Forms.ToolStripButton continuousdrawing; private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripButton showguidelines; } } diff --git a/Source/Plugins/BuilderModes/Interface/DrawRectangleOptionsPanel.cs b/Source/Plugins/BuilderModes/Interface/DrawRectangleOptionsPanel.cs index bb4f638..a2f2c55 100644 --- a/Source/Plugins/BuilderModes/Interface/DrawRectangleOptionsPanel.cs +++ b/Source/Plugins/BuilderModes/Interface/DrawRectangleOptionsPanel.cs @@ -7,6 +7,8 @@ namespace CodeImp.DoomBuilder.BuilderModes { public event EventHandler OnValueChanged; public event EventHandler OnContinuousDrawingChanged; + public event EventHandler OnShowGuidelinesChanged; + private bool blockevents; public int BevelWidth { get { return (int)radius.Value; } set { blockevents = true; radius.Value = value; blockevents = false; } } @@ -16,6 +18,7 @@ namespace CodeImp.DoomBuilder.BuilderModes public int MaxSubdivisions { get { return (int)subdivs.Maximum; } set { subdivs.Maximum = value; } } public int MinSubdivisions { get { return (int)subdivs.Minimum; } set { subdivs.Minimum = value; } } public bool ContinuousDrawing { get { return continuousdrawing.Checked; } set { continuousdrawing.Checked = value; } } + public bool ShowGuidelines { get { return showguidelines.Checked; } set { showguidelines.Checked = value; } } public DrawRectangleOptionsPanel() { @@ -28,6 +31,7 @@ namespace CodeImp.DoomBuilder.BuilderModes subdivs.ValueChanged += ValueChanged; General.Interface.AddButton(continuousdrawing); + General.Interface.AddButton(showguidelines); General.Interface.AddButton(toolStripSeparator1); General.Interface.AddButton(radiuslabel); General.Interface.AddButton(radius); @@ -44,6 +48,7 @@ namespace CodeImp.DoomBuilder.BuilderModes General.Interface.RemoveButton(radius); General.Interface.RemoveButton(radiuslabel); General.Interface.RemoveButton(toolStripSeparator1); + General.Interface.RemoveButton(showguidelines); General.Interface.RemoveButton(continuousdrawing); } @@ -68,5 +73,10 @@ namespace CodeImp.DoomBuilder.BuilderModes { if(OnContinuousDrawingChanged != null) OnContinuousDrawingChanged(continuousdrawing.Checked, EventArgs.Empty); } + + private void showguidelines_CheckedChanged(object sender, EventArgs e) + { + if(OnShowGuidelinesChanged != null) OnShowGuidelinesChanged(showguidelines.Checked, EventArgs.Empty); + } } }