MapSettingsDialog.cs 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. //
  2. // Copyright 2020 Electronic Arts Inc.
  3. //
  4. // The Command & Conquer Map Editor and corresponding source code is free
  5. // software: you can redistribute it and/or modify it under the terms of
  6. // the GNU General Public License as published by the Free Software Foundation,
  7. // either version 3 of the License, or (at your option) any later version.
  8. // The Command & Conquer Map Editor and corresponding source code is distributed
  9. // in the hope that it will be useful, but with permitted additional restrictions
  10. // under Section 7 of the GPL. See the GNU General Public License in LICENSE.TXT
  11. // distributed with this program. You should have received a copy of the
  12. // GNU General Public License along with permitted additional restrictions
  13. // with this program. If not, see https://github.com/electronicarts/CnC_Remastered_Collection
  14. using MobiusEditor.Controls;
  15. using MobiusEditor.Interface;
  16. using MobiusEditor.Model;
  17. using MobiusEditor.Utility;
  18. using System;
  19. using System.Collections.Generic;
  20. using System.Data;
  21. using System.Drawing;
  22. using System.Linq;
  23. using System.Runtime.InteropServices;
  24. using System.Windows.Forms;
  25. namespace MobiusEditor.Dialogs
  26. {
  27. public partial class MapSettingsDialog : Form
  28. {
  29. private const int TVIF_STATE = 0x8;
  30. private const int TVIS_STATEIMAGEMASK = 0xF000;
  31. private const int TV_FIRST = 0x1100;
  32. private const int TVM_SETITEM = TV_FIRST + 63;
  33. [DllImport("user32.dll")]
  34. static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
  35. private struct TVITEM
  36. {
  37. public int mask;
  38. public IntPtr hItem;
  39. public int state;
  40. public int stateMask;
  41. [MarshalAs(UnmanagedType.LPTStr)]
  42. public String lpszText;
  43. public int cchTextMax;
  44. public int iImage;
  45. public int iSelectedImage;
  46. public int cChildren;
  47. public IntPtr lParam;
  48. }
  49. private readonly IGamePlugin plugin;
  50. private readonly PropertyTracker<BasicSection> basicSettingsTracker;
  51. private readonly PropertyTracker<BriefingSection> briefingSettingsTracker;
  52. private readonly IDictionary<House, PropertyTracker<House>> houseSettingsTrackers;
  53. private readonly TreeNode playersNode;
  54. public MapSettingsDialog(IGamePlugin plugin, PropertyTracker<BasicSection> basicSettingsTracker, PropertyTracker<BriefingSection> briefingSettingsTracker,
  55. IDictionary<House, PropertyTracker<House>> houseSettingsTrackers)
  56. {
  57. InitializeComponent();
  58. this.plugin = plugin;
  59. this.basicSettingsTracker = basicSettingsTracker;
  60. this.briefingSettingsTracker = briefingSettingsTracker;
  61. this.houseSettingsTrackers = houseSettingsTrackers;
  62. settingsTreeView.BeginUpdate();
  63. settingsTreeView.Nodes.Clear();
  64. settingsTreeView.Nodes.Add("BASIC", "Basic");
  65. settingsTreeView.Nodes.Add("BRIEFING", "Briefing");
  66. playersNode = settingsTreeView.Nodes.Add("Players");
  67. foreach (var player in plugin.Map.Houses)
  68. {
  69. var playerNode = playersNode.Nodes.Add(player.Type.Name, player.Type.Name);
  70. playerNode.Checked = player.Enabled;
  71. }
  72. playersNode.Expand();
  73. settingsTreeView.EndUpdate();
  74. settingsTreeView.SelectedNode = settingsTreeView.Nodes[0];
  75. }
  76. private void settingsTreeView_AfterSelect(object sender, TreeViewEventArgs e)
  77. {
  78. settingsPanel.Controls.Clear();
  79. switch (settingsTreeView.SelectedNode.Name)
  80. {
  81. case "BASIC":
  82. {
  83. settingsPanel.Controls.Add(new BasicSettings(plugin, basicSettingsTracker));
  84. }
  85. break;
  86. case "BRIEFING":
  87. {
  88. settingsPanel.Controls.Add(new BriefingSettings(plugin, briefingSettingsTracker));
  89. }
  90. break;
  91. default:
  92. {
  93. var player = plugin.Map.Houses.Where(h => h.Type.Name == settingsTreeView.SelectedNode.Name).FirstOrDefault();
  94. if (player != null)
  95. {
  96. settingsPanel.Controls.Add(new PlayerSettings(plugin, houseSettingsTrackers[player]));
  97. }
  98. }
  99. break;
  100. }
  101. }
  102. private void settingsTreeView_DrawNode(object sender, DrawTreeNodeEventArgs e)
  103. {
  104. if (!playersNode.Nodes.Contains(e.Node))
  105. {
  106. HideCheckBox(e.Node);
  107. e.DrawDefault = true;
  108. }
  109. else
  110. {
  111. e.Graphics.DrawString(e.Node.Text, e.Node.TreeView.Font, new SolidBrush(settingsTreeView.ForeColor), e.Node.Bounds.X, e.Node.Bounds.Y);
  112. }
  113. }
  114. private void HideCheckBox(TreeNode node)
  115. {
  116. TVITEM tvi = new TVITEM
  117. {
  118. hItem = node.Handle,
  119. mask = TVIF_STATE,
  120. stateMask = TVIS_STATEIMAGEMASK,
  121. state = 0,
  122. lpszText = null,
  123. cchTextMax = 0,
  124. iImage = 0,
  125. iSelectedImage = 0,
  126. cChildren = 0,
  127. lParam = IntPtr.Zero
  128. };
  129. IntPtr lparam = Marshal.AllocHGlobal(Marshal.SizeOf(tvi));
  130. Marshal.StructureToPtr(tvi, lparam, false);
  131. SendMessage(node.TreeView.Handle, TVM_SETITEM, IntPtr.Zero, lparam);
  132. }
  133. private void settingsTreeView_AfterCheck(object sender, TreeViewEventArgs e)
  134. {
  135. var player = plugin.Map.Houses.Where(h => h.Type.Name == e.Node.Name).FirstOrDefault();
  136. if (player != null)
  137. {
  138. ((dynamic)houseSettingsTrackers[player]).Enabled = e.Node.Checked;
  139. }
  140. }
  141. }
  142. }