|
@@ -1,7 +1,5 @@
|
|
|
#nullable enable
|
|
|
|
|
|
-using System.Drawing;
|
|
|
-
|
|
|
namespace Terminal.Gui;
|
|
|
|
|
|
/// <summary>The Margin for a <see cref="View"/>.</summary>
|
|
@@ -28,58 +26,68 @@ public class Margin : Adornment
|
|
|
CanFocus = false;
|
|
|
}
|
|
|
|
|
|
- private void Margin_LayoutStarted (object? sender, LayoutEventArgs e)
|
|
|
+ private bool _pressed;
|
|
|
+
|
|
|
+ private ShadowView? _bottomShadow;
|
|
|
+ private ShadowView? _rightShadow;
|
|
|
+
|
|
|
+ /// <inheritdoc/>
|
|
|
+ public override void BeginInit ()
|
|
|
{
|
|
|
- // Adjust the shadow such that it is drawn aligned with the Border
|
|
|
- if (ShadowStyle != Gui.ShadowStyle.None && _rightShadow is { } && _bottomShadow is { })
|
|
|
+ base.BeginInit ();
|
|
|
+
|
|
|
+ if (Parent is null)
|
|
|
{
|
|
|
- _rightShadow.Y = Parent.Border.Thickness.Top > 0 ? Parent.Border.Thickness.Top - (Parent.Border.Thickness.Top > 2 && Parent.Border.ShowTitle ? 1 : 0) : 1;
|
|
|
- _bottomShadow.X = Parent.Border.Thickness.Left > 0 ? Parent.Border.Thickness.Left : 1;
|
|
|
+ return;
|
|
|
}
|
|
|
+
|
|
|
+ ShadowStyle = base.ShadowStyle;
|
|
|
+
|
|
|
+ Add (
|
|
|
+ _rightShadow = new()
|
|
|
+ {
|
|
|
+ X = Pos.AnchorEnd (1),
|
|
|
+ Y = 0,
|
|
|
+ Width = 1,
|
|
|
+ Height = Dim.Fill (),
|
|
|
+ ShadowStyle = ShadowStyle,
|
|
|
+ Orientation = Orientation.Vertical
|
|
|
+ },
|
|
|
+ _bottomShadow = new()
|
|
|
+ {
|
|
|
+ X = 0,
|
|
|
+ Y = Pos.AnchorEnd (1),
|
|
|
+ Width = Dim.Fill (),
|
|
|
+ Height = 1,
|
|
|
+ ShadowStyle = ShadowStyle,
|
|
|
+ Orientation = Orientation.Horizontal
|
|
|
+ }
|
|
|
+ );
|
|
|
}
|
|
|
|
|
|
- private bool _pressed;
|
|
|
- private void Margin_Highlight (object? sender, CancelEventArgs<HighlightStyle> e)
|
|
|
+ /// <summary>
|
|
|
+ /// The color scheme for the Margin. If set to <see langword="null"/>, gets the <see cref="Adornment.Parent"/>'s
|
|
|
+ /// <see cref="View.SuperView"/> scheme. color scheme.
|
|
|
+ /// </summary>
|
|
|
+ public override ColorScheme ColorScheme
|
|
|
{
|
|
|
- if (ShadowStyle != Gui.ShadowStyle.None)
|
|
|
+ get
|
|
|
{
|
|
|
- if (_pressed && e.CurrentValue == HighlightStyle.None)
|
|
|
+ if (base.ColorScheme is { })
|
|
|
{
|
|
|
- Thickness = new (Thickness.Left - 1, Thickness.Top, Thickness.Right + 1, Thickness.Bottom);
|
|
|
-
|
|
|
- if (_rightShadow is { })
|
|
|
- {
|
|
|
- _rightShadow.Visible = true;
|
|
|
- }
|
|
|
-
|
|
|
- if (_bottomShadow is { })
|
|
|
- {
|
|
|
- _bottomShadow.Visible = true;
|
|
|
- }
|
|
|
-
|
|
|
- _pressed = false;
|
|
|
- return;
|
|
|
+ return base.ColorScheme;
|
|
|
}
|
|
|
|
|
|
- if (!_pressed && (e.CurrentValue.HasFlag (HighlightStyle.Pressed) /*|| e.HighlightStyle.HasFlag (HighlightStyle.PressedOutside)*/))
|
|
|
- {
|
|
|
- Thickness = new (Thickness.Left + 1, Thickness.Top, Thickness.Right - 1, Thickness.Bottom);
|
|
|
- _pressed = true;
|
|
|
- if (_rightShadow is { })
|
|
|
- {
|
|
|
- _rightShadow.Visible = false;
|
|
|
- }
|
|
|
-
|
|
|
- if (_bottomShadow is { })
|
|
|
- {
|
|
|
- _bottomShadow.Visible = false;
|
|
|
- }
|
|
|
- }
|
|
|
+ return (Parent?.SuperView?.ColorScheme ?? Colors.ColorSchemes ["TopLevel"])!;
|
|
|
+ }
|
|
|
+ set
|
|
|
+ {
|
|
|
+ base.ColorScheme = value;
|
|
|
+ Parent?.SetNeedsDisplay ();
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
|
|
|
- /// <inheritdoc />
|
|
|
+ /// <inheritdoc/>
|
|
|
public override void OnDrawContent (Rectangle viewport)
|
|
|
{
|
|
|
Rectangle screen = ViewportToScreen (viewport);
|
|
@@ -87,12 +95,12 @@ public class Margin : Adornment
|
|
|
|
|
|
Driver?.SetAttribute (normalAttr);
|
|
|
|
|
|
-
|
|
|
// This just draws/clears the thickness, not the insides.
|
|
|
if (ShadowStyle != ShadowStyle.None)
|
|
|
{
|
|
|
screen = Rectangle.Inflate (screen, -1, -1);
|
|
|
}
|
|
|
+
|
|
|
Thickness.Draw (screen, ToString ());
|
|
|
|
|
|
if (Subviews.Count > 0)
|
|
@@ -105,12 +113,14 @@ public class Margin : Adornment
|
|
|
view => view.Visible
|
|
|
&& (view.NeedsDisplay || view.SubViewNeedsDisplay || view.LayoutNeeded)
|
|
|
);
|
|
|
+
|
|
|
foreach (View view in subviewsNeedingDraw)
|
|
|
{
|
|
|
if (view.LayoutNeeded)
|
|
|
{
|
|
|
view.LayoutSubviews ();
|
|
|
}
|
|
|
+
|
|
|
view.Draw ();
|
|
|
}
|
|
|
}
|
|
@@ -118,39 +128,7 @@ public class Margin : Adornment
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
- /// The color scheme for the Margin. If set to <see langword="null"/>, gets the <see cref="Adornment.Parent"/>'s
|
|
|
- /// <see cref="View.SuperView"/> scheme. color scheme.
|
|
|
- /// </summary>
|
|
|
- public override ColorScheme ColorScheme
|
|
|
- {
|
|
|
- get
|
|
|
- {
|
|
|
- if (base.ColorScheme is { })
|
|
|
- {
|
|
|
- return base.ColorScheme;
|
|
|
- }
|
|
|
-
|
|
|
- return (Parent?.SuperView?.ColorScheme ?? Colors.ColorSchemes ["TopLevel"])!;
|
|
|
- }
|
|
|
- set
|
|
|
- {
|
|
|
- base.ColorScheme = value;
|
|
|
- Parent?.SetNeedsDisplay ();
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /// <inheritdoc />
|
|
|
- public override ShadowStyle ShadowStyle
|
|
|
- {
|
|
|
- get => base.ShadowStyle;
|
|
|
- set
|
|
|
- {
|
|
|
- base.ShadowStyle = SetShadow (value);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /// <summary>
|
|
|
- /// Sets whether the Margin includes a shadow effect. The shadow is drawn on the right and bottom sides of the
|
|
|
+ /// Sets whether the Margin includes a shadow effect. The shadow is drawn on the right and bottom sides of the
|
|
|
/// Margin.
|
|
|
/// </summary>
|
|
|
public ShadowStyle SetShadow (ShadowStyle style)
|
|
@@ -181,42 +159,73 @@ public class Margin : Adornment
|
|
|
{
|
|
|
_bottomShadow.ShadowStyle = style;
|
|
|
}
|
|
|
+
|
|
|
return style;
|
|
|
}
|
|
|
|
|
|
- private ShadowView? _bottomShadow;
|
|
|
- private ShadowView? _rightShadow;
|
|
|
-
|
|
|
/// <inheritdoc/>
|
|
|
- public override void BeginInit ()
|
|
|
+ public override ShadowStyle ShadowStyle
|
|
|
{
|
|
|
- base.BeginInit ();
|
|
|
+ get => base.ShadowStyle;
|
|
|
+ set => base.ShadowStyle = SetShadow (value);
|
|
|
+ }
|
|
|
|
|
|
- if (Parent is null)
|
|
|
+ private void Margin_Highlight (object? sender, CancelEventArgs<HighlightStyle> e)
|
|
|
+ {
|
|
|
+ if (ShadowStyle != ShadowStyle.None)
|
|
|
{
|
|
|
- return;
|
|
|
+ if (_pressed && e.NewValue == HighlightStyle.None)
|
|
|
+ {
|
|
|
+ // If the view is pressed and the highlight is being removed, move the shadow back.
|
|
|
+ // Note, for visual effects reasons, we only move horizontally.
|
|
|
+ // TODO: Add a setting or flag that lets the view move vertically as well.
|
|
|
+ Thickness = new (Thickness.Left - 1, Thickness.Top, Thickness.Right + 1, Thickness.Bottom);
|
|
|
+
|
|
|
+ if (_rightShadow is { })
|
|
|
+ {
|
|
|
+ _rightShadow.Visible = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (_bottomShadow is { })
|
|
|
+ {
|
|
|
+ _bottomShadow.Visible = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ _pressed = false;
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!_pressed && e.NewValue.HasFlag (HighlightStyle.Pressed))
|
|
|
+ {
|
|
|
+ // If the view is not pressed and we want highlight move the shadow
|
|
|
+ // Note, for visual effects reasons, we only move horizontally.
|
|
|
+ // TODO: Add a setting or flag that lets the view move vertically as well.
|
|
|
+ Thickness = new (Thickness.Left + 1, Thickness.Top, Thickness.Right - 1, Thickness.Bottom);
|
|
|
+ _pressed = true;
|
|
|
+
|
|
|
+ if (_rightShadow is { })
|
|
|
+ {
|
|
|
+ _rightShadow.Visible = false;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (_bottomShadow is { })
|
|
|
+ {
|
|
|
+ _bottomShadow.Visible = false;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- ShadowStyle = base.ShadowStyle;
|
|
|
- Add (
|
|
|
- _rightShadow = new ShadowView
|
|
|
- {
|
|
|
- X = Pos.AnchorEnd (1),
|
|
|
- Y = 0,
|
|
|
- Width = 1,
|
|
|
- Height = Dim.Fill (),
|
|
|
- ShadowStyle = ShadowStyle,
|
|
|
- Orientation = Orientation.Vertical
|
|
|
- },
|
|
|
- _bottomShadow = new ShadowView
|
|
|
- {
|
|
|
- X = 0,
|
|
|
- Y = Pos.AnchorEnd (1),
|
|
|
- Width = Dim.Fill (),
|
|
|
- Height = 1,
|
|
|
- ShadowStyle = ShadowStyle,
|
|
|
- Orientation = Orientation.Horizontal
|
|
|
- }
|
|
|
- );
|
|
|
+ private void Margin_LayoutStarted (object? sender, LayoutEventArgs e)
|
|
|
+ {
|
|
|
+ // Adjust the shadow such that it is drawn aligned with the Border
|
|
|
+ if (ShadowStyle != ShadowStyle.None && _rightShadow is { } && _bottomShadow is { })
|
|
|
+ {
|
|
|
+ _rightShadow.Y = Parent.Border.Thickness.Top > 0
|
|
|
+ ? Parent.Border.Thickness.Top - (Parent.Border.Thickness.Top > 2 && Parent.Border.ShowTitle ? 1 : 0)
|
|
|
+ : 1;
|
|
|
+ _bottomShadow.X = Parent.Border.Thickness.Left > 0 ? Parent.Border.Thickness.Left : 1;
|
|
|
+ }
|
|
|
}
|
|
|
-}
|
|
|
+}
|