#nullable enable namespace Terminal.Gui; internal enum VariationMode { Decrease, Increase } internal class ScrollButton : View { public ScrollButton (ScrollBar host, VariationMode variation = VariationMode.Decrease) { _host = host; VariationMode = variation; TextAlignment = Alignment.Center; VerticalTextAlignment = Alignment.Center; Id = "scrollButton"; //Width = Dim.Auto (DimAutoStyle.Content, 1); //Height = Dim.Auto (DimAutoStyle.Content, 1); WantContinuousButtonPressed = true; } private readonly ScrollBar _host; private ColorScheme? _savedColorScheme; public void AdjustButton () { if (!IsInitialized) { return; } Width = _host.Orientation == Orientation.Vertical ? Dim.Fill () : 1; Height = _host.Orientation == Orientation.Vertical ? 1 : Dim.Fill (); switch (VariationMode) { case VariationMode.Decrease: X = 0; Y = 0; break; case VariationMode.Increase: X = _host.Orientation == Orientation.Vertical ? 0 : Pos.AnchorEnd (1); Y = _host.Orientation == Orientation.Vertical ? Pos.AnchorEnd (1) : 0; break; default: throw new ArgumentOutOfRangeException (); } SetButtonText (); } /// public override Attribute GetNormalColor () { if (_savedColorScheme is null) { ColorScheme = new () { Normal = new (_host.ColorScheme.HotNormal.Foreground, _host.ColorScheme.HotNormal.Background) }; } else { ColorScheme = new () { Normal = new (_host.ColorScheme.Normal.Background, _host.ColorScheme.Normal.Foreground) }; } return base.GetNormalColor (); } public VariationMode VariationMode { get; } /// protected internal override bool? OnMouseEnter (MouseEvent mouseEvent) { _savedColorScheme ??= _host.ColorScheme; ColorScheme = new () { Normal = new (_savedColorScheme.HotNormal.Foreground, _savedColorScheme.HotNormal.Foreground), Focus = new (_savedColorScheme.Focus.Foreground, _savedColorScheme.Focus.Foreground), HotNormal = new (_savedColorScheme.Normal.Foreground, _savedColorScheme.Normal.Foreground), HotFocus = new (_savedColorScheme.HotFocus.Foreground, _savedColorScheme.HotFocus.Foreground), Disabled = new (_savedColorScheme.Disabled.Foreground, _savedColorScheme.Disabled.Foreground) }; return base.OnMouseEnter (mouseEvent); } /// protected internal override bool OnMouseEvent (MouseEvent mouseEvent) { if (mouseEvent.Flags.HasFlag (MouseFlags.Button1Pressed)) { switch (VariationMode) { case VariationMode.Decrease: _host.Position--; return true; case VariationMode.Increase: _host.Position++; return true; default: throw new ArgumentOutOfRangeException (); } } return base.OnMouseEvent (mouseEvent); } /// protected internal override bool OnMouseLeave (MouseEvent mouseEvent) { if (_savedColorScheme is { } && !mouseEvent.Flags.HasFlag (MouseFlags.Button1Pressed)) { ColorScheme = _savedColorScheme; _savedColorScheme = null; } return base.OnMouseLeave (mouseEvent); } private void SetButtonText () { switch (VariationMode) { case VariationMode.Decrease: Text = _host.Orientation == Orientation.Vertical ? Glyphs.UpArrow.ToString () : Glyphs.LeftArrow.ToString (); break; case VariationMode.Increase: Text = _host.Orientation == Orientation.Vertical ? Glyphs.DownArrow.ToString () : Glyphs.RightArrow.ToString (); break; default: throw new ArgumentOutOfRangeException (); } } }