123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398 |
- using System;
- using System.Collections.ObjectModel;
- using System.Linq;
- using Terminal.Gui;
- namespace UICatalog.Scenarios;
- [ScenarioMetadata ("ScrollBar Demo", "Demonstrates ScrollBar.")]
- [ScenarioCategory ("Scrolling")]
- public class ScrollBarDemo : Scenario
- {
- public override void Main ()
- {
- Application.Init ();
- Window app = new ()
- {
- Title = $"{Application.QuitKey} to Quit - Scenario: {GetName ()}",
- Arrangement = ViewArrangement.Fixed
- };
- var demoFrame = new FrameView ()
- {
- Title = "Demo View",
- X = 0,
- Width = 75,
- Height = 25 + 4,
- ColorScheme = Colors.ColorSchemes ["Base"],
- Arrangement = ViewArrangement.Resizable
- };
- demoFrame!.Padding!.Thickness = new (1);
- demoFrame.Padding.Diagnostics = ViewDiagnosticFlags.Ruler;
- app.Add (demoFrame);
- var scrollBar = new ScrollBar
- {
- X = Pos.AnchorEnd () - 5,
- AutoShow = false,
- ScrollableContentSize = 100,
- Height = Dim.Fill()
- };
- demoFrame.Add (scrollBar);
- ListView controlledList = new ()
- {
- X = Pos.AnchorEnd (),
- Width = 5,
- Height = Dim.Fill (),
- ColorScheme = Colors.ColorSchemes ["Error"],
- };
- demoFrame.Add (controlledList);
- // populate the list box with Size items of the form "{n:00000}"
- controlledList.SetSource (new ObservableCollection<string> (Enumerable.Range (0, scrollBar.ScrollableContentSize).Select (n => $"{n:00000}")));
- int GetMaxLabelWidth (int groupId)
- {
- return demoFrame.Subviews.Max (
- v =>
- {
- if (v.Y.Has<PosAlign> (out var pos) && pos.GroupId == groupId)
- {
- return v.Text.GetColumns ();
- }
- return 0;
- });
- }
- var lblWidthHeight = new Label
- {
- Text = "_Width/Height:",
- TextAlignment = Alignment.End,
- Y = Pos.Align (Alignment.Start, AlignmentModes.StartToEnd, groupId: 1),
- Width = Dim.Func (() => GetMaxLabelWidth (1))
- };
- demoFrame.Add (lblWidthHeight);
- NumericUpDown<int> scrollWidthHeight = new ()
- {
- Value = 1,
- X = Pos.Right (lblWidthHeight) + 1,
- Y = Pos.Top (lblWidthHeight),
- };
- demoFrame.Add (scrollWidthHeight);
- scrollWidthHeight.ValueChanging += (s, e) =>
- {
- if (e.NewValue < 1
- || (e.NewValue
- > (scrollBar.Orientation == Orientation.Vertical
- ? scrollBar.SuperView?.GetContentSize ().Width
- : scrollBar.SuperView?.GetContentSize ().Height)))
- {
- // TODO: This must be handled in the ScrollSlider if Width and Height being virtual
- e.Cancel = true;
- return;
- }
- if (scrollBar.Orientation == Orientation.Vertical)
- {
- scrollBar.Width = e.NewValue;
- }
- else
- {
- scrollBar.Height = e.NewValue;
- }
- };
- var lblOrientationLabel = new Label
- {
- Text = "_Orientation:",
- TextAlignment = Alignment.End,
- Y = Pos.Align (Alignment.Start, groupId: 1),
- Width = Dim.Func (() => GetMaxLabelWidth (1))
- };
- demoFrame.Add (lblOrientationLabel);
- var rgOrientation = new RadioGroup
- {
- X = Pos.Right (lblOrientationLabel) + 1,
- Y = Pos.Top (lblOrientationLabel),
- RadioLabels = ["Vertical", "Horizontal"],
- Orientation = Orientation.Horizontal
- };
- demoFrame.Add (rgOrientation);
- rgOrientation.SelectedItemChanged += (s, e) =>
- {
- if (e.SelectedItem == e.PreviousSelectedItem)
- {
- return;
- }
- if (rgOrientation.SelectedItem == 0)
- {
- scrollBar.Orientation = Orientation.Vertical;
- scrollBar.X = Pos.AnchorEnd () - 5;
- scrollBar.Y = 0;
- scrollBar.Width = scrollWidthHeight.Value;
- scrollBar.Height = Dim.Fill ();
- controlledList.Visible = true;
- }
- else
- {
- scrollBar.Orientation = Orientation.Horizontal;
- scrollBar.X = 0;
- scrollBar.Y = Pos.AnchorEnd ();
- scrollBar.Height = scrollWidthHeight.Value;
- scrollBar.Width = Dim.Fill ();
- controlledList.Visible = false;
- }
- };
- var lblSize = new Label
- {
- Text = "Scrollable_ContentSize:",
- TextAlignment = Alignment.End,
- Y = Pos.Align (Alignment.Start, groupId: 1),
- Width = Dim.Func (() => GetMaxLabelWidth (1))
- };
- demoFrame.Add (lblSize);
- NumericUpDown<int> scrollContentSize = new ()
- {
- Value = scrollBar.ScrollableContentSize,
- X = Pos.Right (lblSize) + 1,
- Y = Pos.Top (lblSize)
- };
- demoFrame.Add (scrollContentSize);
- scrollContentSize.ValueChanging += (s, e) =>
- {
- if (e.NewValue < 0)
- {
- e.Cancel = true;
- return;
- }
- if (scrollBar.ScrollableContentSize != e.NewValue)
- {
- scrollBar.ScrollableContentSize = e.NewValue;
- controlledList.SetSource (new ObservableCollection<string> (Enumerable.Range (0, scrollBar.ScrollableContentSize).Select (n => $"{n:00000}")));
- }
- };
- var lblVisibleContentSize = new Label
- {
- Text = "_VisibleContentSize:",
- TextAlignment = Alignment.End,
- Y = Pos.Align (Alignment.Start, groupId: 1),
- Width = Dim.Func (() => GetMaxLabelWidth (1))
- };
- demoFrame.Add (lblVisibleContentSize);
- NumericUpDown<int> visibleContentSize = new ()
- {
- Value = scrollBar.VisibleContentSize,
- X = Pos.Right (lblVisibleContentSize) + 1,
- Y = Pos.Top (lblVisibleContentSize)
- };
- demoFrame.Add (visibleContentSize);
- visibleContentSize.ValueChanging += (s, e) =>
- {
- if (e.NewValue < 0)
- {
- e.Cancel = true;
- return;
- }
- if (scrollBar.VisibleContentSize != e.NewValue)
- {
- scrollBar.VisibleContentSize = e.NewValue;
- }
- };
- var lblPosition = new Label
- {
- Text = "_Position:",
- TextAlignment = Alignment.End,
- Y = Pos.Align (Alignment.Start, groupId: 1),
- Width = Dim.Func (() => GetMaxLabelWidth (1))
- };
- demoFrame.Add (lblPosition);
- NumericUpDown<int> scrollPosition = new ()
- {
- Value = scrollBar.GetSliderPosition (),
- X = Pos.Right (lblPosition) + 1,
- Y = Pos.Top (lblPosition)
- };
- demoFrame.Add (scrollPosition);
- scrollPosition.ValueChanging += (s, e) =>
- {
- if (e.NewValue < 0)
- {
- e.Cancel = true;
- return;
- }
- if (scrollBar.Position != e.NewValue)
- {
- scrollBar.Position = e.NewValue;
- }
- if (scrollBar.Position != e.NewValue)
- {
- e.Cancel = true;
- }
- };
- var lblOptions = new Label
- {
- Text = "Options:",
- TextAlignment = Alignment.End,
- Y = Pos.Align (Alignment.Start, groupId: 1),
- Width = Dim.Func (() => GetMaxLabelWidth (1))
- };
- demoFrame.Add (lblOptions);
- var autoShow = new CheckBox
- {
- Y = Pos.Top (lblOptions),
- X = Pos.Right (lblOptions) + 1,
- Text = $"_AutoShow",
- CheckedState = scrollBar.AutoShow ? CheckState.Checked : CheckState.UnChecked
- };
- autoShow.CheckedStateChanging += (s, e) => scrollBar.AutoShow = e.NewValue == CheckState.Checked;
- demoFrame.Add (autoShow);
- var lblSliderPosition = new Label
- {
- Text = "SliderPosition:",
- TextAlignment = Alignment.End,
- Y = Pos.Align (Alignment.Start, groupId: 1),
- Width = Dim.Func (() => GetMaxLabelWidth (1))
- };
- demoFrame.Add (lblSliderPosition);
- Label scrollSliderPosition = new ()
- {
- Text = scrollBar.GetSliderPosition ().ToString (),
- X = Pos.Right (lblSliderPosition) + 1,
- Y = Pos.Top (lblSliderPosition)
- };
- demoFrame.Add (scrollSliderPosition);
- var lblScrolled = new Label
- {
- Text = "Scrolled:",
- TextAlignment = Alignment.End,
- Y = Pos.Align (Alignment.Start, groupId: 1),
- Width = Dim.Func (() => GetMaxLabelWidth (1))
- };
- demoFrame.Add (lblScrolled);
- Label scrolled = new ()
- {
- X = Pos.Right (lblScrolled) + 1,
- Y = Pos.Top (lblScrolled)
- };
- demoFrame.Add (scrolled);
- var lblScrollFrame = new Label
- {
- Y = Pos.Bottom (lblScrolled) + 1
- };
- demoFrame.Add (lblScrollFrame);
- var lblScrollViewport = new Label
- {
- Y = Pos.Bottom (lblScrollFrame)
- };
- demoFrame.Add (lblScrollViewport);
- var lblScrollContentSize = new Label
- {
- Y = Pos.Bottom (lblScrollViewport)
- };
- demoFrame.Add (lblScrollContentSize);
- scrollBar.SubviewsLaidOut += (s, e) =>
- {
- lblScrollFrame.Text = $"Scroll Frame: {scrollBar.Frame.ToString ()}";
- lblScrollViewport.Text = $"Scroll Viewport: {scrollBar.Viewport.ToString ()}";
- lblScrollContentSize.Text = $"Scroll ContentSize: {scrollBar.GetContentSize ().ToString ()}";
- visibleContentSize.Value = scrollBar.VisibleContentSize;
- };
- EventLog eventLog = new ()
- {
- X = Pos.AnchorEnd (),
- Y = 0,
- Height = Dim.Fill (),
- BorderStyle = LineStyle.Single,
- ViewToLog = scrollBar
- };
- app.Add (eventLog);
- app.Initialized += AppOnInitialized;
- void AppOnInitialized (object sender, EventArgs e)
- {
- scrollBar.ScrollableContentSizeChanged += (s, e) =>
- {
- eventLog.Log ($"SizeChanged: {e.CurrentValue}");
- if (scrollContentSize.Value != e.CurrentValue)
- {
- scrollContentSize.Value = e.CurrentValue;
- }
- };
- scrollBar.SliderPositionChanged += (s, e) =>
- {
- eventLog.Log ($"SliderPositionChanged: {e.CurrentValue}");
- eventLog.Log ($" Position: {scrollBar.Position}");
- scrollSliderPosition.Text = e.CurrentValue.ToString ();
- };
- scrollBar.Scrolled += (s, e) =>
- {
- eventLog.Log ($"Scrolled: {e.CurrentValue}");
- eventLog.Log ($" SliderPosition: {scrollBar.GetSliderPosition ()}");
- scrolled.Text = e.CurrentValue.ToString ();
- };
- scrollBar.PositionChanged += (s, e) =>
- {
- eventLog.Log ($"PositionChanged: {e.CurrentValue}");
- scrollPosition.Value = e.CurrentValue;
- controlledList.Viewport = controlledList.Viewport with { Y = e.CurrentValue };
- };
- controlledList.ViewportChanged += (s, e) =>
- {
- eventLog.Log ($"ViewportChanged: {e.NewViewport}");
- scrollBar.Position = e.NewViewport.Y;
- };
- }
- Application.Run (app);
- app.Dispose ();
- Application.Shutdown ();
- }
- }
|