From 7797eb5e1352028ba30563bbc77cbddd22e0cf83 Mon Sep 17 00:00:00 2001 From: jpbruyere Date: Fri, 11 Sep 2015 18:48:00 +0200 Subject: [PATCH] Grid control, Stack sizing default reset to stretched as all the other controls --- GOLib.csproj | 1 + Templates/Checkbox.goml | 4 +- Templates/Spinner.goml | 13 +-- Tests/GOLIBTests.cs | 1 + Tests/Interfaces/testGrid.goml | 7 ++ Tests/Interfaces/testSpinner.goml | 2 +- Tests/Tests.csproj | 3 + src/GraphicObjects/GenericStack.cs | 20 ++-- src/GraphicObjects/Grid.cs | 149 +++++++++++++++++++++++++++++ 9 files changed, 177 insertions(+), 23 deletions(-) create mode 100755 Tests/Interfaces/testGrid.goml create mode 100644 src/GraphicObjects/Grid.cs diff --git a/GOLib.csproj b/GOLib.csproj index 06fe014c..92896b0f 100644 --- a/GOLib.csproj +++ b/GOLib.csproj @@ -116,6 +116,7 @@ + diff --git a/Templates/Checkbox.goml b/Templates/Checkbox.goml index c9dbe5b4..a2f8bb21 100755 --- a/Templates/Checkbox.goml +++ b/Templates/Checkbox.goml @@ -1,5 +1,5 @@  - + - \ No newline at end of file diff --git a/Templates/Spinner.goml b/Templates/Spinner.goml index 36af43c1..70b459b2 100755 --- a/Templates/Spinner.goml +++ b/Templates/Spinner.goml @@ -1,12 +1,13 @@  - - - diff --git a/src/GraphicObjects/GenericStack.cs b/src/GraphicObjects/GenericStack.cs index bac7d8af..c6260c6b 100644 --- a/src/GraphicObjects/GenericStack.cs +++ b/src/GraphicObjects/GenericStack.cs @@ -39,7 +39,12 @@ namespace go public int Spacing { get { return _spacing; } - set { _spacing = value; } + set { + if (_spacing == value) + return; + _spacing = value; + NotifyValueChanged ("Spacing", Spacing); + } } [XmlAttributeAttribute()][DefaultValue(Orientation.Horizontal)] public virtual Orientation Orientation @@ -50,19 +55,6 @@ namespace go #endregion #region GraphicObject Overrides - //TODO: to be coherent, those overrides should be removed - //I could maybe set size to fit dynamicaly in the direction of the stack - [XmlAttributeAttribute()][DefaultValue(-1)] - public override int Width { - get { return base.Width; } - set { base.Width = value; } - } - [XmlAttributeAttribute()][DefaultValue(-1)] - public override int Height { - get { return base.Height; } - set { base.Height = value; } - } - protected override Size measureRawSize () { Size tmp = new Size (); diff --git a/src/GraphicObjects/Grid.cs b/src/GraphicObjects/Grid.cs new file mode 100644 index 00000000..e8bd7ba6 --- /dev/null +++ b/src/GraphicObjects/Grid.cs @@ -0,0 +1,149 @@ +using System; +using System.Diagnostics; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Xml.Serialization; +using System.ComponentModel; + +namespace go +{ + /// + /// Simple grid container + /// Allow symetric placement of children on a grid, + /// excedental child (above grid sizing) are ignored + /// and invisible child keep their place in the grid + /// + public class Grid : Group + { + #region CTOR + public Grid() + : base() + { + } + #endregion + + #region Private fields + int _spacing; + int _columnCount; + int _rowCount; + #endregion + + public override T addChild (T child) + { + T tmp = base.addChild (child); + this.RegisterForLayouting ((int)LayoutingType.PositionChildren); + return tmp; + } + public override void removeChild (GraphicObject child) + { + base.removeChild (child); + this.RegisterForLayouting ((int)LayoutingType.PositionChildren); + } + + #region Public Properties + [XmlAttributeAttribute()][DefaultValue(2)] + public int Spacing + { + get { return _spacing; } + set { _spacing = value; } + } + [XmlAttributeAttribute()][DefaultValue(1)] + public virtual int ColumnCount + { + get { return _columnCount; } + set { + if (_columnCount == value) + return; + + _columnCount = value; + + NotifyValueChanged ("ColumnCount", ColumnCount); + this.RegisterForLayouting ((int)LayoutingType.PositionChildren); + } + } + [XmlAttributeAttribute()][DefaultValue(1)] + public virtual int RowCount + { + get { return _rowCount; } + set { + if (_rowCount == value) + return; + + _rowCount = value; + + NotifyValueChanged ("RowCount", RowCount); + this.RegisterForLayouting ((int)LayoutingType.PositionChildren); + } + } + public virtual int CaseWidth { + get { return (Slot.Width - (ColumnCount - 1) * Spacing) / ColumnCount; } + } + public virtual int CaseHeight { + get { return (Slot.Height - (RowCount - 1) * Spacing) / RowCount; } + } + + #endregion + + #region GraphicObject Overrides +// protected override Size measureRawSize () +// { +// Size tmp = new Size (); +// +// foreach (GraphicObject c in Children.Where(ch=>ch.Visible)) { +// tmp.Width = Math.Max (tmp.Width, c.Slot.Width); +// tmp.Height = Math.Max (tmp.Height, c.Slot.Height); +// } +// +// tmp.Width *= (ColumnCount - 1) * Spacing / ColumnCount;; +// tmp.Height *= (RowCount - 1) * Spacing / RowCount; +// tmp.Width += 2 * Margin; +// tmp.Height += 2 * Margin; +// +// return tmp; +// } + public virtual void ComputeChildrenPositions() + { + int slotWidth = CaseWidth; + int slotHeight = CaseHeight; + for (int curY = 0; curY < RowCount; curY++) { + for (int curX = 0; curX < ColumnCount; curX++) { + int idx = curY * ColumnCount + curX; + if (idx >= Children.Count) + return; + GraphicObject c = Children [idx]; + if (!c.Visible) + continue; + //ensure Item are not realigned + c.HorizontalAlignment = HorizontalAlignment.Left; + c.VerticalAlignment = VerticalAlignment.Top; + c.Left = curX * (slotWidth + Spacing); + c.Top = curY * (slotHeight + Spacing); + c.Width = slotWidth; + c.Height = slotHeight; + } + } + } + + public override void RegisterForLayouting (int layoutType) + { + base.RegisterForLayouting (layoutType); + + if ((layoutType & (int)LayoutingType.PositionChildren) > 0) + Interface.LayoutingQueue.Enqueue (LayoutingType.PositionChildren, this); + } + public override void UpdateLayout (LayoutingType layoutType) + { + if (layoutType == LayoutingType.PositionChildren) { + ComputeChildrenPositions (); + //if no layouting remains in queue for item, registre for redraw + if (Interface.LayoutingQueue.Where (lq => lq.GraphicObject == this).Count () <= 0 && bmp==null) + this.RegisterForRedraw (); + }else + base.UpdateLayout(layoutType); + } + #endregion + + + } +} -- 2.47.3