mirror of
https://git.do.srb2.org/STJr/UltimateZoneBuilder.git
synced 2024-11-23 20:32:34 +00:00
7febb2434f
DECORATE: added "$obsolete" special comment. When present, it marks the thing as obsolete. It will be detected by "Check obsolete thing" Map Analysis Mode check and will be marked in the Thing Properties Window and the Thing Info panel. Map Analysis mode: added "Check obsolete things" check. Updated documentation ("DECORATE keys" page). Updated ZDoom_DECORATE.cfg.
239 lines
7.9 KiB
C#
239 lines
7.9 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.Globalization;
|
|
using System.Windows.Forms;
|
|
using CodeImp.DoomBuilder.Data;
|
|
using CodeImp.DoomBuilder.GZBuilder.Data;
|
|
using CodeImp.DoomBuilder.Map;
|
|
using CodeImp.DoomBuilder.Config;
|
|
using CodeImp.DoomBuilder.Types;
|
|
using CodeImp.DoomBuilder.GZBuilder; //mxd
|
|
using System.Collections.Generic;
|
|
|
|
#endregion
|
|
|
|
namespace CodeImp.DoomBuilder.Controls
|
|
{
|
|
internal partial class ThingInfoPanel : UserControl
|
|
{
|
|
private readonly int hexenformatwidth;
|
|
private readonly int doomformatwidth;
|
|
|
|
// Constructor
|
|
public ThingInfoPanel()
|
|
{
|
|
// Initialize
|
|
InitializeComponent();
|
|
|
|
// Hide stuff when in Doom format
|
|
hexenformatwidth = infopanel.Width;
|
|
doomformatwidth = infopanel.Width - 190;
|
|
}
|
|
|
|
// This shows the info
|
|
public void ShowInfo(Thing t)
|
|
{
|
|
string actioninfo;
|
|
string zinfo;
|
|
|
|
// Show/hide stuff depending on format
|
|
bool hasArgs = General.Map.FormatInterface.HasActionArgs;
|
|
arglbl1.Visible = hasArgs;
|
|
arglbl2.Visible = hasArgs;
|
|
arglbl3.Visible = hasArgs;
|
|
arglbl4.Visible = hasArgs;
|
|
arglbl5.Visible = hasArgs;
|
|
arg1.Visible = hasArgs;
|
|
arg2.Visible = hasArgs;
|
|
arg3.Visible = hasArgs;
|
|
arg4.Visible = hasArgs;
|
|
arg5.Visible = hasArgs;
|
|
infopanel.Width = (hasArgs ? hexenformatwidth : doomformatwidth);
|
|
|
|
//mxd
|
|
action.Visible = General.Map.FormatInterface.HasThingAction;
|
|
labelaction.Visible = General.Map.FormatInterface.HasThingAction;
|
|
|
|
// Move panel
|
|
spritepanel.Left = infopanel.Left + infopanel.Width + infopanel.Margin.Right + spritepanel.Margin.Left;
|
|
flagsPanel.Left = spritepanel.Left + spritepanel.Width + spritepanel.Margin.Right + flagsPanel.Margin.Left; //mxd
|
|
|
|
// Lookup thing info
|
|
ThingTypeInfo ti = General.Map.Data.GetThingInfo(t.Type);
|
|
|
|
// Get thing action information
|
|
LinedefActionInfo act;
|
|
if(General.Map.Config.LinedefActions.ContainsKey(t.Action)) act = General.Map.Config.LinedefActions[t.Action];
|
|
else if(t.Action == 0) act = new LinedefActionInfo(0, "None", true, false);
|
|
else act = new LinedefActionInfo(t.Action, "Unknown", false, false);
|
|
actioninfo = act.ToString();
|
|
|
|
// Determine z info to show
|
|
t.DetermineSector();
|
|
if(ti.AbsoluteZ || t.Sector == null)
|
|
{
|
|
zinfo = t.Position.z.ToString(CultureInfo.InvariantCulture) + " (abs.)"; //mxd
|
|
}
|
|
else
|
|
{
|
|
// Hangs from ceiling?
|
|
if(ti.Hangs)
|
|
zinfo = t.Position.z + " (" + ((float)Math.Round(Sector.GetCeilingPlane(t.Sector).GetZ(t.Position) - t.Position.z - ti.Height, General.Map.FormatInterface.VertexDecimals)).ToString(CultureInfo.InvariantCulture) + ")"; //mxd
|
|
else
|
|
zinfo = t.Position.z + " (" + ((float)Math.Round(Sector.GetFloorPlane(t.Sector).GetZ(t.Position) + t.Position.z, General.Map.FormatInterface.VertexDecimals)).ToString(CultureInfo.InvariantCulture) + ")"; //mxd
|
|
}
|
|
|
|
// Thing info
|
|
infopanel.Text = " Thing " + t.Index + " ";
|
|
type.Text = t.Type + " - " + ti.Title;
|
|
if(ti.IsObsolete) type.Text += " - OBSOLETE"; //mxd
|
|
action.Text = actioninfo;
|
|
bool displayclassname = !string.IsNullOrEmpty(ti.ClassName) && !ti.ClassName.StartsWith("$"); //mxd
|
|
labelclass.Enabled = displayclassname; //mxd
|
|
classname.Enabled = displayclassname; //mxd
|
|
classname.Text = (displayclassname ? ti.ClassName : "--"); //mxd
|
|
position.Text = t.Position.x.ToString(CultureInfo.InvariantCulture) + ", " + t.Position.y.ToString(CultureInfo.InvariantCulture) + ", " + zinfo;
|
|
tag.Text = t.Tag + (General.Map.Options.TagLabels.ContainsKey(t.Tag) ? " - " + General.Map.Options.TagLabels[t.Tag] : string.Empty);
|
|
angle.Text = t.AngleDoom + "\u00B0";
|
|
anglecontrol.Angle = t.AngleDoom;
|
|
anglecontrol.Left = angle.Right + 1;
|
|
|
|
// Sprite
|
|
if(ti.Sprite.ToLowerInvariant().StartsWith(DataManager.INTERNAL_PREFIX) && (ti.Sprite.Length > DataManager.INTERNAL_PREFIX.Length))
|
|
{
|
|
spritename.Text = "";
|
|
spritetex.Image = General.Map.Data.GetSpriteImage(ti.Sprite).GetBitmap();
|
|
}
|
|
else if((ti.Sprite.Length <= 8) && (ti.Sprite.Length > 0))
|
|
{
|
|
spritename.Text = ti.Sprite;
|
|
spritetex.Image = General.Map.Data.GetSpriteImage(ti.Sprite).GetPreview();
|
|
}
|
|
else
|
|
{
|
|
spritename.Text = "";
|
|
spritetex.Image = null;
|
|
}
|
|
|
|
// Arguments
|
|
ArgumentInfo[] arginfo = ((t.Action == 0 && ti.Args[0] != null) ? ti.Args : act.Args); //mxd
|
|
|
|
//mxd. ACS script argument names
|
|
bool isacsscript = (Array.IndexOf(GZGeneral.ACS_SPECIALS, t.Action) != -1);
|
|
bool isnamedacsscript = (isacsscript && General.Map.UDMF && t.Fields.ContainsKey("arg0str"));
|
|
string scriptname = (isnamedacsscript ? t.Fields.GetValue("arg0str", string.Empty) : string.Empty);
|
|
ScriptItem scriptitem = null;
|
|
|
|
// Named script?
|
|
if(isnamedacsscript && General.Map.NamedScripts.ContainsKey(scriptname.ToLowerInvariant()))
|
|
{
|
|
scriptitem = General.Map.NamedScripts[scriptname.ToLowerInvariant()];
|
|
}
|
|
// Script number?
|
|
else if(isacsscript && General.Map.NumberedScripts.ContainsKey(t.Args[0]))
|
|
{
|
|
scriptitem = General.Map.NumberedScripts[t.Args[0]];
|
|
scriptname = (scriptitem.HasCustomName ? scriptitem.Name : scriptitem.Index.ToString());
|
|
}
|
|
|
|
// Apply script args?
|
|
Label[] arglabels = new[] { arglbl1, arglbl2, arglbl3, arglbl4, arglbl5 };
|
|
Label[] args = new[] { arg1, arg2, arg3, arg4, arg5 };
|
|
|
|
if(scriptitem != null)
|
|
{
|
|
string[] argnames = scriptitem.GetArgumentsDescriptions(t.Action);
|
|
for(int i = 0; i < argnames.Length; i++)
|
|
{
|
|
if(!string.IsNullOrEmpty(argnames[i]))
|
|
{
|
|
arglabels[i].Text = argnames[i] + ":";
|
|
arglabels[i].Enabled = true;
|
|
args[i].Enabled = true;
|
|
}
|
|
else
|
|
{
|
|
arglabels[i].Text = arginfo[i].Title + ":";
|
|
arglabels[i].Enabled = arginfo[i].Used;
|
|
args[i].Enabled = arginfo[i].Used;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for(int i = 0; i < arginfo.Length; i++)
|
|
{
|
|
arglabels[i].Text = arginfo[i].Title + ":";
|
|
arglabels[i].Enabled = arginfo[i].Used;
|
|
args[i].Enabled = arginfo[i].Used;
|
|
}
|
|
}
|
|
|
|
//mxd. Set argument value and label
|
|
if(!string.IsNullOrEmpty(scriptname)) arg1.Text = scriptname;
|
|
else SetArgumentText(arginfo[0], arg1, t.Args[0]);
|
|
SetArgumentText(arginfo[1], arg2, t.Args[1]);
|
|
SetArgumentText(arginfo[2], arg3, t.Args[2]);
|
|
SetArgumentText(arginfo[3], arg4, t.Args[3]);
|
|
SetArgumentText(arginfo[4], arg5, t.Args[4]);
|
|
|
|
//mxd. Flags
|
|
flags.Items.Clear();
|
|
foreach(KeyValuePair<string, string> group in General.Map.Config.ThingFlags)
|
|
{
|
|
if(t.Flags.ContainsKey(group.Key) && t.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;
|
|
}
|
|
|
|
// Show the whole thing
|
|
this.Show();
|
|
this.Update();
|
|
}
|
|
|
|
//mxd
|
|
private static void SetArgumentText(ArgumentInfo info, Label label, int value)
|
|
{
|
|
TypeHandler th = General.Types.GetArgumentHandler(info);
|
|
th.SetValue(value);
|
|
label.Text = th.GetStringValue();
|
|
}
|
|
|
|
// When visible changed
|
|
protected override void OnVisibleChanged(EventArgs e)
|
|
{
|
|
// Hiding panels
|
|
if(!this.Visible)
|
|
{
|
|
spritetex.Image = null;
|
|
}
|
|
|
|
// Call base
|
|
base.OnVisibleChanged(e);
|
|
}
|
|
}
|
|
}
|