UltimateZoneBuilder/Source/Core/Windows/ConfigForm.cs

937 lines
29 KiB
C#
Raw Normal View History

#region ================== Copyright (c) 2007 Pascal vd Heiden
/*
* Copyright (c) 2007 Pascal vd Heiden, www.codeimp.com
* This program is released under GNU General Public License
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
#endregion
#region ================== Namespaces
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Reflection;
using System.Windows.Forms;
using CodeImp.DoomBuilder.Config;
using CodeImp.DoomBuilder.Data;
using CodeImp.DoomBuilder.Editing;
using CodeImp.DoomBuilder.GZBuilder.Data;
#endregion
namespace CodeImp.DoomBuilder.Windows
{
internal partial class ConfigForm : DelayedForm
{
// Variables
private GameConfiguration gameconfig;
private ConfigurationInfo configinfo;
private List<DefinedTextureSet> copiedsets;
private bool preventchanges;
private bool reloadresources;
//mxd. "Copy/Paste" stuff
private ConfigurationInfo configinfocopy;
// Properties
public bool ReloadResources { get { return reloadresources; } }
// Constructor
public ConfigForm()
{
ListViewItem lvi;
// Initialize
InitializeComponent();
CodeImp.DoomBuilder.General.ApplyMonoListViewFix(listtextures);
// Make list column header full width
columnname.Width = listconfigs.ClientRectangle.Width - SystemInformation.VerticalScrollBarWidth - 2;
// Fill list of configurations
foreach(ConfigurationInfo ci in General.Configs)
{
// Add a copy
lvi = listconfigs.Items.Add(ci.Name);
lvi.Tag = ci.Clone();
lvi.Checked = ci.Enabled; //mxd
lvi.ForeColor = (ci.Enabled ? SystemColors.WindowText : SystemColors.InactiveCaptionText); //mxd
// This is the current configuration?
if((General.Map != null) && (General.Map.ConfigSettings.Filename == ci.Filename))
lvi.Selected = true;
}
// No skill
skill.Value = 0;
// Nodebuilders are allowed to be empty
nodebuildersave.Items.Add(new NodebuilderInfo());
nodebuildertest.Items.Add(new NodebuilderInfo());
// Fill comboboxes with nodebuilders
nodebuildersave.Items.AddRange(General.Nodebuilders.ToArray());
nodebuildertest.Items.AddRange(General.Nodebuilders.ToArray());
// Fill list of editing modes
foreach(EditModeInfo emi in General.Editing.ModesInfo)
{
// Is this mode selectable by the user?
if(emi.IsOptional)
{
lvi = listmodes.Items.Add(emi.Attributes.DisplayName + (emi.Attributes.IsDeprecated ? " (deprecated)" : ""));
lvi.Tag = emi;
lvi.SubItems.Add(emi.Plugin.Plug.Name);
lvi.UseItemStyleForSubItems = true; //mxd
}
}
//mxd
listconfigs.ItemChecked += listconfigs_ItemChecked;
listconfigs.SelectedIndexChanged += listconfigs_SelectedIndexChanged;
//mxd. Trigger change to update the right panel...
listconfigs_MouseUp(this, new MouseEventArgs(MouseButtons.None, 0, 0, 0, 0));
}
// This shows a specific page
public void ShowTab(int index)
{
tabs.SelectedIndex = index;
}
// Configuration item selected
private void listconfigs_SelectedIndexChanged(object sender, EventArgs e)
{
// Item selected?
if(listconfigs.SelectedItems.Count > 0)
{
// Enable panels
tabs.Enabled = true;
preventchanges = true;
//mxd. Store current engine name
if(configinfo != null && !String.IsNullOrEmpty(cbEngineSelector.Text))
configinfo.TestProgramName = cbEngineSelector.Text;
// Get config info of selected item
configinfo = listconfigs.SelectedItems[0].Tag as ConfigurationInfo;
//mxd. Load the game configuration
gameconfig = new GameConfiguration(configinfo.Configuration);
// Set defaults
configinfo.ApplyDefaults(gameconfig);
// Fill resources list
configdata.EditResourceLocationList(configinfo.Resources);
// Go for all nodebuilder save items
nodebuildersave.SelectedIndex = -1;
for(int i = 0; i < nodebuildersave.Items.Count; i++)
{
// Get item
NodebuilderInfo ni = nodebuildersave.Items[i] as NodebuilderInfo;
// Item matches configuration setting?
if(String.CompareOrdinal(ni.Name, configinfo.NodebuilderSave) == 0)
{
// Select this item
nodebuildersave.SelectedIndex = i;
break;
}
}
// Go for all nodebuilder test items
nodebuildertest.SelectedIndex = -1;
for(int i = 0; i < nodebuildertest.Items.Count; i++)
{
// Get item
NodebuilderInfo ni = nodebuildertest.Items[i] as NodebuilderInfo;
// Item matches configuration setting?
if(String.CompareOrdinal(ni.Name, configinfo.NodebuilderTest) == 0)
{
// Select this item
nodebuildertest.SelectedIndex = i;
break;
}
}
// Fill skills list
skill.ClearInfo();
skill.AddInfo(gameconfig.Skills.ToArray());
2013-03-18 13:52:27 +00:00
//mxd. Fill engines list
cbEngineSelector.Items.Clear();
foreach(EngineInfo info in configinfo.TestEngines)
cbEngineSelector.Items.Add(info.TestProgramName);
2013-03-18 13:52:27 +00:00
cbEngineSelector.SelectedIndex = configinfo.CurrentEngineIndex;
btnRemoveEngine.Enabled = configinfo.TestEngines.Count > 1;
// Fill texture sets list
listtextures.Items.Clear();
foreach(DefinedTextureSet ts in configinfo.TextureSets)
{
ListViewItem item = listtextures.Items.Add(ts.Name);
item.Tag = ts;
item.ImageIndex = 0;
}
listtextures.Sort();
// Go for all the editing modes in the list
foreach(ListViewItem lvi in listmodes.Items)
{
EditModeInfo emi = (lvi.Tag as EditModeInfo);
//mxd. Disable item if the mode does not support current map format
if (emi.Attributes.SupportedMapFormats != null &&
Array.IndexOf(emi.Attributes.SupportedMapFormats, gameconfig.FormatInterface) == -1)
{
lvi.Text = emi.Attributes.DisplayName + " (map format not supported" + (emi.Attributes.IsDeprecated ? ", deprecated" : "") + ")";
lvi.ForeColor = SystemColors.GrayText;
lvi.BackColor = SystemColors.InactiveBorder;
lvi.Checked = false;
continue;
}
else if (emi.Attributes.RequiredMapFeatures != null && !gameconfig.SupportsMapFeatures(emi.Attributes.RequiredMapFeatures))
{
lvi.Text = emi.Attributes.DisplayName + " (map feature not supported)";
lvi.ForeColor = SystemColors.GrayText;
lvi.BackColor = SystemColors.InactiveBorder;
lvi.Checked = false;
}
else
{
lvi.Text = emi.Attributes.DisplayName + (emi.Attributes.IsDeprecated ? " (deprecated)" : "");
lvi.ForeColor = SystemColors.WindowText;
lvi.BackColor = SystemColors.Window;
lvi.Checked = (configinfo.EditModes.ContainsKey(emi.Type.FullName) && configinfo.EditModes[emi.Type.FullName]);
}
}
// Update listmodes columns width (mxd)
listmodes.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent);
// Fill start modes
RefillStartModes();
// Done
preventchanges = false;
}
}
// Key released
private void listconfigs_KeyUp(object sender, KeyEventArgs e)
{
// Nothing selected?
if(listconfigs.SelectedItems.Count == 0)
{
// Disable panels
gameconfig = null;
configinfo = null;
configdata.FixedResourceLocationList(new DataLocationList());
configdata.EditResourceLocationList(new DataLocationList());
nodebuildersave.SelectedIndex = -1;
nodebuildertest.SelectedIndex = -1;
testapplication.Text = "";
testparameters.Text = "";
shortpaths.Checked = false;
linuxpaths.Checked = false;
skill.Value = 0;
skill.ClearInfo();
customparameters.Checked = false;
tabs.Enabled = false;
listtextures.Items.Clear();
}
}
// Mouse released
private void listconfigs_MouseUp(object sender, MouseEventArgs e)
{
listconfigs_KeyUp(sender, new KeyEventArgs(Keys.None));
}
//mxd
private void listconfigs_ItemChecked(object sender, ItemCheckedEventArgs e)
{
e.Item.ForeColor = (e.Item.Checked ? SystemColors.WindowText : SystemColors.InactiveCaptionText);
}
// Resource locations changed
private void resourcelocations_OnContentChanged()
{
// Leave when no configuration selected
if(configinfo == null) return;
// Apply to selected configuration
configinfo.Resources.Clear();
configinfo.Resources.AddRange(configdata.GetResources());
if(!preventchanges) reloadresources = true;
}
// Nodebuilder selection changed
private void nodebuildersave_SelectedIndexChanged(object sender, EventArgs e)
{
// Leave during setup or when no configuration selected
if(preventchanges || configinfo == null || nodebuildersave.SelectedItem == null) return;
// Apply to selected configuration
configinfo.NodebuilderSave = (nodebuildersave.SelectedItem as NodebuilderInfo).Name;
configinfo.Changed = true; //mxd
}
// Nodebuilder selection changed
private void nodebuildertest_SelectedIndexChanged(object sender, EventArgs e)
{
// Leave during setup or when no configuration selected
if(preventchanges || configinfo == null || nodebuildertest.SelectedItem == null) return;
// Apply to selected configuration
configinfo.NodebuilderTest = (nodebuildertest.SelectedItem as NodebuilderInfo).Name;
configinfo.Changed = true; //mxd
}
// Test application changed
private void testapplication_TextChanged(object sender, EventArgs e)
{
// Leave during setup or when no configuration is selected
if(preventchanges || configinfo == null) return;
// Apply to selected configuration
configinfo.TestProgram = testapplication.Text;
//mxd. User entered engine name before picking the engine?
if(cbEngineSelector.SelectedIndex == -1 || string.IsNullOrEmpty(configinfo.TestProgram))
{
ApplyTestEngineNameChange();
}
// Update engine name
else
{
// Use engine directory name?
string enginename = Path.GetDirectoryName(configinfo.TestProgram);
if(!string.IsNullOrEmpty(enginename))
{
int pos = enginename.LastIndexOf(Path.DirectorySeparatorChar);
if(pos != -1) enginename = enginename.Substring(pos + 1);
}
// Use engine filename
else
{
enginename = Path.GetFileNameWithoutExtension(configinfo.TestProgram);
}
configinfo.TestProgramName = enginename;
cbEngineSelector.Items[cbEngineSelector.SelectedIndex] = enginename;
}
configinfo.Changed = true; //mxd
}
// Test parameters changed
private void testparameters_TextChanged(object sender, EventArgs e)
{
// Leave when no configuration selected
if(preventchanges || configinfo == null) return;
// Apply to selected configuration
configinfo = listconfigs.SelectedItems[0].Tag as ConfigurationInfo;
configinfo.TestParameters = testparameters.Text;
configinfo.Changed = true; //mxd
// Show example result
CreateParametersExample();
}
// This creates a new parameters example
private void CreateParametersExample()
{
// Map loaded?
if(General.Map != null)
{
// Make converted parameters
testresult.Text = General.Map.Launcher.ConvertParameters(testparameters.Text, skill.Value, shortpaths.Checked, linuxpaths.Checked);
}
}
//mxd
private void ApplyTestEngineNameChange()
{
int index = (int)cbEngineSelector.Tag;
if(index != -1 && cbEngineSelector.Text != cbEngineSelector.Items[index].ToString())
{
cbEngineSelector.Items[index] = cbEngineSelector.Text;
configinfo.TestProgramName = cbEngineSelector.Text;
configinfo.Changed = true; //mxd
}
}
// OK clicked
private void apply_Click(object sender, EventArgs e)
{
ConfigurationInfo ci;
//mxd. Check resources
for(int i = 0; i < listconfigs.Items.Count; i++)
{
// Get configuration item
ci = listconfigs.Items[i].Tag as ConfigurationInfo;
Visual mode: "Fit Textures" action can now fit textures across multiple selected surfaces. A number of times to repeat a texture can now be specified. Visual mode: removed "Fit Texture's Width" and "Fit Texture's Height" actions. Visual mode: "Auto-align texture offsets" actions were incorrectly aligning double-sided middle walls in some cases. Visual mode: "Auto-align texture offsets" actions now align non-wrapped double-sided middle walls to vertical offset closest to their initial vertical offset. Visual mode: middle parts of double-sided walls were ignored when Shift-selecting walls. Nodebuilders/Game configurations: GL nodes definitions were missing from game configurations. Nodebuilders/Game configurations: "~MAP" wildcard can now be a part of a lump name. Nodebuilders: GL nodes were not properly handled by the editor. Main Window: the window is now moved into the view when stored position is ouside of screen bounds. Classic and Visual modes: changing thing pitch was ignored in some cases. Visual mode: raising and lowering a thing with "+SPAWNCEILING" flag now works the same way as when raising/lowering a regular thing. Visual mode: using "Raise/Lower Floor/Ceiling to adjacent sector" actions on a thing with "+SPAWNCEILING" flag now works the same way as when using them on a regular thing. Rendering: even more fixes to MODELDEF and UDMF properties-related model rendering logic. Internal, ResourceListEditor: rewritten resource validation check in a more OOP-ish way. Configurations: fixed an infinite loop crash when a file was trying to include() itself. UDMF thing flags: added Skill 6-8 to the flags list (because there are thing filters for these). ZDoom_ACS.cfg: added definitions for SetTeleFog and SwapTeleFog. ZDoom_DECORATE.cfg: added definitions for A_SetTeleFog and A_SwapTeleFog. Updated ZDoom ACC. Updated documentation.
2014-12-22 21:36:49 +00:00
if(!ci.Resources.IsValid())
{
MessageBox.Show(this, "At least one resource doesn't exist in \"" + ci.Name + "\" game configuration!", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Warning);
Visual mode: "Fit Textures" action can now fit textures across multiple selected surfaces. A number of times to repeat a texture can now be specified. Visual mode: removed "Fit Texture's Width" and "Fit Texture's Height" actions. Visual mode: "Auto-align texture offsets" actions were incorrectly aligning double-sided middle walls in some cases. Visual mode: "Auto-align texture offsets" actions now align non-wrapped double-sided middle walls to vertical offset closest to their initial vertical offset. Visual mode: middle parts of double-sided walls were ignored when Shift-selecting walls. Nodebuilders/Game configurations: GL nodes definitions were missing from game configurations. Nodebuilders/Game configurations: "~MAP" wildcard can now be a part of a lump name. Nodebuilders: GL nodes were not properly handled by the editor. Main Window: the window is now moved into the view when stored position is ouside of screen bounds. Classic and Visual modes: changing thing pitch was ignored in some cases. Visual mode: raising and lowering a thing with "+SPAWNCEILING" flag now works the same way as when raising/lowering a regular thing. Visual mode: using "Raise/Lower Floor/Ceiling to adjacent sector" actions on a thing with "+SPAWNCEILING" flag now works the same way as when using them on a regular thing. Rendering: even more fixes to MODELDEF and UDMF properties-related model rendering logic. Internal, ResourceListEditor: rewritten resource validation check in a more OOP-ish way. Configurations: fixed an infinite loop crash when a file was trying to include() itself. UDMF thing flags: added Skill 6-8 to the flags list (because there are thing filters for these). ZDoom_ACS.cfg: added definitions for SetTeleFog and SwapTeleFog. ZDoom_DECORATE.cfg: added definitions for A_SetTeleFog and A_SwapTeleFog. Updated ZDoom ACC. Updated documentation.
2014-12-22 21:36:49 +00:00
tabs.SelectedTab = tabresources;
listconfigs.Focus();
listconfigs.Items[i].Selected = true;
return;
}
}
//mxd. Apply changes of current test engine name, if there are any
//TODO: move engine selector stuff into separate component!
if(configinfo != null) ApplyTestEngineNameChange();
//mxd. Apply configuration items. They should be in the same order, riiiight?
for(int i = 0; i < listconfigs.Items.Count; i++)
{
// Get configuration item
ci = listconfigs.Items[i].Tag as ConfigurationInfo;
ci.Enabled = listconfigs.Items[i].Checked;
// Apply settings
General.Configs[i].Enabled = ci.Enabled;
if(ci.Changed) General.Configs[i].Apply(ci);
}
// Close
this.DialogResult = DialogResult.OK;
this.Close();
}
// Cancel clicked
private void cancel_Click(object sender, EventArgs e)
{
// Close
this.DialogResult = DialogResult.Cancel;
this.Close();
}
// Browse test program
private void browsetestprogram_Click(object sender, EventArgs e)
{
// Set initial directory
if(testapplication.Text.Length > 0)
{
try { testprogramdialog.InitialDirectory = Path.GetDirectoryName(testapplication.Text); }
catch(Exception) { }
}
// Browse for test program
if(testprogramdialog.ShowDialog() == DialogResult.OK)
{
// Apply
testapplication.Text = testprogramdialog.FileName;
}
}
// Customize parameters (un)checked
private void customparameters_CheckedChanged(object sender, EventArgs e)
{
// Leave when no configuration selected
if(configinfo == null) return;
// Apply to selected configuration
configinfo.CustomParameters = customparameters.Checked;
configinfo.Changed = true; //mxd
// Update interface
labelparameters.Visible = customparameters.Checked;
testparameters.Visible = customparameters.Checked;
shortpaths.Visible = customparameters.Checked;
linuxpaths.Visible = customparameters.Checked;
// Check if a map is loaded
if(General.Map != null)
{
// Show parameters example result
labelresult.Visible = customparameters.Checked;
testresult.Visible = customparameters.Checked;
noresultlabel.Visible = false;
}
else
{
// Cannot show parameters example result
labelresult.Visible = false;
testresult.Visible = false;
noresultlabel.Visible = customparameters.Checked;
}
}
// Use short paths changed
private void shortpaths_CheckedChanged(object sender, EventArgs e)
{
// Leave when no configuration selected
if(configinfo == null) return;
if (linuxpaths.Checked && shortpaths.Checked)
{
linuxpaths.Checked = false;
}
// Apply to selected configuration
configinfo.TestShortPaths = shortpaths.Checked;
configinfo.Changed = true; //mxd
CreateParametersExample();
}
private void Linuxpaths_CheckedChanged(object sender, EventArgs e)
{
// Leave when no configuration selected
if (configinfo == null) return;
if (linuxpaths.Checked && shortpaths.Checked)
{
shortpaths.Checked = false;
}
// Apply to selected configuration
configinfo.TestLinuxPaths = linuxpaths.Checked;
configinfo.Changed = true; //mxd
CreateParametersExample();
}
// Skill changes
private void skill_ValueChanges(object sender, EventArgs e)
{
// Leave when no configuration selected
if(configinfo == null) return;
// Apply to selected configuration
configinfo.TestSkill = skill.Value;
configinfo.Changed = true; //mxd
CreateParametersExample();
}
// Make new texture set
private void addtextureset_Click(object sender, EventArgs e)
{
DefinedTextureSet s = new DefinedTextureSet("New Texture Set");
TextureSetForm form = new TextureSetForm();
form.Setup(s);
if(form.ShowDialog(this) == DialogResult.OK)
{
// Add to texture sets
configinfo.TextureSets.Add(s);
configinfo.Changed = true; //mxd
ListViewItem item = listtextures.Items.Add(s.Name);
item.Tag = s;
item.ImageIndex = 0;
listtextures.Sort();
reloadresources = true;
}
}
// Edit texture set
private void edittextureset_Click(object sender, EventArgs e)
{
// Texture Set selected?
if(listtextures.SelectedItems.Count > 0)
{
DefinedTextureSet s = (listtextures.SelectedItems[0].Tag as DefinedTextureSet);
TextureSetForm form = new TextureSetForm();
form.Setup(s);
form.ShowDialog(this);
listtextures.SelectedItems[0].Text = s.Name;
listtextures.Sort();
reloadresources = true;
}
}
// Remove texture set
private void removetextureset_Click(object sender, EventArgs e)
{
// Texture Set selected?
while(listtextures.SelectedItems.Count > 0)
{
// Remove from config info and list
DefinedTextureSet s = (listtextures.SelectedItems[0].Tag as DefinedTextureSet);
configinfo.TextureSets.Remove(s);
configinfo.Changed = true; //mxd
listtextures.SelectedItems[0].Remove();
reloadresources = true;
}
}
// Texture Set selected/deselected
private void listtextures_SelectedIndexChanged(object sender, EventArgs e)
{
edittextureset.Enabled = (listtextures.SelectedItems.Count > 0);
removetextureset.Enabled = (listtextures.SelectedItems.Count > 0);
copytexturesets.Enabled = (listtextures.SelectedItems.Count > 0);
}
// Doubleclicking a texture set
private void listtextures_DoubleClick(object sender, EventArgs e)
{
edittextureset_Click(sender, e);
}
// Copy selected texture sets
private void copytexturesets_Click(object sender, EventArgs e)
{
// Make copies
copiedsets = new List<DefinedTextureSet>();
foreach(ListViewItem item in listtextures.SelectedItems)
{
DefinedTextureSet s = (item.Tag as DefinedTextureSet);
copiedsets.Add(s.Copy());
}
// Enable button
pastetexturesets.Enabled = true;
}
// Paste copied texture sets
private void pastetexturesets_Click(object sender, EventArgs e)
{
if(copiedsets != null)
{
// Add copies
foreach(DefinedTextureSet ts in copiedsets)
{
DefinedTextureSet s = ts.Copy();
ListViewItem item = listtextures.Items.Add(s.Name);
item.Tag = s;
item.ImageIndex = 0;
configinfo.TextureSets.Add(s);
}
listtextures.Sort();
reloadresources = true;
configinfo.Changed = true; //mxd
}
}
// This will add the default sets from game configuration
private void restoretexturesets_Click(object sender, EventArgs e)
{
// Ask nicely first
if(MessageBox.Show(this, "This will add the default Texture Sets from the Game Configuration. Do you want to continue?",
"Add Default Sets", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
{
// Add copies
foreach(DefinedTextureSet ts in gameconfig.TextureSets)
{
DefinedTextureSet s = ts.Copy();
ListViewItem item = listtextures.Items.Add(s.Name);
item.Tag = s;
item.ImageIndex = 0;
configinfo.TextureSets.Add(s);
}
listtextures.Sort();
reloadresources = true;
configinfo.Changed = true; //mxd
}
}
// This is called when an editing mode item is checked or unchecked
private void listmodes_ItemChecked(object sender, ItemCheckedEventArgs e)
{
if(preventchanges) return; //mxd
// Leave when no configuration selected
if(configinfo == null) return;
// mxd. Not the best way to detect a disabled item, but we will go with that...
if(e.Item.ForeColor == SystemColors.GrayText) e.Item.Checked = false;
// Apply changes
EditModeInfo emi = (e.Item.Tag as EditModeInfo);
bool currentstate = (configinfo.EditModes.ContainsKey(emi.Type.FullName) && configinfo.EditModes[emi.Type.FullName]);
if(e.Item.Checked && !currentstate)
{
// Add
configinfo.EditModes[emi.Type.FullName] = true;
configinfo.Changed = true; //mxd
}
else if(!e.Item.Checked && currentstate)
{
// Remove
configinfo.EditModes[emi.Type.FullName] = false;
configinfo.Changed = true; //mxd
}
preventchanges = true;
RefillStartModes();
preventchanges = false;
}
// Help requested
private void ConfigForm_HelpRequested(object sender, HelpEventArgs hlpevent)
{
General.ShowHelp("w_gameconfigurations.html");
hlpevent.Handled = true;
}
// This refills the start mode cobobox
private void RefillStartModes()
{
// Refill the startmode combobox
startmode.Items.Clear();
foreach(ListViewItem item in listmodes.Items)
{
if(item.Checked)
{
EditModeInfo emi = (item.Tag as EditModeInfo);
if(emi.Attributes.SafeStartMode)
{
int newindex = startmode.Items.Add(emi);
if(emi.Type.Name == configinfo.StartMode) startmode.SelectedIndex = newindex;
}
}
}
// Select the first in the combobox if none are selected
if((startmode.SelectedItem == null) && (startmode.Items.Count > 0))
{
startmode.SelectedIndex = 0;
EditModeInfo emi = (startmode.SelectedItem as EditModeInfo);
configinfo.StartMode = emi.Type.Name;
configinfo.Changed = true; //mxd
}
}
// Start mode combobox changed
private void startmode_SelectedIndexChanged(object sender, EventArgs e)
{
if(preventchanges || (configinfo == null)) return;
// Apply start mode
if(startmode.SelectedItem != null)
{
EditModeInfo emi = (startmode.SelectedItem as EditModeInfo);
configinfo.StartMode = emi.Type.Name;
configinfo.Changed = true; //mxd
}
}
//mxd
private void btnNewEngine_Click(object sender, EventArgs e)
{
// Set initial directory?
if(testapplication.Text.Length > 0)
{
try { testprogramdialog.InitialDirectory = Path.GetDirectoryName(testapplication.Text); }
catch(Exception) { }
}
// Browse for test program
if(testprogramdialog.ShowDialog() == DialogResult.OK)
{
preventchanges = true;
// Remove EngineInfos without program path
configinfo.TestEngines.RemoveAll(info => string.IsNullOrEmpty(info.TestProgram));
// Add new EngineInfo
EngineInfo newInfo = new EngineInfo();
newInfo.TestSkill = (int)Math.Ceiling(gameconfig.Skills.Count / 2f); // Set Medium skill level
configinfo.TestEngines.Add(newInfo);
configinfo.Changed = true;
// Refresh engines list
cbEngineSelector.Items.Clear();
foreach(EngineInfo info in configinfo.TestEngines)
cbEngineSelector.Items.Add(info.TestProgramName);
cbEngineSelector.SelectedIndex = configinfo.TestEngines.Count - 1;
btnRemoveEngine.Enabled = (configinfo.TestEngines.Count > 1);
preventchanges = false;
// Set engine path (will also update current engine name)
testapplication.Text = testprogramdialog.FileName;
}
}
//mxd
private void btnRemoveEngine_Click(object sender, EventArgs e)
{
preventchanges = true;
//remove params
int index = cbEngineSelector.SelectedIndex;
cbEngineSelector.SelectedIndex = -1;
configinfo.TestEngines.RemoveAt(index);
configinfo.Changed = true; //mxd
//refresh engines list
cbEngineSelector.Items.Clear();
foreach(EngineInfo info in configinfo.TestEngines)
cbEngineSelector.Items.Add(info.TestProgramName);
if(index >= configinfo.TestEngines.Count)
index = configinfo.TestEngines.Count - 1;
cbEngineSelector.SelectedIndex = index;
if(configinfo.TestEngines.Count < 2)
btnRemoveEngine.Enabled = false;
preventchanges = false;
}
//mxd
private void cbEngineSelector_SelectedIndexChanged(object sender, EventArgs e)
{
if(cbEngineSelector.SelectedIndex == -1) return;
preventchanges = true;
//set new values
configinfo.CurrentEngineIndex = cbEngineSelector.SelectedIndex;
configinfo.Changed = true; //mxd
cbEngineSelector.Tag = cbEngineSelector.SelectedIndex; //store for later use
// Set test application and parameters
if(!configinfo.CustomParameters)
{
configinfo.TestParameters = gameconfig.TestParameters;
configinfo.TestShortPaths = gameconfig.TestShortPaths;
configinfo.TestLinuxPaths = gameconfig.TestLinuxPaths;
}
configinfo.TestProgramName = cbEngineSelector.Text;
testapplication.Text = configinfo.TestProgram;
testparameters.Text = configinfo.TestParameters;
shortpaths.Checked = configinfo.TestShortPaths;
linuxpaths.Checked = configinfo.TestLinuxPaths;
int skilllevel = configinfo.TestSkill;
skill.Value = skilllevel - 1; //mxd. WHY???
skill.Value = skilllevel;
customparameters.Checked = configinfo.CustomParameters;
preventchanges = false;
}
//mxd
private void cbEngineSelector_DropDown(object sender, EventArgs e)
{
ApplyTestEngineNameChange();
}
2013-03-18 13:52:27 +00:00
//mxd
private void ConfigForm_Shown(object sender, EventArgs e)
{
if(listconfigs.SelectedItems.Count > 0) listconfigs.SelectedItems[0].EnsureVisible();
}
#region ============= Copy/Paste context menu (mxd)
private void copypastemenu_Opening(object sender, System.ComponentModel.CancelEventArgs e)
{
if(listconfigs.SelectedIndices.Count < 1)
{
e.Cancel = true;
return;
}
ConfigurationInfo current = listconfigs.SelectedItems[0].Tag as ConfigurationInfo;
bool havecopiedconfig = configinfocopy != null;
bool formatinterfacesmatch = havecopiedconfig && current.FormatInterface == configinfocopy.FormatInterface;
pasteall.Enabled = formatinterfacesmatch;
Game Configurations: added Vanilla Strife, Vanilla Heretic and Vanilla Hexen game configurations. Added "makedoorceil" game configuration property. Works the same way as "makedoortrack" and "makedoordoor", but for ceilings of door sectors. Changed, Game configurations: the editor no longer tries to load DECORATE/MODELDEF/VOXELDEF/GLDEFS/REVERBS lumps when "decorategames" setting is not specified / is set to empty string. Changed, General interface: "Tools -> Reload MODELDEF/VOXELDEF" and "Tools -> Reload GLDEFS" menu items are no longer shown when current game configuration doesn't support DECORATE. Fixed a crash when pasting linedef/thing properties in Hexen map format. Fixed, Visual mode: Visual Thing resources were not fully unloaded when resetting D3D device leading to crash when switching to the editor from a DX-using game engine (like ZDoom) running in fullscreen. Fixed: in some cases, when current game configuration supported multiple script compilers, it was possible to open/create a map or change map options without selecting any script compiler. Fixed, New Map Options window: default map name was not updated when switching game configurations. Fixed: copied map element properties were not reset after switching to another map. Fixed: stored textures for "Make Door" action were not reset after switching to another map. Fixed, Game Configurations window: currently selected test engine name was not updated when pasting test engines from another configuration. Fixed, Game Configurations: all "Heretic in Doom map format" configurations were using Doom sector effects list. Fixed, Game Configurations: all "Strife in Doom map format" configurations were using Doom sector effects list.
2015-10-21 13:35:42 +00:00
pasteengines.Enabled = (havecopiedconfig && configinfocopy.TestEngines.Count > 0);
pasteresources.Enabled = (havecopiedconfig && configinfocopy.Resources.Count > 0);
pastecolorpresets.Enabled = (formatinterfacesmatch && configinfocopy.LinedefColorPresets.Length > 0);
}
private void copyall_Click(object sender, EventArgs e)
{
if(listconfigs.SelectedIndices.Count < 1) return;
ConfigurationInfo current = listconfigs.SelectedItems[0].Tag as ConfigurationInfo;
configinfocopy = current.Clone();
//display info
General.Interface.DisplayStatus(StatusType.Info, "Copied \"" + configinfocopy.Name + "\" game configuration");
}
private void pasteall_Click(object sender, EventArgs e)
{
if(listconfigs.SelectedIndices.Count < 1) return;
// Get current configinfo
ConfigurationInfo current = listconfigs.SelectedItems[0].Tag as ConfigurationInfo;
current.PasteFrom(configinfocopy);
// Update display
Game Configurations: added Vanilla Strife, Vanilla Heretic and Vanilla Hexen game configurations. Added "makedoorceil" game configuration property. Works the same way as "makedoortrack" and "makedoordoor", but for ceilings of door sectors. Changed, Game configurations: the editor no longer tries to load DECORATE/MODELDEF/VOXELDEF/GLDEFS/REVERBS lumps when "decorategames" setting is not specified / is set to empty string. Changed, General interface: "Tools -> Reload MODELDEF/VOXELDEF" and "Tools -> Reload GLDEFS" menu items are no longer shown when current game configuration doesn't support DECORATE. Fixed a crash when pasting linedef/thing properties in Hexen map format. Fixed, Visual mode: Visual Thing resources were not fully unloaded when resetting D3D device leading to crash when switching to the editor from a DX-using game engine (like ZDoom) running in fullscreen. Fixed: in some cases, when current game configuration supported multiple script compilers, it was possible to open/create a map or change map options without selecting any script compiler. Fixed, New Map Options window: default map name was not updated when switching game configurations. Fixed: copied map element properties were not reset after switching to another map. Fixed: stored textures for "Make Door" action were not reset after switching to another map. Fixed, Game Configurations window: currently selected test engine name was not updated when pasting test engines from another configuration. Fixed, Game Configurations: all "Heretic in Doom map format" configurations were using Doom sector effects list. Fixed, Game Configurations: all "Strife in Doom map format" configurations were using Doom sector effects list.
2015-10-21 13:35:42 +00:00
cbEngineSelector.Text = string.Empty; // Otherwise current text from cbEngineSelector will override the pasted one
listconfigs_SelectedIndexChanged(listconfigs, EventArgs.Empty);
// Resources need reloading?
if(General.Map != null && General.Map.ConfigSettings.Name == current.Name)
reloadresources = true;
General.Interface.DisplayStatus(StatusType.Info, "Pasted game configuration from \"" + configinfocopy.Name + "\"");
}
private void pasteresources_Click(object sender, EventArgs e)
{
if(listconfigs.SelectedIndices.Count < 1) return;
// Get current configinfo
ConfigurationInfo current = listconfigs.SelectedItems[0].Tag as ConfigurationInfo;
current.PasteResourcesFrom(configinfocopy);
// Update display
listconfigs_SelectedIndexChanged(listconfigs, EventArgs.Empty);
// Resources need reloading?
if(General.Map != null && General.Map.ConfigSettings.Name == current.Name)
reloadresources = true;
General.Interface.DisplayStatus(StatusType.Info, "Pasted resources from \"" + configinfocopy.Name + "\"");
}
private void pasteengines_Click(object sender, EventArgs e)
{
if(listconfigs.SelectedIndices.Count < 1) return;
// Get current configinfo
ConfigurationInfo current = listconfigs.SelectedItems[0].Tag as ConfigurationInfo;
current.PasteTestEnginesFrom(configinfocopy);
// Update display
Game Configurations: added Vanilla Strife, Vanilla Heretic and Vanilla Hexen game configurations. Added "makedoorceil" game configuration property. Works the same way as "makedoortrack" and "makedoordoor", but for ceilings of door sectors. Changed, Game configurations: the editor no longer tries to load DECORATE/MODELDEF/VOXELDEF/GLDEFS/REVERBS lumps when "decorategames" setting is not specified / is set to empty string. Changed, General interface: "Tools -> Reload MODELDEF/VOXELDEF" and "Tools -> Reload GLDEFS" menu items are no longer shown when current game configuration doesn't support DECORATE. Fixed a crash when pasting linedef/thing properties in Hexen map format. Fixed, Visual mode: Visual Thing resources were not fully unloaded when resetting D3D device leading to crash when switching to the editor from a DX-using game engine (like ZDoom) running in fullscreen. Fixed: in some cases, when current game configuration supported multiple script compilers, it was possible to open/create a map or change map options without selecting any script compiler. Fixed, New Map Options window: default map name was not updated when switching game configurations. Fixed: copied map element properties were not reset after switching to another map. Fixed: stored textures for "Make Door" action were not reset after switching to another map. Fixed, Game Configurations window: currently selected test engine name was not updated when pasting test engines from another configuration. Fixed, Game Configurations: all "Heretic in Doom map format" configurations were using Doom sector effects list. Fixed, Game Configurations: all "Strife in Doom map format" configurations were using Doom sector effects list.
2015-10-21 13:35:42 +00:00
cbEngineSelector.Text = string.Empty; // Otherwise current text from cbEngineSelector will override the pasted one
listconfigs_SelectedIndexChanged(listconfigs, EventArgs.Empty);
General.Interface.DisplayStatus(StatusType.Info, "Pasted engines list from \"" + configinfocopy.Name + "\"");
}
private void pastecolorpresets_Click(object sender, EventArgs e)
{
if(listconfigs.SelectedIndices.Count < 1) return;
// Get current configinfo
ConfigurationInfo current = listconfigs.SelectedItems[0].Tag as ConfigurationInfo;
current.PasteColorPresetsFrom(configinfocopy);
// Update display
listconfigs_SelectedIndexChanged(listconfigs, EventArgs.Empty);
General.Interface.DisplayStatus(StatusType.Info, "Pasted color presets from \"" + configinfocopy.Name + "\"");
}
#endregion
}
}