diff --git a/Terminal.Gui/Text/TextFormatter.cs b/Terminal.Gui/Text/TextFormatter.cs index b8dfa3d57..d9bba800d 100644 --- a/Terminal.Gui/Text/TextFormatter.cs +++ b/Terminal.Gui/Text/TextFormatter.cs @@ -30,7 +30,7 @@ public class TextFormatter /// Gets or sets whether the should be automatically changed to fit the . /// - /// Used by to resize the view's to fit . + /// Used when is using to resize the view's to fit . /// /// AutoSize is ignored if and /// are used. diff --git a/Terminal.Gui/View/Layout/ViewLayout.cs b/Terminal.Gui/View/Layout/ViewLayout.cs index 4c4891a6e..012092a43 100644 --- a/Terminal.Gui/View/Layout/ViewLayout.cs +++ b/Terminal.Gui/View/Layout/ViewLayout.cs @@ -395,140 +395,6 @@ public partial class View } } - ///// Determines if the View's can be set to a new value. - ///// TrySetHeight can only be called when AutoSize is true (or being set to true). - ///// - ///// - ///// Contains the width that would result if were set to - ///// "/> - ///// - ///// - ///// if the View's can be changed to the specified value. False - ///// otherwise. - ///// - //internal bool TrySetHeight (int desiredHeight, out int resultHeight) - //{ - // int h = desiredHeight; - // bool canSetHeight; - - // switch (Height) - // { - // case Dim.DimCombine _: - // case Dim.DimView _: - // case Dim.DimFill _: - // // It's a Dim.DimCombine and so can't be assigned. Let it have it's height anchored. - // h = Height.Anchor (h); - // canSetHeight = !ValidatePosDim; - - // break; - // case Dim.DimFactor factor: - // // Tries to get the SuperView height otherwise the view height. - // int sh = SuperView is { } ? SuperView.Frame.Height : h; - - // if (factor.IsFromRemaining ()) - // { - // sh -= Frame.Y; - // } - - // h = Height.Anchor (sh); - // canSetHeight = !ValidatePosDim; - - // break; - // default: - // canSetHeight = true; - - // break; - // } - - // resultHeight = h; - - // return canSetHeight; - //} - - ///// Determines if the View's can be set to a new value. - ///// TrySetWidth can only be called when AutoSize is true (or being set to true). - ///// - ///// - ///// Contains the width that would result if were set to - ///// "/> - ///// - ///// - ///// if the View's can be changed to the specified value. False - ///// otherwise. - ///// - //internal bool TrySetWidth (int desiredWidth, out int resultWidth) - //{ - // int w = desiredWidth; - // bool canSetWidth; - - // switch (Width) - // { - // case Dim.DimCombine _: - // case Dim.DimView _: - // case Dim.DimFill _: - // // It's a Dim.DimCombine and so can't be assigned. Let it have it's Width anchored. - // w = Width.Anchor (w); - // canSetWidth = !ValidatePosDim; - - // break; - // case Dim.DimFactor factor: - // // Tries to get the SuperView Width otherwise the view Width. - // int sw = SuperView is { } ? SuperView.Frame.Width : w; - - // if (factor.IsFromRemaining ()) - // { - // sw -= Frame.X; - // } - - // w = Width.Anchor (sw); - // canSetWidth = !ValidatePosDim; - - // break; - // default: - // canSetWidth = true; - - // break; - // } - - // resultWidth = w; - - // return canSetWidth; - //} - - ///// Resizes the View to fit the specified size. Factors in the HotKey. - ///// ResizeBoundsToFit can only be called when AutoSize is true (or being set to true). - ///// - ///// whether the Viewport was changed or not - //private bool ResizeViewportToFit (Size size) - //{ - // //if (AutoSize == false) { - // // throw new InvalidOperationException ("ResizeViewportToFit can only be called when AutoSize is true"); - // //} - - // var changed = false; - // bool canSizeW = TrySetWidth (size.Width - GetHotKeySpecifierLength (), out int rW); - // bool canSizeH = TrySetHeight (size.Height - GetHotKeySpecifierLength (false), out int rH); - - // if (canSizeW) - // { - // changed = true; - // _width = rW; - // } - - // if (canSizeH) - // { - // changed = true; - // _height = rH; - // } - - // if (changed) - // { - // Viewport = new (Viewport.X, Viewport.Y, canSizeW ? rW : Viewport.Width, canSizeH ? rH : Viewport.Height); - // } - - // return changed; - //} - #endregion AutoSize #region Layout Engine @@ -1110,33 +976,6 @@ public partial class View SetNeedsLayout (); SetNeedsDisplay (); } - - //if (AutoSize) - //{ - // if (autoSize.Width == 0 || autoSize.Height == 0) - // { - // // Set the frame. Do NOT use `Frame` as it overwrites X, Y, Width, and Height, making - // // the view LayoutStyle.Absolute. - // SetFrame (_frame with { Size = autoSize }); - - // if (autoSize.Width == 0) - // { - // _width = 0; - // } - - // if (autoSize.Height == 0) - // { - // _height = 0; - // } - // } - // //else if (!SetFrameToFitText ()) - // //{ - // // SetTextFormatterSize (); - // //} - - // SetNeedsLayout (); - // SetNeedsDisplay (); - //} } internal void CollectAll (View from, ref HashSet nNodes, ref HashSet<(View, View)> nEdges) diff --git a/Terminal.Gui/View/ViewDrawing.cs b/Terminal.Gui/View/ViewDrawing.cs index 9a0823343..b506dedf5 100644 --- a/Terminal.Gui/View/ViewDrawing.cs +++ b/Terminal.Gui/View/ViewDrawing.cs @@ -577,10 +577,7 @@ public partial class View /// public void SetNeedsDisplay () { - //if (IsInitialized) - { - SetNeedsDisplay (Viewport); - } + SetNeedsDisplay (Viewport); } /// Expands the area of this view needing to be redrawn to include . @@ -597,13 +594,6 @@ public partial class View /// The content-relative region that needs to be redrawn. public void SetNeedsDisplay (Rectangle region) { - //if (!IsInitialized) - //{ - // _needsDisplayRect = region; - - // return; - //} - if (_needsDisplayRect.IsEmpty) { _needsDisplayRect = region; diff --git a/Terminal.Gui/View/ViewText.cs b/Terminal.Gui/View/ViewText.cs index 4377143c9..2b7d83bf6 100644 --- a/Terminal.Gui/View/ViewText.cs +++ b/Terminal.Gui/View/ViewText.cs @@ -40,7 +40,8 @@ public partial class View /// The text will word-wrap to additional lines if it does not fit horizontally. If 's height /// is 1, the text will be clipped. /// - /// If is true, the will be adjusted to fit the text. + /// If or are using , + /// the will be adjusted to fit the text. /// When the text changes, the is fired. /// public virtual string Text @@ -83,7 +84,7 @@ public partial class View /// redisplay the . /// /// - /// If is true, the will be adjusted to fit the text. + /// or are using , the will be adjusted to fit the text. /// /// The text alignment. public virtual TextAlignment TextAlignment @@ -102,7 +103,7 @@ public partial class View /// . /// /// - /// If is true, the will be adjusted to fit the text. + /// or are using , the will be adjusted to fit the text. /// /// The text alignment. public virtual TextDirection TextDirection @@ -126,7 +127,7 @@ public partial class View /// the . /// /// - /// If is true, the will be adjusted to fit the text. + /// or are using , the will be adjusted to fit the text. /// /// The text alignment. public virtual VerticalTextAlignment VerticalTextAlignment @@ -139,64 +140,6 @@ public partial class View } } - /// - /// Gets the width or height of the characters - /// in the property. - /// - /// - /// Only the first HotKey specifier found in is supported. - /// - /// - /// If (the default) the width required for the HotKey specifier is returned. Otherwise the - /// height - /// is returned. - /// - /// - /// The number of characters required for the . If the text - /// direction specified - /// by does not match the parameter, 0 is returned. - /// - public int GetHotKeySpecifierLength (bool isWidth = true) - { - if (isWidth) - { - return TextFormatter.IsHorizontalDirection (TextDirection) && TextFormatter.Text?.Contains ((char)HotKeySpecifier.Value) == true - ? Math.Max (HotKeySpecifier.GetColumns (), 0) - : 0; - } - - return TextFormatter.IsVerticalDirection (TextDirection) && TextFormatter.Text?.Contains ((char)HotKeySpecifier.Value) == true - ? Math.Max (HotKeySpecifier.GetColumns (), 0) - : 0; - } - - ///// - ///// Gets dimensions required to fit within using the text - ///// specified by the property and accounting for any - ///// characters. - ///// - ///// - ///// - ///// The of the required to fit the formatted text. - //public Size GetTextAutoSize () - //{ - // var x = 0; - // var y = 0; - - // if (IsInitialized) - // { - // x = Viewport.X; - // y = Viewport.Y; - // } - - // // Get the size of the text without the hot key specifier - // Rectangle rect = TextFormatter.CalcRect (x, y, TextFormatter.Text, TextFormatter.Direction); - // int newWidth = rect.Size.Width - GetHotKeySpecifierLength (); - // int newHeight = rect.Size.Height - GetHotKeySpecifierLength (false); - - // return new (newWidth, newHeight); - //} - /// /// Can be overridden if the has /// different format than the default. @@ -216,8 +159,8 @@ public partial class View internal Size GetSizeNeededForTextWithoutHotKey () { return new Size ( - TextFormatter.Size.Width - GetHotKeySpecifierLength (), - TextFormatter.Size.Height - GetHotKeySpecifierLength (false)); + TextFormatter.Size.Width - TextFormatter.GetHotKeySpecifierLength (), + TextFormatter.Size.Height - TextFormatter.GetHotKeySpecifierLength (false)); } /// @@ -234,14 +177,6 @@ public partial class View { UpdateTextFormatterText (); - //if (!IsInitialized) - //{ - // return; - //} - - //Dim.DimAuto widthAuto = Width as Dim.DimAuto; - //Dim.DimAuto heightAuto = Height as Dim.DimAuto; - // TODO: This is a hack. Figure out how to move this into DimDimAuto // Use _width & _height instead of Width & Height to avoid debug spew if ((_width is Dim.DimAuto widthAuto && widthAuto._style != Dim.DimAutoStyle.Subviews) @@ -259,148 +194,78 @@ public partial class View TextFormatter.Size = new Size (ContentSize.Width, ContentSize.Height); } - ////private bool IsValidAutoSize (out Size autoSize) - ////{ - //// Rectangle rect = TextFormatter.CalcRect (_frame.X, _frame.Y, TextFormatter.Text, TextDirection); - - //// autoSize = new Size ( - //// rect.Size.Width - GetHotKeySpecifierLength (), - //// rect.Size.Height - GetHotKeySpecifierLength (false)); - - //// return !((ValidatePosDim && (!(Width is Dim.DimAbsolute) || !(Height is Dim.DimAbsolute))) - //// || _frame.Size.Width != rect.Size.Width - GetHotKeySpecifierLength () - //// || _frame.Size.Height != rect.Size.Height - GetHotKeySpecifierLength (false)); - ////} - - //private bool IsValidAutoSizeHeight (Dim height) - //{ - // Rectangle rect = TextFormatter.CalcRect (_frame.X, _frame.Y, TextFormatter.Text, TextDirection); - // int dimValue = height.Anchor (0); - - // return !((ValidatePosDim && !(height is Dim.DimAbsolute)) || dimValue != rect.Size.Height - GetHotKeySpecifierLength (false)); - //} - - //private bool IsValidAutoSizeWidth (Dim width) - //{ - // Rectangle rect = TextFormatter.CalcRect (_frame.X, _frame.Y, TextFormatter.Text, TextDirection); - // int dimValue = width.Anchor (0); - - // return !((ValidatePosDim && !(width is Dim.DimAbsolute)) || dimValue != rect.Size.Width - GetHotKeySpecifierLength ()); - //} - - ///// - ///// Sets the size of the View to the minimum width or height required to fit . - ///// - ///// - ///// if the size was changed; if == - ///// or - ///// will not fit. - ///// - ///// - ///// Always returns if is or - ///// if (Horizontal) or (Vertical) are not not set or zero. - ///// Does not take into account word wrapping. - ///// - //private bool SetFrameToFitText () - //{ - // if (AutoSize == false) - // { - // throw new InvalidOperationException ("SetFrameToFitText can only be called when AutoSize is true"); - // } - - // // BUGBUG: This API is broken - should not assume Frame.Height == ContentSize.Height - // // - // // Gets the minimum dimensions required to fit the View's , factoring in . - // // - // // The minimum dimensions required. - // // if the dimensions fit within the View's , otherwise. - // // - // // Always returns if is or - // // if (Horizontal) or (Vertical) are not not set or zero. - // // Does not take into account word wrapping. - // // - // bool GetMinimumSizeOfText (out Size sizeRequired) - // { - // if (!IsInitialized) - // { - // sizeRequired = Size.Empty; - - // return false; - // } - - // sizeRequired = ContentSize; - - // if (AutoSize || string.IsNullOrEmpty (TextFormatter.Text)) - // { - // return false; - // } - - // switch (TextFormatter.IsVerticalDirection (TextDirection)) - // { - // case true: - // int colWidth = TextFormatter.GetColumnsRequiredForVerticalText (new List { TextFormatter.Text }, 0, 1); - - //// // TODO: v2 - This uses frame.Width; it should only use ContentSize - // if (_frame.Width < colWidth - // && (Width is null || (ContentSize.Width >= 0 && Width is Dim.DimAbsolute && Width.Anchor (0) >= 0 && Width.Anchor (0) < colWidth))) - // { - // sizeRequired = new (colWidth, ContentSize.Height); - - // return true; - // } - - // break; - // default: - // if (_frame.Height < 1 && (Height is null || (Height is Dim.DimAbsolute && Height.Anchor (0) == 0))) - // { - // sizeRequired = new (ContentSize.Width, 1); - - // return true; - // } - - // break; - // } - - // return false; - // } - - // if (GetMinimumSizeOfText (out Size size)) - // { - // // TODO: This is a hack. - // //_width = size.Width; - // //_height = size.Height; - // SetFrame (new (_frame.Location, size)); - - // //throw new InvalidOperationException ("This is a hack."); - // return true; - // } - - // return false; - //} - private void UpdateTextDirection (TextDirection newDirection) { bool directionChanged = TextFormatter.IsHorizontalDirection (TextFormatter.Direction) != TextFormatter.IsHorizontalDirection (newDirection); TextFormatter.Direction = newDirection; - //bool isValidOldAutoSize = AutoSize && IsValidAutoSize (out Size _); - UpdateTextFormatterText (); if (directionChanged) { OnResizeNeeded (); } - //if ((!ValidatePosDim && directionChanged && AutoSize) || (ValidatePosDim && directionChanged && AutoSize && isValidOldAutoSize)) - //{ - // OnResizeNeeded (); - //} - //else if (directionChanged && IsAdded) - //{ - // ResizeViewportToFit (Viewport.Size); - //} SetTextFormatterSize (); SetNeedsDisplay (); } + + + #region AutoSize + + /// + /// Gets or sets a flag that determines whether the View will be automatically resized to fit the + /// within . + /// + /// The default is . Set to to turn on AutoSize. If + /// then and will be used if can + /// fit; if won't fit the view will be resized as needed. + /// + /// + /// If is set to then and + /// will be changed to if they are not already. + /// + /// + /// If is set to then and + /// will left unchanged. + /// + /// + [ObsoleteAttribute ("Use Dim.Auto instead.", false)] + public virtual bool AutoSize + { + get => _height is Dim.DimAuto && _width is Dim.DimAuto; + set + { + TextFormatter.AutoSize = value; + + // BUGBUG: This is all a hack until AutoSize is removed + if (value) + { + UpdateTextFormatterText (); + + if (IsInitialized) + { + Height = Dim.Auto (Dim.DimAutoStyle.Text); + Width = Dim.Auto (Dim.DimAutoStyle.Text); + } + else + { + _height = Dim.Auto (Dim.DimAutoStyle.Text); + _width = Dim.Auto (Dim.DimAutoStyle.Text); + OnResizeNeeded (); + } + } + else + { + _height = ContentSize.Height; + _width = ContentSize.Width; + + // Force ContentSize to be reset to Viewport + _contentSize = Size.Empty; + OnResizeNeeded (); + } + } + } + + #endregion AutoSize }