#nullable enable using System; namespace UICatalog.Scenarios; /// /// Provides an editor UI for View.ViewportSettings. /// public sealed class ViewportSettingsEditor : EditorBase { public ViewportSettingsEditor () { Title = "ViewportSettingsEditor"; TabStop = TabBehavior.TabGroup; Initialized += ViewportSettingsEditor_Initialized; } protected override void OnViewToEditChanged () { foreach (View subview in SubViews) { subview.Enabled = ViewToEdit is not Adornment; } if (ViewToEdit is { } and not Adornment) { //ViewToEdit.VerticalScrollBar.AutoShow = true; //ViewToEdit.HorizontalScrollBar.AutoShow = true; _contentSizeWidth!.Value = ViewToEdit.GetContentSize ().Width; _contentSizeHeight!.Value = ViewToEdit.GetContentSize ().Height; _cbAllowNegativeX!.CheckedState = ViewToEdit.ViewportSettings.HasFlag (ViewportSettingsFlags.AllowNegativeX) ? CheckState.Checked : CheckState.UnChecked; _cbAllowNegativeY!.CheckedState = ViewToEdit.ViewportSettings.HasFlag (ViewportSettingsFlags.AllowNegativeY) ? CheckState.Checked : CheckState.UnChecked; _cbAllowXGreaterThanContentWidth!.CheckedState = ViewToEdit.ViewportSettings.HasFlag (ViewportSettingsFlags.AllowXGreaterThanContentWidth) ? CheckState.Checked : CheckState.UnChecked; _cbAllowYGreaterThanContentHeight!.CheckedState = ViewToEdit.ViewportSettings.HasFlag (ViewportSettingsFlags.AllowYGreaterThanContentHeight) ? CheckState.Checked : CheckState.UnChecked; _cbClearContentOnly!.CheckedState = ViewToEdit.ViewportSettings.HasFlag (ViewportSettingsFlags.ClearContentOnly) ? CheckState.Checked : CheckState.UnChecked; _cbClipContentOnly!.CheckedState = ViewToEdit.ViewportSettings.HasFlag (ViewportSettingsFlags.ClipContentOnly) ? CheckState.Checked : CheckState.UnChecked; _cbTransparent!.CheckedState = ViewToEdit.ViewportSettings.HasFlag (ViewportSettingsFlags.Transparent) ? CheckState.Checked : CheckState.UnChecked; _cbTransparentMouse!.CheckedState = ViewToEdit.ViewportSettings.HasFlag (ViewportSettingsFlags.TransparentMouse) ? CheckState.Checked : CheckState.UnChecked; _cbVerticalScrollBar!.CheckedState = ViewToEdit.VerticalScrollBar.Visible ? CheckState.Checked : CheckState.UnChecked; _cbAutoShowVerticalScrollBar!.CheckedState = ViewToEdit.VerticalScrollBar.AutoShow ? CheckState.Checked : CheckState.UnChecked; _cbHorizontalScrollBar!.CheckedState = ViewToEdit.HorizontalScrollBar.Visible ? CheckState.Checked : CheckState.UnChecked; _cbAutoShowHorizontalScrollBar!.CheckedState = ViewToEdit.HorizontalScrollBar.AutoShow ? CheckState.Checked : CheckState.UnChecked; } } private CheckBox? _cbAllowNegativeX; private CheckBox? _cbAllowNegativeY; private CheckBox? _cbAllowXGreaterThanContentWidth; private CheckBox? _cbAllowYGreaterThanContentHeight; private NumericUpDown? _contentSizeWidth; private NumericUpDown? _contentSizeHeight; private CheckBox? _cbClearContentOnly; private CheckBox? _cbClipContentOnly; private CheckBox? _cbTransparent; private CheckBox? _cbTransparentMouse; private CheckBox? _cbVerticalScrollBar; private CheckBox? _cbAutoShowVerticalScrollBar; private CheckBox? _cbHorizontalScrollBar; private CheckBox? _cbAutoShowHorizontalScrollBar; private void ViewportSettingsEditor_Initialized (object? s, EventArgs e) { _cbAllowNegativeX = new () { Title = "Allow X < 0", CanFocus = true }; Add (_cbAllowNegativeX); _cbAllowNegativeY = new () { Title = "Allow Y < 0", CanFocus = true }; Add (_cbAllowNegativeY); _cbAllowXGreaterThanContentWidth = new () { Title = "Allow X > Content Width", Y = Pos.Bottom (_cbAllowNegativeX), CanFocus = true }; _cbAllowNegativeX.CheckedStateChanging += AllowNegativeXToggle; _cbAllowXGreaterThanContentWidth.CheckedStateChanging += AllowXGreaterThanContentWidthToggle; Add (_cbAllowXGreaterThanContentWidth); void AllowNegativeXToggle (object? sender, ResultEventArgs e) { if (e.Result == CheckState.Checked) { ViewToEdit!.ViewportSettings |= Terminal.Gui.ViewBase.ViewportSettingsFlags.AllowNegativeX; } else { ViewToEdit!.ViewportSettings &= ~Terminal.Gui.ViewBase.ViewportSettingsFlags.AllowNegativeX; } } void AllowXGreaterThanContentWidthToggle (object? sender, ResultEventArgs e) { if (e.Result == CheckState.Checked) { ViewToEdit!.ViewportSettings |= Terminal.Gui.ViewBase.ViewportSettingsFlags.AllowXGreaterThanContentWidth; } else { ViewToEdit!.ViewportSettings &= ~Terminal.Gui.ViewBase.ViewportSettingsFlags.AllowXGreaterThanContentWidth; } } _cbAllowYGreaterThanContentHeight = new () { Title = "Allow Y > Content Height", X = Pos.Right (_cbAllowXGreaterThanContentWidth) + 1, Y = Pos.Bottom (_cbAllowNegativeX), CanFocus = true }; _cbAllowNegativeY.CheckedStateChanging += AllowNegativeYToggle; _cbAllowYGreaterThanContentHeight.CheckedStateChanging += AllowYGreaterThanContentHeightToggle; Add (_cbAllowYGreaterThanContentHeight); void AllowNegativeYToggle (object? sender, ResultEventArgs e) { if (e.Result == CheckState.Checked) { ViewToEdit!.ViewportSettings |= Terminal.Gui.ViewBase.ViewportSettingsFlags.AllowNegativeY; } else { ViewToEdit!.ViewportSettings &= ~Terminal.Gui.ViewBase.ViewportSettingsFlags.AllowNegativeY; } } void AllowYGreaterThanContentHeightToggle (object? sender, ResultEventArgs e) { if (e.Result == CheckState.Checked) { ViewToEdit!.ViewportSettings |= Terminal.Gui.ViewBase.ViewportSettingsFlags.AllowYGreaterThanContentHeight; } else { ViewToEdit!.ViewportSettings &= ~Terminal.Gui.ViewBase.ViewportSettingsFlags.AllowYGreaterThanContentHeight; } } _cbAllowNegativeY.X = Pos.Left (_cbAllowYGreaterThanContentHeight); var labelContentSize = new Label { Title = "ContentSize:", Y = Pos.Bottom (_cbAllowYGreaterThanContentHeight) }; _contentSizeWidth = new () { X = Pos.Right (labelContentSize) + 1, Y = Pos.Top (labelContentSize), CanFocus = true }; _contentSizeWidth.ValueChanging += ContentSizeWidthValueChanged; void ContentSizeWidthValueChanged (object? sender, CancelEventArgs e) { if (e.NewValue < 0) { e.Cancel = true; return; } // BUGBUG: set_ContentSize is supposed to be `protected`. ViewToEdit!.SetContentSize (ViewToEdit.GetContentSize () with { Width = e.NewValue }); } var labelComma = new Label { Title = ",", X = Pos.Right (_contentSizeWidth), Y = Pos.Top (labelContentSize) }; _contentSizeHeight = new () { X = Pos.Right (labelComma) + 1, Y = Pos.Top (labelContentSize), CanFocus = true }; _contentSizeHeight.ValueChanging += ContentSizeHeightValueChanged; void ContentSizeHeightValueChanged (object? sender, CancelEventArgs e) { if (e.NewValue < 0) { e.Cancel = true; return; } // BUGBUG: set_ContentSize is supposed to be `protected`. ViewToEdit?.SetContentSize (ViewToEdit.GetContentSize () with { Height = e.NewValue }); } _cbClearContentOnly = new () { Title = "ClearContentOnly", X = 0, Y = Pos.Bottom (labelContentSize), CanFocus = true }; _cbClearContentOnly.CheckedStateChanging += ClearContentOnlyToggle; void ClearContentOnlyToggle (object? sender, ResultEventArgs e) { if (e.Result == CheckState.Checked) { ViewToEdit!.ViewportSettings |= Terminal.Gui.ViewBase.ViewportSettingsFlags.ClearContentOnly; } else { ViewToEdit!.ViewportSettings &= ~Terminal.Gui.ViewBase.ViewportSettingsFlags.ClearContentOnly; } } _cbClipContentOnly = new () { Title = "ClipContentOnly", X = Pos.Right (_cbClearContentOnly) + 1, Y = Pos.Bottom (labelContentSize), CanFocus = true }; _cbClipContentOnly.CheckedStateChanging += ClipContentOnlyToggle; void ClipContentOnlyToggle (object? sender, ResultEventArgs e) { if (e.Result == CheckState.Checked) { ViewToEdit!.ViewportSettings |= Terminal.Gui.ViewBase.ViewportSettingsFlags.ClipContentOnly; } else { ViewToEdit!.ViewportSettings &= ~Terminal.Gui.ViewBase.ViewportSettingsFlags.ClipContentOnly; } } _cbTransparent = new () { Title = "Transparent", X = Pos.Right (_cbClipContentOnly) + 1, Y = Pos.Bottom (labelContentSize), CanFocus = true }; _cbTransparent.CheckedStateChanging += TransparentToggle; void TransparentToggle (object? sender, ResultEventArgs e) { if (e.Result == CheckState.Checked) { ViewToEdit!.ViewportSettings |= Terminal.Gui.ViewBase.ViewportSettingsFlags.Transparent; } else { ViewToEdit!.ViewportSettings &= ~Terminal.Gui.ViewBase.ViewportSettingsFlags.Transparent; } } _cbTransparentMouse = new () { Title = "TransparentMouse", X = Pos.Right (_cbTransparent) + 1, Y = Pos.Bottom (labelContentSize), CanFocus = true }; _cbTransparentMouse.CheckedStateChanging += TransparentMouseToggle; void TransparentMouseToggle (object? sender, ResultEventArgs e) { if (e.Result == CheckState.Checked) { ViewToEdit!.ViewportSettings |= Terminal.Gui.ViewBase.ViewportSettingsFlags.TransparentMouse; } else { ViewToEdit!.ViewportSettings &= ~Terminal.Gui.ViewBase.ViewportSettingsFlags.TransparentMouse; } } _cbVerticalScrollBar = new () { Title = "VerticalScrollBar", X = 0, Y = Pos.Bottom (_cbClearContentOnly), CanFocus = false }; _cbVerticalScrollBar.CheckedStateChanging += VerticalScrollBarToggle; void VerticalScrollBarToggle (object? sender, ResultEventArgs e) { ViewToEdit!.VerticalScrollBar.Visible = e.Result == CheckState.Checked; } _cbAutoShowVerticalScrollBar = new () { Title = "AutoShow", X = Pos.Right (_cbVerticalScrollBar) + 1, Y = Pos.Top (_cbVerticalScrollBar), CanFocus = false }; _cbAutoShowVerticalScrollBar.CheckedStateChanging += AutoShowVerticalScrollBarToggle; void AutoShowVerticalScrollBarToggle (object? sender, ResultEventArgs e) { ViewToEdit!.VerticalScrollBar.AutoShow = e.Result == CheckState.Checked; } _cbHorizontalScrollBar = new () { Title = "HorizontalScrollBar", X = 0, Y = Pos.Bottom (_cbVerticalScrollBar), CanFocus = false }; _cbHorizontalScrollBar.CheckedStateChanging += HorizontalScrollBarToggle; void HorizontalScrollBarToggle (object? sender, ResultEventArgs e) { ViewToEdit!.HorizontalScrollBar.Visible = e.Result == CheckState.Checked; } _cbAutoShowHorizontalScrollBar = new () { Title = "AutoShow ", X = Pos.Right (_cbHorizontalScrollBar) + 1, Y = Pos.Top (_cbHorizontalScrollBar), CanFocus = false }; _cbAutoShowHorizontalScrollBar.CheckedStateChanging += AutoShowHorizontalScrollBarToggle; void AutoShowHorizontalScrollBarToggle (object? sender, ResultEventArgs e) { ViewToEdit!.HorizontalScrollBar.AutoShow = e.Result == CheckState.Checked; } Add ( labelContentSize, _contentSizeWidth, labelComma, _contentSizeHeight, _cbClearContentOnly, _cbClipContentOnly, _cbTransparent, _cbTransparentMouse, _cbVerticalScrollBar, _cbHorizontalScrollBar, _cbAutoShowVerticalScrollBar, _cbAutoShowHorizontalScrollBar); } }