diff options
| author | jpbruyere <jp.bruyere@hotmail.com> | 2015-09-11 18:48:00 +0200 |
|---|---|---|
| committer | jpbruyere <jp.bruyere@hotmail.com> | 2015-09-11 18:48:00 +0200 |
| commit | 7797eb5e1352028ba30563bbc77cbddd22e0cf83 (patch) | |
| tree | 92c17077ffda448ed1eef6ba3ee2381d217c8a73 | |
| parent | 58e643bf9e00e01cacd5ba0465b9d24ef0f93cb4 (diff) | |
Grid control, Stack sizing default reset to stretched as all the other
controls
| -rw-r--r-- | GOLib.csproj | 1 | ||||
| -rwxr-xr-x | Templates/Checkbox.goml | 4 | ||||
| -rwxr-xr-x | Templates/Spinner.goml | 13 | ||||
| -rw-r--r-- | Tests/GOLIBTests.cs | 1 | ||||
| -rwxr-xr-x | Tests/Interfaces/testGrid.goml | 7 | ||||
| -rwxr-xr-x | Tests/Interfaces/testSpinner.goml | 2 | ||||
| -rw-r--r-- | Tests/Tests.csproj | 3 | ||||
| -rw-r--r-- | src/GraphicObjects/GenericStack.cs | 20 | ||||
| -rw-r--r-- | src/GraphicObjects/Grid.cs | 149 |
9 files changed, 177 insertions, 23 deletions
diff --git a/GOLib.csproj b/GOLib.csproj index 06fe014c..92896b0f 100644 --- a/GOLib.csproj +++ b/GOLib.csproj @@ -116,6 +116,7 @@ <Compile Include="src\LayoutChangeEventArgs.cs" />
<Compile Include="src\ReflexionExtensions.cs" />
<Compile Include="src\XCursor.cs" />
+ <Compile Include="src\GraphicObjects\Grid.cs" />
</ItemGroup>
<ItemGroup>
<Reference Include="System" />
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 @@ <?xml version="1.0"?>
-<HorizontalStack Margin="0" Spacing="1">
+<HorizontalStack Width="{Width}" Height="{Height}" Margin="0" Spacing="1">
<Image Name="Image" Width="16" Height="16" Path="#go.Images.Icons.checkbox.svg"/>
- <Label Name="Caption"/>
+ <Label Name="Caption" Height="{Height}" Width="0"/>
</HorizontalStack>
\ 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 @@ <?xml version="1.0"?> -<Border CornerRadius="0" Margin="0" BorderWidth="1" Width="0" Height="-1"> - <HorizontalStack Name="hstack" Margin="0" Spacing="5" Width="0" Height="-1"> - <Label Width="0" Name="labCpt" Text="{Value}" Margin="1" TextAlignment="RightCenter"/> - <VerticalStack Spacing="1" Name="vstack"> - <Button Width="10" Height="8" MouseClick="onUp"> +<Border BorderWidth="1" Width="{Width}" Height="{Height}" Background="White"> + <HorizontalStack Name="hstack" Margin="0" Spacing="2" Width="{Width}" Height="{Height}"> + <Label Foreground="DimGray" Width="0" Height="{Height}" Name="labCpt" + Text="{Value}" Margin="1" TextAlignment="RightCenter"/> + <VerticalStack RowCount="2" Width="-1" Height="-1" Spacing="1" > + <Button Width="12" Height="8" MouseClick="onUp"> <Image Margin="1" Path="#go.Images.Icons.updown.svg" SvgSub="up"/> </Button> - <Button Width="10" Height="8" MouseClick="onDown"> + <Button Width="12" Height="8" MouseClick="onDown"> <Image Margin="1" Path="#go.Images.Icons.updown.svg" SvgSub="down"/> </Button> </VerticalStack> diff --git a/Tests/GOLIBTests.cs b/Tests/GOLIBTests.cs index a7645cb9..29cfc9fd 100644 --- a/Tests/GOLIBTests.cs +++ b/Tests/GOLIBTests.cs @@ -31,6 +31,7 @@ namespace test int frameCpt = 0;
int idx = 0;
string[] testFiles = {
+ "testGrid.goml",
"test1.goml",
"test1.1.goml",
"test1.2.goml",
diff --git a/Tests/Interfaces/testGrid.goml b/Tests/Interfaces/testGrid.goml new file mode 100755 index 00000000..24784922 --- /dev/null +++ b/Tests/Interfaces/testGrid.goml @@ -0,0 +1,7 @@ +<?xml version="1.0"?>
+<Grid RowCount="2" ColumnCount="2">
+ <GraphicObject Background="1,0;0,0;0,0;1,0"/>
+ <GraphicObject Background="0,0;0,0;0,5;1,0"/>
+ <GraphicObject Background="0,0;0,5;0,0;1,0"/>
+ <GraphicObject Background="0,5;0,0;0,0;1,0"/>
+</Grid>
\ No newline at end of file diff --git a/Tests/Interfaces/testSpinner.goml b/Tests/Interfaces/testSpinner.goml index 9767d546..c1980eb7 100755 --- a/Tests/Interfaces/testSpinner.goml +++ b/Tests/Interfaces/testSpinner.goml @@ -2,5 +2,5 @@ <Container Name="TopContainer" Width="400" Height="350"
Margin="20" Focusable="True" Background="DarkGray">
- <Spinner Width="100"></Spinner>
+ <Spinner Height="-1" Width="-1" Value="5"></Spinner>
</Container>
\ No newline at end of file diff --git a/Tests/Tests.csproj b/Tests/Tests.csproj index b6f21253..8694d0e0 100644 --- a/Tests/Tests.csproj +++ b/Tests/Tests.csproj @@ -137,6 +137,9 @@ <None Include="Interfaces\tmpDirItem.goml"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> + <None Include="Interfaces\testGrid.goml"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </None> </ItemGroup> <ItemGroup> <Folder Include="Interfaces\" /> 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
+{
+ /// <summary>
+ /// 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
+ /// </summary>
+ 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> (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
+
+
+ }
+}
|