123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- //
- // Copyright 2020 Electronic Arts Inc.
- //
- // The Command & Conquer Map Editor and corresponding source code is free
- // software: you can redistribute it and/or modify it under the terms of
- // the GNU General Public License as published by the Free Software Foundation,
- // either version 3 of the License, or (at your option) any later version.
- // The Command & Conquer Map Editor and corresponding source code is distributed
- // in the hope that it will be useful, but with permitted additional restrictions
- // under Section 7 of the GPL. See the GNU General Public License in LICENSE.TXT
- // distributed with this program. You should have received a copy of the
- // GNU General Public License along with permitted additional restrictions
- // with this program. If not, see https://github.com/electronicarts/CnC_Remastered_Collection
- using MobiusEditor.Controls;
- using MobiusEditor.Interface;
- using MobiusEditor.Model;
- using MobiusEditor.Utility;
- using System;
- using System.Collections.Generic;
- using System.Data;
- using System.Drawing;
- using System.Linq;
- using System.Runtime.InteropServices;
- using System.Windows.Forms;
- namespace MobiusEditor.Dialogs
- {
- public partial class MapSettingsDialog : Form
- {
- private const int TVIF_STATE = 0x8;
- private const int TVIS_STATEIMAGEMASK = 0xF000;
- private const int TV_FIRST = 0x1100;
- private const int TVM_SETITEM = TV_FIRST + 63;
- [DllImport("user32.dll")]
- static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
- private struct TVITEM
- {
- public int mask;
- public IntPtr hItem;
- public int state;
- public int stateMask;
- [MarshalAs(UnmanagedType.LPTStr)]
- public String lpszText;
- public int cchTextMax;
- public int iImage;
- public int iSelectedImage;
- public int cChildren;
- public IntPtr lParam;
- }
- private readonly IGamePlugin plugin;
- private readonly PropertyTracker<BasicSection> basicSettingsTracker;
- private readonly PropertyTracker<BriefingSection> briefingSettingsTracker;
- private readonly IDictionary<House, PropertyTracker<House>> houseSettingsTrackers;
- private readonly TreeNode playersNode;
- public MapSettingsDialog(IGamePlugin plugin, PropertyTracker<BasicSection> basicSettingsTracker, PropertyTracker<BriefingSection> briefingSettingsTracker,
- IDictionary<House, PropertyTracker<House>> houseSettingsTrackers)
- {
- InitializeComponent();
- this.plugin = plugin;
- this.basicSettingsTracker = basicSettingsTracker;
- this.briefingSettingsTracker = briefingSettingsTracker;
- this.houseSettingsTrackers = houseSettingsTrackers;
- settingsTreeView.BeginUpdate();
- settingsTreeView.Nodes.Clear();
- settingsTreeView.Nodes.Add("BASIC", "Basic");
- settingsTreeView.Nodes.Add("BRIEFING", "Briefing");
- playersNode = settingsTreeView.Nodes.Add("Players");
- foreach (var player in plugin.Map.Houses)
- {
- var playerNode = playersNode.Nodes.Add(player.Type.Name, player.Type.Name);
- playerNode.Checked = player.Enabled;
- }
- playersNode.Expand();
- settingsTreeView.EndUpdate();
- settingsTreeView.SelectedNode = settingsTreeView.Nodes[0];
- }
- private void settingsTreeView_AfterSelect(object sender, TreeViewEventArgs e)
- {
- settingsPanel.Controls.Clear();
- switch (settingsTreeView.SelectedNode.Name)
- {
- case "BASIC":
- {
- settingsPanel.Controls.Add(new BasicSettings(plugin, basicSettingsTracker));
- }
- break;
- case "BRIEFING":
- {
- settingsPanel.Controls.Add(new BriefingSettings(plugin, briefingSettingsTracker));
- }
- break;
- default:
- {
- var player = plugin.Map.Houses.Where(h => h.Type.Name == settingsTreeView.SelectedNode.Name).FirstOrDefault();
- if (player != null)
- {
- settingsPanel.Controls.Add(new PlayerSettings(plugin, houseSettingsTrackers[player]));
- }
- }
- break;
- }
- }
- private void settingsTreeView_DrawNode(object sender, DrawTreeNodeEventArgs e)
- {
- if (!playersNode.Nodes.Contains(e.Node))
- {
- HideCheckBox(e.Node);
- e.DrawDefault = true;
- }
- else
- {
- e.Graphics.DrawString(e.Node.Text, e.Node.TreeView.Font, new SolidBrush(settingsTreeView.ForeColor), e.Node.Bounds.X, e.Node.Bounds.Y);
- }
- }
- private void HideCheckBox(TreeNode node)
- {
- TVITEM tvi = new TVITEM
- {
- hItem = node.Handle,
- mask = TVIF_STATE,
- stateMask = TVIS_STATEIMAGEMASK,
- state = 0,
- lpszText = null,
- cchTextMax = 0,
- iImage = 0,
- iSelectedImage = 0,
- cChildren = 0,
- lParam = IntPtr.Zero
- };
- IntPtr lparam = Marshal.AllocHGlobal(Marshal.SizeOf(tvi));
- Marshal.StructureToPtr(tvi, lparam, false);
- SendMessage(node.TreeView.Handle, TVM_SETITEM, IntPtr.Zero, lparam);
- }
- private void settingsTreeView_AfterCheck(object sender, TreeViewEventArgs e)
- {
- var player = plugin.Map.Houses.Where(h => h.Type.Name == e.Node.Name).FirstOrDefault();
- if (player != null)
- {
- ((dynamic)houseSettingsTrackers[player]).Enabled = e.Node.Checked;
- }
- }
- }
- }
|