From: jpbruyere Date: Sat, 13 Aug 2016 00:13:22 +0000 (+0200) Subject: wrapper widget X-Git-Tag: v0.4~7^2~8 X-Git-Url: https://git.osiis.dedyn.io/?a=commitdiff_plain;h=34a5dc3dbea962260e2a89ce87b3175b1dde3a42;p=jp%2Fcrow.git wrapper widget --- diff --git a/Crow.csproj b/Crow.csproj index 0de00b5c..c85557b9 100644 --- a/Crow.csproj +++ b/Crow.csproj @@ -139,6 +139,7 @@ + diff --git a/Tests/Interfaces/basicTests/0.crow b/Tests/Interfaces/basicTests/0.crow index d180fa82..798b8ff1 100755 --- a/Tests/Interfaces/basicTests/0.crow +++ b/Tests/Interfaces/basicTests/0.crow @@ -1,2 +1,13 @@ - - + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/GraphicObjects/Group.cs b/src/GraphicObjects/Group.cs index e87ca41c..3782640c 100644 --- a/src/GraphicObjects/Group.cs +++ b/src/GraphicObjects/Group.cs @@ -164,6 +164,56 @@ namespace Crow break; } } + protected override void onDraw (Context gr) + { + base.onDraw (gr); + + gr.Save (); + //clip to client zone + CairoHelpers.CairoRectangle (gr, ClientRectangle, CornerRadius); + gr.Clip (); + lock (children) { + foreach (GraphicObject g in Children) { + g.Paint (ref gr); + } + } + gr.Restore (); + } + protected override void UpdateCache (Context ctx) + { + Rectangle rb = Slot + Parent.ClientRectangle.Position; + + using (ImageSurface cache = new ImageSurface (bmp, Format.Argb32, Slot.Width, Slot.Height, 4 * Slot.Width)) { + Context gr = new Context (cache); + + if (Clipping.count > 0) { + Clipping.clearAndClip (gr); + base.onDraw (gr); + + //clip to client zone + CairoHelpers.CairoRectangle (gr, ClientRectangle, CornerRadius); + gr.Clip (); + + foreach (GraphicObject c in Children) { + if (!c.Visible) + continue; + if (Clipping.intersect(c.Slot + ClientRectangle.Position)) + c.Paint (ref gr); + } + + #if DEBUG_CLIP_RECTANGLE + Clipping.stroke (gr, Color.Amaranth.AdjustAlpha (0.8)); + #endif + } + gr.Dispose (); + + ctx.SetSourceSurface (cache, rb.X, rb.Y); + ctx.Paint (); + } + Clipping.Reset(); + } + #endregion + public virtual void OnChildLayoutChanges (object sender, LayoutingEventArgs arg) { GraphicObject g = sender as GraphicObject; @@ -193,7 +243,6 @@ namespace Crow break; } } - //TODO: x,y position should be taken in account for computation of width and height void resetChildrenMaxSize(){ largestChild = null; @@ -235,56 +284,6 @@ namespace Crow } } - protected override void onDraw (Context gr) - { - base.onDraw (gr); - - gr.Save (); - //clip to client zone - CairoHelpers.CairoRectangle (gr, ClientRectangle, CornerRadius); - gr.Clip (); - lock (children) { - foreach (GraphicObject g in Children) { - g.Paint (ref gr); - } - } - gr.Restore (); - } - protected override void UpdateCache (Context ctx) - { - Rectangle rb = Slot + Parent.ClientRectangle.Position; - - using (ImageSurface cache = new ImageSurface (bmp, Format.Argb32, Slot.Width, Slot.Height, 4 * Slot.Width)) { - Context gr = new Context (cache); - - if (Clipping.count > 0) { - Clipping.clearAndClip (gr); - base.onDraw (gr); - - //clip to client zone - CairoHelpers.CairoRectangle (gr, ClientRectangle, CornerRadius); - gr.Clip (); - - foreach (GraphicObject c in Children) { - if (!c.Visible) - continue; - if (Clipping.intersect(c.Slot + ClientRectangle.Position)) - c.Paint (ref gr); - } - - #if DEBUG_CLIP_RECTANGLE - Clipping.stroke (gr, Color.Amaranth.AdjustAlpha (0.8)); - #endif - } - gr.Dispose (); - - ctx.SetSourceSurface (cache, rb.X, rb.Y); - ctx.Paint (); - } - Clipping.Reset(); - } - #endregion - #region Mouse handling public override void checkHoverWidget (MouseMoveEventArgs e) diff --git a/src/GraphicObjects/Wrapper.cs b/src/GraphicObjects/Wrapper.cs new file mode 100644 index 00000000..cfd74524 --- /dev/null +++ b/src/GraphicObjects/Wrapper.cs @@ -0,0 +1,164 @@ +// +// Wrapper.cs +// +// Author: +// Jean-Philippe Bruyère +// +// Copyright (c) 2016 jp +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +using System; + +namespace Crow +{ + public class Wrapper : GenericStack + { + public Wrapper () : base() + {} + + #region Group Overrides + public override void ChildrenLayoutingConstraints (ref LayoutingType layoutType) + { + layoutType &= (~LayoutingType.Positioning); + } + public override void ComputeChildrenPositions() + { + int dx = 0; + int dy = 0; + + if (Orientation == Orientation.Horizontal) { + int tallestChild = 0; + foreach (GraphicObject c in Children) { + if (!c.Visible) + continue; + if (dx + c.Slot.Width > ClientRectangle.Width) { + dx = 0; + dy += tallestChild + Spacing; + c.Slot.X = dx; + c.Slot.Y = dy; + tallestChild = c.Slot.Height; + } else { + if (tallestChild < c.Slot.Height) + tallestChild = c.Slot.Height; + c.Slot.X = dx; + c.Slot.Y = dy; + } + dx += c.Slot.Width + Spacing; + } + } else { + int largestChild = 0; + foreach (GraphicObject c in Children) { + if (!c.Visible) + continue; + if (dy + c.Slot.Height > ClientRectangle.Height) { + dy = 0; + dx += largestChild + Spacing; + c.Slot.X = dx; + c.Slot.Y = dy; + largestChild = c.Slot.Width; + } else if (largestChild < c.Slot.Width){ + largestChild = c.Slot.Width; + c.Slot.X = dx; + c.Slot.Y = dy; + dy += c.Slot.Height + Spacing; + } + } + } + bmp = null; + } + public override void OnChildLayoutChanges (object sender, LayoutingEventArgs arg) + { + //children can't stretch in a wrapper + GraphicObject go = sender as GraphicObject; + //Debug.WriteLine ("child layout change: " + go.LastSlots.ToString() + " => " + go.Slot.ToString()); + switch (arg.LayoutType) { + case LayoutingType.Width: + if (Orientation == Orientation.Vertical && go.Width == Measure.Stretched) { + go.Width = Measure.Fit; + return; + } + break; + case LayoutingType.Height: + if (Orientation == Orientation.Horizontal && go.Height == Measure.Stretched) { + go.Height = Measure.Fit; + return; + } + break; + default: + return; + } + this.RegisterForLayouting (LayoutingType.ArrangeChildren); + } + #endregion + + #region GraphicObject Overrides + protected override int measureRawSize (LayoutingType lt) + { + //Wrapper can't fit + if (lt == LayoutingType.Width) + Width = Measure.Stretched; + else + Height = Measure.Stretched; + return -1; + } + + public override bool UpdateLayout (LayoutingType layoutType) + { + RegisteredLayoutings &= (~layoutType); + + if (layoutType == LayoutingType.ArrangeChildren) { + if ((RegisteredLayoutings & LayoutingType.Sizing) != 0) + return false; + + ComputeChildrenPositions (); + + //if no layouting remains in queue for item, registre for redraw + if (RegisteredLayoutings == LayoutingType.None && bmp == null) + Interface.CurrentInterface.EnqueueForRepaint (this); + + return true; + } + + return base.UpdateLayout(layoutType); + } + public override void OnLayoutChanges (LayoutingType layoutType) + { + #if DEBUG_LAYOUTING + LayoutingQueueItem.currentLQI.Slot = LastSlots; + LayoutingQueueItem.currentLQI.Slot = Slot; + #endif + + switch (layoutType) { + case LayoutingType.Width: + foreach (GraphicObject c in Children) { + if (c.Width.Units == Unit.Percent) + c.RegisterForLayouting (LayoutingType.Width); + } + break; + case LayoutingType.Height: + foreach (GraphicObject c in Children) { + if (c.Height.Units == Unit.Percent) + c.RegisterForLayouting (LayoutingType.Height); + } + break; + default: + return; + } + RegisterForLayouting (LayoutingType.ArrangeChildren); + //LayoutChanged.Raise (this, new LayoutingEventArgs (layoutType)); + } + #endregion + } +} + diff --git a/src/LayoutingQueueItem.cs b/src/LayoutingQueueItem.cs index a7909022..e33d209c 100644 --- a/src/LayoutingQueueItem.cs +++ b/src/LayoutingQueueItem.cs @@ -31,6 +31,7 @@ namespace Crow None = 0x00, X = 0x01, Y = 0x02, + Positioning = 0x03, Width = 0x04, Height = 0x08, Sizing = 0x0C,