ZoneBuilder/Source/Core/Controls/SectorInfoPanel.cs
MaxED 6e5a0b61d0 Added, Edit Selection mode: Added "Adjust height" setting. It can be used to adjust floor/ceiling height of selected sectors based on the sector selection was in and the sector selection was moved into.
Removed "Adjust heights to match relatively with surrounding sector" option from Preferences -> Pasting, because sector height adjustments are now handled by Edit Selection mode.
Fixed, Sector info panel: in some cases 0 deg. floor/ceiling texture rotation was triggering texture offset/scale/rotation UI parts to be shown.
Fixed even more cases when sidedefs belonging to linedefs, which were moved on top of existing linedefs, were incorrectly reassigned when applying Edit Selection and Drag Geometry modes.
Fixed, Bridge mode: in some cases calculated floor/ceiling heights were not applied to the sectors created by the mode.
Changed, internal: changed program's CurrentCulture to InvariantCulture.
2023-01-04 23:07:04 +01:00

407 lines
12 KiB
C#

#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.Drawing;
using System.Globalization;
using System.Windows.Forms;
using CodeImp.DoomBuilder.Map;
using CodeImp.DoomBuilder.Data;
using CodeImp.DoomBuilder.Rendering;
using System.Collections.Generic;
#endregion
namespace CodeImp.DoomBuilder.Controls
{
internal partial class SectorInfoPanel : UserControl
{
private readonly List<Label> floorinfolabels;
private readonly List<Label> ceilinfolabels;
private readonly List<Label> floorlabels;
private readonly List<Label> ceillabels;
// Constructor
public SectorInfoPanel()
{
// Initialize
InitializeComponent();
//mxd
labelFloorTextureSize.BackColor = Color.FromArgb(128, labelFloorTextureSize.BackColor);
labelCeilTextureSize.BackColor = Color.FromArgb(128, labelCeilTextureSize.BackColor);
floorinfolabels = new List<Label> { floorAngle, floorLight, floorOffset, floorScale };
ceilinfolabels = new List<Label> { ceilingAngle, ceilingLight, ceilingOffset, ceilingScale };
floorlabels = new List<Label> { floorAngleLabel, floorLightLabel, floorOffsetLabel, floorScaleLabel };
ceillabels = new List<Label> { ceilingAngleLabel, ceilingLightLabel, ceilingOffsetLabel, ceilingScaleLabel };
}
// This shows the info
public void ShowInfo(Sector s, bool highlightceiling, bool highlightfloor)
{
int sheight = s.CeilHeight - s.FloorHeight;
// Lookup effect description in config
string effectinfo = s.Effect + " - " + General.Map.Config.GetSectorEffectInfo(s.Effect).Title; //mxd
// Sector info
sectorinfo.Text = " Sector " + s.Index + " (" + (s.Sidedefs == null ? "no" : s.Sidedefs.Count.ToString()) + " sidedefs)"; //mxd
effect.Text = effectinfo;
ceiling.Text = s.CeilHeight.ToString();
floor.Text = s.FloorHeight.ToString();
height.Text = sheight.ToString();
brightness.Text = s.Brightness.ToString();
floorname.Text = s.FloorTexture;
ceilingname.Text = s.CeilTexture;
//mxd. Set tags
if(s.Tags.Count > 1)
{
string[] tags = new string[s.Tags.Count];
for(int i = 0; i < s.Tags.Count; i++) tags[i] = s.Tags[i].ToString();
tag.Text = string.Join(", ", tags);
tag.Enabled = true;
taglabel.Enabled = true;
taglabel.Text = "Tags:";
}
else
{
tag.Text = s.Tag + (General.Map.Options.TagLabels.ContainsKey(s.Tag) ? " - " + General.Map.Options.TagLabels[s.Tag] : string.Empty);
tag.Enabled = (s.Tag != 0);
taglabel.Enabled = (s.Tag != 0);
taglabel.Text = "Tag:";
}
//mxd
effect.Enabled = (s.Effect != 0);
effectlabel.Enabled = (s.Effect != 0);
//mxd. Texture size
if(s.LongFloorTexture == MapSet.EmptyLongName)
{
labelFloorTextureSize.Visible = false;
General.DisplayZoomedImage(floortex, Properties.Resources.MissingTexture);
}
else
{
ImageData image = General.Map.Data.GetFlatImage(s.FloorTexture);
DisplayTextureSize(labelFloorTextureSize, image);
General.DisplayZoomedImage(floortex, image.GetPreview());
}
if(s.LongCeilTexture == MapSet.EmptyLongName)
{
labelCeilTextureSize.Visible = false;
General.DisplayZoomedImage(ceilingtex, Properties.Resources.MissingTexture);
}
else
{
ImageData image = General.Map.Data.GetFlatImage(s.CeilTexture);
DisplayTextureSize(labelCeilTextureSize, image); //mxd
General.DisplayZoomedImage(ceilingtex, image.GetPreview());
}
//mxd
bool showExtededFloorInfo = false;
bool showExtededCeilingInfo = false;
if(General.Map.UDMF)
{
if(s.Fields != null)
{
//sector colors
labelLight.Visible = true;
labelFade.Visible = true;
panelLightColor.Visible = true;
panelFadeColor.Visible = true;
if(s.Fields.ContainsKey("lightcolor"))
{
panelLightColor.BackColor = PixelColor.FromInt(s.Fields.GetValue("lightcolor", 0xFFFFFF)).WithAlpha(255).ToColor();
labelLight.Enabled = true;
}
else
{
panelLightColor.BackColor = SystemColors.Control;
labelLight.Enabled = false;
}
if(s.Fields.ContainsKey("fadecolor"))
{
panelFadeColor.BackColor = PixelColor.FromInt(s.Fields.GetValue("fadecolor", 0)).WithAlpha(255).ToColor();
labelFade.Enabled = true;
}
else
{
panelFadeColor.BackColor = SystemColors.Control;
labelFade.Enabled = false;
}
//light
if(s.Fields.ContainsKey("lightceiling") || s.Fields.ContainsKey("lightceilingabsolute"))
{
showExtededCeilingInfo = true;
ceilingLight.Enabled = true;
ceilingLightLabel.Enabled = true;
int cl = s.Fields.GetValue("lightceiling", 0);
if(s.Fields.GetValue("lightceilingabsolute", false))
ceilingLight.Text = cl + " (abs.)";
else
ceilingLight.Text = cl + " (" + Math.Min(255, Math.Max(0, (cl + s.Brightness))) + ")";
}
else
{
ceilingLight.Text = "--";
ceilingLight.Enabled = false;
ceilingLightLabel.Enabled = false;
}
if(s.Fields.ContainsKey("lightfloor") || s.Fields.ContainsKey("lightfloorabsolute"))
{
showExtededFloorInfo = true;
floorLight.Enabled = true;
floorLightLabel.Enabled = true;
int fl = s.Fields.GetValue("lightfloor", 0);
if(s.Fields.GetValue("lightfloorabsolute", false))
floorLight.Text = fl + " (abs.)";
else
floorLight.Text = fl + " (" + Math.Min(255, Math.Max(0, (fl + s.Brightness))) + ")";
}
else
{
floorLight.Text = "--";
floorLight.Enabled = false;
floorLightLabel.Enabled = false;
}
//ceiling offsets
float panX = s.Fields.GetValue("xpanningceiling", 0f);
float panY = s.Fields.GetValue("ypanningceiling", 0f);
if(panX != 0 || panY != 0)
{
showExtededCeilingInfo = true;
ceilingOffset.Enabled = true;
ceilingOffsetLabel.Enabled = true;
ceilingOffset.Text = panX.ToString(CultureInfo.InvariantCulture) + ", " + panY.ToString(CultureInfo.InvariantCulture);
}
else
{
ceilingOffset.Text = "--, --";
ceilingOffset.Enabled = false;
ceilingOffsetLabel.Enabled = false;
}
//floor offsets
panX = s.Fields.GetValue("xpanningfloor", 0f);
panY = s.Fields.GetValue("ypanningfloor", 0f);
if(panX != 0 || panY != 0)
{
showExtededFloorInfo = true;
floorOffset.Enabled = true;
floorOffsetLabel.Enabled = true;
floorOffset.Text = panX.ToString(CultureInfo.InvariantCulture) + ", " + panY.ToString(CultureInfo.InvariantCulture);
}
else
{
floorOffset.Text = "--, --";
floorOffset.Enabled = false;
floorOffsetLabel.Enabled = false;
}
//ceiling scale
float scaleX = s.Fields.GetValue("xscaleceiling", 1.0f);
float scaleY = s.Fields.GetValue("yscaleceiling", 1.0f);
if(scaleX != 1.0f || scaleY != 1.0f)
{
showExtededCeilingInfo = true;
ceilingScale.Enabled = true;
ceilingScaleLabel.Enabled = true;
ceilingScale.Text = scaleX.ToString(CultureInfo.InvariantCulture) + ", " + scaleY.ToString(CultureInfo.InvariantCulture);
}
else
{
ceilingScale.Text = "--, --";
ceilingScale.Enabled = false;
ceilingScaleLabel.Enabled = false;
}
//floor scale
scaleX = s.Fields.GetValue("xscalefloor", 1.0f);
scaleY = s.Fields.GetValue("yscalefloor", 1.0f);
if(scaleX != 1.0f || scaleY != 1.0f)
{
showExtededFloorInfo = true;
floorScale.Enabled = true;
floorScaleLabel.Enabled = true;
floorScale.Text = scaleX.ToString(CultureInfo.InvariantCulture) + ", " + scaleY.ToString(CultureInfo.InvariantCulture);
}
else
{
floorScale.Text = "--, --";
floorScale.Enabled = false;
floorScaleLabel.Enabled = false;
}
//rotation
float ceilangle = s.Fields.GetValue("rotationceiling", 0f);
if(ceilangle != 0f)
{
showExtededCeilingInfo = true;
ceilingAngle.Enabled = true;
ceilingAngleLabel.Enabled = true;
ceilingAngle.Text = ceilangle + "\u00B0";
}
else
{
ceilingAngle.Text = "--";
ceilingAngle.Enabled = false;
ceilingAngleLabel.Enabled = false;
}
float floorangle = s.Fields.GetValue("rotationfloor", 0f);
if(floorangle != 0f)
{
showExtededFloorInfo = true;
floorAngle.Enabled = true;
floorAngleLabel.Enabled = true;
floorAngle.Text = floorangle + "\u00B0";
}
else
{
floorAngle.Text = "--";
floorAngle.Enabled = false;
floorAngleLabel.Enabled = false;
}
}
//Flags
flags.Items.Clear();
foreach(KeyValuePair<string, string> group in General.Map.Config.SectorFlags)
{
if(s.Flags.ContainsKey(group.Key) && s.Flags[group.Key])
flags.Items.Add(new ListViewItem(group.Value) { Checked = true });
}
//mxd. Flags panel visibility and size
flagsPanel.Visible = (flags.Items.Count > 0);
if(flags.Items.Count > 0)
{
flags.Width = flags.GetItemRect(0).Width * (int)Math.Ceiling(flags.Items.Count / 4.0f);
flagsPanel.Width = flags.Width + flags.Left * 2;
}
//mxd. Toggle visibility
foreach(Label label in floorinfolabels) label.Visible = showExtededFloorInfo;
foreach(Label label in floorlabels) label.Visible = showExtededFloorInfo;
foreach(Label label in ceilinfolabels) label.Visible = showExtededCeilingInfo;
foreach(Label label in ceillabels) label.Visible = showExtededCeilingInfo;
}
else
{
panelFadeColor.Visible = false;
panelLightColor.Visible = false;
labelFade.Visible = false;
labelLight.Visible = false;
flagsPanel.Visible = false;
}
//mxd. Resize panels
UpdateTexturePanel(ceilingpanel, ceilingname, ceilinfolabels, ceilingtex, ceilingOffsetLabel.Location.X - 1, showExtededCeilingInfo);
UpdateTexturePanel(floorpanel, floorname, floorinfolabels, floortex, floorOffsetLabel.Location.X - 1, showExtededFloorInfo);
//mxd. Highlight ceiling or floor?
Color floorhighlightcolor = (highlightfloor ? SystemColors.HotTrack : SystemColors.WindowText);
Color ceilinghighlightcolor = (highlightceiling ? SystemColors.HotTrack : SystemColors.WindowText);
floorpanel.ForeColor = floorhighlightcolor;
floor.ForeColor = floorhighlightcolor;
labelfloor.ForeColor = floorhighlightcolor;
ceilingpanel.ForeColor = ceilinghighlightcolor;
ceiling.ForeColor = ceilinghighlightcolor;
labelceiling.ForeColor = ceilinghighlightcolor;
// Show the whole thing
this.Show();
this.Update();
}
//mxd
private static void UpdateTexturePanel(GroupBox panel, Label texturename, List<Label> proplabels, Panel image, int sizeref, bool extendedinfoshown)
{
//Reposition texture name label?
if(texturename.Width < image.Width + 2)
texturename.Location = new Point(image.Location.X + (image.Width - texturename.Width) / 2, texturename.Location.Y);
else
texturename.Location = new Point(image.Location.X - 1, texturename.Location.Y);
// Resize panel
if(!extendedinfoshown)
panel.Width = Math.Max(texturename.Right + image.Location.X - 1, sizeref);
else
panel.Width = Math.Max(texturename.Right, GetMaxRight(proplabels)) + image.Location.X;
}
//mxd
private static int GetMaxRight(IEnumerable<Label> labels)
{
int max = 0;
foreach(Label label in labels) if(label.Right > max) max = label.Right;
return max;
}
//mxd
private static void DisplayTextureSize(Label label, ImageData texture)
{
if(General.Settings.ShowTextureSizes && texture.ImageState == ImageLoadState.Ready
&& !string.IsNullOrEmpty(texture.Name) && !(texture is UnknownImage))
{
label.Visible = true;
label.Text = Math.Abs(texture.ScaledWidth) + "x" + Math.Abs(texture.ScaledHeight);
}
else
{
label.Visible = false;
}
}
// When visible changed
protected override void OnVisibleChanged(EventArgs e)
{
// Hiding panels
if(!this.Visible)
{
floortex.BackgroundImage = null;
ceilingtex.BackgroundImage = null;
}
// Call base
base.OnVisibleChanged(e);
}
}
}