diff --git a/Build/Scripting/ZDoom_DECORATE.cfg b/Build/Scripting/ZDoom_DECORATE.cfg
index 644afae1..bdc1a7cb 100644
--- a/Build/Scripting/ZDoom_DECORATE.cfg
+++ b/Build/Scripting/ZDoom_DECORATE.cfg
@@ -252,6 +252,7 @@ keywords
A_SetScale = "A_SetScale(float scaleX[, float scaleY = scaleX[, int pointer = AAPTR_DEFAULT[, bool usezero = false]]])";
A_SetShadow = "A_SetShadow";
A_SetShootable = "A_SetShootable";
+ A_SetSize = "bool A_SetSize(float newradius[, float newheight = -1[, bool testpos = false]])";
A_SetSolid = "A_SetSolid";
A_SetSpecial = "A_SetSpecial(int special, int arg0, int arg1, int arg2, int arg3, int arg4)";
A_SetSpecies = "A_SetSpecies(str species[, int pointer = AAPTR_DEFAULT])";
diff --git a/Help/gc_decoratekeys.html b/Help/gc_decoratekeys.html
index 9d614025..184b8b34 100644
--- a/Help/gc_decoratekeys.html
+++ b/Help/gc_decoratekeys.html
@@ -65,7 +65,6 @@
"Circle". The argument value is used as circle radius.
Rendering shapes can be toggled using "Toggle Event Lines" action/menu button.
- Currently rendering shapes are shown only in Classic modes.
This property must be used in conjunction with the "//$ArgN" property.
//$ArgNRenderColor <integer> - GZDB only.
diff --git a/Source/Core/Builder.csproj b/Source/Core/Builder.csproj
index b88a6471..fdc247c6 100644
--- a/Source/Core/Builder.csproj
+++ b/Source/Core/Builder.csproj
@@ -715,12 +715,19 @@
+
+
+ Component
+
UserControl
FindUsagesControl.cs
+
+ Component
+
@@ -1206,6 +1213,8 @@
+
+
diff --git a/Source/Core/Config/IFilledTextureSet.cs b/Source/Core/Config/IFilledTextureSet.cs
index 2c1c6353..bf9453f4 100644
--- a/Source/Core/Config/IFilledTextureSet.cs
+++ b/Source/Core/Config/IFilledTextureSet.cs
@@ -27,7 +27,6 @@ namespace CodeImp.DoomBuilder.Config
{
// Properties
string Name { get; }
- int Level { get; } //mxd
ICollection Textures { get; }
ICollection Flats { get; }
}
diff --git a/Source/Core/Config/ProgramConfiguration.cs b/Source/Core/Config/ProgramConfiguration.cs
index 8cecfb91..0493be73 100644
--- a/Source/Core/Config/ProgramConfiguration.cs
+++ b/Source/Core/Config/ProgramConfiguration.cs
@@ -44,7 +44,6 @@ namespace CodeImp.DoomBuilder.Config
// Cached variables
private bool blackbrowsers;
- private bool capitalizetexturenames; //mxd
private int visualfov;
private float visualmousesensx;
private float visualmousesensy;
@@ -65,7 +64,6 @@ namespace CodeImp.DoomBuilder.Config
private float viewdistance;
private bool invertyaxis;
private string screenshotspath; //mxd
- private int previewimagesize;
private int autoscrollspeed;
private int zoomfactor;
private bool showerrorswindow;
@@ -88,7 +86,6 @@ namespace CodeImp.DoomBuilder.Config
private int antialiasingsamples; //mxd
private bool showtexturesizes;
private bool locatetexturegroup; //mxd
- private bool keeptexturefilterfocused; //mxd
private SplitLineBehavior splitlinebehavior; //mxd
private MergeGeometryMode mergegeomode; //mxd
private bool splitjoinedsectors; //mxd
@@ -156,7 +153,6 @@ namespace CodeImp.DoomBuilder.Config
internal Configuration Config { get { return cfg; } }
public bool BlackBrowsers { get { return blackbrowsers; } internal set { blackbrowsers = value; } }
- public bool CapitalizeTextureNames { get { return capitalizetexturenames; } internal set { capitalizetexturenames = value; } } //mxd
public int VisualFOV { get { return visualfov; } internal set { visualfov = value; } }
public int ImageBrightness { get { return imagebrightness; } internal set { imagebrightness = value; } }
public float DoubleSidedAlpha { get { return doublesidedalpha; } internal set { doublesidedalpha = value; doublesidedalphabyte = (byte)(doublesidedalpha * 255f); } }
@@ -176,7 +172,6 @@ namespace CodeImp.DoomBuilder.Config
public int MoveSpeed { get { return movespeed; } internal set { movespeed = value; } }
public float ViewDistance { get { return viewdistance; } internal set { viewdistance = value; } }
public bool InvertYAxis { get { return invertyaxis; } internal set { invertyaxis = value; } }
- public int PreviewImageSize { get { return previewimagesize; } internal set { previewimagesize = value; } }
public int AutoScrollSpeed { get { return autoscrollspeed; } internal set { autoscrollspeed = value; } }
public int ZoomFactor { get { return zoomfactor; } internal set { zoomfactor = value; } }
public bool ShowErrorsWindow { get { return showerrorswindow; } internal set { showerrorswindow = value; } }
@@ -200,7 +195,6 @@ namespace CodeImp.DoomBuilder.Config
public int AntiAliasingSamples { get { return antialiasingsamples; } internal set { antialiasingsamples = value; } } //mxd
public bool ShowTextureSizes { get { return showtexturesizes; } internal set { showtexturesizes = value; } }
public bool LocateTextureGroup { get { return locatetexturegroup; } internal set { locatetexturegroup = value; } } //mxd
- public bool KeepTextureFilterFocused { get { return keeptexturefilterfocused; } internal set { keeptexturefilterfocused = value; } } //mxd
public SplitLineBehavior SplitLineBehavior { get { return splitlinebehavior; } set { splitlinebehavior = value; } } //mxd
public MergeGeometryMode MergeGeometryMode { get { return mergegeomode; } internal set { mergegeomode = value; } } //mxd
public bool SplitJoinedSectors { get { return splitjoinedsectors; } internal set { splitjoinedsectors = value; } } //mxd
@@ -302,8 +296,6 @@ namespace CodeImp.DoomBuilder.Config
{
// Read the cache variables
blackbrowsers = cfg.ReadSetting("blackbrowsers", false);
- capitalizetexturenames = cfg.ReadSetting("capitalizetexturenames", true); //mxd
- //undolevels = cfg.ReadSetting("undolevels", 20);
visualfov = cfg.ReadSetting("visualfov", 80);
visualmousesensx = cfg.ReadSetting("visualmousesensx", 40f);
visualmousesensy = cfg.ReadSetting("visualmousesensy", 40f);
@@ -324,7 +316,6 @@ namespace CodeImp.DoomBuilder.Config
viewdistance = cfg.ReadSetting("viewdistance", 3000.0f);
invertyaxis = cfg.ReadSetting("invertyaxis", false);
screenshotspath = cfg.ReadSetting("screenshotspath", General.DefaultScreenshotsPath); //mxd
- previewimagesize = cfg.ReadSetting("previewimagesize", 1);
autoscrollspeed = cfg.ReadSetting("autoscrollspeed", 0);
zoomfactor = cfg.ReadSetting("zoomfactor", 3);
showerrorswindow = cfg.ReadSetting("showerrorswindow", true);
@@ -347,7 +338,6 @@ namespace CodeImp.DoomBuilder.Config
antialiasingsamples = General.Clamp(cfg.ReadSetting("antialiasingsamples", 4), 0, 8) / 2 * 2; //mxd
showtexturesizes = cfg.ReadSetting("showtexturesizes", true);
locatetexturegroup = cfg.ReadSetting("locatetexturegroup", true); //mxd
- keeptexturefilterfocused = cfg.ReadSetting("keeptexturefilterfocused", true); //mxd
splitlinebehavior = (SplitLineBehavior)General.Clamp(cfg.ReadSetting("splitlinebehavior", 0), 0, Enum.GetValues(typeof(SplitLineBehavior)).Length - 1); //mxd
mergegeomode = (MergeGeometryMode)General.Clamp(cfg.ReadSetting("mergegeometrymode", (int)MergeGeometryMode.REPLACE), 0, Enum.GetValues(typeof(MergeGeometryMode)).Length - 1); //mxd
splitjoinedsectors = cfg.ReadSetting("splitjoinedsectors", true); //mxd
@@ -419,8 +409,6 @@ namespace CodeImp.DoomBuilder.Config
// Write the cache variables
cfg.WriteSetting("blackbrowsers", blackbrowsers);
- cfg.WriteSetting("capitalizetexturenames", capitalizetexturenames); //mxd
- //cfg.WriteSetting("undolevels", undolevels);
cfg.WriteSetting("visualfov", visualfov);
cfg.WriteSetting("visualmousesensx", visualmousesensx);
cfg.WriteSetting("visualmousesensy", visualmousesensy);
@@ -440,7 +428,6 @@ namespace CodeImp.DoomBuilder.Config
cfg.WriteSetting("viewdistance", viewdistance);
cfg.WriteSetting("invertyaxis", invertyaxis);
cfg.WriteSetting("screenshotspath", screenshotspath); //mxd
- cfg.WriteSetting("previewimagesize", previewimagesize);
cfg.WriteSetting("autoscrollspeed", autoscrollspeed);
cfg.WriteSetting("zoomfactor", zoomfactor);
cfg.WriteSetting("showerrorswindow", showerrorswindow);
@@ -463,7 +450,6 @@ namespace CodeImp.DoomBuilder.Config
cfg.WriteSetting("antialiasingsamples", antialiasingsamples); //mxd
cfg.WriteSetting("showtexturesizes", showtexturesizes);
cfg.WriteSetting("locatetexturegroup", locatetexturegroup); //mxd
- cfg.WriteSetting("keeptexturefilterfocused", keeptexturefilterfocused); //mxd
cfg.WriteSetting("splitlinebehavior", (int)splitlinebehavior); //mxd
cfg.WriteSetting("mergegeometrymode", (int)mergegeomode); //mxd
cfg.WriteSetting("splitjoinedsectors", splitjoinedsectors); //mxd
diff --git a/Source/Core/Config/TextureSet.cs b/Source/Core/Config/TextureSet.cs
index e6f52782..1df5a46b 100644
--- a/Source/Core/Config/TextureSet.cs
+++ b/Source/Core/Config/TextureSet.cs
@@ -28,7 +28,6 @@ namespace CodeImp.DoomBuilder.Config
#region ================== Variables
protected string name;
- private int level; //mxd. Folder depth of this item
protected List filters;
#endregion
@@ -36,7 +35,6 @@ namespace CodeImp.DoomBuilder.Config
#region ================== Properties
public string Name { get { return name; } set { name = value; } }
- public int Level { get { return level; } set { level = value; } }
internal List Filters { get { return filters; } }
#endregion
diff --git a/Source/Core/Controls/FlatSelectorControl.cs b/Source/Core/Controls/FlatSelectorControl.cs
index a0d287ce..bd4fecf3 100644
--- a/Source/Core/Controls/FlatSelectorControl.cs
+++ b/Source/Core/Controls/FlatSelectorControl.cs
@@ -16,6 +16,7 @@
#region ================== Namespaces
+using System;
using System.Drawing;
using CodeImp.DoomBuilder.Windows;
using CodeImp.DoomBuilder.Data;
@@ -64,14 +65,19 @@ namespace CodeImp.DoomBuilder.Controls
if(string.IsNullOrEmpty(texture.FilePathName) || texture is UnknownImage) DisplayImageSize(0, 0); //mxd
else DisplayImageSize(texture.ScaledWidth, texture.ScaledHeight); //mxd
- if(usepreviews ? !texture.IsPreviewLoaded : !texture.IsImageLoaded) timer.Start(); //mxd
+ if(!texture.IsPreviewLoaded) timer.Start(); //mxd
// Set the image
- // mxd. GetPreview() returns a copy of preview, GetBitmap() returns actual bitmap
- return (usepreviews ? texture.GetPreview() : new Bitmap(texture.GetBitmap()));
+ return texture.GetPreview();
}
}
+ //mxd. This gets ImageData by name...
+ protected override ImageData GetImageData(string imagename)
+ {
+ return General.Map.Data.GetFlatImage(imagename);
+ }
+
// This browses for a flat
protected override string BrowseImage(string imagename)
{
diff --git a/Source/Core/Controls/ImageBrowserCategoryItem.cs b/Source/Core/Controls/ImageBrowserCategoryItem.cs
new file mode 100644
index 00000000..ab8bfa6d
--- /dev/null
+++ b/Source/Core/Controls/ImageBrowserCategoryItem.cs
@@ -0,0 +1,50 @@
+#region ================== Namespaces
+
+using System;
+using CodeImp.DoomBuilder.Data;
+
+#endregion
+
+namespace CodeImp.DoomBuilder.Controls
+{
+ internal class ImageBrowserCategoryItem : ImageBrowserItem
+ {
+ #region ================== Variables
+
+ private string groupname;
+
+ #endregion
+
+ #region ================== Properties
+
+ public override bool IsPreviewLoaded { get { return true; } }
+ public override string TextureName { get { return groupname; } }
+
+ #endregion
+
+ #region ================== Constructors
+
+ private ImageBrowserCategoryItem(ImageData icon, string tooltip, bool showfullname) : base(icon, tooltip, showfullname) { }
+ public ImageBrowserCategoryItem(ImageBrowserItemType itemtype, string groupname)
+ {
+ this.groupname = groupname;
+ this.itemtype = itemtype;
+
+ switch(itemtype)
+ {
+ case ImageBrowserItemType.FOLDER:
+ icon = General.Map.Data.FolderTexture;
+ break;
+
+ case ImageBrowserItemType.FOLDER_UP:
+ icon = General.Map.Data.FolderUpTexture;
+ break;
+
+ default:
+ throw new NotImplementedException("Unsupported ItemType");
+ }
+ }
+
+ #endregion
+ }
+}
diff --git a/Source/Core/Controls/ImageBrowserControl.Designer.cs b/Source/Core/Controls/ImageBrowserControl.Designer.cs
index e376addf..6b2f4407 100644
--- a/Source/Core/Controls/ImageBrowserControl.Designer.cs
+++ b/Source/Core/Controls/ImageBrowserControl.Designer.cs
@@ -33,16 +33,19 @@ namespace CodeImp.DoomBuilder.Controls
this.labelMixMode = new System.Windows.Forms.Label();
this.label = new System.Windows.Forms.Label();
this.splitter = new System.Windows.Forms.SplitContainer();
- this.list = new CodeImp.DoomBuilder.Controls.OptimizedListView();
- this.showsubdirtextures = new System.Windows.Forms.CheckBox();
+ this.objectclear = new System.Windows.Forms.Button();
+ this.sizecombo = new System.Windows.Forms.ComboBox();
+ this.label1 = new System.Windows.Forms.Label();
+ this.usedtexturesonly = new System.Windows.Forms.CheckBox();
this.longtexturenames = new System.Windows.Forms.CheckBox();
this.filterheightlabel = new System.Windows.Forms.Label();
- this.filterHeight = new CodeImp.DoomBuilder.Controls.ButtonsNumericTextbox();
this.filterwidthlabel = new System.Windows.Forms.Label();
- this.filterWidth = new CodeImp.DoomBuilder.Controls.ButtonsNumericTextbox();
- this.cbMixMode = new System.Windows.Forms.ComboBox();
+ this.texturetypecombo = new System.Windows.Forms.ComboBox();
this.objectname = new System.Windows.Forms.TextBox();
this.refreshtimer = new System.Windows.Forms.Timer(this.components);
+ this.list = new CodeImp.DoomBuilder.Controls.ImageSelectorPanel();
+ this.filterHeight = new CodeImp.DoomBuilder.Controls.ButtonsNumericTextbox();
+ this.filterWidth = new CodeImp.DoomBuilder.Controls.ButtonsNumericTextbox();
this.splitter.Panel1.SuspendLayout();
this.splitter.Panel2.SuspendLayout();
this.splitter.SuspendLayout();
@@ -51,7 +54,7 @@ namespace CodeImp.DoomBuilder.Controls
// labelMixMode
//
this.labelMixMode.AutoSize = true;
- this.labelMixMode.Location = new System.Drawing.Point(3, 9);
+ this.labelMixMode.Location = new System.Drawing.Point(3, 8);
this.labelMixMode.Name = "labelMixMode";
this.labelMixMode.Size = new System.Drawing.Size(37, 13);
this.labelMixMode.TabIndex = 0;
@@ -60,7 +63,7 @@ namespace CodeImp.DoomBuilder.Controls
// label
//
this.label.AutoSize = true;
- this.label.Location = new System.Drawing.Point(131, 9);
+ this.label.Location = new System.Drawing.Point(164, 9);
this.label.Name = "label";
this.label.Size = new System.Drawing.Size(32, 13);
this.label.TabIndex = 0;
@@ -81,59 +84,79 @@ namespace CodeImp.DoomBuilder.Controls
//
// splitter.Panel2
//
- this.splitter.Panel2.Controls.Add(this.showsubdirtextures);
+ this.splitter.Panel2.Controls.Add(this.objectclear);
+ this.splitter.Panel2.Controls.Add(this.sizecombo);
+ this.splitter.Panel2.Controls.Add(this.label1);
+ this.splitter.Panel2.Controls.Add(this.usedtexturesonly);
this.splitter.Panel2.Controls.Add(this.longtexturenames);
this.splitter.Panel2.Controls.Add(this.filterheightlabel);
this.splitter.Panel2.Controls.Add(this.filterHeight);
this.splitter.Panel2.Controls.Add(this.filterwidthlabel);
this.splitter.Panel2.Controls.Add(this.filterWidth);
- this.splitter.Panel2.Controls.Add(this.cbMixMode);
+ this.splitter.Panel2.Controls.Add(this.texturetypecombo);
this.splitter.Panel2.Controls.Add(this.labelMixMode);
this.splitter.Panel2.Controls.Add(this.objectname);
this.splitter.Panel2.Controls.Add(this.label);
this.splitter.Size = new System.Drawing.Size(840, 346);
- this.splitter.SplitterDistance = 312;
+ this.splitter.SplitterDistance = 284;
this.splitter.TabIndex = 0;
this.splitter.TabStop = false;
//
- // list
+ // objectclear
//
- this.list.Dock = System.Windows.Forms.DockStyle.Fill;
- this.list.Font = new System.Drawing.Font("Microsoft Sans Serif", 8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
- this.list.HideSelection = false;
- this.list.Location = new System.Drawing.Point(0, 0);
- this.list.MultiSelect = false;
- this.list.Name = "list";
- this.list.OwnerDraw = true;
- this.list.ShowItemToolTips = true;
- this.list.Size = new System.Drawing.Size(840, 312);
- this.list.TabIndex = 1;
- this.list.TabStop = false;
- this.list.TileSize = new System.Drawing.Size(90, 90);
- this.list.UseCompatibleStateImageBehavior = false;
- this.list.View = System.Windows.Forms.View.Tile;
- this.list.DrawItem += new System.Windows.Forms.DrawListViewItemEventHandler(this.list_DrawItem);
- this.list.DoubleClick += new System.EventHandler(this.list_DoubleClick);
- this.list.ItemSelectionChanged += new System.Windows.Forms.ListViewItemSelectionChangedEventHandler(this.list_ItemSelectionChanged);
- this.list.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.list_KeyPress);
- this.list.KeyDown += new System.Windows.Forms.KeyEventHandler(this.list_KeyDown);
+ this.objectclear.Image = global::CodeImp.DoomBuilder.Properties.Resources.Close;
+ this.objectclear.Location = new System.Drawing.Point(330, 4);
+ this.objectclear.Name = "objectclear";
+ this.objectclear.Size = new System.Drawing.Size(26, 23);
+ this.objectclear.TabIndex = 3;
+ this.objectclear.TabStop = false;
+ this.objectclear.UseVisualStyleBackColor = true;
+ this.objectclear.Click += new System.EventHandler(this.objectclear_Click);
//
- // showsubdirtextures
+ // sizecombo
//
- this.showsubdirtextures.AutoSize = true;
- this.showsubdirtextures.Location = new System.Drawing.Point(595, 8);
- this.showsubdirtextures.Name = "showsubdirtextures";
- this.showsubdirtextures.Size = new System.Drawing.Size(172, 17);
- this.showsubdirtextures.TabIndex = 0;
- this.showsubdirtextures.TabStop = false;
- this.showsubdirtextures.Text = "Show textures in subdirectories";
- this.showsubdirtextures.UseVisualStyleBackColor = true;
- this.showsubdirtextures.CheckedChanged += new System.EventHandler(this.showsubdirtextures_CheckedChanged);
+ this.sizecombo.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.sizecombo.FormattingEnabled = true;
+ this.sizecombo.Items.AddRange(new object[] {
+ "1:1",
+ "64",
+ "96",
+ "128",
+ "192",
+ "256"});
+ this.sizecombo.Location = new System.Drawing.Point(43, 32);
+ this.sizecombo.Margin = new System.Windows.Forms.Padding(3, 3, 6, 3);
+ this.sizecombo.Name = "sizecombo";
+ this.sizecombo.Size = new System.Drawing.Size(107, 21);
+ this.sizecombo.TabIndex = 2;
+ this.sizecombo.TabStop = false;
+ this.sizecombo.SelectedIndexChanged += new System.EventHandler(this.sizecombo_SelectedIndexChanged);
+ //
+ // label1
+ //
+ this.label1.AutoSize = true;
+ this.label1.Location = new System.Drawing.Point(10, 35);
+ this.label1.Name = "label1";
+ this.label1.Size = new System.Drawing.Size(30, 13);
+ this.label1.TabIndex = 1;
+ this.label1.Text = "Size:";
+ //
+ // usedtexturesonly
+ //
+ this.usedtexturesonly.AutoSize = true;
+ this.usedtexturesonly.Location = new System.Drawing.Point(365, 8);
+ this.usedtexturesonly.Name = "usedtexturesonly";
+ this.usedtexturesonly.Size = new System.Drawing.Size(113, 17);
+ this.usedtexturesonly.TabIndex = 0;
+ this.usedtexturesonly.TabStop = false;
+ this.usedtexturesonly.Text = "Used textures only";
+ this.usedtexturesonly.UseVisualStyleBackColor = true;
+ this.usedtexturesonly.CheckedChanged += new System.EventHandler(this.usedtexturesonly_CheckedChanged);
//
// longtexturenames
//
this.longtexturenames.AutoSize = true;
- this.longtexturenames.Location = new System.Drawing.Point(470, 8);
+ this.longtexturenames.Location = new System.Drawing.Point(365, 34);
this.longtexturenames.Name = "longtexturenames";
this.longtexturenames.Size = new System.Drawing.Size(119, 17);
this.longtexturenames.TabIndex = 0;
@@ -145,83 +168,46 @@ namespace CodeImp.DoomBuilder.Controls
// filterheightlabel
//
this.filterheightlabel.AutoSize = true;
- this.filterheightlabel.Location = new System.Drawing.Point(367, 9);
+ this.filterheightlabel.Location = new System.Drawing.Point(258, 35);
this.filterheightlabel.Name = "filterheightlabel";
this.filterheightlabel.Size = new System.Drawing.Size(41, 13);
this.filterheightlabel.TabIndex = 0;
this.filterheightlabel.Text = "Height:";
//
- // filterHeight
- //
- this.filterHeight.AllowDecimal = false;
- this.filterHeight.AllowNegative = false;
- this.filterHeight.AllowRelative = false;
- this.filterHeight.ButtonStep = 1;
- this.filterHeight.ButtonStepBig = 10F;
- this.filterHeight.ButtonStepFloat = 1F;
- this.filterHeight.ButtonStepSmall = 0.1F;
- this.filterHeight.ButtonStepsUseModifierKeys = false;
- this.filterHeight.ButtonStepsWrapAround = false;
- this.filterHeight.Location = new System.Drawing.Point(410, 4);
- this.filterHeight.Name = "filterHeight";
- this.filterHeight.Size = new System.Drawing.Size(54, 24);
- this.filterHeight.StepValues = null;
- this.filterHeight.TabIndex = 0;
- this.filterHeight.TabStop = false;
- this.filterHeight.WhenTextChanged += new System.EventHandler(this.filterSize_WhenTextChanged);
- //
// filterwidthlabel
//
this.filterwidthlabel.AutoSize = true;
- this.filterwidthlabel.Location = new System.Drawing.Point(268, 9);
+ this.filterwidthlabel.Location = new System.Drawing.Point(159, 35);
this.filterwidthlabel.Name = "filterwidthlabel";
this.filterwidthlabel.Size = new System.Drawing.Size(38, 13);
this.filterwidthlabel.TabIndex = 0;
this.filterwidthlabel.Text = "Width:";
//
- // filterWidth
+ // texturetypecombo
//
- this.filterWidth.AllowDecimal = false;
- this.filterWidth.AllowNegative = false;
- this.filterWidth.AllowRelative = false;
- this.filterWidth.ButtonStep = 1;
- this.filterWidth.ButtonStepBig = 10F;
- this.filterWidth.ButtonStepFloat = 1F;
- this.filterWidth.ButtonStepSmall = 0.1F;
- this.filterWidth.ButtonStepsUseModifierKeys = false;
- this.filterWidth.ButtonStepsWrapAround = false;
- this.filterWidth.Location = new System.Drawing.Point(308, 4);
- this.filterWidth.Name = "filterWidth";
- this.filterWidth.Size = new System.Drawing.Size(54, 24);
- this.filterWidth.StepValues = null;
- this.filterWidth.TabIndex = 0;
- this.filterWidth.TabStop = false;
- this.filterWidth.WhenTextChanged += new System.EventHandler(this.filterSize_WhenTextChanged);
- //
- // cbMixMode
- //
- this.cbMixMode.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
- this.cbMixMode.FormattingEnabled = true;
- this.cbMixMode.Items.AddRange(new object[] {
+ this.texturetypecombo.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
+ this.texturetypecombo.FormattingEnabled = true;
+ this.texturetypecombo.Items.AddRange(new object[] {
"All",
"Textures",
"Flats",
- "By sel. type"});
- this.cbMixMode.Location = new System.Drawing.Point(43, 5);
- this.cbMixMode.Margin = new System.Windows.Forms.Padding(3, 3, 6, 3);
- this.cbMixMode.Name = "cbMixMode";
- this.cbMixMode.Size = new System.Drawing.Size(80, 21);
- this.cbMixMode.TabIndex = 0;
- this.cbMixMode.TabStop = false;
- this.cbMixMode.SelectedIndexChanged += new System.EventHandler(this.cbMixMode_SelectedIndexChanged);
+ "By selection type"});
+ this.texturetypecombo.Location = new System.Drawing.Point(43, 5);
+ this.texturetypecombo.Margin = new System.Windows.Forms.Padding(3, 3, 6, 3);
+ this.texturetypecombo.Name = "texturetypecombo";
+ this.texturetypecombo.Size = new System.Drawing.Size(107, 21);
+ this.texturetypecombo.TabIndex = 0;
+ this.texturetypecombo.TabStop = false;
+ this.texturetypecombo.SelectedIndexChanged += new System.EventHandler(this.texturetypecombo_SelectedIndexChanged);
//
// objectname
//
this.objectname.CharacterCasing = System.Windows.Forms.CharacterCasing.Upper;
- this.objectname.Location = new System.Drawing.Point(166, 6);
+ this.objectname.HideSelection = false;
+ this.objectname.Location = new System.Drawing.Point(199, 6);
this.objectname.Margin = new System.Windows.Forms.Padding(3, 3, 6, 3);
this.objectname.Name = "objectname";
- this.objectname.Size = new System.Drawing.Size(94, 20);
+ this.objectname.Size = new System.Drawing.Size(128, 20);
this.objectname.TabIndex = 0;
this.objectname.TabStop = false;
this.objectname.TextChanged += new System.EventHandler(this.objectname_TextChanged);
@@ -232,6 +218,63 @@ namespace CodeImp.DoomBuilder.Controls
this.refreshtimer.Interval = 500;
this.refreshtimer.Tick += new System.EventHandler(this.refreshtimer_Tick);
//
+ // list
+ //
+ this.list.AutoScroll = true;
+ this.list.BackColor = System.Drawing.Color.White;
+ this.list.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+ this.list.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.list.HideSelection = false;
+ this.list.ImageSize = 128;
+ this.list.Location = new System.Drawing.Point(0, 0);
+ this.list.MultiSelect = false;
+ this.list.Name = "list";
+ this.list.Size = new System.Drawing.Size(840, 284);
+ this.list.TabIndex = 1;
+ this.list.Title = "Default group";
+ this.list.ItemDoubleClicked += new CodeImp.DoomBuilder.Controls.ImageSelectorPanel.ItemSelectedEventHandler(this.list_ItemDoubleClicked);
+ this.list.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.list_KeyPress);
+ //
+ // filterHeight
+ //
+ this.filterHeight.AllowDecimal = false;
+ this.filterHeight.AllowExpressions = false;
+ this.filterHeight.AllowNegative = false;
+ this.filterHeight.AllowRelative = false;
+ this.filterHeight.ButtonStep = 1;
+ this.filterHeight.ButtonStepBig = 10F;
+ this.filterHeight.ButtonStepFloat = 1F;
+ this.filterHeight.ButtonStepSmall = 0.1F;
+ this.filterHeight.ButtonStepsUseModifierKeys = false;
+ this.filterHeight.ButtonStepsWrapAround = false;
+ this.filterHeight.Location = new System.Drawing.Point(301, 30);
+ this.filterHeight.Name = "filterHeight";
+ this.filterHeight.Size = new System.Drawing.Size(54, 24);
+ this.filterHeight.StepValues = null;
+ this.filterHeight.TabIndex = 0;
+ this.filterHeight.TabStop = false;
+ this.filterHeight.WhenTextChanged += new System.EventHandler(this.filterSize_WhenTextChanged);
+ //
+ // filterWidth
+ //
+ this.filterWidth.AllowDecimal = false;
+ this.filterWidth.AllowExpressions = false;
+ this.filterWidth.AllowNegative = false;
+ this.filterWidth.AllowRelative = false;
+ this.filterWidth.ButtonStep = 1;
+ this.filterWidth.ButtonStepBig = 10F;
+ this.filterWidth.ButtonStepFloat = 1F;
+ this.filterWidth.ButtonStepSmall = 0.1F;
+ this.filterWidth.ButtonStepsUseModifierKeys = false;
+ this.filterWidth.ButtonStepsWrapAround = false;
+ this.filterWidth.Location = new System.Drawing.Point(199, 30);
+ this.filterWidth.Name = "filterWidth";
+ this.filterWidth.Size = new System.Drawing.Size(54, 24);
+ this.filterWidth.StepValues = null;
+ this.filterWidth.TabIndex = 0;
+ this.filterWidth.TabStop = false;
+ this.filterWidth.WhenTextChanged += new System.EventHandler(this.filterSize_WhenTextChanged);
+ //
// ImageBrowserControl
//
this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F);
@@ -250,18 +293,21 @@ namespace CodeImp.DoomBuilder.Controls
#endregion
private System.Windows.Forms.SplitContainer splitter;
- private OptimizedListView list;
+ private CodeImp.DoomBuilder.Controls.ImageSelectorPanel list;
private System.Windows.Forms.Timer refreshtimer;
private System.Windows.Forms.TextBox objectname;
- private System.Windows.Forms.ComboBox cbMixMode;
+ private System.Windows.Forms.ComboBox texturetypecombo;
private System.Windows.Forms.Label label;
private System.Windows.Forms.Label labelMixMode;
- private ButtonsNumericTextbox filterWidth;
+ private CodeImp.DoomBuilder.Controls.ButtonsNumericTextbox filterWidth;
private System.Windows.Forms.Label filterheightlabel;
- private ButtonsNumericTextbox filterHeight;
+ private CodeImp.DoomBuilder.Controls.ButtonsNumericTextbox filterHeight;
private System.Windows.Forms.Label filterwidthlabel;
private System.Windows.Forms.CheckBox longtexturenames;
- private System.Windows.Forms.CheckBox showsubdirtextures;
+ private System.Windows.Forms.CheckBox usedtexturesonly;
+ private System.Windows.Forms.ComboBox sizecombo;
+ private System.Windows.Forms.Label label1;
+ private System.Windows.Forms.Button objectclear;
}
}
diff --git a/Source/Core/Controls/ImageBrowserControl.cs b/Source/Core/Controls/ImageBrowserControl.cs
index 7a0e4cd9..980437c6 100644
--- a/Source/Core/Controls/ImageBrowserControl.cs
+++ b/Source/Core/Controls/ImageBrowserControl.cs
@@ -19,7 +19,6 @@
using System;
using System.Collections.Generic;
using System.Drawing;
-using System.Globalization;
using System.Windows.Forms;
using CodeImp.DoomBuilder.Data;
using CodeImp.DoomBuilder.Windows;
@@ -32,12 +31,14 @@ namespace CodeImp.DoomBuilder.Controls
{
#region ================== Constants
+ private static readonly HashSet AllowedSpecialChars = new HashSet("!@#$%^&*()-_=+<>,.?/'\"\\;:[]{}`~".ToCharArray()); //mxd
+
#endregion
#region ================== Delegates / Events
- public delegate void SelectedItemChangedDelegate();
- public delegate void SelectedItemDoubleClickDelegate();
+ public delegate void SelectedItemChangedDelegate(ImageBrowserItem item);
+ public delegate void SelectedItemDoubleClickDelegate(ImageBrowserItem item);
public event SelectedItemChangedDelegate SelectedItemChanged;
public event SelectedItemDoubleClickDelegate SelectedItemDoubleClicked;
@@ -50,21 +51,21 @@ namespace CodeImp.DoomBuilder.Controls
private bool preventselection;
// States
- private bool updating;
private int keepselected;
- private bool browseFlats; //mxd
- private static bool uselongtexturenames; //mxd
- private static bool showtexturesfromsubdirs; //mxd
- private int currentlevel; //mxd
+ private bool browseflats; //mxd
+ private bool uselongtexturenames; //mxd
+ private bool blockupdate; //mxd
- // All items
- private readonly List items;
+ //mxd. All items
+ private Dictionary> items; // >
+ private List groups;
+ private string selectedgroup;
- // Items visible in the list
+ // Filtered items
private List visibleitems;
//mxd
- private static int mixMode;
+ private int texturetype;
#endregion
@@ -72,11 +73,10 @@ namespace CodeImp.DoomBuilder.Controls
public bool PreventSelection { get { return preventselection; } set { preventselection = value; } }
public bool HideInputBox { get { return splitter.Panel2Collapsed; } set { splitter.Panel2Collapsed = value; } }
- public bool BrowseFlats { get { return browseFlats; } set { browseFlats = value; } } //mxd
- public static bool ShowTexturesFromSubDirectories { get { return showtexturesfromsubdirs; } internal set { showtexturesfromsubdirs = value; } } //mxd
- public static bool UseLongTextureNames { get { return uselongtexturenames; } internal set { uselongtexturenames = value; } } //mxd
- public ListViewItem SelectedItem { get { if(list.SelectedItems.Count > 0) return list.SelectedItems[0]; else return null; } }
-
+ public List SelectedItems { get { return list.SelectedItems; } } //mxd
+ public ImageBrowserItem SelectedItem { get { return (list.SelectedItems.Count > 0 ? list.SelectedItems[0] : null); } }
+ public string SelectedGroup { get { return selectedgroup; } } //mxd
+
#endregion
#region ================== Constructor / Disposer
@@ -86,7 +86,8 @@ namespace CodeImp.DoomBuilder.Controls
{
// Initialize
InitializeComponent();
- items = new List();
+ items = new Dictionary>();
+ groups = new List();
//mxd
StepsList sizes = new StepsList { 4, 8, 16, 32, 48, 64, 96, 128, 196, 256, 512, 1024 };
@@ -98,8 +99,38 @@ namespace CodeImp.DoomBuilder.Controls
{
splitter.SplitterDistance = splitter.Height - splitter.Panel2.Height - (int)Math.Round(splitter.SplitterWidth * MainForm.DPIScaler.Height);
}
+
+ //mxd
+ list.SelectionChanged += list_SelectionChanged;
}
-
+
+ // This applies the application settings
+ public void ApplySettings(string settingpath, bool browseflats)
+ {
+ blockupdate = true;
+
+ //TODO: group handling doesn't couple well with usedtexturesonly checkbox...
+ this.browseflats = browseflats;
+ uselongtexturenames = General.Map.Options.UseLongTextureNames;
+ selectedgroup = General.Settings.ReadSetting(settingpath + ".selectedgroup", string.Empty);
+
+ if(string.IsNullOrEmpty(selectedgroup) || (groups.Count > 0 && !groups.Contains(selectedgroup)))
+ {
+ selectedgroup = groups[0];
+ }
+
+ texturetype = General.Settings.ReadSetting(settingpath + ".texturetype", 0);
+ usedtexturesonly.Checked = (groups.IndexOf(selectedgroup) == 1);
+
+ int imagesize = General.Settings.ReadSetting(settingpath + ".imagesize", 128);
+ sizecombo.Text = (imagesize == 0 ? sizecombo.Items[0].ToString() : imagesize.ToString());
+ list.ImageSize = imagesize;
+
+ ApplySettings();
+
+ blockupdate = false;
+ }
+
// This applies the application settings
public void ApplySettings()
{
@@ -113,52 +144,40 @@ namespace CodeImp.DoomBuilder.Controls
// Set the size of preview images
if(General.Map != null)
{
- int itemwidth = General.Map.Data.Previews.MaxImageWidth + 26;
- int itemheight = General.Map.Data.Previews.MaxImageHeight + 26;
- list.TileSize = new Size(itemwidth, itemheight);
-
//mxd
if(General.Map.Config.MixTexturesFlats)
{
- cbMixMode.SelectedIndex = mixMode;
+ texturetypecombo.SelectedIndex = texturetype;
}
else
{
- labelMixMode.Visible = false;
- cbMixMode.Visible = false;
-
- int offset = label.Left - labelMixMode.Left;
- label.Left -= offset;
- objectname.Left -= offset;
- filterWidth.Left -= offset;
- filterwidthlabel.Left -= offset;
- filterHeight.Left -= offset;
- filterheightlabel.Left -= offset;
- showsubdirtextures.Left -= offset;
- longtexturenames.Left -= offset;
-
- mixMode = 0;
+ labelMixMode.Enabled = false;
+ texturetypecombo.Enabled = false;
+ texturetype = 0;
}
//mxd. Use long texture names?
longtexturenames.Checked = (uselongtexturenames && General.Map.Config.UseLongTextureNames);
- longtexturenames.Visible = General.Map.Config.UseLongTextureNames;
- if(!General.Map.Config.UseLongTextureNames)
- showsubdirtextures.Left = longtexturenames.Left; //mxd
+ longtexturenames.Enabled = General.Map.Config.UseLongTextureNames;
}
else
{
- longtexturenames.Visible = false; //mxd
+ longtexturenames.Enabled = false; //mxd
uselongtexturenames = false; //mxd
- showsubdirtextures.Left = longtexturenames.Left; //mxd
}
//mxd
- if(!General.Settings.CapitalizeTextureNames)
- objectname.CharacterCasing = CharacterCasing.Normal;
+ objectname.CharacterCasing = (longtexturenames.Checked ? CharacterCasing.Normal : CharacterCasing.Upper);
+ }
- //mxd. Show textures in subfolders?
- showsubdirtextures.Checked = showtexturesfromsubdirs;
+ //mxd. Save settings
+ public virtual void OnClose(string settingpath)
+ {
+ General.Settings.WriteSetting(settingpath + ".selectedgroup", selectedgroup);
+ General.Settings.WriteSetting(settingpath + ".imagesize", list.ImageSize);
+ if(General.Map.Config.UseLongTextureNames) General.Map.Options.UseLongTextureNames = uselongtexturenames;
+
+ CleanUp();
}
// This cleans everything up
@@ -172,34 +191,27 @@ namespace CodeImp.DoomBuilder.Controls
#region ================== Rendering
- // Draw item
- private void list_DrawItem(object sender, DrawListViewItemEventArgs e)
- {
- if(!updating) (e.Item as ImageBrowserItem).Draw(e.Graphics, e.Bounds);
- }
-
// Refresher
private void refreshtimer_Tick(object sender, EventArgs e)
{
bool allpreviewsloaded = true;
+ bool redrawneeded = false; //mxd
// Go for all items
foreach(ImageBrowserItem i in list.Items)
{
// Check if there are still previews that are not loaded
allpreviewsloaded &= i.IsPreviewLoaded;
-
- // Items needs to be redrawn?
- if(i.CheckRedrawNeeded())
- {
- // Refresh item in list
- //list.RedrawItems(i.Index, i.Index, false);
- list.Invalidate();
- }
+
+ //mxd. Item needs to be redrawn?
+ redrawneeded |= i.CheckRedrawNeeded();
}
// If all previews were loaded, stop this timer
if(allpreviewsloaded) refreshtimer.Stop();
+
+ // Redraw the list if needed
+ if(redrawneeded) list.Invalidate();
}
#endregion
@@ -223,32 +235,24 @@ namespace CodeImp.DoomBuilder.Controls
// Key pressed in textbox
private void objectname_KeyDown(object sender, KeyEventArgs e)
{
- // Check what key is pressed
- switch(e.KeyData)
+ // Let the list handle arrow keys and such
+ if(list.ProcessKeyDown(e))
{
- // Cursor keys
- case Keys.Left: SelectNextItem(SearchDirectionHint.Left); e.SuppressKeyPress = true; break;
- case Keys.Right: SelectNextItem(SearchDirectionHint.Right); e.SuppressKeyPress = true; break;
- case Keys.Up: SelectNextItem(SearchDirectionHint.Up); e.SuppressKeyPress = true; break;
- case Keys.Down: SelectNextItem(SearchDirectionHint.Down); e.SuppressKeyPress = true; break;
-
- // Tab
- case Keys.Tab: GoToNextSameTexture(); e.SuppressKeyPress = true; break;
+ e.SuppressKeyPress = true;
+ }
+ // Toggle groups
+ else if(e.KeyData == Keys.Tab)
+ {
+ ShowNextGroup();
+ e.SuppressKeyPress = true;
}
}
- //mxd. Handle keyboard navigation the same way regardless of list being focused...
- private void list_KeyDown(object sender, KeyEventArgs e)
+ //mxd
+ private void objectclear_Click(object sender, EventArgs e)
{
- // Check what key is pressed
- switch(e.KeyData)
- {
- // Cursor keys
- case Keys.Left: SelectNextItem(SearchDirectionHint.Left); e.SuppressKeyPress = true; break;
- case Keys.Right: SelectNextItem(SearchDirectionHint.Right); e.SuppressKeyPress = true; break;
- case Keys.Up: SelectNextItem(SearchDirectionHint.Up); e.SuppressKeyPress = true; break;
- case Keys.Down: SelectNextItem(SearchDirectionHint.Down); e.SuppressKeyPress = true; break;
- }
+ objectname.Clear();
+ list.Focus();
}
//mxd
@@ -260,40 +264,36 @@ namespace CodeImp.DoomBuilder.Controls
//mxd
protected override bool ProcessTabKey(bool forward)
{
- GoToNextSameTexture();
+ usedtexturesonly.Checked = !usedtexturesonly.Checked;
return false;
}
// Selection changed
- private void list_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
+ private void list_SelectionChanged(object sender, List selection)
{
- if(!e.IsSelected) return; //mxd. Don't want to trigger this twice
-
// Prevent selecting?
if(preventselection)
{
- foreach(ListViewItem i in list.SelectedItems) i.Selected = false;
+ if(selection.Count > 0) list.ClearSelection(); //mxd
}
else
{
// Raise event
- if(SelectedItemChanged != null) SelectedItemChanged();
+ if(SelectedItemChanged != null)
+ SelectedItemChanged(list.SelectedItems.Count > 0 ? list.SelectedItems[0] : null);
}
}
// Doublelicking an item
- private void list_DoubleClick(object sender, EventArgs e)
+ private void list_ItemDoubleClicked(object sender, ImageBrowserItem item)
{
if(!preventselection && (list.SelectedItems.Count > 0))
- if(SelectedItemDoubleClicked != null) SelectedItemDoubleClicked();
+ if(SelectedItemDoubleClicked != null) SelectedItemDoubleClicked(item);
}
- //mxd. Transfer focus to Filter textbox
+ //mxd. Transfer input to Filter textbox
private void list_KeyPress(object sender, KeyPressEventArgs e)
{
- if(!General.Settings.KeepTextureFilterFocused) return;
-
- objectname.Focus();
if(e.KeyChar == '\b') // Any better way to check for Backspace?..
{
if(!string.IsNullOrEmpty(objectname.Text) && objectname.SelectionStart > 0 && objectname.SelectionLength == 0)
@@ -303,216 +303,111 @@ namespace CodeImp.DoomBuilder.Controls
objectname.SelectionStart = s;
}
}
- else
+ if(e.KeyChar == 8 && objectname.Text.Length > 0)
{
- objectname.AppendText(e.KeyChar.ToString(CultureInfo.InvariantCulture));
+ if(objectname.SelectionLength > 0)
+ {
+ objectname.Text = objectname.Text.Substring(0, objectname.SelectionStart) +
+ objectname.Text.Substring(objectname.SelectionStart + objectname.SelectionLength);
+ }
+ else
+ {
+ objectname.Text = objectname.Text.Substring(0, objectname.Text.Length - 1);
+ }
+ }
+ else if((e.KeyChar >= 'a' && e.KeyChar <= 'z') || (e.KeyChar >= '0' && e.KeyChar <= '9') || AllowedSpecialChars.Contains(e.KeyChar))
+ {
+ if(objectname.SelectionLength > 0)
+ {
+ objectname.Text = objectname.Text.Substring(0, objectname.SelectionStart) +
+ e.KeyChar +
+ objectname.Text.Substring(objectname.SelectionStart + objectname.SelectionLength);
+ }
+ else
+ {
+ objectname.Text += e.KeyChar;
+ }
}
}
//mxd
- private void cbMixMode_SelectedIndexChanged(object sender, EventArgs e)
+ private void texturetypecombo_SelectedIndexChanged(object sender, EventArgs e)
{
- mixMode = cbMixMode.SelectedIndex;
+ texturetype = texturetypecombo.SelectedIndex;
RefillList(false);
}
+ //mxd
+ private void sizecombo_SelectedIndexChanged(object sender, EventArgs e)
+ {
+ if(blockupdate) return;
+ list.ImageSize = (sizecombo.SelectedIndex == 0 ? 0 : Convert.ToInt32(sizecombo.SelectedItem));
+ list.Focus();
+ }
+
//mxd
private void longtexturenames_CheckedChanged(object sender, EventArgs e)
{
+ if(blockupdate) return;
uselongtexturenames = longtexturenames.Checked;
+ objectname.CharacterCasing = (uselongtexturenames ? CharacterCasing.Normal : CharacterCasing.Upper);
RefillList(false);
}
//mxd
- private void showsubdirtextures_CheckedChanged(object sender, EventArgs e)
+ private void usedtexturesonly_CheckedChanged(object sender, EventArgs e)
{
- showtexturesfromsubdirs = showsubdirtextures.Checked;
- RefillList(false);
+ if(blockupdate) return;
+ ShowNextGroup();
}
#endregion
#region ================== Methods
- // This selects the next texture with the same name as the selected texture
- public void GoToNextSameTexture()
- {
- if(list.SelectedItems.Count > 0)
- {
- list.Focus(); //mxd
- ListViewItem selected = list.SelectedItems[0];
-
- //mxd
- foreach(ImageBrowserItem n in visibleitems)
- {
- if(n == selected) continue;
- if(n.Text == selected.Text)
- {
- if(list.IsGroupCollapsed(n.Group)) list.SetGroupCollapsed(n.Group, false);
- n.Selected = true;
- n.Focused = true;
- n.EnsureVisible();
- return;
- }
- }
- }
- }
-
// This selects an item by longname (mxd - changed from name to longname)
- public void SelectItem(long longname, ListViewGroup preferredgroup)
- {
- ImageBrowserItem lvi = null; //mxd
-
- // Not when selecting is prevented
- if(preventselection) return;
-
- // Search in preferred group first
- if(preferredgroup != null)
- {
- foreach(ListViewItem item in list.Items)
- {
- ImageBrowserItem curitem = item as ImageBrowserItem;
- if(curitem != null && longname == curitem.Icon.LongName) //mxd
- {
- lvi = curitem;
- if(item.Group == preferredgroup) break;
- }
- }
- }
-
- // Select the item
- if(lvi != null)
- {
- // Select this item
- list.SelectedItems.Clear();
- lvi.Selected = true;
- lvi.EnsureVisible();
- }
- }
-
- // This performs item sleection by keys
- private void SelectNextItem(SearchDirectionHint dir)
+ public void SelectItem(long longname, string preferredgroup)
{
// Not when selecting is prevented
if(preventselection) return;
-
- // Nothing selected?
- if(list.SelectedItems.Count == 0)
+
+ // Assemble group order
+ List searchorder;
+ if(string.IsNullOrEmpty(preferredgroup) || !groups.Contains(preferredgroup))
{
- // Select first
- SelectFirstItem();
+ searchorder = new List(groups);
}
else
{
- //mxd
- int index = list.SelectedItems[0].Index;
- int targetindex = -1;
- ListViewGroup startgroup = list.SelectedItems[0].Group;
- Rectangle startrect = list.SelectedItems[0].GetBounds(ItemBoundsPortion.Entire);
-
- switch(dir)
+ searchorder = new List { preferredgroup };
+ List othergroups = new List(groups);
+ othergroups.Remove(preferredgroup);
+ searchorder.AddRange(othergroups);
+ }
+
+ // Search for item
+ ImageBrowserItem target = null; //mxd
+ string targetgroup = string.Empty;
+ foreach(string group in searchorder)
+ {
+ foreach(ImageBrowserItem item in items[group])
{
- // Check previous items untill groups match...
- case SearchDirectionHint.Left:
- if(list.SelectedIndices[0] > 0)
- {
- while(--index > -1)
- {
- if(list.Items[index].Group == startgroup)
- {
- targetindex = index;
- break;
- }
- }
- }
- break;
-
- // Same thing, other direction...
- case SearchDirectionHint.Right:
- if(list.SelectedIndices[0] < list.Items.Count - 1)
- {
- while(++index < list.Items.Count)
- {
- if(list.Items[index].Group == startgroup)
- {
- targetindex = index;
- break;
- }
- }
- }
- break;
-
- // Check previous items untill X coordinate match and Y coordinate is less than the start ones...
- case SearchDirectionHint.Up:
- while(--index > -1)
- {
- ListViewItem item = list.Items[index];
- if(item != null && item.Group == startgroup)
- {
- Rectangle rect = item.GetBounds(ItemBoundsPortion.Entire);
- if(rect.X == startrect.X && rect.Y < startrect.Y)
- {
- targetindex = index;
- break;
- }
- }
- }
- break;
-
- // Same thing, other direction...
- case SearchDirectionHint.Down:
- if(list.SelectedIndices[0] < list.Items.Count - 1)
- {
- while(++index < list.Items.Count)
- {
- ListViewItem item = list.Items[index];
- if(item != null && item.Group == startgroup)
- {
- Rectangle rect = item.GetBounds(ItemBoundsPortion.Entire);
- if(rect.X == startrect.X && rect.Y > startrect.Y)
- {
- targetindex = index;
- break;
- }
- }
- }
- }
- break;
- }
-
- //mxd. Use the old method for Up/Down keys, becaue it can jump between Groups...
- if(targetindex == -1 && (dir == SearchDirectionHint.Up || dir == SearchDirectionHint.Down))
- {
- Point spos = new Point(startrect.Location.X + startrect.Width / 2, startrect.Y + startrect.Height / 2);
-
- // Try finding 5 times in the given direction
- for(int i = 0; i < 5; i++)
+ if(item.Icon.LongName == longname) //mxd
{
- // Move point in given direction
- switch(dir)
- {
- case SearchDirectionHint.Up: spos.Y -= list.TileSize.Height / 2; break;
- case SearchDirectionHint.Down: spos.Y += list.TileSize.Height / 2; break;
- }
-
- // Test position
- ListViewItem lvi = list.GetItemAt(spos.X, spos.Y);
- if(lvi != null)
- {
- targetindex = lvi.Index;
- break;
- }
+ target = item;
+ targetgroup = group;
+ break;
}
}
+ }
+
+ if(target != null)
+ {
+ // Group switching required?
+ SelectGroup(targetgroup);
- //mxd. Found something?..
- if(targetindex != -1)
- {
- // Select item
- list.SelectedItems.Clear();
- list.Items[targetindex].Selected = true;
- list.SelectedItems[0].EnsureVisible();
- }
+ // Select the item
+ list.SetSelectedItem(target);
}
}
@@ -523,53 +418,54 @@ namespace CodeImp.DoomBuilder.Controls
if(preventselection) return;
// Select first
- if(list.Items.Count > 0)
- {
- list.SelectedItems.Clear();
- ListViewItem lvi = list.GetItemAt(list.TileSize.Width / 2, list.TileSize.Height / 2);
- if(lvi != null)
- {
- lvi.Selected = true;
- lvi.EnsureVisible();
- }
- }
+ if(list.Items.Count > 0) list.SetSelectedItem(list.Items[0]);
}
// This adds a group
- public ListViewGroup AddGroup(string name)
+ public void AddGroup(string name)
{
- ListViewGroup grp = new ListViewGroup(name);
- list.Groups.Add(grp);
- return grp;
+ if(groups.Contains(name)) return;
+ groups.Add(name);
+ items.Add(name, new List());
}
- //mxd
- public bool IsGroupCollapsed(ListViewGroup group)
+ // This selects a group
+ public void SelectGroup(string groupname)
{
- if(!list.Groups.Contains(group)) return false;
- return list.IsGroupCollapsed(group);
+ if(string.IsNullOrEmpty(groupname) || groupname == selectedgroup || !groups.Contains(groupname)) return;
+ selectedgroup = groupname;
+ list.SetItems(items[groupname]);
+
+ blockupdate = true;
+ usedtexturesonly.Checked = (groups.IndexOf(selectedgroup) == 1);
+ blockupdate = false;
+
+ RefillList(false);
}
- //mxd. This enables group collapsability and optionally collapses it
- public void SetGroupCollapsed(ListViewGroup group, bool collapse)
+ // This toggles between groups
+ private void ShowNextGroup()
{
- if(!list.Groups.Contains(group)) return;
- list.SetGroupCollapsed(group, collapse);
+ if(groups.Count < 2) return;
+ int nextgroupindex = groups.IndexOf(selectedgroup) + 1;
+ if(nextgroupindex >= items.Count) nextgroupindex = 0;
+ SelectGroup(groups[nextgroupindex]);
}
// This begins adding items
- public void BeginAdding(bool keepselectedindex) { BeginAdding(0, keepselectedindex); } //mxd
- public void BeginAdding(int selectedlevel, bool keepselectedindex)
+ public void BeginAdding(bool keepselectedindex)
{
if(keepselectedindex && (list.SelectedItems.Count > 0))
- keepselected = list.SelectedIndices[0];
+ keepselected = list.Items.IndexOf(list.SelectedItems[0]);
else
keepselected = -1;
-
- currentlevel = selectedlevel;
// Clean list
items.Clear();
+
+ // Re-add groups...
+ foreach(string s in groups)
+ items.Add(s, new List());
// Stop updating
refreshtimer.Enabled = false;
@@ -584,49 +480,67 @@ namespace CodeImp.DoomBuilder.Controls
// Start updating
refreshtimer.Enabled = true;
}
-
- // This adds an item
- public void Add(ImageData image, object tag, ListViewGroup group)
+
+ //mxd. This adds a category item
+ public void AddFolder(ImageBrowserItemType itemtype, string group, string categoryname)
{
- ImageBrowserItem i = new ImageBrowserItem(image, tag, uselongtexturenames); //mxd
- i.ListGroup = group;
- i.Group = group;
- i.ToolTipText = image.Name; //mxd
- items.Add(i);
+ if(string.IsNullOrEmpty(group)) group = ImageSelectorPanel.DEFAULT_GROUP;
+ if(!items.ContainsKey(group))
+ {
+ items.Add(group, new List());
+ groups.Add(group);
+ }
+
+ switch(itemtype)
+ {
+ case ImageBrowserItemType.FOLDER: case ImageBrowserItemType.FOLDER_UP:
+ items[group].Add(new ImageBrowserCategoryItem(itemtype, categoryname));
+ break;
+
+ default: throw new Exception("Unsupported ImageBrowserItemType");
+ }
}
// This adds an item
- public void Add(ImageData image, object tag, ListViewGroup group, string tooltiptext)
+ public void AddItem(ImageData image, string group, string tooltip)
{
- ImageBrowserItem i = new ImageBrowserItem(image, tag, uselongtexturenames); //mxd
- i.ListGroup = group;
- i.Group = group;
- i.ToolTipText = tooltiptext;
- items.Add(i);
+ if(string.IsNullOrEmpty(group)) group = ImageSelectorPanel.DEFAULT_GROUP;
+ if(!items.ContainsKey(group))
+ {
+ items.Add(group, new List());
+ groups.Add(group);
+ }
+ items[group].Add(new ImageBrowserItem(image, tooltip, uselongtexturenames));
+ }
+
+ public void AddItem(ImageData image, string group)
+ {
+ AddItem(image, group, string.Empty);
}
// This fills the list based on the objectname filter
private void RefillList(bool selectfirst)
{
+ if(groups.Count == 0) return;
visibleitems = new List();
+ //mxd. Check group name...
+ if(string.IsNullOrEmpty(selectedgroup))
+ {
+ if(groups.Count == 0) throw new Exception("No groups defined...");
+ selectedgroup = groups[0];
+ }
+
//mxd. Store info about currently selected item
string selectedname = string.Empty;
- ListViewGroup selecteditemgroup = null;
- if(!selectfirst && keepselected == -1 && list.SelectedIndices.Count > 0)
+ if(!selectfirst && keepselected == -1 && list.SelectedItems.Count > 0)
{
- selectedname = list.Items[list.SelectedIndices[0]].Text;
- selecteditemgroup = list.Items[list.SelectedIndices[0]].Group;
+ selectedname = list.SelectedItems[0].Icon.Name;
}
-
- // Begin updating list
- updating = true;
- //list.SuspendLayout();
- list.BeginUpdate();
-
+
// Clear list first
- // Group property of items will be set to null, we will restore it later
- list.Items.Clear();
+ list.Clear();
+ list.Title = selectedgroup;
//mxd. Filtering by texture size?
int w = filterWidth.GetResult(-1);
@@ -634,39 +548,28 @@ namespace CodeImp.DoomBuilder.Controls
// Go for all items
ImageBrowserItem previtem = null; //mxd
- for(int i = items.Count - 1; i > -1; i--)
+ for(int i = items[selectedgroup].Count - 1; i > -1; i--)
{
// Add item if valid
- items[i].ShowFullName = uselongtexturenames; //mxd
- if(ValidateItem(items[i], previtem) && ValidateItemSize(items[i], w, h))
+ items[selectedgroup][i].ShowFullName = uselongtexturenames; //mxd
+ if(ValidateItem(items[selectedgroup][i], previtem) && ValidateItemSize(items[selectedgroup][i], w, h))
{
- items[i].Group = items[i].ListGroup;
- items[i].Selected = false;
- visibleitems.Add(items[i]);
- previtem = items[i];
+ visibleitems.Add(items[selectedgroup][i]);
+ previtem = items[selectedgroup][i];
}
}
// Fill list
visibleitems.Sort();
- ListViewItem[] array = new ListViewItem[visibleitems.Count];
- for(int i = 0; i < visibleitems.Count; i++) array[i] = visibleitems[i];
- list.Items.AddRange(array);
-
- // Done updating list
- updating = false;
- list.EndUpdate();
- list.Invalidate();
- //list.ResumeLayout();
+ list.SetItems(visibleitems);
// Make selection?
- if(!preventselection && (list.Items.Count > 0))
+ if(!preventselection && list.Items.Count > 0)
{
// Select specific item?
if(keepselected > -1)
{
- list.Items[keepselected].Selected = true;
- list.Items[keepselected].EnsureVisible();
+ list.SetSelectedItem(list.Items[keepselected]);
}
// Select first item?
else if(selectfirst)
@@ -674,23 +577,23 @@ namespace CodeImp.DoomBuilder.Controls
SelectFirstItem();
}
//mxd. Try reselecting the same/next closest item
- else if(selecteditemgroup != null && !string.IsNullOrEmpty(selectedname))
+ else if(!string.IsNullOrEmpty(selectedname))
{
- ListViewItem bestmatch = null;
+ ImageBrowserItem bestmatch = null;
int charsmatched = 1;
- foreach(ListViewItem item in list.Items)
+ foreach(ImageBrowserItem item in list.Items)
{
- if(item.Group == selecteditemgroup && item.Text[0] == selectedname[0])
+ if(item.ItemType == ImageBrowserItemType.IMAGE && item.Icon.Name[0] == selectedname[0])
{
- if(item.Text == selectedname)
+ if(item.Icon.Name == selectedname)
{
bestmatch = item;
break;
}
- for(int i = 1; i < Math.Min(item.Text.Length, selectedname.Length); i++)
+ for(int i = 1; i < Math.Min(item.Icon.Name.Length, selectedname.Length); i++)
{
- if(item.Text[i] != selectedname[i])
+ if(item.Icon.Name[i] != selectedname[i])
{
if(i > charsmatched)
{
@@ -703,48 +606,38 @@ namespace CodeImp.DoomBuilder.Controls
}
}
- // Select the first item from the same group...
- if(bestmatch == null)
- {
- foreach(ListViewItem item in list.Items)
- {
- if(item.Group == selecteditemgroup)
- {
- bestmatch = item;
- break;
- }
- }
- }
-
// Select found item
if(bestmatch != null)
{
- bestmatch.Selected = true;
- bestmatch.EnsureVisible();
+ list.SetSelectedItem(bestmatch);
+ }
+ else
+ {
+ SelectFirstItem();
}
}
}
// Raise event
- if((SelectedItemChanged != null) && !preventselection) SelectedItemChanged();
+ if((SelectedItemChanged != null) && !preventselection)
+ SelectedItemChanged(list.SelectedItems.Count > 0 ? list.SelectedItems[0] : null);
}
// This validates an item
private bool ValidateItem(ImageBrowserItem item, ImageBrowserItem previtem)
{
//mxd. Don't show duplicate items
- if(previtem != null && item.TextureName == previtem.TextureName && item.Group == previtem.Group) return false; //mxd
+ if(previtem != null && item.TextureName == previtem.TextureName) return false; //mxd
//mxd. mixMode: 0 = All, 1 = Textures, 2 = Flats, 3 = Based on BrowseFlats
if(!splitter.Panel2Collapsed)
{
- if(mixMode == 1 && item.Icon.IsFlat) return false;
- if(mixMode == 2 && !item.Icon.IsFlat) return false;
- if(mixMode == 3 && (browseFlats != item.Icon.IsFlat)) return false;
- if(!showtexturesfromsubdirs && item.Icon.Level > currentlevel) return false;
+ if(texturetype == 1 && item.Icon.IsFlat) return false;
+ if(texturetype == 2 && !item.Icon.IsFlat) return false;
+ if(texturetype == 3 && (browseflats != item.Icon.IsFlat)) return false;
}
- return item.Text.ToUpperInvariant().Contains(objectname.Text.ToUpperInvariant());
+ return item.TextureName.ToUpperInvariant().Contains(objectname.Text.ToUpperInvariant());
}
//mxd. This validates an item's texture size
@@ -756,13 +649,10 @@ namespace CodeImp.DoomBuilder.Controls
return true;
}
- // This sends the focus to the textbox
- public void FocusTextbox()
+ //mxd. This sends the focus to the textures list
+ public void FocusList()
{
- if(General.Settings.KeepTextureFilterFocused) //mxd
- objectname.Focus();
- else
- list.Focus();
+ list.Focus();
}
#endregion
diff --git a/Source/Core/Controls/ImageBrowserControl.resx b/Source/Core/Controls/ImageBrowserControl.resx
index 39dc5d30..cb19257e 100644
--- a/Source/Core/Controls/ImageBrowserControl.resx
+++ b/Source/Core/Controls/ImageBrowserControl.resx
@@ -120,9 +120,6 @@
True
-
- True
-
103, 17
diff --git a/Source/Core/Controls/ImageBrowserItem.cs b/Source/Core/Controls/ImageBrowserItem.cs
index aafec37e..1142220f 100644
--- a/Source/Core/Controls/ImageBrowserItem.cs
+++ b/Source/Core/Controls/ImageBrowserItem.cs
@@ -1,190 +1,167 @@
-
-#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
+#region ================== Namespaces
using System;
using System.Drawing;
-using System.Windows.Forms;
using CodeImp.DoomBuilder.Data;
-using System.Drawing.Drawing2D;
-using SlimDX;
#endregion
namespace CodeImp.DoomBuilder.Controls
{
- internal class ImageBrowserItem : ListViewItem, IComparable
+ #region ================== mxd. ImageBrowserItemType
+
+ internal enum ImageBrowserItemType
{
- #region ================== Constants
+ // Values order is used when sorting ImageBrowserItems!
+ FOLDER_UP,
+ FOLDER,
+ IMAGE,
+ }
- internal const int MAX_NAME_LENGTH = 14; //mxd
+ #endregion
- #endregion
-
+ internal class ImageBrowserItem : IComparable
+ {
#region ================== Variables
- // Display image and text
- public readonly ImageData Icon;
- private string imagesize; //mxd
- private bool showfullname; //mxd
- private static readonly StringFormat format = new StringFormat { Alignment = StringAlignment.Center }; //mxd
-
- // Group
- private ListViewGroup listgroup;
-
- // Image cache
+ protected ImageData icon;
private bool imageloaded;
-
+ private bool showfullname;
+ protected ImageBrowserItemType itemtype;
+ private string tooltip;
+
#endregion
#region ================== Properties
- public ListViewGroup ListGroup { get { return listgroup; } set { listgroup = value; } }
- public bool IsPreviewLoaded { get { return imageloaded; } }
- public bool ShowFullName { set { showfullname = value; UpdateName(); } }
- public string TextureName { get { return showfullname ? Icon.Name : Icon.ShortName; } }
+ public ImageData Icon { get { return icon; } }
+ public ImageBrowserItemType ItemType { get { return itemtype; } }
+ public virtual bool IsPreviewLoaded { get { return imageloaded; } }
+ public bool ShowFullName { set { showfullname = value; } }
+ public virtual string TextureName { get { return (showfullname ? icon.Name : icon.ShortName); } }
+ public string ToolTip { get { return tooltip; } }
#endregion
- #region ================== Constructor / Disposer
+ #region ================== Constructor
// Constructors
- public ImageBrowserItem(ImageData icon, object tag, bool showfullname)
+ protected ImageBrowserItem() { } //mxd. Needed for inheritance...
+ public ImageBrowserItem(ImageData icon, string tooltip, bool showfullname)
{
// Initialize
- this.Icon = icon;
- this.Tag = tag;
+ this.icon = icon;
+ this.itemtype = ImageBrowserItemType.IMAGE; //mxd
this.showfullname = showfullname; //mxd
- UpdateName(); //mxd
+ this.imageloaded = icon.IsPreviewLoaded; //mxd
+ this.tooltip = tooltip; //mxd
}
-
+
#endregion
-
+
#region ================== Methods
-
- // This checks if a redraw is needed
- public bool CheckRedrawNeeded()
+
+ internal bool CheckRedrawNeeded()
{
- UpdateName(); //mxd. Update texture size if needed
- return (Icon.IsPreviewLoaded != imageloaded);
- }
-
- // This draws the images
- public void Draw(Graphics g, Rectangle bounds)
- {
- Brush forecolor;
- Brush backcolor;
-
- // Remember if the preview is loaded
- imageloaded = Icon.IsPreviewLoaded;
-
- // Drawing settings
- g.CompositingQuality = CompositingQuality.HighSpeed;
- g.InterpolationMode = InterpolationMode.NearestNeighbor;
- g.SmoothingMode = SmoothingMode.HighSpeed;
- g.PixelOffsetMode = PixelOffsetMode.None;
-
- // Determine coordinates
- SizeF textsize = g.MeasureString(Text, this.ListView.Font, bounds.Width * 2);
- Rectangle imagerect = new Rectangle(bounds.Left + ((bounds.Width - General.Map.Data.Previews.MaxImageWidth) >> 1),
- bounds.Top + ((bounds.Height - General.Map.Data.Previews.MaxImageHeight - (int)textsize.Height) >> 1),
- General.Map.Data.Previews.MaxImageWidth, General.Map.Data.Previews.MaxImageHeight);
- PointF textpos = new PointF(bounds.Left + (bounds.Width * 0.5f), bounds.Bottom - textsize.Height - 2);
-
- // Determine colors
- if(this.Selected)
+ if(icon.IsPreviewLoaded != imageloaded)
{
- // Highlighted
- backcolor = new LinearGradientBrush(new Point(0, bounds.Top - 1), new Point(0, bounds.Bottom + 1),
- AdjustedColor(SystemColors.Highlight, 0.2f),
- AdjustedColor(SystemColors.Highlight, -0.1f));
- forecolor = new SolidBrush(SystemColors.HighlightText);
+ imageloaded = icon.IsPreviewLoaded;
+ return true;
+ }
+ return false;
+ }
+
+ internal void Draw(Graphics g, Image bmp, int x, int y, int w, int h, bool selected)
+ {
+ if(bmp == null) return;
+
+ var iw = bmp.Width;
+ var ih = bmp.Height;
+
+ if(iw > w && iw >= ih)
+ {
+ ih = (int)Math.Floor(h * (ih / (float)iw));
+ iw = w;
+ }
+ else if(ih > h)
+ {
+ iw = (int)Math.Floor(w * (iw / (float)ih));
+ ih = h;
+ }
+
+ int ix = (iw < w ? x + (w - iw) / 2 : x + 1);
+ int iy = (ih < h ? y + (h - ih) / 2 : y + 1);
+
+ // Pick colors and brushes
+ Brush bgbrush, fgbrush, selectedbgbrush, selectionbrush;
+ Color bgcolor;
+ Pen selection;
+ if(General.Settings.BlackBrowsers)
+ {
+ bgcolor = Color.Black;
+ bgbrush = Brushes.Black;
+ fgbrush = Brushes.White;
+ selectedbgbrush = Brushes.Gray;
+ selection = Pens.Red;
+ selectionbrush = Brushes.Red;
}
else
{
- // Normal
- backcolor = new SolidBrush(base.ListView.BackColor);
- forecolor = new SolidBrush(base.ListView.ForeColor);
+ bgcolor = SystemColors.Window;
+ bgbrush = SystemBrushes.Window;
+ fgbrush = SystemBrushes.ControlText;
+ selectedbgbrush = SystemBrushes.ActiveCaption;
+ selection = SystemPens.HotTrack;
+ selectionbrush = SystemBrushes.HotTrack;
}
- // Draw!
- g.FillRectangle(backcolor, bounds);
- Icon.DrawPreview(g, imagerect.Location);
- g.DrawString(Text, this.ListView.Font, forecolor, textpos, format);
+ // Item bg
+ g.FillRectangle(bgbrush, x - 3, y - 3, w + 6, h + 10 + SystemFonts.MessageBoxFont.Height);
- //mxd. Dispose brushes
- backcolor.Dispose();
- forecolor.Dispose();
+ // Selected image bg
+ if(selected) g.FillRectangle(selectedbgbrush, x - 1, y - 1, w + 2, h + 2);
- //mxd. Draw size label?
- if(General.Settings.ShowTextureSizes && !string.IsNullOrEmpty(imagesize))
+ // Image
+ g.DrawImage(bmp, ix, iy, iw, ih);
+
+ // Frame
+ if(selected)
{
- // Setup
- using(Font sizefont = new Font(this.ListView.Font.FontFamily, this.ListView.Font.SizeInPoints - 1))
- {
- textsize = g.MeasureString(imagesize, sizefont, bounds.Width * 2);
- textpos = new PointF(bounds.Left + textsize.Width / 2, bounds.Top + 1);
- imagerect = new Rectangle(bounds.Left + 1, bounds.Top + 1, (int)textsize.Width, (int)textsize.Height);
-
- // Draw
- using(SolidBrush labelbg = new SolidBrush(Color.FromArgb(196, base.ListView.ForeColor)))
- {
- g.FillRectangle(labelbg, imagerect);
- }
- using(SolidBrush labelcolor = new SolidBrush(base.ListView.BackColor))
- {
- g.DrawString(imagesize, sizefont, labelcolor, textpos, format);
- }
- }
+ g.DrawRectangle(selection, x - 1, y - 1, w + 1, h + 1);
+ g.DrawRectangle(selection, x - 2, y - 2, w + 3, h + 3);
+ }
+ else
+ {
+ g.DrawRectangle(Pens.Gray, x - 2, y - 2, w + 3, h + 3);
}
- }
- // This brightens or darkens a color
- private static Color AdjustedColor(Color c, float amount)
- {
- Color4 cc = new Color4(c);
-
- // Adjust color
- cc.Red = Saturate((cc.Red * (1f + amount)) + (amount * 0.5f));
- cc.Green = Saturate((cc.Green * (1f + amount)) + (amount * 0.5f));
- cc.Blue = Saturate((cc.Blue * (1f + amount)) + (amount * 0.5f));
-
- // Return result
- return Color.FromArgb(cc.ToArgb());
- }
+ // Image name
+ g.DrawString(TextureName, SystemFonts.MessageBoxFont, (selected ? selectionbrush : fgbrush), x - 2, y + h + 3);
- // This clamps a value between 0 and 1
- private static float Saturate(float v)
- {
- if(v < 0f) return 0f; else if(v > 1f) return 1f; else return v;
- }
+ // Image size
+ if(General.Settings.ShowTextureSizes && icon.IsPreviewLoaded && itemtype == ImageBrowserItemType.IMAGE)
+ {
+ string imagesize = Math.Abs(icon.ScaledWidth) + "x" + Math.Abs(icon.ScaledHeight);
+ SizeF textsize = g.MeasureString(imagesize, SystemFonts.MessageBoxFont);
+ textsize.Width += 2;
+ textsize.Height -= 2;
- //mxd
- private void UpdateName()
- {
- Text = (showfullname ? Icon.DisplayName : Icon.ShortName);
- if(General.Settings.ShowTextureSizes && Icon.IsPreviewLoaded)
- imagesize = Math.Abs(Icon.ScaledWidth) + "x" + Math.Abs(Icon.ScaledHeight);
+ // Draw bg
+ using(Brush bg = new SolidBrush(Color.FromArgb(192, bgcolor)))
+ {
+ g.FillRectangle(bg, x, y, textsize.Width, textsize.Height);
+ }
+
+ // Draw text
+ g.DrawString(imagesize, SystemFonts.MessageBoxFont, (selected ? selectionbrush : fgbrush), x, y - 1);
+ }
}
// Comparer
public int CompareTo(ImageBrowserItem other)
{
- return this.Text.ToUpperInvariant().CompareTo(other.Text.ToUpperInvariant());
+ if(itemtype != other.itemtype) return ((int)itemtype).CompareTo((int)other.itemtype);
+ return this.TextureName.ToUpperInvariant().CompareTo(other.TextureName.ToUpperInvariant());
}
#endregion
diff --git a/Source/Core/Controls/ImageSelectorControl.Designer.cs b/Source/Core/Controls/ImageSelectorControl.Designer.cs
index 90e45cff..dd3eebed 100644
--- a/Source/Core/Controls/ImageSelectorControl.Designer.cs
+++ b/Source/Core/Controls/ImageSelectorControl.Designer.cs
@@ -30,7 +30,7 @@ namespace CodeImp.DoomBuilder.Controls
{
this.components = new System.ComponentModel.Container();
this.preview = new System.Windows.Forms.Panel();
- this.labelSize = new System.Windows.Forms.Label();
+ this.labelSize = new CodeImp.DoomBuilder.Controls.TransparentLabel();
this.timer = new System.Windows.Forms.Timer(this.components);
this.tooltip = new System.Windows.Forms.ToolTip(this.components);
this.togglefullname = new System.Windows.Forms.Button();
@@ -137,7 +137,7 @@ namespace CodeImp.DoomBuilder.Controls
protected System.Windows.Forms.Panel preview;
protected CodeImp.DoomBuilder.Controls.AutoSelectTextbox name;
- private System.Windows.Forms.Label labelSize;
+ private CodeImp.DoomBuilder.Controls.TransparentLabel labelSize;
protected System.Windows.Forms.Timer timer;
private System.Windows.Forms.ToolTip tooltip;
private ConfigurablePictureBox imagebox;
diff --git a/Source/Core/Controls/ImageSelectorControl.cs b/Source/Core/Controls/ImageSelectorControl.cs
index 46f39d46..40fcf8e7 100644
--- a/Source/Core/Controls/ImageSelectorControl.cs
+++ b/Source/Core/Controls/ImageSelectorControl.cs
@@ -40,14 +40,12 @@ namespace CodeImp.DoomBuilder.Controls
private ImageData image; //mxd
private string previousimagename; //mxd
protected bool multipletextures; //mxd
- protected bool usepreviews = true; //mxd
#endregion
#region ================== Properties
public string TextureName { get { return name.Text; } set { name.Text = value; } }
- public bool UsePreviews { get { return usepreviews; } set { usepreviews = value; } } //mxd
[Browsable(false)]
public bool MultipleTextures { get { return multipletextures; } set { multipletextures = value; } }
@@ -68,7 +66,7 @@ namespace CodeImp.DoomBuilder.Controls
{
// set the max length of texture names
name.MaxLength = General.Map.Config.MaxTextureNameLength;
- if(General.Settings.CapitalizeTextureNames) this.name.CharacterCasing = CharacterCasing.Upper; //mxd
+ if(!General.Map.Options.UseLongTextureNames) this.name.CharacterCasing = CharacterCasing.Upper; //mxd
labelSize.BackColor = Color.FromArgb(196, labelSize.BackColor);
}
@@ -101,7 +99,12 @@ namespace CodeImp.DoomBuilder.Controls
switch(button)
{
case MouseButtons.Right: name.Text = "-"; break;
- case MouseButtons.Left: name.Text = BrowseImage(name.Text); break;
+ case MouseButtons.Left:
+ // We need to change CharacterCasing before applying the text, so let's hack around a bit...
+ string newname = BrowseImage(name.Text);
+ name.CharacterCasing = (IsLongTextureName(newname) ? CharacterCasing.Normal : CharacterCasing.Upper);
+ name.Text = newname;
+ break;
}
}
@@ -155,7 +158,16 @@ namespace CodeImp.DoomBuilder.Controls
private void togglefullname_Click(object sender, EventArgs e)
{
// Toggle between short and full name
- name.Text = (name.Text == image.ShortName ? image.Name : image.ShortName);
+ if(string.Compare(name.Text, image.ShortName, StringComparison.OrdinalIgnoreCase) == 0)
+ {
+ name.CharacterCasing = CharacterCasing.Normal;
+ name.Text = image.Name;
+ }
+ else
+ {
+ name.CharacterCasing = CharacterCasing.Upper;
+ name.Text = image.ShortName;
+ }
// Update icon and tooltip
UpdateToggleImageNameButton(image);
@@ -208,10 +220,26 @@ namespace CodeImp.DoomBuilder.Controls
labelSize.Text = (width > 0 && height > 0) ? width + "x" + height : string.Empty;
ImageSelectorControl_EnabledChanged(this, EventArgs.Empty);
}
+
+ //mxd
+ private bool IsLongTextureName(string imagename)
+ {
+ if(!General.Map.Config.UseLongTextureNames || string.IsNullOrEmpty(imagename) || imagename == "-")
+ return false;
+
+ ImageData texture = GetImageData(imagename);
+ if(texture == null || !texture.HasLongName) return false;
+
+ return string.Compare(imagename, texture.ShortName, StringComparison.OrdinalIgnoreCase) != 0;
+ }
+
// This must determine and return the image to show
protected abstract Image FindImage(string imagename);
+ //mxd. This gets ImageData by name...
+ protected abstract ImageData GetImageData(string imagename);
+
// This must show the image browser and return the selected texture name
protected abstract string BrowseImage(string imagename);
@@ -228,7 +256,7 @@ namespace CodeImp.DoomBuilder.Controls
// Update icon and tooltip
togglefullname.Visible = true;
- if(image.ShortName == name.Text)
+ if(string.Compare(image.ShortName, name.Text, StringComparison.OrdinalIgnoreCase) == 0)
{
togglefullname.Image = Properties.Resources.Expand;
tooltip.SetToolTip(togglefullname, "Switch to full name");
diff --git a/Source/Core/Controls/ImageSelectorPanel.cs b/Source/Core/Controls/ImageSelectorPanel.cs
new file mode 100644
index 00000000..0cb32763
--- /dev/null
+++ b/Source/Core/Controls/ImageSelectorPanel.cs
@@ -0,0 +1,645 @@
+#region ================== Namespaces
+
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Drawing.Drawing2D;
+using System.Drawing.Imaging;
+using System.Linq;
+using System.Windows.Forms;
+
+#endregion
+
+namespace CodeImp.DoomBuilder.Controls
+{
+ //mxd. Based on (but heavily reworked since) TextureListPanel from Sledge (https://github.com/LogicAndTrick/sledge)
+ internal class ImageSelectorPanel : Panel
+ {
+ #region ================== Constants
+
+ internal const string DEFAULT_GROUP = "[DEFAULT_GROUP]";
+
+ #endregion
+
+ #region ================== Variables
+
+ private VScrollBar scrollbar;
+ private List items;
+ private List selection;
+ private List rectangles;
+ private ImageBrowserItem lastselecteditem;
+ private int imagesize = 128;
+ private string title;
+ private int titleheight = SystemFonts.MessageBoxFont.Height + 6;
+
+ //mxd. Tooltips
+ private ToolTip tooltip;
+ private Point lasttooltippos;
+ private const int tooltipreshowdistance = 48;
+
+ //mxd. Textures cache
+ private static Dictionary> texturecache = new Dictionary>(); // >
+
+ // Selection
+ private bool allowselection;
+ private bool allowmultipleselection;
+
+ #endregion
+
+ #region ================== Event handlers
+
+ public delegate void ItemSelectedEventHandler(object sender, ImageBrowserItem item);
+ public delegate void SelectionChangedEventHandler(object sender, List selection);
+
+ /*public event ItemSelectedEventHandler ItemSelected;
+ private void OnItemSelected(ImageBrowserItem item)
+ {
+ if(ItemSelected != null) ItemSelected(this, item);
+ }*/
+
+ public event SelectionChangedEventHandler SelectionChanged;
+ private void OnSelectionChanged(List selection)
+ {
+ if(SelectionChanged != null) SelectionChanged(this, selection);
+ }
+
+ public event ItemSelectedEventHandler ItemDoubleClicked;
+ private void OnItemDoubleClicked(ImageBrowserItem item)
+ {
+ if(ItemDoubleClicked != null) ItemDoubleClicked(this, item);
+ }
+
+ #endregion
+
+ #region ================== Properties
+
+ public bool HideSelection
+ {
+ get { return !allowselection; }
+ set
+ {
+ allowselection = !value;
+ if(!allowselection && selection.Count > 0)
+ {
+ selection.Clear();
+ Refresh();
+ }
+ }
+ }
+
+ public bool MultiSelect
+ {
+ get { return allowmultipleselection; }
+ set
+ {
+ allowmultipleselection = value;
+ if(!allowmultipleselection && selection.Count > 0)
+ {
+ var first = selection[0];
+ selection.Clear();
+ selection.Add(first);
+ Refresh();
+ }
+ }
+ }
+
+ public int ImageSize
+ {
+ get { return imagesize; }
+ set
+ {
+ imagesize = value;
+ UpdateRectangles();
+ if(selection.Count > 0) ScrollToItem(selection[0]);
+ }
+ }
+
+ public List Items { get { return items; } }
+ public List SelectedItems { get { return selection; } }
+ public string Title { get { return title; } set { title = value; } }
+
+ #endregion
+
+ #region ================== Constructor / Disposer
+
+ public ImageSelectorPanel()
+ {
+ VScroll = true;
+ AutoScroll = true;
+ DoubleBuffered = true;
+
+ scrollbar = new VScrollBar { Dock = DockStyle.Right };
+ scrollbar.ValueChanged += (sender, e) => Refresh();
+ tooltip = new ToolTip(); //mxd
+ items = new List();
+ selection = new List();
+ imagesize = 128;
+ rectangles = new List();
+ title = "Default group";
+
+ Controls.Add(scrollbar);
+ }
+
+ protected override void Dispose(bool disposing)
+ {
+ if(disposing) Clear();
+ base.Dispose(disposing);
+ }
+
+ #endregion
+
+ #region ================== Add/Remove/Get Textures
+
+ //mxd
+ public void Clear()
+ {
+ selection.Clear();
+ items.Clear();
+ lastselecteditem = null;
+ rectangles.Clear();
+
+ OnSelectionChanged(selection);
+ Refresh();
+ }
+
+ //mxd
+ public void ClearSelection()
+ {
+ selection.Clear();
+ lastselecteditem = null;
+
+ OnSelectionChanged(selection);
+ Refresh();
+ }
+
+ public void SetItems(IEnumerable items)
+ {
+ this.items.Clear();
+ lastselecteditem = null;
+ selection.Clear();
+ this.items.AddRange(items);
+
+ OnSelectionChanged(selection);
+ UpdateRectangles();
+ }
+
+ public void SetSelectedItem(ImageBrowserItem item)
+ {
+ SetSelectedItems(new List { item } );
+ }
+
+ public void SetSelectedItems(List items)
+ {
+ selection.Clear();
+ if(items.Count > 0)
+ {
+ selection.AddRange(items);
+ ScrollToItem(items[0]); //mxd
+ Refresh(); //mxd
+ }
+ OnSelectionChanged(selection);
+ }
+
+ public void ScrollToItem(ImageBrowserItem item)
+ {
+ int index = items.IndexOf(item);
+ if(index < 0) return;
+
+ Rectangle rec = rectangles[index];
+
+ //mxd. Already visible?
+ int ymin = scrollbar.Value - titleheight;
+ int ymax = ymin + this.ClientRectangle.Height + titleheight;
+ if(rec.Top - 3 >= ymin && rec.Bottom + 3 <= ymax) return;
+
+ int yscroll = Math.Max(0, Math.Min(rec.Top - titleheight - 3, scrollbar.Maximum - ClientRectangle.Height));
+ scrollbar.Value = yscroll;
+ Refresh();
+ }
+
+ public void SelectNextItem(SearchDirectionHint dir)
+ {
+ if(!allowselection) return;
+
+ if(selection.Count == 0)
+ {
+ if(items.Count > 0) SetSelectedItem(items[0]);
+ return;
+ }
+
+ int targetindex = items.IndexOf(selection[0]);
+ Rectangle rect = rectangles[targetindex];
+ int index, newindex, tx, cx, cy;
+
+ switch(dir)
+ {
+ case SearchDirectionHint.Right:
+ // Just select the next item
+ if(targetindex < items.Count - 1) SetSelectedItem(items[targetindex + 1]);
+ break;
+
+ case SearchDirectionHint.Left:
+ // Just select the previous item
+ if(targetindex > 0) SetSelectedItem(items[targetindex - 1]);
+ break;
+
+ case SearchDirectionHint.Up:
+ // Skip current row...
+ index = targetindex - 1;
+ if(index < 0) break;
+ while(index > 0)
+ {
+ if(rectangles[index].Y != rect.Y) break;
+ index--;
+ }
+
+ // Check upper row for best match
+ tx = rect.X + rect.Width / 2;
+ cx = int.MaxValue;
+ cy = rectangles[index].Y;
+ newindex = int.MaxValue;
+
+ while(index > 0 && rectangles[index].Y == cy)
+ {
+ int ccx = Math.Abs(rectangles[index].X + rectangles[index].Width / 2 - tx);
+ if(ccx < cx)
+ {
+ cx = ccx;
+ newindex = index;
+ }
+ index--;
+ }
+
+ // Select item
+ if(newindex != int.MaxValue) SetSelectedItem(items[newindex]);
+ break;
+
+ case SearchDirectionHint.Down:
+ // Skip current row...
+ index = targetindex + 1;
+ if(index > rectangles.Count - 1) break;
+ while(index < rectangles.Count - 1)
+ {
+ if(rectangles[index].Y != rect.Y) break;
+ index++;
+ }
+
+ // Check upper row for best match
+ tx = rect.X + rect.Width / 2;
+ cx = int.MaxValue;
+ cy = rectangles[index].Y;
+ newindex = int.MaxValue;
+
+ while(index < rectangles.Count - 1 && rectangles[index].Y == cy)
+ {
+ int ccx = Math.Abs(rectangles[index].X + rectangles[index].Width / 2 - tx);
+ if(ccx < cx)
+ {
+ cx = ccx;
+ newindex = index;
+ }
+ index++;
+ }
+
+ // Select item
+ if(newindex != int.MaxValue) SetSelectedItem(items[newindex]);
+ break;
+ }
+ }
+
+ protected override void OnMouseDoubleClick(MouseEventArgs e)
+ {
+ base.OnMouseDoubleClick(e);
+ if(General.Interface.CtrlState || General.Interface.ShiftState || selection.Count != 1)
+ return;
+
+ int index = GetIndexAt(e.X, scrollbar.Value + e.Y);
+ if(index == -1) return;
+
+ OnItemDoubleClicked(items[index]);
+ }
+
+ protected override void OnMouseDown(MouseEventArgs e)
+ {
+ base.OnMouseDown(e);
+ this.Focus();
+
+ if(!allowselection) return;
+ if(!allowmultipleselection || !General.Interface.CtrlState)
+ selection.Clear();
+
+ int x = e.X;
+ int y = scrollbar.Value + e.Y;
+
+ int clickedIndex = GetIndexAt(x, y);
+ var item = (clickedIndex >= 0 && clickedIndex < items.Count ? items[clickedIndex] : null);
+
+ if(item == null)
+ {
+ selection.Clear();
+ }
+ else if(allowmultipleselection && General.Interface.CtrlState && selection.Contains(item))
+ {
+ selection.Remove(item);
+ lastselecteditem = null;
+ }
+ else if(allowmultipleselection && General.Interface.ShiftState && lastselecteditem != null)
+ {
+ int bef = items.IndexOf(lastselecteditem);
+ var start = Math.Min(bef, clickedIndex);
+ var count = Math.Abs(clickedIndex - bef) + 1;
+ selection.AddRange(items.GetRange(start, count).Where(i => !selection.Contains(i)));
+ }
+ else
+ {
+ selection.Add(item);
+ lastselecteditem = item;
+ }
+
+ OnSelectionChanged(selection);
+ Refresh();
+ }
+
+ protected override void OnMouseEnter(EventArgs e)
+ {
+ Focus();
+ base.OnMouseEnter(e);
+ }
+
+ //mxd
+ protected override void OnMouseMove(MouseEventArgs e)
+ {
+ base.OnMouseMove(e);
+
+ int index = GetIndexAt(e.X, scrollbar.Value + e.Y);
+ if(index == -1 || items[index].ItemType != ImageBrowserItemType.IMAGE || string.IsNullOrEmpty(items[index].ToolTip))
+ {
+ if(tooltip.Active) tooltip.Hide(this);
+ }
+ else if(!tooltip.Active || tooltip.GetToolTip(this) != items[index].ToolTip
+ || Math.Abs(lasttooltippos.X - e.Location.X) > tooltipreshowdistance
+ || Math.Abs(lasttooltippos.Y - e.Location.Y) > tooltipreshowdistance)
+ {
+ Point pos = new Point(e.Location.X, e.Location.Y + Cursor.Size.Height + 4);
+ tooltip.Show(items[index].ToolTip, this, pos, 999999);
+ lasttooltippos = e.Location;
+ }
+ }
+
+ public int GetIndexAt(int x, int y)
+ {
+ const int pad = 3;
+ int font = 4 + SystemFonts.MessageBoxFont.Height;
+
+ for(var i = 0; i < rectangles.Count; i++)
+ {
+ var rec = rectangles[i];
+ if(rec.Left - pad <= x
+ && rec.Right + pad >= x
+ && rec.Top - pad <= y
+ && rec.Bottom + pad + font >= y)
+ {
+ return i;
+ }
+ }
+
+ return -1;
+ }
+
+ #endregion
+
+ #region ================== Scrolling
+
+ private void ScrollByAmount(int value)
+ {
+ int newvalue = Math.Max(0, scrollbar.Value + value);
+ scrollbar.Value = Math.Min(newvalue, Math.Max(0, scrollbar.Maximum - ClientRectangle.Height));
+ }
+
+ protected override void OnMouseWheel(MouseEventArgs e)
+ {
+ base.OnMouseWheel(e);
+ ScrollByAmount(scrollbar.SmallChange * (e.Delta / -120));
+ }
+
+ //mxd. Otherwise arrow keys won't be handled by OnKeyDown
+ protected override bool IsInputKey(Keys keyData)
+ {
+ switch(keyData)
+ {
+ case Keys.Right: case Keys.Left:
+ case Keys.Up: case Keys.Down:
+ case Keys.Return: return true;
+ }
+
+ return base.IsInputKey(keyData);
+ }
+
+ protected override void OnKeyDown(KeyEventArgs e)
+ {
+ ProcessKeyDown(e);
+ base.OnKeyDown(e);
+ }
+
+ internal bool ProcessKeyDown(KeyEventArgs e)
+ {
+ switch(e.KeyCode)
+ {
+ //mxd. Cursor keys
+ case Keys.Left: SelectNextItem(SearchDirectionHint.Left); return true;
+ case Keys.Right: SelectNextItem(SearchDirectionHint.Right); return true;
+ case Keys.Up: SelectNextItem(SearchDirectionHint.Up); return true;
+ case Keys.Down: SelectNextItem(SearchDirectionHint.Down); return true;
+
+ case Keys.PageDown: ScrollByAmount(scrollbar.LargeChange); return true;
+ case Keys.PageUp: ScrollByAmount(-scrollbar.LargeChange); return true;
+ case Keys.End: ScrollByAmount(int.MaxValue); return true;
+ case Keys.Home: ScrollByAmount(-int.MaxValue); return true;
+
+ case Keys.Enter:
+ if(selection.Count > 0)
+ {
+ OnItemDoubleClicked(selection[0]);
+ return true;
+ }
+ break;
+
+ }
+
+ return false;
+ }
+
+ /*protected override void OnMouseEnter(EventArgs e)
+ {
+ Focus();
+ base.OnMouseEnter(e);
+ }*/
+
+ #endregion
+
+ #region ================== Updating Rectangles & Dimensions
+
+ protected override void OnResize(EventArgs e)
+ {
+ base.OnResize(e);
+ UpdateRectangles();
+
+ //mxd
+ if(selection.Count > 0) ScrollToItem(selection[0]);
+ }
+
+ private void UpdateRectangles()
+ {
+ int w = ClientRectangle.Width - scrollbar.Width;
+ const int pad = 3;
+ int font = 4 + SystemFonts.MessageBoxFont.Height;
+ int cx = 0;
+ int cy = titleheight;
+ int my = 0;
+ rectangles.Clear();
+
+ foreach(var ti in items)
+ {
+ Image preview = GetPreview(ti, imagesize);
+
+ int rw = w - cx;
+ int wid = (imagesize > 0 ? imagesize : preview.Width) + pad + pad;
+ int hei = (imagesize > 0 ? imagesize : preview.Height) + pad + pad + font;
+
+ if(rw < wid)
+ {
+ // New row
+ cx = 0;
+ cy += my;
+ my = 0;
+ }
+
+ my = Math.Max(my, hei);
+ var rect = new Rectangle(cx + pad, cy + pad, wid - pad - pad, hei - pad - pad - font);
+ rectangles.Add(rect);
+ cx += wid;
+ }
+
+ if(rectangles.Count > 0)
+ {
+ scrollbar.Maximum = cy + my;
+ scrollbar.SmallChange = (imagesize > 0 ? imagesize : 128) + pad + pad + font;
+ scrollbar.LargeChange = ClientRectangle.Height;
+ scrollbar.Visible = (scrollbar.Maximum > ClientRectangle.Height);
+
+ if(scrollbar.Value > scrollbar.Maximum - ClientRectangle.Height)
+ {
+ scrollbar.Value = Math.Max(0, scrollbar.Maximum - ClientRectangle.Height);
+ }
+ }
+ else
+ {
+ scrollbar.Visible = false;
+ }
+
+ Refresh();
+ }
+
+ #endregion
+
+ #region ================== Rendering
+
+ protected override void OnPaint(PaintEventArgs e)
+ {
+ base.OnPaint(e);
+ DrawTextures(e.Graphics);
+ }
+
+ private void DrawTextures(Graphics g)
+ {
+ // Draw items
+ if(items.Count > 0)
+ {
+ int y = scrollbar.Value;
+ int height = ClientRectangle.Height - titleheight;
+
+ for(var i = 0; i < items.Count; i++)
+ {
+ Rectangle rec = rectangles[i];
+ if(rec.Bottom < y) continue;
+ if(rec.Top > y + height) break;
+
+ Image bmp = GetPreview(items[i], imagesize);
+ items[i].Draw(g, bmp, rec.X, rec.Y - y, rec.Width, rec.Height, selection.Contains(items[i]));
+ }
+ }
+
+ // Draw title on top of items
+ if(title != DEFAULT_GROUP)
+ {
+ // Draw group name bg
+ bool blackbrowsers = (General.Settings != null && General.Settings.BlackBrowsers);
+ Color bgcolor = (blackbrowsers ? Color.Gray : SystemColors.Control);
+ using(Brush bg = new SolidBrush(Color.FromArgb(192, bgcolor)))
+ {
+ int scrollwidth = (scrollbar.Visible ? scrollbar.Width : 0);
+ g.FillRectangle(bg, 2, 2, ClientRectangle.Width - scrollwidth - 4, SystemFonts.MessageBoxFont.Height);
+ }
+
+ // Draw group name
+ Brush fgbrush = (blackbrowsers ? Brushes.White : SystemBrushes.ControlText);
+ g.DrawString(title, SystemFonts.MessageBoxFont, fgbrush, 2, 2);
+ }
+ }
+
+ #endregion
+
+ #region ================== Image Caching
+
+ private static Image GetPreview(ImageBrowserItem item, int imagesize)
+ {
+ if(!item.IsPreviewLoaded) return item.Icon.GetPreview();
+ if(!texturecache.ContainsKey(imagesize)) texturecache.Add(imagesize, new Dictionary());
+
+ // Generate preview?
+ if(!texturecache[imagesize].ContainsKey(item.Icon.LongName))
+ {
+ Image img = item.Icon.GetPreview();
+
+ // Determine preview size
+ float scalex, scaley;
+ if(item.ItemType == ImageBrowserItemType.IMAGE)
+ {
+ scalex = (imagesize == 0 ? 1.0f : (imagesize / (float)img.Width));
+ scaley = (imagesize == 0 ? 1.0f :(imagesize / (float)img.Height));
+ }
+ else
+ {
+ // Don't upscale folder icons
+ scalex = (imagesize == 0 ? 1.0f : ((img.Width > imagesize) ? (imagesize / (float)img.Width) : 1.0f));
+ scaley = (imagesize == 0 ? 1.0f : ((img.Height > imagesize) ? (imagesize / (float)img.Height) : 1.0f));
+ }
+
+ float scale = Math.Min(scalex, scaley);
+ int previewwidth = (int)(img.Width * scale);
+ int previewheight = (int)(img.Height * scale);
+ if(previewwidth < 1) previewwidth = 1;
+ if(previewheight < 1) previewheight = 1;
+
+ // Make new image
+ Bitmap preview = new Bitmap(previewwidth, previewheight, PixelFormat.Format32bppArgb);
+ using(Graphics g = Graphics.FromImage(preview))
+ {
+ g.PageUnit = GraphicsUnit.Pixel;
+ g.InterpolationMode = InterpolationMode.NearestNeighbor;
+ g.PixelOffsetMode = PixelOffsetMode.None;
+
+ g.DrawImage(img, new Rectangle(0, 0, previewwidth, previewheight));
+ }
+
+ texturecache[imagesize][item.Icon.LongName] = preview;
+ }
+
+ // Get preview
+ return texturecache[imagesize][item.Icon.LongName];
+ }
+
+ #endregion
+ }
+}
diff --git a/Source/Core/Controls/LinedefInfoPanel.cs b/Source/Core/Controls/LinedefInfoPanel.cs
index 4c6cfb25..75942341 100644
--- a/Source/Core/Controls/LinedefInfoPanel.cs
+++ b/Source/Core/Controls/LinedefInfoPanel.cs
@@ -591,7 +591,7 @@ namespace CodeImp.DoomBuilder.Controls
private static void UpdateTexturePanel(Panel panel, string texturename, Label texturenamelabel, Label sizelabel, int maxlabelright, Panel image, int sizeref, bool extendedinfoshown, bool required)
{
// Set texture name
- texturenamelabel.Text = texturename;
+ texturenamelabel.Text = (texturename.Length > DataManager.CLASIC_IMAGE_NAME_LENGTH ? texturename : texturename.ToUpperInvariant());
// And image
DisplayTextureImage(image, sizelabel, texturename, required);
diff --git a/Source/Core/Controls/SectorInfoPanel.cs b/Source/Core/Controls/SectorInfoPanel.cs
index e114e7b6..400541b3 100644
--- a/Source/Core/Controls/SectorInfoPanel.cs
+++ b/Source/Core/Controls/SectorInfoPanel.cs
@@ -20,6 +20,7 @@ using System;
using System.Drawing;
using System.Globalization;
using System.Windows.Forms;
+using CodeImp.DoomBuilder.IO;
using CodeImp.DoomBuilder.Map;
using CodeImp.DoomBuilder.Data;
using CodeImp.DoomBuilder.Rendering;
@@ -67,8 +68,8 @@ namespace CodeImp.DoomBuilder.Controls
floor.Text = s.FloorHeight.ToString();
height.Text = sheight.ToString();
brightness.Text = s.Brightness.ToString();
- floorname.Text = s.FloorTexture;
- ceilingname.Text = s.CeilTexture;
+ floorname.Text = (s.FloorTexture.Length > DataManager.CLASIC_IMAGE_NAME_LENGTH ? s.FloorTexture : s.FloorTexture.ToUpperInvariant());
+ ceilingname.Text = (s.CeilTexture.Length > DataManager.CLASIC_IMAGE_NAME_LENGTH ? s.CeilTexture : s.CeilTexture.ToUpperInvariant());
//mxd. Set tags
if(s.Tags.Count > 1)
diff --git a/Source/Core/Controls/TextureSelectorControl.cs b/Source/Core/Controls/TextureSelectorControl.cs
index 9f5d580c..f2122be9 100644
--- a/Source/Core/Controls/TextureSelectorControl.cs
+++ b/Source/Core/Controls/TextureSelectorControl.cs
@@ -75,15 +75,19 @@ namespace CodeImp.DoomBuilder.Controls
if(string.IsNullOrEmpty(texture.FilePathName) || texture is UnknownImage) DisplayImageSize(0, 0); //mxd
else DisplayImageSize(texture.ScaledWidth, texture.ScaledHeight); //mxd
- if(usepreviews && !texture.IsPreviewLoaded) timer.Start(); //mxd
- else if(!texture.IsImageLoaded) texture.LoadImage(); //mxd. In some cases the image may never me loaded by the DataManager
+ if(!texture.IsPreviewLoaded) timer.Start(); //mxd
// Set the image
- // mxd. GetPreview() returns a copy of preview, GetBitmap() returns actual bitmap
- return (usepreviews ? texture.GetPreview() : new Bitmap(texture.GetBitmap()));
+ return texture.GetPreview();
}
}
+ //mxd. This gets ImageData by name...
+ protected override ImageData GetImageData(string imagename)
+ {
+ return General.Map.Data.GetTextureImage(imagename);
+ }
+
// This browses for a texture
protected override string BrowseImage(string imagename)
{
diff --git a/Source/Core/Controls/TransparentLabel.cs b/Source/Core/Controls/TransparentLabel.cs
new file mode 100644
index 00000000..a49c4d88
--- /dev/null
+++ b/Source/Core/Controls/TransparentLabel.cs
@@ -0,0 +1,28 @@
+using System;
+using System.Windows.Forms;
+
+namespace CodeImp.DoomBuilder.Controls
+{
+ //mxd. Label, which ignores mouse events
+ internal class TransparentLabel : Label
+ {
+ private const int WM_NCHITTEST = 0x0084;
+ private const int WM_MOUSEHOVER = 0x02A1;
+ private const int HTTRANSPARENT = -1;
+
+ protected override void WndProc(ref Message m)
+ {
+ switch(m.Msg)
+ {
+ case WM_NCHITTEST:
+ case WM_MOUSEHOVER:
+ m.Result = (IntPtr)HTTRANSPARENT;
+ break;
+
+ default:
+ base.WndProc(ref m);
+ break;
+ }
+ }
+ }
+}
diff --git a/Source/Core/Data/DataManager.cs b/Source/Core/Data/DataManager.cs
index 89d333ca..d2ff7663 100644
--- a/Source/Core/Data/DataManager.cs
+++ b/Source/Core/Data/DataManager.cs
@@ -120,6 +120,10 @@ namespace CodeImp.DoomBuilder.Data
private ImageData blacktexture; //mxd
private ImageData thingtexture; //mxd
+ //mxd. Texture Browser images
+ private ImageData foldertexture;
+ private ImageData folderuptexture;
+
//mxd. Sky textures
private CubeTexture skybox; // GZDoom skybox
@@ -180,6 +184,8 @@ namespace CodeImp.DoomBuilder.Data
public ImageData WhiteTexture { get { return whitetexture; } }
public ImageData BlackTexture { get { return blacktexture; } } //mxd
public ImageData ThingTexture { get { return thingtexture; } } //mxd
+ internal ImageData FolderTexture { get { return foldertexture; } } //mxd
+ internal ImageData FolderUpTexture { get { return folderuptexture; } } //mxd
public ImageData[] CommentTextures { get { return commenttextures; } } //mxd
internal CubeTexture SkyBox { get { return skybox; } } //mxd
public List ThingCategories { get { return thingcategories; } }
@@ -218,14 +224,20 @@ namespace CodeImp.DoomBuilder.Data
blacktexture.CreateTexture(); //mxd
unknownimage = new UnknownImage(Properties.Resources.UnknownImage); //mxd. There should be only one!
+ //mxd. Textures browser images
+ foldertexture = new ResourceImage("CodeImp.DoomBuilder.Resources.Folder96.png") { UseColorCorrection = false };
+ foldertexture.LoadImage();
+ folderuptexture = new ResourceImage("CodeImp.DoomBuilder.Resources.Folder96Up.png") { UseColorCorrection = false };
+ folderuptexture.LoadImage();
+
//mxd. Create comment icons
commenttextures = new ImageData[]
{
- new ResourceImage("CodeImp.DoomBuilder.Resources.CommentRegular.png"),
- new ResourceImage("CodeImp.DoomBuilder.Resources.CommentInfo.png"),
- new ResourceImage("CodeImp.DoomBuilder.Resources.CommentQuestion.png"),
- new ResourceImage("CodeImp.DoomBuilder.Resources.CommentProblem.png"),
- new ResourceImage("CodeImp.DoomBuilder.Resources.CommentSmile.png"),
+ new ResourceImage("CodeImp.DoomBuilder.Resources.CommentRegular.png") { UseColorCorrection = false },
+ new ResourceImage("CodeImp.DoomBuilder.Resources.CommentInfo.png") { UseColorCorrection = false },
+ new ResourceImage("CodeImp.DoomBuilder.Resources.CommentQuestion.png") { UseColorCorrection = false },
+ new ResourceImage("CodeImp.DoomBuilder.Resources.CommentProblem.png") { UseColorCorrection = false },
+ new ResourceImage("CodeImp.DoomBuilder.Resources.CommentSmile.png") { UseColorCorrection = false },
};
//mxd. Load comment icons
@@ -262,6 +274,10 @@ namespace CodeImp.DoomBuilder.Data
thingtexture = null; //mxd
unknownimage.Dispose(); //mxd
unknownimage = null; //mxd
+ foldertexture.Dispose(); //mxd
+ foldertexture = null; //mxd
+ folderuptexture.Dispose(); //mxd
+ folderuptexture = null; //mxd
for(int i = 0; i < commenttextures.Length; i++) //mxd
{
commenttextures[i].Dispose();
diff --git a/Source/Core/Data/FileImage.cs b/Source/Core/Data/FileImage.cs
index 0a59baa4..f4e3019a 100644
--- a/Source/Core/Data/FileImage.cs
+++ b/Source/Core/Data/FileImage.cs
@@ -129,17 +129,6 @@ namespace CodeImp.DoomBuilder.Data
this.longname = Lump.MakeLongName(this.name, uselongtexturenames);
this.filepathname = filepathname;
- this.level = virtualname.Split(new[] { Path.AltDirectorySeparatorChar }).Length - 1;
-
- if(General.Settings.CapitalizeTextureNames && !string.IsNullOrEmpty(this.displayname))
- {
- this.displayname = this.displayname.ToUpperInvariant();
- }
-
- if(this.displayname.Length > ImageBrowserItem.MAX_NAME_LENGTH)
- {
- this.displayname = this.displayname.Substring(0, ImageBrowserItem.MAX_NAME_LENGTH);
- }
}
// This loads the image
diff --git a/Source/Core/Data/ImageData.cs b/Source/Core/Data/ImageData.cs
index 5d640fb4..41dd4d94 100644
--- a/Source/Core/Data/ImageData.cs
+++ b/Source/Core/Data/ImageData.cs
@@ -58,7 +58,6 @@ namespace CodeImp.DoomBuilder.Data
protected bool ismasked; //mxd. If true, has pixels with zero alpha
protected bool hasLongName; //mxd. Texture name is longer than DataManager.CLASIC_IMAGE_NAME_LENGTH
protected bool hasPatchWithSameName; //mxd
- protected int level; //mxd. Folder depth of this item
//mxd. Hashing
private static int hashcounter;
@@ -121,7 +120,6 @@ namespace CodeImp.DoomBuilder.Data
public virtual float ScaledHeight { get { return (float)Math.Round(height * scale.y); } }
public virtual Vector2D Scale { get { return scale; } }
public bool WorldPanning { get { return worldpanning; } }
- public int Level { get { return level; } } //mxd
#endregion
@@ -534,15 +532,15 @@ namespace CodeImp.DoomBuilder.Data
else if(loadfailed)
{
// Draw error bitmap
- targetpos = new Point(targetpos.X + ((General.Map.Data.Previews.MaxImageWidth - Properties.Resources.Hourglass.Width) >> 1),
- targetpos.Y + ((General.Map.Data.Previews.MaxImageHeight - Properties.Resources.Hourglass.Height) >> 1));
+ targetpos = new Point(targetpos.X + ((PreviewManager.MAX_PREVIEW_SIZE - Properties.Resources.Hourglass.Width) >> 1),
+ targetpos.Y + ((PreviewManager.MAX_PREVIEW_SIZE - Properties.Resources.Hourglass.Height) >> 1));
target.DrawImageUnscaled(Properties.Resources.Failed, targetpos);
}
else
{
// Draw loading bitmap
- targetpos = new Point(targetpos.X + ((General.Map.Data.Previews.MaxImageWidth - Properties.Resources.Hourglass.Width) >> 1),
- targetpos.Y + ((General.Map.Data.Previews.MaxImageHeight - Properties.Resources.Hourglass.Height) >> 1));
+ targetpos = new Point(targetpos.X + ((PreviewManager.MAX_PREVIEW_SIZE - Properties.Resources.Hourglass.Width) >> 1),
+ targetpos.Y + ((PreviewManager.MAX_PREVIEW_SIZE - Properties.Resources.Hourglass.Height) >> 1));
target.DrawImageUnscaled(Properties.Resources.Hourglass, targetpos);
}
}
diff --git a/Source/Core/Data/PK3FileImage.cs b/Source/Core/Data/PK3FileImage.cs
index 043c0440..9ad7c6db 100644
--- a/Source/Core/Data/PK3FileImage.cs
+++ b/Source/Core/Data/PK3FileImage.cs
@@ -93,17 +93,6 @@ namespace CodeImp.DoomBuilder.Data
this.longname = Lump.MakeLongName(this.name);
this.virtualname = filepathname.Replace(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar);
this.filepathname = filepathname;
- this.level = virtualname.Split(new[] { Path.AltDirectorySeparatorChar }).Length - 1;
-
- if(General.Settings.CapitalizeTextureNames && !string.IsNullOrEmpty(this.displayname))
- {
- this.displayname = this.displayname.ToUpperInvariant();
- }
-
- if(this.displayname.Length > ImageBrowserItem.MAX_NAME_LENGTH)
- {
- this.displayname = this.displayname.Substring(0, ImageBrowserItem.MAX_NAME_LENGTH);
- }
}
// This loads the image
diff --git a/Source/Core/Data/PreviewManager.cs b/Source/Core/Data/PreviewManager.cs
index 9baa95d3..8e58ed00 100644
--- a/Source/Core/Data/PreviewManager.cs
+++ b/Source/Core/Data/PreviewManager.cs
@@ -34,16 +34,12 @@ namespace CodeImp.DoomBuilder.Data
private const PixelFormat IMAGE_FORMAT = PixelFormat.Format32bppArgb;
// Dimensions of a single preview image
- public static readonly int[] PREVIEW_SIZES = new[] { 48, 64, 80, 96, 112, 128 };
+ public const int MAX_PREVIEW_SIZE = 256; //mxd
#endregion
#region ================== Variables
- // Dimensions of a single preview image
- private readonly int maxpreviewwidth;
- private readonly int maxpreviewheight;
-
// Images
private List images;
@@ -57,10 +53,6 @@ namespace CodeImp.DoomBuilder.Data
#endregion
#region ================== Properties
-
- // Constants
- public int MaxImageWidth { get { return maxpreviewwidth; } }
- public int MaxImageHeight { get { return maxpreviewheight; } }
// Disposing
internal bool IsDisposed { get { return isdisposed; } }
@@ -84,8 +76,6 @@ namespace CodeImp.DoomBuilder.Data
// Initialize
images = new List();
imageque = new Queue();
- maxpreviewwidth = PREVIEW_SIZES[General.Settings.PreviewImageSize];
- maxpreviewheight = PREVIEW_SIZES[General.Settings.PreviewImageSize];
// We have no destructor
GC.SuppressFinalize(this);
@@ -131,8 +121,8 @@ namespace CodeImp.DoomBuilder.Data
}
// Determine preview size
- float scalex = (img.Width > maxpreviewwidth) ? (maxpreviewwidth / (float)imagewidth) : 1.0f;
- float scaley = (img.Height > maxpreviewheight) ? (maxpreviewheight / (float)imageheight) : 1.0f;
+ float scalex = (img.Width > MAX_PREVIEW_SIZE) ? (MAX_PREVIEW_SIZE / (float)imagewidth) : 1.0f;
+ float scaley = (img.Height > MAX_PREVIEW_SIZE) ? (MAX_PREVIEW_SIZE / (float)imageheight) : 1.0f;
float scale = Math.Min(scalex, scaley);
int previewwidth = (int)(imagewidth * scale);
int previewheight = (int)(imageheight * scale);
@@ -193,8 +183,8 @@ namespace CodeImp.DoomBuilder.Data
lock(images) { image = images[previewindex]; }
// Adjust offset for the size of the preview image
- targetpos.X += (maxpreviewwidth - image.Width) >> 1;
- targetpos.Y += (maxpreviewheight - image.Height) >> 1;
+ targetpos.X += (MAX_PREVIEW_SIZE - image.Width) >> 1;
+ targetpos.Y += (MAX_PREVIEW_SIZE - image.Height) >> 1;
// Draw from atlas to target
lock(syncroot)
diff --git a/Source/Core/Data/TEXTURESImage.cs b/Source/Core/Data/TEXTURESImage.cs
index cd9fbe15..fff29db5 100644
--- a/Source/Core/Data/TEXTURESImage.cs
+++ b/Source/Core/Data/TEXTURESImage.cs
@@ -58,7 +58,6 @@ namespace CodeImp.DoomBuilder.Data
//mxd
SetName(name);
this.virtualname = (!string.IsNullOrEmpty(virtualpath) ? virtualpath : "[TEXTURES]") + Path.AltDirectorySeparatorChar + this.name;
- this.level = virtualname.Split(new[] { Path.AltDirectorySeparatorChar }).Length - 1;
this.isFlat = isflat;
// We have no destructor
@@ -81,16 +80,6 @@ namespace CodeImp.DoomBuilder.Data
base.SetName(name);
- if(General.Settings.CapitalizeTextureNames && !string.IsNullOrEmpty(this.displayname))
- {
- this.displayname = this.displayname.ToUpperInvariant();
- }
-
- if(this.displayname.Length > ImageBrowserItem.MAX_NAME_LENGTH)
- {
- this.displayname = this.displayname.Substring(0, ImageBrowserItem.MAX_NAME_LENGTH);
- }
-
this.shortname = this.displayname.ToUpperInvariant();
if(this.shortname.Length > DataManager.CLASIC_IMAGE_NAME_LENGTH)
{
diff --git a/Source/Core/Properties/Resources.Designer.cs b/Source/Core/Properties/Resources.Designer.cs
index 35ba6881..84245c71 100644
--- a/Source/Core/Properties/Resources.Designer.cs
+++ b/Source/Core/Properties/Resources.Designer.cs
@@ -354,6 +354,20 @@ namespace CodeImp.DoomBuilder.Properties {
}
}
+ internal static System.Drawing.Bitmap Folder96 {
+ get {
+ object obj = ResourceManager.GetObject("Folder96", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
+ internal static System.Drawing.Bitmap Folder96Up {
+ get {
+ object obj = ResourceManager.GetObject("Folder96Up", resourceCulture);
+ return ((System.Drawing.Bitmap)(obj));
+ }
+ }
+
internal static System.Drawing.Bitmap FolderExplore {
get {
object obj = ResourceManager.GetObject("FolderExplore", resourceCulture);
diff --git a/Source/Core/Properties/Resources.resx b/Source/Core/Properties/Resources.resx
index e02f7ac0..437f6422 100644
--- a/Source/Core/Properties/Resources.resx
+++ b/Source/Core/Properties/Resources.resx
@@ -607,4 +607,10 @@
..\Resources\WarningLargeText.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+ ..\Resources\Folder96.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
+
+ ..\Resources\Folder96Up.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
+
\ No newline at end of file
diff --git a/Source/Core/Resources/Folder96.png b/Source/Core/Resources/Folder96.png
new file mode 100644
index 00000000..6e63908d
Binary files /dev/null and b/Source/Core/Resources/Folder96.png differ
diff --git a/Source/Core/Resources/Folder96Up.png b/Source/Core/Resources/Folder96Up.png
new file mode 100644
index 00000000..5f98530a
Binary files /dev/null and b/Source/Core/Resources/Folder96Up.png differ
diff --git a/Source/Core/Windows/LinedefEditForm.Designer.cs b/Source/Core/Windows/LinedefEditForm.Designer.cs
index 4f8163d8..aa9ef86e 100644
--- a/Source/Core/Windows/LinedefEditForm.Designer.cs
+++ b/Source/Core/Windows/LinedefEditForm.Designer.cs
@@ -407,7 +407,6 @@ namespace CodeImp.DoomBuilder.Windows
this.frontlow.Size = new System.Drawing.Size(83, 107);
this.frontlow.TabIndex = 6;
this.frontlow.TextureName = "";
- this.frontlow.UsePreviews = true;
this.frontlow.OnValueChanged += new System.EventHandler(this.frontlow_OnValueChanged);
//
// frontmid
@@ -419,7 +418,6 @@ namespace CodeImp.DoomBuilder.Windows
this.frontmid.Size = new System.Drawing.Size(83, 107);
this.frontmid.TabIndex = 5;
this.frontmid.TextureName = "";
- this.frontmid.UsePreviews = true;
this.frontmid.OnValueChanged += new System.EventHandler(this.frontmid_OnValueChanged);
//
// fronthigh
@@ -431,7 +429,6 @@ namespace CodeImp.DoomBuilder.Windows
this.fronthigh.Size = new System.Drawing.Size(83, 107);
this.fronthigh.TabIndex = 4;
this.fronthigh.TextureName = "";
- this.fronthigh.UsePreviews = true;
this.fronthigh.OnValueChanged += new System.EventHandler(this.fronthigh_OnValueChanged);
//
// frontTextureOffset
@@ -506,7 +503,6 @@ namespace CodeImp.DoomBuilder.Windows
this.backlow.Size = new System.Drawing.Size(83, 107);
this.backlow.TabIndex = 6;
this.backlow.TextureName = "";
- this.backlow.UsePreviews = true;
this.backlow.OnValueChanged += new System.EventHandler(this.backlow_OnValueChanged);
//
// backmid
@@ -518,7 +514,6 @@ namespace CodeImp.DoomBuilder.Windows
this.backmid.Size = new System.Drawing.Size(83, 107);
this.backmid.TabIndex = 5;
this.backmid.TextureName = "";
- this.backmid.UsePreviews = true;
this.backmid.OnValueChanged += new System.EventHandler(this.backmid_OnValueChanged);
//
// backhigh
@@ -530,7 +525,6 @@ namespace CodeImp.DoomBuilder.Windows
this.backhigh.Size = new System.Drawing.Size(83, 107);
this.backhigh.TabIndex = 4;
this.backhigh.TextureName = "";
- this.backhigh.UsePreviews = true;
this.backhigh.OnValueChanged += new System.EventHandler(this.backhigh_OnValueChanged);
//
// backTextureOffset
diff --git a/Source/Core/Windows/LinedefEditFormUDMF.Designer.cs b/Source/Core/Windows/LinedefEditFormUDMF.Designer.cs
index d731d563..2c38ab76 100644
--- a/Source/Core/Windows/LinedefEditFormUDMF.Designer.cs
+++ b/Source/Core/Windows/LinedefEditFormUDMF.Designer.cs
@@ -857,7 +857,6 @@ namespace CodeImp.DoomBuilder.Windows
this.frontlow.Size = new System.Drawing.Size(220, 189);
this.frontlow.TabIndex = 6;
this.frontlow.TextureName = "";
- this.frontlow.UsePreviews = false;
this.frontlow.OnValueChanged += new System.EventHandler(this.frontlow_OnValueChanged);
//
// frontmid
@@ -869,7 +868,6 @@ namespace CodeImp.DoomBuilder.Windows
this.frontmid.Size = new System.Drawing.Size(220, 189);
this.frontmid.TabIndex = 5;
this.frontmid.TextureName = "";
- this.frontmid.UsePreviews = false;
this.frontmid.OnValueChanged += new System.EventHandler(this.frontmid_OnValueChanged);
//
// fronthigh
@@ -881,7 +879,6 @@ namespace CodeImp.DoomBuilder.Windows
this.fronthigh.Size = new System.Drawing.Size(220, 189);
this.fronthigh.TabIndex = 4;
this.fronthigh.TextureName = "";
- this.fronthigh.UsePreviews = false;
this.fronthigh.OnValueChanged += new System.EventHandler(this.fronthigh_OnValueChanged);
//
// tabback
@@ -1285,7 +1282,6 @@ namespace CodeImp.DoomBuilder.Windows
this.backlow.Size = new System.Drawing.Size(220, 189);
this.backlow.TabIndex = 6;
this.backlow.TextureName = "";
- this.backlow.UsePreviews = false;
this.backlow.OnValueChanged += new System.EventHandler(this.backlow_OnValueChanged);
//
// backmid
@@ -1297,7 +1293,6 @@ namespace CodeImp.DoomBuilder.Windows
this.backmid.Size = new System.Drawing.Size(220, 189);
this.backmid.TabIndex = 5;
this.backmid.TextureName = "";
- this.backmid.UsePreviews = false;
this.backmid.OnValueChanged += new System.EventHandler(this.backmid_OnValueChanged);
//
// backhigh
@@ -1309,7 +1304,6 @@ namespace CodeImp.DoomBuilder.Windows
this.backhigh.Size = new System.Drawing.Size(220, 189);
this.backhigh.TabIndex = 4;
this.backhigh.TextureName = "";
- this.backhigh.UsePreviews = false;
this.backhigh.OnValueChanged += new System.EventHandler(this.backhigh_OnValueChanged);
//
// tabcomment
diff --git a/Source/Core/Windows/PreferencesForm.Designer.cs b/Source/Core/Windows/PreferencesForm.Designer.cs
index 5d5dce0a..b0188d67 100644
--- a/Source/Core/Windows/PreferencesForm.Designer.cs
+++ b/Source/Core/Windows/PreferencesForm.Designer.cs
@@ -38,9 +38,7 @@ namespace CodeImp.DoomBuilder.Windows
System.Windows.Forms.Label label27;
System.Windows.Forms.Label label29;
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PreferencesForm));
- this.capitalizetexturenames = new System.Windows.Forms.CheckBox();
this.blackbrowsers = new System.Windows.Forms.CheckBox();
- this.keepfilterfocused = new System.Windows.Forms.CheckBox();
this.checkforupdates = new System.Windows.Forms.CheckBox();
this.cbStoreEditTab = new System.Windows.Forms.CheckBox();
this.locatetexturegroup = new System.Windows.Forms.CheckBox();
@@ -59,13 +57,11 @@ namespace CodeImp.DoomBuilder.Windows
this.autoscrollspeed = new System.Windows.Forms.TrackBar();
this.autoscrollspeedlabel = new System.Windows.Forms.Label();
this.label15 = new System.Windows.Forms.Label();
- this.previewsize = new System.Windows.Forms.TrackBar();
- this.previewsizelabel = new System.Windows.Forms.Label();
- this.label12 = new System.Windows.Forms.Label();
this.label14 = new System.Windows.Forms.Label();
this.defaultviewmode = new System.Windows.Forms.ComboBox();
this.keyusedlabel = new System.Windows.Forms.Label();
this.colorsgroup1 = new System.Windows.Forms.GroupBox();
+ this.colorguidelines = new CodeImp.DoomBuilder.Controls.ColorControl();
this.color3dFloors = new CodeImp.DoomBuilder.Controls.ColorControl();
this.colorInfo = new CodeImp.DoomBuilder.Controls.ColorControl();
this.colorMD3 = new CodeImp.DoomBuilder.Controls.ColorControl();
@@ -213,7 +209,6 @@ namespace CodeImp.DoomBuilder.Windows
this.pasteoptions = new CodeImp.DoomBuilder.Controls.PasteOptionsControl();
this.toolTip1 = new System.Windows.Forms.ToolTip(this.components);
this.browseScreenshotsFolderDialog = new System.Windows.Forms.FolderBrowserDialog();
- this.colorguidelines = new CodeImp.DoomBuilder.Controls.ColorControl();
label7 = new System.Windows.Forms.Label();
label5 = new System.Windows.Forms.Label();
groupBox1 = new System.Windows.Forms.GroupBox();
@@ -226,7 +221,6 @@ namespace CodeImp.DoomBuilder.Windows
((System.ComponentModel.ISupportInitialize)(this.vertexScale)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.zoomfactor)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.autoscrollspeed)).BeginInit();
- ((System.ComponentModel.ISupportInitialize)(this.previewsize)).BeginInit();
this.colorsgroup1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.doublesidedalpha)).BeginInit();
this.tabs.SuspendLayout();
@@ -281,9 +275,7 @@ namespace CodeImp.DoomBuilder.Windows
//
// groupBox1
//
- groupBox1.Controls.Add(this.capitalizetexturenames);
groupBox1.Controls.Add(this.blackbrowsers);
- groupBox1.Controls.Add(this.keepfilterfocused);
groupBox1.Controls.Add(this.checkforupdates);
groupBox1.Controls.Add(this.cbStoreEditTab);
groupBox1.Controls.Add(this.locatetexturegroup);
@@ -302,9 +294,6 @@ namespace CodeImp.DoomBuilder.Windows
groupBox1.Controls.Add(this.autoscrollspeed);
groupBox1.Controls.Add(this.autoscrollspeedlabel);
groupBox1.Controls.Add(this.label15);
- groupBox1.Controls.Add(this.previewsize);
- groupBox1.Controls.Add(this.previewsizelabel);
- groupBox1.Controls.Add(this.label12);
groupBox1.Controls.Add(this.label14);
groupBox1.Controls.Add(this.defaultviewmode);
groupBox1.Location = new System.Drawing.Point(8, 8);
@@ -314,44 +303,20 @@ namespace CodeImp.DoomBuilder.Windows
groupBox1.TabStop = false;
groupBox1.Text = " Options ";
//
- // capitalizetexturenames
- //
- this.capitalizetexturenames.AutoSize = true;
- this.capitalizetexturenames.Location = new System.Drawing.Point(16, 350);
- this.capitalizetexturenames.Name = "capitalizetexturenames";
- this.capitalizetexturenames.Size = new System.Drawing.Size(140, 17);
- this.capitalizetexturenames.TabIndex = 11;
- this.capitalizetexturenames.Text = "Capitalize texture names";
- this.toolTip1.SetToolTip(this.capitalizetexturenames, "When enabled, texture names will be shown \r\nand saved as all caps\r\n(Doom Builder " +
- "2 behaviour)");
- this.capitalizetexturenames.UseVisualStyleBackColor = true;
- //
// blackbrowsers
//
this.blackbrowsers.AutoSize = true;
- this.blackbrowsers.Location = new System.Drawing.Point(16, 329);
+ this.blackbrowsers.Location = new System.Drawing.Point(16, 277);
this.blackbrowsers.Name = "blackbrowsers";
this.blackbrowsers.Size = new System.Drawing.Size(195, 17);
this.blackbrowsers.TabIndex = 10;
this.blackbrowsers.Text = "Black background in image browser";
this.blackbrowsers.UseVisualStyleBackColor = true;
//
- // keepfilterfocused
- //
- this.keepfilterfocused.AutoSize = true;
- this.keepfilterfocused.Location = new System.Drawing.Point(16, 308);
- this.keepfilterfocused.Name = "keepfilterfocused";
- this.keepfilterfocused.Size = new System.Drawing.Size(280, 17);
- this.keepfilterfocused.TabIndex = 9;
- this.keepfilterfocused.Text = "Keep Filter input focused when image browser is open";
- this.toolTip1.SetToolTip(this.keepfilterfocused, "When enabled, all key presses in \r\nimage browsers will be redirected \r\nto the Fil" +
- "ter textbox.");
- this.keepfilterfocused.UseVisualStyleBackColor = true;
- //
// checkforupdates
//
this.checkforupdates.AutoSize = true;
- this.checkforupdates.Location = new System.Drawing.Point(16, 413);
+ this.checkforupdates.Location = new System.Drawing.Point(16, 346);
this.checkforupdates.Name = "checkforupdates";
this.checkforupdates.Size = new System.Drawing.Size(160, 17);
this.checkforupdates.TabIndex = 14;
@@ -361,7 +326,7 @@ namespace CodeImp.DoomBuilder.Windows
// cbStoreEditTab
//
this.cbStoreEditTab.AutoSize = true;
- this.cbStoreEditTab.Location = new System.Drawing.Point(16, 392);
+ this.cbStoreEditTab.Location = new System.Drawing.Point(16, 323);
this.cbStoreEditTab.Name = "cbStoreEditTab";
this.cbStoreEditTab.Size = new System.Drawing.Size(203, 17);
this.cbStoreEditTab.TabIndex = 13;
@@ -371,7 +336,7 @@ namespace CodeImp.DoomBuilder.Windows
// locatetexturegroup
//
this.locatetexturegroup.AutoSize = true;
- this.locatetexturegroup.Location = new System.Drawing.Point(16, 287);
+ this.locatetexturegroup.Location = new System.Drawing.Point(16, 254);
this.locatetexturegroup.Name = "locatetexturegroup";
this.locatetexturegroup.Size = new System.Drawing.Size(267, 17);
this.locatetexturegroup.TabIndex = 8;
@@ -384,7 +349,7 @@ namespace CodeImp.DoomBuilder.Windows
//
this.recentFiles.BackColor = System.Drawing.SystemColors.Window;
this.recentFiles.LargeChange = 1;
- this.recentFiles.Location = new System.Drawing.Point(127, 193);
+ this.recentFiles.Location = new System.Drawing.Point(127, 156);
this.recentFiles.Maximum = 25;
this.recentFiles.Minimum = 8;
this.recentFiles.Name = "recentFiles";
@@ -397,7 +362,7 @@ namespace CodeImp.DoomBuilder.Windows
// labelRecentFiles
//
this.labelRecentFiles.AutoSize = true;
- this.labelRecentFiles.Location = new System.Drawing.Point(249, 205);
+ this.labelRecentFiles.Location = new System.Drawing.Point(249, 168);
this.labelRecentFiles.Name = "labelRecentFiles";
this.labelRecentFiles.Size = new System.Drawing.Size(13, 13);
this.labelRecentFiles.TabIndex = 48;
@@ -406,7 +371,7 @@ namespace CodeImp.DoomBuilder.Windows
// label25
//
this.label25.AutoSize = true;
- this.label25.Location = new System.Drawing.Point(31, 206);
+ this.label25.Location = new System.Drawing.Point(31, 169);
this.label25.Name = "label25";
this.label25.Size = new System.Drawing.Size(87, 13);
this.label25.TabIndex = 47;
@@ -416,7 +381,7 @@ namespace CodeImp.DoomBuilder.Windows
// vertexScaleLabel
//
this.vertexScaleLabel.AutoSize = true;
- this.vertexScaleLabel.Location = new System.Drawing.Point(249, 168);
+ this.vertexScaleLabel.Location = new System.Drawing.Point(249, 131);
this.vertexScaleLabel.Name = "vertexScaleLabel";
this.vertexScaleLabel.Size = new System.Drawing.Size(74, 13);
this.vertexScaleLabel.TabIndex = 45;
@@ -425,7 +390,7 @@ namespace CodeImp.DoomBuilder.Windows
// label22
//
this.label22.AutoSize = true;
- this.label22.Location = new System.Drawing.Point(26, 168);
+ this.label22.Location = new System.Drawing.Point(26, 131);
this.label22.Name = "label22";
this.label22.Size = new System.Drawing.Size(91, 13);
this.label22.TabIndex = 44;
@@ -436,7 +401,7 @@ namespace CodeImp.DoomBuilder.Windows
//
this.vertexScale.BackColor = System.Drawing.SystemColors.Window;
this.vertexScale.LargeChange = 1;
- this.vertexScale.Location = new System.Drawing.Point(127, 156);
+ this.vertexScale.Location = new System.Drawing.Point(127, 119);
this.vertexScale.Minimum = 1;
this.vertexScale.Name = "vertexScale";
this.vertexScale.Size = new System.Drawing.Size(116, 45);
@@ -448,7 +413,7 @@ namespace CodeImp.DoomBuilder.Windows
// cbSynchCameras
//
this.cbSynchCameras.AutoSize = true;
- this.cbSynchCameras.Location = new System.Drawing.Point(16, 371);
+ this.cbSynchCameras.Location = new System.Drawing.Point(16, 300);
this.cbSynchCameras.Name = "cbSynchCameras";
this.cbSynchCameras.Size = new System.Drawing.Size(294, 17);
this.cbSynchCameras.TabIndex = 12;
@@ -458,7 +423,7 @@ namespace CodeImp.DoomBuilder.Windows
// showtexturesizes
//
this.showtexturesizes.AutoSize = true;
- this.showtexturesizes.Location = new System.Drawing.Point(16, 266);
+ this.showtexturesizes.Location = new System.Drawing.Point(16, 231);
this.showtexturesizes.Name = "showtexturesizes";
this.showtexturesizes.Size = new System.Drawing.Size(208, 17);
this.showtexturesizes.TabIndex = 7;
@@ -468,7 +433,7 @@ namespace CodeImp.DoomBuilder.Windows
// scriptontop
//
this.scriptontop.AutoSize = true;
- this.scriptontop.Location = new System.Drawing.Point(16, 245);
+ this.scriptontop.Location = new System.Drawing.Point(16, 208);
this.scriptontop.Name = "scriptontop";
this.scriptontop.Size = new System.Drawing.Size(227, 17);
this.scriptontop.TabIndex = 6;
@@ -479,7 +444,7 @@ namespace CodeImp.DoomBuilder.Windows
//
this.zoomfactor.BackColor = System.Drawing.SystemColors.Window;
this.zoomfactor.LargeChange = 1;
- this.zoomfactor.Location = new System.Drawing.Point(127, 119);
+ this.zoomfactor.Location = new System.Drawing.Point(127, 82);
this.zoomfactor.Minimum = 1;
this.zoomfactor.Name = "zoomfactor";
this.zoomfactor.Size = new System.Drawing.Size(116, 45);
@@ -491,7 +456,7 @@ namespace CodeImp.DoomBuilder.Windows
// zoomfactorlabel
//
this.zoomfactorlabel.AutoSize = true;
- this.zoomfactorlabel.Location = new System.Drawing.Point(249, 131);
+ this.zoomfactorlabel.Location = new System.Drawing.Point(249, 94);
this.zoomfactorlabel.Name = "zoomfactorlabel";
this.zoomfactorlabel.Size = new System.Drawing.Size(27, 13);
this.zoomfactorlabel.TabIndex = 39;
@@ -500,7 +465,7 @@ namespace CodeImp.DoomBuilder.Windows
// label19
//
this.label19.AutoSize = true;
- this.label19.Location = new System.Drawing.Point(52, 131);
+ this.label19.Location = new System.Drawing.Point(52, 94);
this.label19.Name = "label19";
this.label19.Size = new System.Drawing.Size(67, 13);
this.label19.TabIndex = 38;
@@ -510,7 +475,7 @@ namespace CodeImp.DoomBuilder.Windows
//
this.autoscrollspeed.BackColor = System.Drawing.SystemColors.Window;
this.autoscrollspeed.LargeChange = 1;
- this.autoscrollspeed.Location = new System.Drawing.Point(127, 82);
+ this.autoscrollspeed.Location = new System.Drawing.Point(127, 45);
this.autoscrollspeed.Maximum = 5;
this.autoscrollspeed.Name = "autoscrollspeed";
this.autoscrollspeed.Size = new System.Drawing.Size(116, 45);
@@ -521,7 +486,7 @@ namespace CodeImp.DoomBuilder.Windows
// autoscrollspeedlabel
//
this.autoscrollspeedlabel.AutoSize = true;
- this.autoscrollspeedlabel.Location = new System.Drawing.Point(249, 94);
+ this.autoscrollspeedlabel.Location = new System.Drawing.Point(249, 57);
this.autoscrollspeedlabel.Name = "autoscrollspeedlabel";
this.autoscrollspeedlabel.Size = new System.Drawing.Size(21, 13);
this.autoscrollspeedlabel.TabIndex = 36;
@@ -530,43 +495,12 @@ namespace CodeImp.DoomBuilder.Windows
// label15
//
this.label15.AutoSize = true;
- this.label15.Location = new System.Drawing.Point(26, 94);
+ this.label15.Location = new System.Drawing.Point(26, 57);
this.label15.Name = "label15";
this.label15.Size = new System.Drawing.Size(91, 13);
this.label15.TabIndex = 35;
this.label15.Text = "Auto-scroll speed:";
//
- // previewsize
- //
- this.previewsize.BackColor = System.Drawing.SystemColors.Window;
- this.previewsize.LargeChange = 1;
- this.previewsize.Location = new System.Drawing.Point(127, 45);
- this.previewsize.Maximum = 5;
- this.previewsize.Name = "previewsize";
- this.previewsize.Size = new System.Drawing.Size(116, 45);
- this.previewsize.TabIndex = 1;
- this.previewsize.TickStyle = System.Windows.Forms.TickStyle.TopLeft;
- this.previewsize.Value = 5;
- this.previewsize.ValueChanged += new System.EventHandler(this.previewsize_ValueChanged);
- //
- // previewsizelabel
- //
- this.previewsizelabel.AutoSize = true;
- this.previewsizelabel.Location = new System.Drawing.Point(249, 57);
- this.previewsizelabel.Name = "previewsizelabel";
- this.previewsizelabel.Size = new System.Drawing.Size(54, 13);
- this.previewsizelabel.TabIndex = 33;
- this.previewsizelabel.Text = "128 x 128";
- //
- // label12
- //
- this.label12.AutoSize = true;
- this.label12.Location = new System.Drawing.Point(17, 57);
- this.label12.Name = "label12";
- this.label12.Size = new System.Drawing.Size(100, 13);
- this.label12.TabIndex = 32;
- this.label12.Text = "Preview image size:";
- //
// label14
//
this.label14.AutoSize = true;
@@ -666,6 +600,17 @@ namespace CodeImp.DoomBuilder.Windows
this.colorsgroup1.Text = " Colors ";
this.colorsgroup1.Visible = false;
//
+ // colorguidelines
+ //
+ this.colorguidelines.BackColor = System.Drawing.Color.Transparent;
+ this.colorguidelines.Label = "Guidelines:";
+ this.colorguidelines.Location = new System.Drawing.Point(15, 307);
+ this.colorguidelines.MaximumSize = new System.Drawing.Size(10000, 23);
+ this.colorguidelines.MinimumSize = new System.Drawing.Size(100, 23);
+ this.colorguidelines.Name = "colorguidelines";
+ this.colorguidelines.Size = new System.Drawing.Size(168, 23);
+ this.colorguidelines.TabIndex = 11;
+ //
// color3dFloors
//
this.color3dFloors.BackColor = System.Drawing.Color.Transparent;
@@ -1978,6 +1923,7 @@ namespace CodeImp.DoomBuilder.Windows
// scripttabwidth
//
this.scripttabwidth.AllowDecimal = false;
+ this.scripttabwidth.AllowExpressions = false;
this.scripttabwidth.AllowNegative = false;
this.scripttabwidth.AllowRelative = false;
this.scripttabwidth.ButtonStep = 2;
@@ -2405,17 +2351,6 @@ namespace CodeImp.DoomBuilder.Windows
//
this.browseScreenshotsFolderDialog.Description = "Select a Folder to Save Screenshots Into";
//
- // colorguidelines
- //
- this.colorguidelines.BackColor = System.Drawing.Color.Transparent;
- this.colorguidelines.Label = "Guidelines:";
- this.colorguidelines.Location = new System.Drawing.Point(15, 307);
- this.colorguidelines.MaximumSize = new System.Drawing.Size(10000, 23);
- this.colorguidelines.MinimumSize = new System.Drawing.Size(100, 23);
- this.colorguidelines.Name = "colorguidelines";
- this.colorguidelines.Size = new System.Drawing.Size(168, 23);
- this.colorguidelines.TabIndex = 11;
- //
// PreferencesForm
//
this.AcceptButton = this.apply;
@@ -2443,7 +2378,6 @@ namespace CodeImp.DoomBuilder.Windows
((System.ComponentModel.ISupportInitialize)(this.vertexScale)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.zoomfactor)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.autoscrollspeed)).EndInit();
- ((System.ComponentModel.ISupportInitialize)(this.previewsize)).EndInit();
this.colorsgroup1.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)(this.doublesidedalpha)).EndInit();
this.tabs.ResumeLayout(false);
@@ -2544,9 +2478,6 @@ namespace CodeImp.DoomBuilder.Windows
private System.Windows.Forms.CheckBox qualitydisplay;
private System.Windows.Forms.CheckBox visualbilinear;
private System.Windows.Forms.CheckBox classicbilinear;
- private System.Windows.Forms.TrackBar previewsize;
- private System.Windows.Forms.Label previewsizelabel;
- private System.Windows.Forms.Label label12;
private System.Windows.Forms.TrackBar autoscrollspeed;
private System.Windows.Forms.Label autoscrollspeedlabel;
private System.Windows.Forms.Label label15;
@@ -2647,7 +2578,6 @@ namespace CodeImp.DoomBuilder.Windows
private System.Windows.Forms.ComboBox scriptcolorpresets;
private System.Windows.Forms.Label label23;
private CodeImp.DoomBuilder.Controls.ColorControl colorproperties;
- private System.Windows.Forms.CheckBox keepfilterfocused;
private System.Windows.Forms.Label labelantialiasing;
private System.Windows.Forms.TrackBar antialiasing;
private System.Windows.Forms.Label labelanisotropicfiltering;
@@ -2661,7 +2591,6 @@ namespace CodeImp.DoomBuilder.Windows
private System.Windows.Forms.Label activethingsalphalabel;
private System.Windows.Forms.Label label31;
private System.Windows.Forms.TrackBar activethingsalpha;
- private System.Windows.Forms.CheckBox capitalizetexturenames;
private System.Windows.Forms.CheckBox blackbrowsers;
private System.Windows.Forms.GroupBox groupBox11;
private System.Windows.Forms.Label label28;
diff --git a/Source/Core/Windows/PreferencesForm.cs b/Source/Core/Windows/PreferencesForm.cs
index 194b9d5d..8da4ec2f 100644
--- a/Source/Core/Windows/PreferencesForm.cs
+++ b/Source/Core/Windows/PreferencesForm.cs
@@ -73,7 +73,6 @@ namespace CodeImp.DoomBuilder.Windows
vertexScale3D.Value = General.Clamp((int)(General.Settings.GZVertexScale3D * 10), vertexScale3D.Minimum, vertexScale3D.Maximum); //mxd
viewdistance.Value = General.Clamp((int)(General.Settings.ViewDistance / 200.0f), viewdistance.Minimum, viewdistance.Maximum);
invertyaxis.Checked = General.Settings.InvertYAxis;
- previewsize.Value = General.Clamp(General.Settings.PreviewImageSize, previewsize.Minimum, previewsize.Maximum);
autoscrollspeed.Value = General.Clamp(General.Settings.AutoScrollSpeed, autoscrollspeed.Minimum, autoscrollspeed.Maximum);
zoomfactor.Value = General.Clamp(General.Settings.ZoomFactor, zoomfactor.Minimum, zoomfactor.Maximum);
animatevisualselection.Checked = General.Settings.AnimateVisualSelection;
@@ -92,7 +91,6 @@ namespace CodeImp.DoomBuilder.Windows
//mxd
locatetexturegroup.Checked = General.Settings.LocateTextureGroup;
- keepfilterfocused.Checked = General.Settings.KeepTextureFilterFocused;
cbStoreEditTab.Checked = General.Settings.StoreSelectedEditTab;
checkforupdates.Checked = General.Settings.CheckForUpdates;
toolbar_gzdoom.Checked = General.Settings.GZToolbarGZDoom;
@@ -253,7 +251,6 @@ namespace CodeImp.DoomBuilder.Windows
scriptcolorpresets.SelectedIndex = 0;
blackbrowsers.Checked = General.Settings.BlackBrowsers;
- capitalizetexturenames.Checked = General.Settings.CapitalizeTextureNames; //mxd
classicbilinear.Checked = General.Settings.ClassicBilinear;
visualbilinear.Checked = General.Settings.VisualBilinear;
qualitydisplay.Checked = General.Settings.QualityDisplay;
@@ -291,7 +288,6 @@ namespace CodeImp.DoomBuilder.Windows
// Check if we need to reload the resources
reloadresources |= (General.Settings.ImageBrightness != imagebrightness.Value);
- reloadresources |= (General.Settings.PreviewImageSize != previewsize.Value);
// Apply interface
General.Settings.ImageBrightness = imagebrightness.Value;
@@ -306,7 +302,6 @@ namespace CodeImp.DoomBuilder.Windows
General.Settings.GZVertexScale3D = vertexScale3D.Value * 0.1f; //mxd
General.Settings.ViewDistance = viewdistance.Value * 200.0f;
General.Settings.InvertYAxis = invertyaxis.Checked;
- General.Settings.PreviewImageSize = previewsize.Value;
General.Settings.AutoScrollSpeed = autoscrollspeed.Value;
General.Settings.ZoomFactor = zoomfactor.Value;
General.Settings.AnimateVisualSelection = animatevisualselection.Checked;
@@ -326,7 +321,6 @@ namespace CodeImp.DoomBuilder.Windows
General.Settings.StoreSelectedEditTab = cbStoreEditTab.Checked; //mxd
General.Settings.CheckForUpdates = checkforupdates.Checked; //mxd
General.Settings.LocateTextureGroup = locatetexturegroup.Checked; //mxd
- General.Settings.KeepTextureFilterFocused = keepfilterfocused.Checked; //mxd
General.Settings.MaxRecentFiles = recentFiles.Value; //mxd
General.Settings.ScreenshotsPath = screenshotsfolderpath.Text.Trim(); //mxd
@@ -400,7 +394,6 @@ namespace CodeImp.DoomBuilder.Windows
General.Colors.CreateAssistColors();
General.Settings.BlackBrowsers = blackbrowsers.Checked;
- General.Settings.CapitalizeTextureNames = capitalizetexturenames.Checked; //mxd
General.Settings.ClassicBilinear = classicbilinear.Checked;
General.Settings.VisualBilinear = visualbilinear.Checked;
General.Settings.QualityDisplay = qualitydisplay.Checked;
@@ -478,12 +471,6 @@ namespace CodeImp.DoomBuilder.Windows
#endregion
#region ================== Interface Panel
-
- private void previewsize_ValueChanged(object sender, EventArgs e)
- {
- int size = PreviewManager.PREVIEW_SIZES[previewsize.Value];
- previewsizelabel.Text = size + " x " + size;
- }
private void fieldofview_ValueChanged(object sender, EventArgs e)
{
diff --git a/Source/Core/Windows/ScriptFindReplaceForm.Designer.cs b/Source/Core/Windows/ScriptFindReplaceForm.Designer.cs
index e1984e2a..0ca9a461 100644
--- a/Source/Core/Windows/ScriptFindReplaceForm.Designer.cs
+++ b/Source/Core/Windows/ScriptFindReplaceForm.Designer.cs
@@ -345,6 +345,7 @@ namespace CodeImp.DoomBuilder.Windows
this.ShowIcon = false;
this.ShowInTaskbar = false;
this.Text = "Find and Replace";
+ this.Shown += new System.EventHandler(this.ScriptFindReplaceForm_Shown);
this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.ScriptFindReplaceForm_FormClosing);
this.tabs.ResumeLayout(false);
this.tabfind.ResumeLayout(false);
diff --git a/Source/Core/Windows/ScriptFindReplaceForm.cs b/Source/Core/Windows/ScriptFindReplaceForm.cs
index 108af180..cb9c540c 100644
--- a/Source/Core/Windows/ScriptFindReplaceForm.cs
+++ b/Source/Core/Windows/ScriptFindReplaceForm.cs
@@ -363,6 +363,7 @@ namespace CodeImp.DoomBuilder.Windows
findbox.Items.AddRange(items);
}
findbox.SelectAll();
+ findbox.Focus();
findinbox.SelectedIndex = replaceinbox.SelectedIndex;
@@ -380,6 +381,7 @@ namespace CodeImp.DoomBuilder.Windows
replacefindbox.Items.AddRange(items);
}
replacefindbox.SelectAll();
+ replacefindbox.Focus();
replaceinbox.SelectedIndex = findinbox.SelectedIndex;
@@ -392,6 +394,14 @@ namespace CodeImp.DoomBuilder.Windows
}
}
+ //mxd. Focus text input
+ private void ScriptFindReplaceForm_Shown(object sender, EventArgs e)
+ {
+ if(tabs.SelectedTab == tabfind) findbox.Focus();
+ else if(tabs.SelectedTab == tabreplace) replacefindbox.Focus();
+ else throw new NotImplementedException("Unsupported tab type");
+ }
+
#endregion
}
}
\ No newline at end of file
diff --git a/Source/Core/Windows/SectorEditForm.Designer.cs b/Source/Core/Windows/SectorEditForm.Designer.cs
index 7f3c7d73..e8095ff9 100644
--- a/Source/Core/Windows/SectorEditForm.Designer.cs
+++ b/Source/Core/Windows/SectorEditForm.Designer.cs
@@ -53,8 +53,6 @@ namespace CodeImp.DoomBuilder.Windows
this.ceilingtex = new CodeImp.DoomBuilder.Controls.FlatSelectorControl();
this.cancel = new System.Windows.Forms.Button();
this.apply = new System.Windows.Forms.Button();
- this.flatSelectorControl2 = new CodeImp.DoomBuilder.Controls.FlatSelectorControl();
- this.flatSelectorControl1 = new CodeImp.DoomBuilder.Controls.FlatSelectorControl();
this.panel1 = new System.Windows.Forms.Panel();
this.tooltip = new System.Windows.Forms.ToolTip(this.components);
label1 = new System.Windows.Forms.Label();
@@ -311,7 +309,6 @@ namespace CodeImp.DoomBuilder.Windows
this.floortex.Size = new System.Drawing.Size(114, 138);
this.floortex.TabIndex = 2;
this.floortex.TextureName = "";
- this.floortex.UsePreviews = true;
this.floortex.OnValueChanged += new System.EventHandler(this.floortex_OnValueChanged);
//
// floorheight
@@ -341,7 +338,6 @@ namespace CodeImp.DoomBuilder.Windows
this.ceilingtex.Size = new System.Drawing.Size(114, 138);
this.ceilingtex.TabIndex = 3;
this.ceilingtex.TextureName = "";
- this.ceilingtex.UsePreviews = true;
this.ceilingtex.OnValueChanged += new System.EventHandler(this.ceilingtex_OnValueChanged);
//
// cancel
@@ -367,26 +363,6 @@ namespace CodeImp.DoomBuilder.Windows
this.apply.UseVisualStyleBackColor = true;
this.apply.Click += new System.EventHandler(this.apply_Click);
//
- // flatSelectorControl2
- //
- this.flatSelectorControl2.Location = new System.Drawing.Point(271, 37);
- this.flatSelectorControl2.MultipleTextures = false;
- this.flatSelectorControl2.Name = "flatSelectorControl2";
- this.flatSelectorControl2.Size = new System.Drawing.Size(83, 105);
- this.flatSelectorControl2.TabIndex = 13;
- this.flatSelectorControl2.TextureName = "";
- this.flatSelectorControl2.UsePreviews = true;
- //
- // flatSelectorControl1
- //
- this.flatSelectorControl1.Location = new System.Drawing.Point(363, 37);
- this.flatSelectorControl1.MultipleTextures = false;
- this.flatSelectorControl1.Name = "flatSelectorControl1";
- this.flatSelectorControl1.Size = new System.Drawing.Size(83, 105);
- this.flatSelectorControl1.TabIndex = 12;
- this.flatSelectorControl1.TextureName = "";
- this.flatSelectorControl1.UsePreviews = true;
- //
// panel1
//
this.panel1.BackColor = System.Drawing.SystemColors.Window;
@@ -439,8 +415,6 @@ namespace CodeImp.DoomBuilder.Windows
private System.Windows.Forms.Button apply;
private CodeImp.DoomBuilder.Controls.FlatSelectorControl floortex;
private CodeImp.DoomBuilder.Controls.FlatSelectorControl ceilingtex;
- private CodeImp.DoomBuilder.Controls.FlatSelectorControl flatSelectorControl2;
- private CodeImp.DoomBuilder.Controls.FlatSelectorControl flatSelectorControl1;
private System.Windows.Forms.Label sectorheight;
private CodeImp.DoomBuilder.Controls.ActionSelectorControl effect;
private System.Windows.Forms.Button browseeffect;
diff --git a/Source/Core/Windows/SectorEditForm.resx b/Source/Core/Windows/SectorEditForm.resx
index e0a9f880..7f637e04 100644
--- a/Source/Core/Windows/SectorEditForm.resx
+++ b/Source/Core/Windows/SectorEditForm.resx
@@ -159,10 +159,4 @@
False
-
- True
-
-
- True
-
\ No newline at end of file
diff --git a/Source/Core/Windows/SectorEditFormUDMF.Designer.cs b/Source/Core/Windows/SectorEditFormUDMF.Designer.cs
index c78069a2..6cbcdc57 100644
--- a/Source/Core/Windows/SectorEditFormUDMF.Designer.cs
+++ b/Source/Core/Windows/SectorEditFormUDMF.Designer.cs
@@ -988,7 +988,6 @@
this.floortex.Size = new System.Drawing.Size(190, 204);
this.floortex.TabIndex = 11;
this.floortex.TextureName = "";
- this.floortex.UsePreviews = false;
this.floortex.OnValueChanged += new System.EventHandler(this.floortex_OnValueChanged);
//
// groupBox1
@@ -1270,7 +1269,6 @@
this.ceilingtex.Size = new System.Drawing.Size(190, 204);
this.ceilingtex.TabIndex = 11;
this.ceilingtex.TextureName = "";
- this.ceilingtex.UsePreviews = false;
this.ceilingtex.OnValueChanged += new System.EventHandler(this.ceilingtex_OnValueChanged);
//
// tabslopes
diff --git a/Source/Core/Windows/TextureBrowserForm.Designer.cs b/Source/Core/Windows/TextureBrowserForm.Designer.cs
index 1276b4d3..d076ed4d 100644
--- a/Source/Core/Windows/TextureBrowserForm.Designer.cs
+++ b/Source/Core/Windows/TextureBrowserForm.Designer.cs
@@ -48,7 +48,7 @@ namespace CodeImp.DoomBuilder.Windows
//
this.cancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
this.cancel.DialogResult = System.Windows.Forms.DialogResult.Cancel;
- this.cancel.Location = new System.Drawing.Point(683, 411);
+ this.cancel.Location = new System.Drawing.Point(682, 413);
this.cancel.Name = "cancel";
this.cancel.Size = new System.Drawing.Size(98, 25);
this.cancel.TabIndex = 3;
@@ -60,9 +60,10 @@ namespace CodeImp.DoomBuilder.Windows
// apply
//
this.apply.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right)));
- this.apply.Location = new System.Drawing.Point(581, 411);
+ this.apply.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(204)));
+ this.apply.Location = new System.Drawing.Point(682, 381);
this.apply.Name = "apply";
- this.apply.Size = new System.Drawing.Size(98, 25);
+ this.apply.Size = new System.Drawing.Size(98, 30);
this.apply.TabIndex = 2;
this.apply.TabStop = false;
this.apply.Text = "OK";
@@ -97,7 +98,7 @@ namespace CodeImp.DoomBuilder.Windows
this.tvTextureSets.SelectedImageIndex = 0;
this.tvTextureSets.SelectionBackColor = System.Drawing.SystemColors.Highlight;
this.tvTextureSets.SelectionMode = CodeImp.DoomBuilder.Controls.TreeViewSelectionMode.SingleSelect;
- this.tvTextureSets.Size = new System.Drawing.Size(198, 402);
+ this.tvTextureSets.Size = new System.Drawing.Size(198, 374);
this.tvTextureSets.TabIndex = 4;
this.tvTextureSets.TabStop = false;
this.tvTextureSets.KeyUp += new System.Windows.Forms.KeyEventHandler(this.tvTextureSets_KeyUp);
@@ -105,7 +106,6 @@ namespace CodeImp.DoomBuilder.Windows
//
// browser
//
- this.browser.BrowseFlats = false;
this.browser.Dock = System.Windows.Forms.DockStyle.Fill;
this.browser.HideInputBox = false;
this.browser.Location = new System.Drawing.Point(0, 0);
diff --git a/Source/Core/Windows/TextureBrowserForm.cs b/Source/Core/Windows/TextureBrowserForm.cs
index d5667897..be36e128 100644
--- a/Source/Core/Windows/TextureBrowserForm.cs
+++ b/Source/Core/Windows/TextureBrowserForm.cs
@@ -17,7 +17,7 @@
#region ================== Namespaces
using System;
-using System.Drawing;
+using System.Collections.Generic;
using System.Windows.Forms;
using CodeImp.DoomBuilder.Controls;
using CodeImp.DoomBuilder.IO;
@@ -31,13 +31,19 @@ namespace CodeImp.DoomBuilder.Windows
{
internal partial class TextureBrowserForm : DelayedForm
{
+ //mxd. Structs
+ private struct TreeNodeData
+ {
+ public IFilledTextureSet Set;
+ public string FolderName;
+ }
+
// Variables
private string selectedname;
- private readonly ListViewGroup usedgroup;
- private readonly ListViewGroup availgroup;
+ private readonly string usedgroup;
+ private readonly string availgroup;
private TreeNode selectedset; //mxd
private long selecttextureonfill; //mxd. Was string, which wasn't reliable whem dealing with long texture names
- private readonly bool usedgroupcollapsed; //mxd
private readonly bool browseflats; //mxd
// Properties
@@ -63,11 +69,14 @@ namespace CodeImp.DoomBuilder.Windows
string imagetype = (browseflats ? "flats" : "textures");
this.Text = "Browse " + imagetype;
+ // Make groups
+ usedgroup = "Used " + imagetype + ":";
+ availgroup = "Available " + imagetype + ":";
+ browser.AddGroup(availgroup);
+ browser.AddGroup(usedgroup);
+
// Setup texture browser
- ImageBrowserControl.ShowTexturesFromSubDirectories = General.Settings.ReadSetting("windows." + configname + ".showtexturesfromsubdirs", true);
- ImageBrowserControl.UseLongTextureNames = General.Map.Options.UseLongTextureNames;
- browser.BrowseFlats = browseflats;
- browser.ApplySettings();
+ browser.ApplySettings("windows." + configname, browseflats);
// Update the used textures
General.Map.Data.UpdateUsedTextures();
@@ -77,14 +86,6 @@ namespace CodeImp.DoomBuilder.Windows
//mxd. Texture longname to select when list is filled
selecttextureonfill = longname;
- // Make groups
- usedgroup = browser.AddGroup("Used " + imagetype + ":");
- availgroup = browser.AddGroup("Available " + imagetype + ":");
-
- //mxd. Make "Used" group collapsible
- usedgroupcollapsed = General.Settings.ReadSetting("windows." + configname + ".usedgroupcollapsed", false);
- browser.SetGroupCollapsed(usedgroup, usedgroupcollapsed);
-
//mxd. Fill texture sets list with normal texture sets
foreach(IFilledTextureSet ts in General.Map.Data.TextureSets)
{
@@ -94,7 +95,7 @@ namespace CodeImp.DoomBuilder.Windows
item = tvTextureSets.Nodes.Add(ts.Name + " [" + count + "]");
item.Name = ts.Name;
- item.Tag = ts;
+ item.Tag = new TreeNodeData { Set = ts, FolderName = ts.Name };
item.ImageIndex = 0;
}
@@ -105,9 +106,9 @@ namespace CodeImp.DoomBuilder.Windows
if((count == 0 && !General.Map.Config.MixTexturesFlats) || (ts.Flats.Count == 0 && ts.Textures.Count == 0))
continue;
- item = tvTextureSets.Nodes.Add(ts.Name + " [" + count + "]");
+ item = tvTextureSets.Nodes.Add(ts.Name);
item.Name = ts.Name;
- item.Tag = ts;
+ item.Tag = new TreeNodeData { Set = ts, FolderName = ts.Name };
item.ImageIndex = 2 + ts.Location.type;
item.SelectedImageIndex = item.ImageIndex;
@@ -119,7 +120,7 @@ namespace CodeImp.DoomBuilder.Windows
count = (browseflats ? General.Map.Data.AllTextureSet.Flats.Count : General.Map.Data.AllTextureSet.Textures.Count);
item = tvTextureSets.Nodes.Add(General.Map.Data.AllTextureSet.Name + " [" + count + "]");
item.Name = General.Map.Data.AllTextureSet.Name;
- item.Tag = General.Map.Data.AllTextureSet;
+ item.Tag = new TreeNodeData { Set = General.Map.Data.AllTextureSet, FolderName = General.Map.Data.AllTextureSet.Name };
item.ImageIndex = 1;
item.SelectedImageIndex = item.ImageIndex;
@@ -142,7 +143,7 @@ namespace CodeImp.DoomBuilder.Windows
if(match != null)
{
- IFilledTextureSet set = (match.Tag as IFilledTextureSet);
+ IFilledTextureSet set = ((TreeNodeData)match.Tag).Set;
foreach(ImageData img in (browseflats ? set.Flats : set.Textures))
{
if(img.LongName == longname)
@@ -176,7 +177,7 @@ namespace CodeImp.DoomBuilder.Windows
selectedset.EnsureVisible();
}
- tvTextureSets.EndUpdate();//mxd
+ tvTextureSets.EndUpdate(); //mxd
//mxd. Set splitter position and state (doesn't work when layout is suspended)
if(General.Settings.ReadSetting("windows." + configname + ".splittercollapsed", false))
@@ -199,7 +200,13 @@ namespace CodeImp.DoomBuilder.Windows
//mxd
private static int SortImageData(ImageData img1, ImageData img2)
{
- return String.Compare(img1.FilePathName, img2.FilePathName, StringComparison.Ordinal);
+ return String.Compare(img1.Name, img2.Name, StringComparison.OrdinalIgnoreCase);
+ }
+
+ //mxd
+ private static int SortTreeNodes(TreeNode n1, TreeNode n2)
+ {
+ return String.Compare(n1.Text, n2.Text, StringComparison.OrdinalIgnoreCase);
}
//mxd
@@ -213,7 +220,7 @@ namespace CodeImp.DoomBuilder.Windows
}
//then - in current node
- IFilledTextureSet set = (node.Tag as IFilledTextureSet);
+ IFilledTextureSet set = ((TreeNodeData)node.Tag).Set;
foreach(ImageData img in (browseflats ? set.Flats : set.Textures))
if(img.LongName == longname) return node;
@@ -235,9 +242,10 @@ namespace CodeImp.DoomBuilder.Windows
}
//mxd
- private void CreateNodes(TreeNode root)
+ private void CreateNodes(TreeNode root)
{
- ResourceTextureSet set = root.Tag as ResourceTextureSet;
+ TreeNodeData rootdata = (TreeNodeData)root.Tag;
+ ResourceTextureSet set = rootdata.Set as ResourceTextureSet;
if(set == null)
{
General.ErrorLogger.Add(ErrorType.Error, "Resource " + root.Name + " doesn't have TextureSet!");
@@ -260,14 +268,19 @@ namespace CodeImp.DoomBuilder.Windows
}
Array.Sort(images, SortImageData);
+ List rootimages = new List();
foreach(ImageData image in images)
{
string[] parts = image.VirtualName.Split(separator, StringSplitOptions.RemoveEmptyEntries);
TreeNode curNode = root;
- if(parts.Length == 1) continue;
- int localindex = (parts[0] == "[TEXTURES]" ? 8 : imageIndex);
+ if(parts.Length == 1)
+ {
+ rootimages.Add(image);
+ continue;
+ }
+ int localindex = ((parts[0] == "[TEXTURES]" || image is TEXTURESImage) ? 8 : imageIndex);
string category = set.Name;
for(int i = 0; i < parts.Length - 1; i++)
{
@@ -281,77 +294,94 @@ namespace CodeImp.DoomBuilder.Windows
else //create a new one
{
TreeNode n = new TreeNode(parts[i]) { Name = category, ImageIndex = localindex, SelectedImageIndex = localindex };
-
curNode.Nodes.Add(n);
curNode = n;
-
- ResourceTextureSet ts = new ResourceTextureSet(category, set.Location);
- ts.Level = i + 1;
- curNode.Tag = ts;
+ curNode.Tag = new TreeNodeData { Set = new ResourceTextureSet(category, set.Location), FolderName = parts[i] };
}
- //add to current and parent nodes
+ // Add to current node
if(i == parts.Length - 2)
{
- TreeNode cn = curNode;
- while(cn != root)
- {
- ResourceTextureSet curTs = cn.Tag as ResourceTextureSet;
- if(image.IsFlat)
- curTs.AddFlat(image);
- else
- curTs.AddTexture(image);
- cn = cn.Parent;
- }
+ ResourceTextureSet curTs = ((TreeNodeData)curNode.Tag).Set as ResourceTextureSet;
+ if(image.IsFlat)
+ curTs.AddFlat(image);
+ else
+ curTs.AddTexture(image);
}
}
}
+ // Shift the tree up when only single child node was added
if(root.Nodes.Count == 1 && root.Nodes[0].Nodes.Count > 0)
{
TreeNode[] children = new TreeNode[root.Nodes[0].Nodes.Count];
root.Nodes[0].Nodes.CopyTo(children, 0);
root.Nodes.Clear();
root.Nodes.AddRange(children);
- ((ResourceTextureSet)root.Tag).Level++;
}
+ // Sort immediate child nodes...
+ TreeNode[] rootnodes = new TreeNode[root.Nodes.Count];
+ root.Nodes.CopyTo(rootnodes, 0);
+ Array.Sort(rootnodes, SortTreeNodes);
+ root.Nodes.Clear();
+ root.Nodes.AddRange(rootnodes);
+
+ // Re-add root images
+ ResourceTextureSet rootset = new ResourceTextureSet(set.Name, set.Location);
+ if(browseflats)
+ {
+ foreach(ImageData data in rootimages) rootset.AddFlat(data);
+ }
+ else
+ {
+ foreach(ImageData data in rootimages) rootset.AddTexture(data);
+ }
+
+ // Store root data
+ rootdata.Set = rootset;
+ root.Tag = rootdata;
+
+ // Set root images count
+ if(rootimages.Count > 0) root.Text += " [" + rootimages.Count + "]";
+
+ // Add image count to node titles
foreach(TreeNode n in root.Nodes) SetItemsCount(n);
}
//mxd
private void SetItemsCount(TreeNode node)
{
- ResourceTextureSet ts = node.Tag as ResourceTextureSet;
- if(ts == null) throw new Exception("Expected IFilledTextureSet, but got null...");
+ ResourceTextureSet ts = ((TreeNodeData)node.Tag).Set as ResourceTextureSet;
+ if(ts == null) throw new Exception("Expected ResourceTextureSet, but got null...");
if(node.Parent != null && General.Map.Config.MixTexturesFlats)
{
ts.MixTexturesAndFlats();
- node.Text += " [" + ts.Textures.Count + "]";
+ if(ts.Textures.Count > 0) node.Text += " [" + ts.Textures.Count + "]";
}
else
{
- node.Text += " [" + (browseflats ? ts.Flats.Count : ts.Textures.Count) + "]";
+ int texcount = (browseflats ? ts.Flats.Count : ts.Textures.Count);
+ if(texcount > 0) node.Text += " [" + texcount + "]";
}
foreach(TreeNode child in node.Nodes) SetItemsCount(child);
}
// Selection changed
- private void browser_SelectedItemChanged()
+ private void browser_SelectedItemChanged(ImageBrowserItem item)
{
- apply.Enabled = (browser.SelectedItem != null);
+ apply.Enabled = (item != null && item.ItemType == ImageBrowserItemType.IMAGE);
}
// OK clicked
private void apply_Click(object sender, EventArgs e)
{
// Set selected name and close
- if(browser.SelectedItem != null)
+ if(browser.SelectedItem != null && browser.SelectedItem.ItemType == ImageBrowserItemType.IMAGE)
{
- ImageBrowserItem item = browser.SelectedItem as ImageBrowserItem;
- selectedname = item.TextureName;
+ selectedname = browser.SelectedItem.TextureName;
DialogResult = DialogResult.OK;
}
else
@@ -384,92 +414,175 @@ namespace CodeImp.DoomBuilder.Windows
// Save window settings
General.Settings.WriteSetting("windows." + configname + ".splitterdistance", splitter.SplitPosition); //mxd
General.Settings.WriteSetting("windows." + configname + ".splittercollapsed", splitter.IsCollapsed); //mxd
- General.Settings.WriteSetting("windows." + configname + ".usedgroupcollapsed", browser.IsGroupCollapsed(usedgroup)); //mxd
//mxd. Save last selected texture set
if(this.DialogResult == DialogResult.OK && tvTextureSets.SelectedNodes.Count > 0)
General.Settings.WriteSetting("windows." + configname + ".textureset", tvTextureSets.SelectedNodes[0].Name);
-
- //mxd. Save ImageBrowserControl settings
- General.Settings.WriteSetting("windows." + configname + ".showtexturesfromsubdirs", ImageBrowserControl.ShowTexturesFromSubDirectories);
- if(General.Map.Config.UseLongTextureNames) General.Map.Options.UseLongTextureNames = ImageBrowserControl.UseLongTextureNames;
// Clean up
- browser.CleanUp();
+ browser.OnClose("windows." + configname);
}
- // Static method to browse for texture or flat
- // Returns null when cancelled.
- public static string Browse(IWin32Window parent, string select, bool browseFlats)
+ // Static method to browse for texture or flat.
+ public static string Browse(IWin32Window parent, string select, bool browseflats)
{
- TextureBrowserForm browser = new TextureBrowserForm(select, browseFlats);
- if(browser.ShowDialog(parent) == DialogResult.OK) return browser.SelectedName; // Return result
-
- // Cancelled
- return select;
+ TextureBrowserForm browser = new TextureBrowserForm(select, browseflats);
+ return (browser.ShowDialog(parent) == DialogResult.OK ? browser.SelectedName : select);
}
// Item double clicked
- private void browser_SelectedItemDoubleClicked()
+ private void browser_SelectedItemDoubleClicked(ImageBrowserItem item)
{
- if(apply.Enabled) apply_Click(this, EventArgs.Empty);
+ if(item == null) return;
+ switch(item.ItemType)
+ {
+ case ImageBrowserItemType.IMAGE:
+ if(selectedset == null) throw new NotSupportedException("selectedset required!");
+ if(apply.Enabled) apply_Click(this, EventArgs.Empty);
+ break;
+
+ case ImageBrowserItemType.FOLDER_UP:
+ if(selectedset == null) throw new NotSupportedException("selectedset required!");
+ if(selectedset.Parent != null)
+ {
+ // Select the node
+ tvTextureSets.SelectedNodes.Clear();
+ tvTextureSets.SelectedNodes.Add(selectedset.Parent);
+ selectedset.Parent.EnsureVisible();
+
+ // Update textures list
+ selectedset = selectedset.Parent;
+ }
+ else
+ {
+ tvTextureSets.SelectedNodes.Clear();
+ selectedset = null;
+ }
+ FillImagesList();
+ break;
+
+ case ImageBrowserItemType.FOLDER:
+ // selectedset is null when at root level
+ TreeNodeCollection nodes = (selectedset == null ? tvTextureSets.Nodes : selectedset.Nodes);
+ foreach(TreeNode child in nodes)
+ {
+ TreeNodeData data = (TreeNodeData)child.Tag;
+ if(data.FolderName == item.TextureName)
+ {
+ // Select the node
+ tvTextureSets.SelectedNodes.Clear();
+ tvTextureSets.SelectedNodes.Add(child);
+ child.EnsureVisible();
+
+ // Update textures list
+ selectedset = child;
+ FillImagesList();
+ break;
+ }
+ }
+ break;
+
+ default: throw new NotImplementedException("Unsupported ImageBrowserItemType");
+ }
}
// This fills the list of textures, depending on the selected texture set
private void FillImagesList()
{
+ //mxd. Show root items
+ if(selectedset == null)
+ {
+ FillCategoriesList();
+ return;
+ }
+
// Get the selected texture set
- IFilledTextureSet set = (selectedset.Tag as IFilledTextureSet);
+ IFilledTextureSet set = ((TreeNodeData)selectedset.Tag).Set;
// Start adding
- browser.BeginAdding(set.Level, false); //mxd. Pass current folder level
+ browser.BeginAdding(false);
+ //mxd. Add "Browse up" item
+ if(selectedset.Parent != null)
+ {
+ TreeNodeData data = (TreeNodeData)selectedset.Parent.Tag;
+ browser.AddFolder(ImageBrowserItemType.FOLDER_UP, availgroup, data.FolderName);
+ }
+ else
+ {
+ browser.AddFolder(ImageBrowserItemType.FOLDER_UP, availgroup, "All Texture Sets");
+ }
+
+ //mxd. Add folders
+ foreach(TreeNode child in selectedset.Nodes)
+ {
+ TreeNodeData data = (TreeNodeData)child.Tag;
+ browser.AddFolder(ImageBrowserItemType.FOLDER, availgroup, data.FolderName);
+ }
+
+ // Add textures
if(browseflats)
{
// Add all available flats
foreach(ImageData img in set.Flats)
- browser.Add(img, img, availgroup);
+ browser.AddItem(img, availgroup);
// Add all used flats
foreach(ImageData img in set.Flats)
- if(img.UsedInMap) browser.Add(img, img, usedgroup);
+ if(img.UsedInMap) browser.AddItem(img, usedgroup);
}
else
{
// Add all available textures and mark the images for temporary loading
foreach(ImageData img in set.Textures)
- browser.Add(img, img, availgroup);
+ browser.AddItem(img, availgroup);
// Add all used textures and mark the images for permanent loading
foreach(ImageData img in set.Textures)
- if(img.UsedInMap) browser.Add(img, img, usedgroup);
+ if(img.UsedInMap) browser.AddItem(img, usedgroup);
}
// Done adding
browser.EndAdding();
}
+ private void FillCategoriesList()
+ {
+ // Start adding
+ browser.BeginAdding(false);
+
+ foreach(TreeNode node in tvTextureSets.Nodes)
+ {
+ TreeNodeData data = (TreeNodeData)node.Tag;
+ browser.AddFolder(ImageBrowserItemType.FOLDER, availgroup, data.FolderName);
+ browser.AddFolder(ImageBrowserItemType.FOLDER, usedgroup, data.FolderName);
+ }
+
+ // Done adding
+ browser.EndAdding();
+ }
+
// Help
- private void TextureBrowserForm_HelpRequested(object sender, HelpEventArgs hlpevent)
+ private void TextureBrowserForm_HelpRequested(object sender, HelpEventArgs e)
{
General.ShowHelp("w_imagesbrowser.html");
- hlpevent.Handled = true;
+ e.Handled = true;
}
private void TextureBrowserForm_Shown(object sender, EventArgs e)
{
- if(selectedset != null) //mxd. Calling FillImagesList() from constructor leads to TERRIBLE load times. Why? I have no sodding idea...
- FillImagesList();
+ //mxd. Calling FillImagesList() from constructor results in TERRIBLE load times. Why? I have no sodding idea...
+ if(selectedset != null) FillImagesList();
// Select texture
if(selecttextureonfill != 0)
{
- browser.SelectItem(selecttextureonfill, (usedgroupcollapsed ? availgroup : usedgroup)); //mxd. availgroup/usedgroup switch.
+ browser.SelectItem(selecttextureonfill, browser.SelectedGroup);
selecttextureonfill = 0;
}
- //mxd. Focus the textbox. Calling this from TextureBrowserForm_Activated (like it's done in DB2) fails when the form is maximized. Again, I've no idea why...
- browser.FocusTextbox();
+ //mxd. Focus the textures list. Calling this from TextureBrowserForm_Activated (like it's done in DB2) fails when the form is maximized. Again, I've no idea why...
+ browser.FocusList();
}
//mxd
diff --git a/Source/Core/Windows/TextureSetForm.Designer.cs b/Source/Core/Windows/TextureSetForm.Designer.cs
index 4309e048..1702e861 100644
--- a/Source/Core/Windows/TextureSetForm.Designer.cs
+++ b/Source/Core/Windows/TextureSetForm.Designer.cs
@@ -229,7 +229,6 @@ namespace CodeImp.DoomBuilder.Windows
this.matcheslist.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
- this.matcheslist.BrowseFlats = false;
this.matcheslist.HideInputBox = true;
this.matcheslist.Location = new System.Drawing.Point(18, 55);
this.matcheslist.Name = "matcheslist";
diff --git a/Source/Core/Windows/TextureSetForm.cs b/Source/Core/Windows/TextureSetForm.cs
index a4b0326f..3203f9aa 100644
--- a/Source/Core/Windows/TextureSetForm.cs
+++ b/Source/Core/Windows/TextureSetForm.cs
@@ -19,6 +19,7 @@
using System;
using System.Collections.Generic;
using System.Windows.Forms;
+using CodeImp.DoomBuilder.Controls;
using CodeImp.DoomBuilder.Data;
using CodeImp.DoomBuilder.Config;
@@ -170,7 +171,7 @@ namespace CodeImp.DoomBuilder.Windows
{
bool ismatch = set.IsMatch(img);
if((ismatch && matchesbutton.Checked) || (!ismatch && nomatchesbutton.Checked))
- matcheslist.Add(img, img, null, tooltiptext);
+ matcheslist.AddItem(img, null, tooltiptext);
}
// If not already mixed, add flats as well
@@ -181,7 +182,7 @@ namespace CodeImp.DoomBuilder.Windows
{
bool ismatch = set.IsMatch(img);
if((ismatch && matchesbutton.Checked) || (!ismatch && nomatchesbutton.Checked))
- matcheslist.Add(img, img, null, tooltiptext);
+ matcheslist.AddItem(img, null, tooltiptext);
}
}
@@ -213,11 +214,10 @@ namespace CodeImp.DoomBuilder.Windows
}
// Texture doubleclicked
- private void matcheslist_SelectedItemDoubleClicked()
+ private void matcheslist_SelectedItemDoubleClicked(ImageBrowserItem item)
{
// Add texture name to the list
- if(matcheslist.SelectedItem != null)
- filters.Items.Add(matcheslist.SelectedItem.Text);
+ if(item != null) filters.Items.Add(item.TextureName);
// Run the timer
filterstimer.Start();
diff --git a/Source/Plugins/BuilderEffects/Interface/JitterSectorsForm.Designer.cs b/Source/Plugins/BuilderEffects/Interface/JitterSectorsForm.Designer.cs
index ae05340d..7285a3cb 100644
--- a/Source/Plugins/BuilderEffects/Interface/JitterSectorsForm.Designer.cs
+++ b/Source/Plugins/BuilderEffects/Interface/JitterSectorsForm.Designer.cs
@@ -133,7 +133,6 @@
this.textureUpper.Size = new System.Drawing.Size(83, 112);
this.textureUpper.TabIndex = 2;
this.textureUpper.TextureName = "";
- this.textureUpper.UsePreviews = true;
this.textureUpper.OnValueChanged += new System.EventHandler(this.textureUpper_OnValueChanged);
//
// cbPegTop
@@ -156,7 +155,6 @@
this.textureLower.Size = new System.Drawing.Size(83, 112);
this.textureLower.TabIndex = 4;
this.textureLower.TextureName = "";
- this.textureLower.UsePreviews = true;
this.textureLower.OnValueChanged += new System.EventHandler(this.textureLower_OnValueChanged);
//
// cbPegBottom
diff --git a/Source/Plugins/BuilderModes/Interface/MakeDoorForm.Designer.cs b/Source/Plugins/BuilderModes/Interface/MakeDoorForm.Designer.cs
index 7828826e..57fda0fe 100644
--- a/Source/Plugins/BuilderModes/Interface/MakeDoorForm.Designer.cs
+++ b/Source/Plugins/BuilderModes/Interface/MakeDoorForm.Designer.cs
@@ -50,7 +50,6 @@ namespace CodeImp.DoomBuilder.BuilderModes.Interface
this.doortexture.Size = new System.Drawing.Size(83, 105);
this.doortexture.TabIndex = 0;
this.doortexture.TextureName = "";
- this.doortexture.UsePreviews = true;
//
// label1
//
@@ -80,7 +79,6 @@ namespace CodeImp.DoomBuilder.BuilderModes.Interface
this.ceilingtexture.Size = new System.Drawing.Size(83, 105);
this.ceilingtexture.TabIndex = 1;
this.ceilingtexture.TextureName = "";
- this.ceilingtexture.UsePreviews = true;
//
// floortexture
//
@@ -90,7 +88,6 @@ namespace CodeImp.DoomBuilder.BuilderModes.Interface
this.floortexture.Size = new System.Drawing.Size(83, 105);
this.floortexture.TabIndex = 2;
this.floortexture.TextureName = "";
- this.floortexture.UsePreviews = true;
//
// label3
//
@@ -144,7 +141,6 @@ namespace CodeImp.DoomBuilder.BuilderModes.Interface
this.tracktexture.Size = new System.Drawing.Size(83, 105);
this.tracktexture.TabIndex = 6;
this.tracktexture.TextureName = "";
- this.tracktexture.UsePreviews = true;
//
// label4
//
diff --git a/Source/Plugins/BuilderModes/Interface/SectorDrawingOptionsPanel.Designer.cs b/Source/Plugins/BuilderModes/Interface/SectorDrawingOptionsPanel.Designer.cs
index 9d329ab6..0667649d 100644
--- a/Source/Plugins/BuilderModes/Interface/SectorDrawingOptionsPanel.Designer.cs
+++ b/Source/Plugins/BuilderModes/Interface/SectorDrawingOptionsPanel.Designer.cs
@@ -99,7 +99,6 @@
this.ceiling.Size = new System.Drawing.Size(68, 90);
this.ceiling.TabIndex = 30;
this.ceiling.TextureName = "";
- this.ceiling.UsePreviews = true;
this.ceiling.OnValueChanged += new System.EventHandler(this.ceiling_OnValueChanged);
//
// floor
@@ -110,7 +109,6 @@
this.floor.Size = new System.Drawing.Size(68, 90);
this.floor.TabIndex = 29;
this.floor.TextureName = "";
- this.floor.UsePreviews = true;
this.floor.OnValueChanged += new System.EventHandler(this.floor_OnValueChanged);
//
// cbOverrideFloorTexture
@@ -282,7 +280,6 @@
this.bottom.Size = new System.Drawing.Size(68, 90);
this.bottom.TabIndex = 25;
this.bottom.TextureName = "";
- this.bottom.UsePreviews = true;
this.bottom.OnValueChanged += new System.EventHandler(this.bottom_OnValueChanged);
//
// cbOverrideTopTexture
@@ -305,7 +302,6 @@
this.middle.Size = new System.Drawing.Size(68, 90);
this.middle.TabIndex = 24;
this.middle.TextureName = "";
- this.middle.UsePreviews = true;
this.middle.OnValueChanged += new System.EventHandler(this.middle_OnValueChanged);
//
// top
@@ -317,7 +313,6 @@
this.top.Size = new System.Drawing.Size(68, 90);
this.top.TabIndex = 23;
this.top.TextureName = "";
- this.top.UsePreviews = true;
this.top.OnValueChanged += new System.EventHandler(this.top_OnValueChanged);
//
// groupBox3
diff --git a/Source/Plugins/NodesViewer/NodesViewerMode.cs b/Source/Plugins/NodesViewer/NodesViewerMode.cs
index 7e712122..a2a5b40a 100644
--- a/Source/Plugins/NodesViewer/NodesViewerMode.cs
+++ b/Source/Plugins/NodesViewer/NodesViewerMode.cs
@@ -148,6 +148,21 @@ namespace CodeImp.DoomBuilder.Plugins.NodesViewer
return false;
}
+ //mxd. ZDoom SEGS overflow error
+ if(numsegs >= ushort.MaxValue)
+ {
+ // Cancel mode
+ MessageBox.Show("The map has too many SEGS (" + numsegs + "/" + ushort.MaxValue + ").\nIt won't load in most Doom source ports.", "THY SEGS ARETH WAAAY TOO PHAT!", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ General.Editing.CancelMode();
+ return false;
+ }
+
+ //mxd. Vanilla SEGS overflow warning
+ if(numsegs >= short.MaxValue)
+ {
+ MessageBox.Show("The map has too many SEGS (" + numsegs + "/" + short.MaxValue + ").\nIt won't load in Vanilla-style source ports.", "THY SEGS ARETH TOO PHAT!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
+ }
+
segs = new Seg[numsegs];
for(int i = 0; i < segs.Length; i++)
{
@@ -199,8 +214,8 @@ namespace CodeImp.DoomBuilder.Plugins.NodesViewer
ssectors = new Subsector[numssec];
for(int i = 0; i < ssectors.Length; i++)
{
- ssectors[i].numsegs = ssecreader.ReadInt16();
- ssectors[i].firstseg = ssecreader.ReadInt16();
+ ssectors[i].numsegs = ssecreader.ReadUInt16(); //TECH: these are short in Doom, ushort in ZDoom/PRBoom+
+ ssectors[i].firstseg = ssecreader.ReadUInt16();
}
ssecreader.Close();
@@ -344,7 +359,7 @@ namespace CodeImp.DoomBuilder.Plugins.NodesViewer
// Boilerplate...
if(nodescount < 1)
{
- MessageBox.Show("The map has only one subsector.", "Why are you doing this, Stanley?..", MessageBoxButtons.OK, MessageBoxIcon.Error);
+ MessageBox.Show("The map has only one subsector.\nPlease add more sectors before using this mode.", "Why are you doing this, Stanley?..", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}