ViewportSettingsEditor.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391
  1. #nullable enable
  2. using System;
  3. namespace UICatalog.Scenarios;
  4. /// <summary>
  5. /// Provides an editor UI for View.ViewportSettings.
  6. /// </summary>
  7. public sealed class ViewportSettingsEditor : EditorBase
  8. {
  9. public ViewportSettingsEditor ()
  10. {
  11. Title = "ViewportSettingsEditor";
  12. TabStop = TabBehavior.TabGroup;
  13. Initialized += ViewportSettingsEditor_Initialized;
  14. }
  15. protected override void OnViewToEditChanged ()
  16. {
  17. foreach (View subview in SubViews)
  18. {
  19. subview.Enabled = ViewToEdit is not Adornment;
  20. }
  21. if (ViewToEdit is { } and not Adornment)
  22. {
  23. //ViewToEdit.VerticalScrollBar.AutoShow = true;
  24. //ViewToEdit.HorizontalScrollBar.AutoShow = true;
  25. _contentSizeWidth!.Value = ViewToEdit.GetContentSize ().Width;
  26. _contentSizeHeight!.Value = ViewToEdit.GetContentSize ().Height;
  27. _cbAllowNegativeX!.CheckedState = ViewToEdit.ViewportSettings.HasFlag (ViewportSettingsFlags.AllowNegativeX)
  28. ? CheckState.Checked
  29. : CheckState.UnChecked;
  30. _cbAllowNegativeY!.CheckedState = ViewToEdit.ViewportSettings.HasFlag (ViewportSettingsFlags.AllowNegativeY)
  31. ? CheckState.Checked
  32. : CheckState.UnChecked;
  33. _cbAllowXGreaterThanContentWidth!.CheckedState = ViewToEdit.ViewportSettings.HasFlag (ViewportSettingsFlags.AllowXGreaterThanContentWidth)
  34. ? CheckState.Checked
  35. : CheckState.UnChecked;
  36. _cbAllowYGreaterThanContentHeight!.CheckedState = ViewToEdit.ViewportSettings.HasFlag (ViewportSettingsFlags.AllowYGreaterThanContentHeight)
  37. ? CheckState.Checked
  38. : CheckState.UnChecked;
  39. _cbClearContentOnly!.CheckedState = ViewToEdit.ViewportSettings.HasFlag (ViewportSettingsFlags.ClearContentOnly)
  40. ? CheckState.Checked
  41. : CheckState.UnChecked;
  42. _cbClipContentOnly!.CheckedState = ViewToEdit.ViewportSettings.HasFlag (ViewportSettingsFlags.ClipContentOnly)
  43. ? CheckState.Checked
  44. : CheckState.UnChecked;
  45. _cbTransparent!.CheckedState = ViewToEdit.ViewportSettings.HasFlag (ViewportSettingsFlags.Transparent)
  46. ? CheckState.Checked
  47. : CheckState.UnChecked;
  48. _cbTransparentMouse!.CheckedState = ViewToEdit.ViewportSettings.HasFlag (ViewportSettingsFlags.TransparentMouse)
  49. ? CheckState.Checked
  50. : CheckState.UnChecked;
  51. _cbVerticalScrollBar!.CheckedState = ViewToEdit.VerticalScrollBar.Visible ? CheckState.Checked : CheckState.UnChecked;
  52. _cbAutoShowVerticalScrollBar!.CheckedState = ViewToEdit.VerticalScrollBar.AutoShow ? CheckState.Checked : CheckState.UnChecked;
  53. _cbHorizontalScrollBar!.CheckedState = ViewToEdit.HorizontalScrollBar.Visible ? CheckState.Checked : CheckState.UnChecked;
  54. _cbAutoShowHorizontalScrollBar!.CheckedState = ViewToEdit.HorizontalScrollBar.AutoShow ? CheckState.Checked : CheckState.UnChecked;
  55. }
  56. }
  57. private CheckBox? _cbAllowNegativeX;
  58. private CheckBox? _cbAllowNegativeY;
  59. private CheckBox? _cbAllowXGreaterThanContentWidth;
  60. private CheckBox? _cbAllowYGreaterThanContentHeight;
  61. private NumericUpDown<int>? _contentSizeWidth;
  62. private NumericUpDown<int>? _contentSizeHeight;
  63. private CheckBox? _cbClearContentOnly;
  64. private CheckBox? _cbClipContentOnly;
  65. private CheckBox? _cbTransparent;
  66. private CheckBox? _cbTransparentMouse;
  67. private CheckBox? _cbVerticalScrollBar;
  68. private CheckBox? _cbAutoShowVerticalScrollBar;
  69. private CheckBox? _cbHorizontalScrollBar;
  70. private CheckBox? _cbAutoShowHorizontalScrollBar;
  71. private void ViewportSettingsEditor_Initialized (object? s, EventArgs e)
  72. {
  73. _cbAllowNegativeX = new ()
  74. {
  75. Title = "Allow X < 0",
  76. CanFocus = true
  77. };
  78. Add (_cbAllowNegativeX);
  79. _cbAllowNegativeY = new ()
  80. {
  81. Title = "Allow Y < 0",
  82. CanFocus = true
  83. };
  84. Add (_cbAllowNegativeY);
  85. _cbAllowXGreaterThanContentWidth = new ()
  86. {
  87. Title = "Allow X > Content Width",
  88. Y = Pos.Bottom (_cbAllowNegativeX),
  89. CanFocus = true
  90. };
  91. _cbAllowNegativeX.CheckedStateChanging += AllowNegativeXToggle;
  92. _cbAllowXGreaterThanContentWidth.CheckedStateChanging += AllowXGreaterThanContentWidthToggle;
  93. Add (_cbAllowXGreaterThanContentWidth);
  94. void AllowNegativeXToggle (object? sender, ResultEventArgs<CheckState> e)
  95. {
  96. if (e.Result == CheckState.Checked)
  97. {
  98. ViewToEdit!.ViewportSettings |= Terminal.Gui.ViewBase.ViewportSettingsFlags.AllowNegativeX;
  99. }
  100. else
  101. {
  102. ViewToEdit!.ViewportSettings &= ~Terminal.Gui.ViewBase.ViewportSettingsFlags.AllowNegativeX;
  103. }
  104. }
  105. void AllowXGreaterThanContentWidthToggle (object? sender, ResultEventArgs<CheckState> e)
  106. {
  107. if (e.Result == CheckState.Checked)
  108. {
  109. ViewToEdit!.ViewportSettings |= Terminal.Gui.ViewBase.ViewportSettingsFlags.AllowXGreaterThanContentWidth;
  110. }
  111. else
  112. {
  113. ViewToEdit!.ViewportSettings &= ~Terminal.Gui.ViewBase.ViewportSettingsFlags.AllowXGreaterThanContentWidth;
  114. }
  115. }
  116. _cbAllowYGreaterThanContentHeight = new ()
  117. {
  118. Title = "Allow Y > Content Height",
  119. X = Pos.Right (_cbAllowXGreaterThanContentWidth) + 1,
  120. Y = Pos.Bottom (_cbAllowNegativeX),
  121. CanFocus = true
  122. };
  123. _cbAllowNegativeY.CheckedStateChanging += AllowNegativeYToggle;
  124. _cbAllowYGreaterThanContentHeight.CheckedStateChanging += AllowYGreaterThanContentHeightToggle;
  125. Add (_cbAllowYGreaterThanContentHeight);
  126. void AllowNegativeYToggle (object? sender, ResultEventArgs<CheckState> e)
  127. {
  128. if (e.Result == CheckState.Checked)
  129. {
  130. ViewToEdit!.ViewportSettings |= Terminal.Gui.ViewBase.ViewportSettingsFlags.AllowNegativeY;
  131. }
  132. else
  133. {
  134. ViewToEdit!.ViewportSettings &= ~Terminal.Gui.ViewBase.ViewportSettingsFlags.AllowNegativeY;
  135. }
  136. }
  137. void AllowYGreaterThanContentHeightToggle (object? sender, ResultEventArgs<CheckState> e)
  138. {
  139. if (e.Result == CheckState.Checked)
  140. {
  141. ViewToEdit!.ViewportSettings |= Terminal.Gui.ViewBase.ViewportSettingsFlags.AllowYGreaterThanContentHeight;
  142. }
  143. else
  144. {
  145. ViewToEdit!.ViewportSettings &= ~Terminal.Gui.ViewBase.ViewportSettingsFlags.AllowYGreaterThanContentHeight;
  146. }
  147. }
  148. _cbAllowNegativeY.X = Pos.Left (_cbAllowYGreaterThanContentHeight);
  149. var labelContentSize = new Label
  150. {
  151. Title = "ContentSize:",
  152. Y = Pos.Bottom (_cbAllowYGreaterThanContentHeight)
  153. };
  154. _contentSizeWidth = new ()
  155. {
  156. X = Pos.Right (labelContentSize) + 1,
  157. Y = Pos.Top (labelContentSize),
  158. CanFocus = true
  159. };
  160. _contentSizeWidth.ValueChanging += ContentSizeWidthValueChanged;
  161. void ContentSizeWidthValueChanged (object? sender, CancelEventArgs<int> e)
  162. {
  163. if (e.NewValue < 0)
  164. {
  165. e.Cancel = true;
  166. return;
  167. }
  168. // BUGBUG: set_ContentSize is supposed to be `protected`.
  169. ViewToEdit!.SetContentSize (ViewToEdit.GetContentSize () with { Width = e.NewValue });
  170. }
  171. var labelComma = new Label
  172. {
  173. Title = ",",
  174. X = Pos.Right (_contentSizeWidth),
  175. Y = Pos.Top (labelContentSize)
  176. };
  177. _contentSizeHeight = new ()
  178. {
  179. X = Pos.Right (labelComma) + 1,
  180. Y = Pos.Top (labelContentSize),
  181. CanFocus = true
  182. };
  183. _contentSizeHeight.ValueChanging += ContentSizeHeightValueChanged;
  184. void ContentSizeHeightValueChanged (object? sender, CancelEventArgs<int> e)
  185. {
  186. if (e.NewValue < 0)
  187. {
  188. e.Cancel = true;
  189. return;
  190. }
  191. // BUGBUG: set_ContentSize is supposed to be `protected`.
  192. ViewToEdit?.SetContentSize (ViewToEdit.GetContentSize () with { Height = e.NewValue });
  193. }
  194. _cbClearContentOnly = new ()
  195. {
  196. Title = "ClearContentOnly",
  197. X = 0,
  198. Y = Pos.Bottom (labelContentSize),
  199. CanFocus = true
  200. };
  201. _cbClearContentOnly.CheckedStateChanging += ClearContentOnlyToggle;
  202. void ClearContentOnlyToggle (object? sender, ResultEventArgs<CheckState> e)
  203. {
  204. if (e.Result == CheckState.Checked)
  205. {
  206. ViewToEdit!.ViewportSettings |= Terminal.Gui.ViewBase.ViewportSettingsFlags.ClearContentOnly;
  207. }
  208. else
  209. {
  210. ViewToEdit!.ViewportSettings &= ~Terminal.Gui.ViewBase.ViewportSettingsFlags.ClearContentOnly;
  211. }
  212. }
  213. _cbClipContentOnly = new ()
  214. {
  215. Title = "ClipContentOnly",
  216. X = Pos.Right (_cbClearContentOnly) + 1,
  217. Y = Pos.Bottom (labelContentSize),
  218. CanFocus = true
  219. };
  220. _cbClipContentOnly.CheckedStateChanging += ClipContentOnlyToggle;
  221. void ClipContentOnlyToggle (object? sender, ResultEventArgs<CheckState> e)
  222. {
  223. if (e.Result == CheckState.Checked)
  224. {
  225. ViewToEdit!.ViewportSettings |= Terminal.Gui.ViewBase.ViewportSettingsFlags.ClipContentOnly;
  226. }
  227. else
  228. {
  229. ViewToEdit!.ViewportSettings &= ~Terminal.Gui.ViewBase.ViewportSettingsFlags.ClipContentOnly;
  230. }
  231. }
  232. _cbTransparent = new ()
  233. {
  234. Title = "Transparent",
  235. X = Pos.Right (_cbClipContentOnly) + 1,
  236. Y = Pos.Bottom (labelContentSize),
  237. CanFocus = true
  238. };
  239. _cbTransparent.CheckedStateChanging += TransparentToggle;
  240. void TransparentToggle (object? sender, ResultEventArgs<CheckState> e)
  241. {
  242. if (e.Result == CheckState.Checked)
  243. {
  244. ViewToEdit!.ViewportSettings |= Terminal.Gui.ViewBase.ViewportSettingsFlags.Transparent;
  245. }
  246. else
  247. {
  248. ViewToEdit!.ViewportSettings &= ~Terminal.Gui.ViewBase.ViewportSettingsFlags.Transparent;
  249. }
  250. }
  251. _cbTransparentMouse = new ()
  252. {
  253. Title = "TransparentMouse",
  254. X = Pos.Right (_cbTransparent) + 1,
  255. Y = Pos.Bottom (labelContentSize),
  256. CanFocus = true
  257. };
  258. _cbTransparentMouse.CheckedStateChanging += TransparentMouseToggle;
  259. void TransparentMouseToggle (object? sender, ResultEventArgs<CheckState> e)
  260. {
  261. if (e.Result == CheckState.Checked)
  262. {
  263. ViewToEdit!.ViewportSettings |= Terminal.Gui.ViewBase.ViewportSettingsFlags.TransparentMouse;
  264. }
  265. else
  266. {
  267. ViewToEdit!.ViewportSettings &= ~Terminal.Gui.ViewBase.ViewportSettingsFlags.TransparentMouse;
  268. }
  269. }
  270. _cbVerticalScrollBar = new ()
  271. {
  272. Title = "VerticalScrollBar",
  273. X = 0,
  274. Y = Pos.Bottom (_cbClearContentOnly),
  275. CanFocus = false
  276. };
  277. _cbVerticalScrollBar.CheckedStateChanging += VerticalScrollBarToggle;
  278. void VerticalScrollBarToggle (object? sender, ResultEventArgs<CheckState> e)
  279. {
  280. ViewToEdit!.VerticalScrollBar.Visible = e.Result == CheckState.Checked;
  281. }
  282. _cbAutoShowVerticalScrollBar = new ()
  283. {
  284. Title = "AutoShow",
  285. X = Pos.Right (_cbVerticalScrollBar) + 1,
  286. Y = Pos.Top (_cbVerticalScrollBar),
  287. CanFocus = false
  288. };
  289. _cbAutoShowVerticalScrollBar.CheckedStateChanging += AutoShowVerticalScrollBarToggle;
  290. void AutoShowVerticalScrollBarToggle (object? sender, ResultEventArgs<CheckState> e)
  291. {
  292. ViewToEdit!.VerticalScrollBar.AutoShow = e.Result == CheckState.Checked;
  293. }
  294. _cbHorizontalScrollBar = new ()
  295. {
  296. Title = "HorizontalScrollBar",
  297. X = 0,
  298. Y = Pos.Bottom (_cbVerticalScrollBar),
  299. CanFocus = false
  300. };
  301. _cbHorizontalScrollBar.CheckedStateChanging += HorizontalScrollBarToggle;
  302. void HorizontalScrollBarToggle (object? sender, ResultEventArgs<CheckState> e)
  303. {
  304. ViewToEdit!.HorizontalScrollBar.Visible = e.Result == CheckState.Checked;
  305. }
  306. _cbAutoShowHorizontalScrollBar = new ()
  307. {
  308. Title = "AutoShow ",
  309. X = Pos.Right (_cbHorizontalScrollBar) + 1,
  310. Y = Pos.Top (_cbHorizontalScrollBar),
  311. CanFocus = false
  312. };
  313. _cbAutoShowHorizontalScrollBar.CheckedStateChanging += AutoShowHorizontalScrollBarToggle;
  314. void AutoShowHorizontalScrollBarToggle (object? sender, ResultEventArgs<CheckState> e)
  315. {
  316. ViewToEdit!.HorizontalScrollBar.AutoShow = e.Result == CheckState.Checked;
  317. }
  318. Add (
  319. labelContentSize,
  320. _contentSizeWidth,
  321. labelComma,
  322. _contentSizeHeight,
  323. _cbClearContentOnly,
  324. _cbClipContentOnly,
  325. _cbTransparent,
  326. _cbTransparentMouse,
  327. _cbVerticalScrollBar,
  328. _cbHorizontalScrollBar,
  329. _cbAutoShowVerticalScrollBar,
  330. _cbAutoShowHorizontalScrollBar);
  331. }
  332. }