// // 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 basicSettingsTracker; private readonly PropertyTracker briefingSettingsTracker; private readonly IDictionary> houseSettingsTrackers; private readonly TreeNode playersNode; public MapSettingsDialog(IGamePlugin plugin, PropertyTracker basicSettingsTracker, PropertyTracker briefingSettingsTracker, IDictionary> 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; } } } }