From 9d0137b1d39e62b09437b6a11e8dcf1318e2a7eb Mon Sep 17 00:00:00 2001 From: jpbruyere Date: Sun, 14 Aug 2016 06:43:59 +0200 Subject: [PATCH] * Crow.csproj, XCursor.cs, Interface.cs, ibeam: text xcursor * Window.template, Expandable.template, TabView.cs, 0.crow: divers * ExtensionsMethods.cs, CairoHelpers.cs, Border.cs: stroke better alignment, should be reworked for different width * Label.cs: text xcursor, selection rectangles adjustments * Window.cs: Maximize --- Crow.csproj | 1 + Images/Icons/Cursors/ibeam | Bin 0 -> 69120 bytes Templates/Expandable.template | 2 +- Templates/Window.template | 9 +++--- Tests/Interfaces/basicTests/0.crow | 5 +++- src/Cairo/CairoHelpers.cs | 30 +++++++------------- src/ExtensionsMethods.cs | 8 ++++-- src/GraphicObjects/Border.cs | 3 +- src/GraphicObjects/Label.cs | 21 ++++++++++---- src/GraphicObjects/TabView.cs | 2 +- src/GraphicObjects/Window.cs | 44 +++++++++++++++++++++++++++-- src/Interface.cs | 1 + src/XCursor.cs | 1 + 13 files changed, 89 insertions(+), 38 deletions(-) create mode 100644 Images/Icons/Cursors/ibeam diff --git a/Crow.csproj b/Crow.csproj index c85557b9..cf48acaa 100644 --- a/Crow.csproj +++ b/Crow.csproj @@ -263,6 +263,7 @@ Crow.Window.template + diff --git a/Images/Icons/Cursors/ibeam b/Images/Icons/Cursors/ibeam new file mode 100644 index 0000000000000000000000000000000000000000..ccbdcb5c87d5348437b00cf3c0fb51a67d0e45c9 GIT binary patch literal 69120 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 BVzU4M literal 0 HcmV?d00001 diff --git a/Templates/Expandable.template b/Templates/Expandable.template index 3d75afaf..14a59dd9 100755 --- a/Templates/Expandable.template +++ b/Templates/Expandable.template @@ -2,7 +2,7 @@ - + - - + + - + \ No newline at end of file diff --git a/Tests/Interfaces/basicTests/0.crow b/Tests/Interfaces/basicTests/0.crow index 8e2ac487..50312cce 100755 --- a/Tests/Interfaces/basicTests/0.crow +++ b/Tests/Interfaces/basicTests/0.crow @@ -1,2 +1,5 @@ - + + + diff --git a/src/Cairo/CairoHelpers.cs b/src/Cairo/CairoHelpers.cs index 60852def..8f9e6325 100644 --- a/src/Cairo/CairoHelpers.cs +++ b/src/Cairo/CairoHelpers.cs @@ -31,24 +31,24 @@ namespace Crow return arr[minp]; } - public static void CairoRectangle(Cairo.Context gr, Rectangle r, double radius) + public static void CairoRectangle(Cairo.Context gr, Rectangle r, double radius, bool stroke = false) { - if (radius>0) - CairoHelpers.DrawRoundedRectangle(gr,r,radius); + if (radius > 0) + CairoHelpers.DrawRoundedRectangle (gr, r, radius, stroke); else - gr.Rectangle (r); + gr.Rectangle (r, stroke); } public static void CairoCircle(Cairo.Context gr, Rectangle r) { gr.Arc(r.X + r.Width/2, r.Y + r.Height/2, Math.Min(r.Width,r.Height)/2, 0, 2*Math.PI); } - public static void DrawRoundedRectangle(Cairo.Context gr, Rectangle r, double radius) + public static void DrawRoundedRectangle(Cairo.Context gr, Rectangle r, double radius, bool stroke = false) { - DrawRoundedRectangle(gr, r.X, r.Y, r.Width, r.Height, radius); - } - public static void DrawCurvedRectangle(Cairo.Context gr, Rectangle r) - { - DrawCurvedRectangle(gr, r.X, r.Y, r.Width, r.Height); + if (stroke) { + DrawRoundedRectangle (gr, r.X + 0.5, r.Y + 0.5, r.Width - 1.0, r.Height - 1.0, radius); + gr.Stroke (); + }else + DrawRoundedRectangle(gr, r.X, r.Y, r.Width, r.Height, radius); } public static void DrawRoundedRectangle(Cairo.Context gr, double x, double y, double width, double height, double radius) { @@ -68,16 +68,6 @@ namespace Crow gr.ClosePath(); gr.Restore(); } - public static void DrawCurvedRectangle(Cairo.Context gr, double x, double y, double width, double height) - { - gr.Save(); - gr.MoveTo(x, y + height / 2); - gr.CurveTo(x, y, x, y, x + width / 2, y); - gr.CurveTo(x + width, y, x + width, y, x + width, y + height / 2); - gr.CurveTo(x + width, y + height, x + width, y + height, x + width / 2, y + height); - gr.CurveTo(x, y + height, x, y + height, x, y + height / 2); - gr.Restore(); - } public static void StrokeRaisedRectangle(Cairo.Context gr, Rectangle r, double width = 1) { gr.Save(); diff --git a/src/ExtensionsMethods.cs b/src/ExtensionsMethods.cs index 8985c929..07c37174 100644 --- a/src/ExtensionsMethods.cs +++ b/src/ExtensionsMethods.cs @@ -26,9 +26,13 @@ namespace Crow public static class ExtensionsMethods { #region Cairo extensions - public static void Rectangle(this Cairo.Context ctx, Rectangle r) + public static void Rectangle(this Cairo.Context ctx, Rectangle r, bool stroke = false) { - ctx.Rectangle (r.X, r.Y, r.Width, r.Height); + if (stroke) { + ctx.Rectangle (r.X + 0.5, r.Y + 0.5, r.Width - 1.0, r.Height - 1.0); + ctx.Stroke (); + }else + ctx.Rectangle (r.X, r.Y, r.Width, r.Height); } public static void SetSourceColor(this Cairo.Context ctx, Color c) { diff --git a/src/GraphicObjects/Border.cs b/src/GraphicObjects/Border.cs index 6c1ed6a1..bd72d750 100644 --- a/src/GraphicObjects/Border.cs +++ b/src/GraphicObjects/Border.cs @@ -55,8 +55,7 @@ namespace Crow if (BorderWidth > 0) { gr.LineWidth = BorderWidth; Foreground.SetAsSource (gr, rBack); - CairoHelpers.CairoRectangle(gr, rBack, CornerRadius); - gr.Stroke (); + CairoHelpers.CairoRectangle(gr, rBack, CornerRadius, true); } gr.Save (); diff --git a/src/GraphicObjects/Label.cs b/src/GraphicObjects/Label.cs index 3cc0f916..37a32a2f 100644 --- a/src/GraphicObjects/Label.cs +++ b/src/GraphicObjects/Label.cs @@ -569,8 +569,8 @@ namespace Crow Foreground.SetAsSource (gr); gr.LineWidth = 1.0; - gr.MoveTo(new PointD(textCursorPos + rText.X, rText.Y + CurrentLine * fe.Height)); - gr.LineTo(new PointD(textCursorPos + rText.X, rText.Y + (CurrentLine + 1) * fe.Height)); + gr.MoveTo (0.5 + textCursorPos + rText.X, rText.Y + CurrentLine * fe.Height); + gr.LineTo (0.5 + textCursorPos + rText.X, rText.Y + (CurrentLine + 1) * fe.Height); gr.Stroke(); } #endregion @@ -603,9 +603,9 @@ namespace Crow int lineLength = (int)gr.TextExtents (l).XAdvance; Rectangle lineRect = new Rectangle ( rText.X, - rText.Y + (int)(i * fe.Height), - lineLength, - (int)fe.Height); + rText.Y + (int)Math.Ceiling(i * fe.Height), + lineLength, + (int)Math.Ceiling(fe.Height)); // if (TextAlignment == Alignment.Center || // TextAlignment == Alignment.Top || @@ -659,6 +659,17 @@ namespace Crow if (mouseLocalPos.Y < 0) mouseLocalPos.Y = 0; } + public override void onMouseEnter (object sender, MouseMoveEventArgs e) + { + base.onMouseEnter (sender, e); + if (Selectable) + Interface.CurrentInterface.MouseCursor = XCursor.Text; + } + public override void onMouseLeave (object sender, MouseMoveEventArgs e) + { + base.onMouseLeave (sender, e); + Interface.CurrentInterface.MouseCursor = XCursor.Default; + } public override void onFocused (object sender, EventArgs e) { base.onFocused (sender, e); diff --git a/src/GraphicObjects/TabView.cs b/src/GraphicObjects/TabView.cs index e140191b..fa352b0d 100644 --- a/src/GraphicObjects/TabView.cs +++ b/src/GraphicObjects/TabView.cs @@ -82,7 +82,7 @@ namespace Crow RegisterForRedraw (); } } - [XmlAttributeAttribute()][DefaultValue("15")] + [XmlAttributeAttribute()][DefaultValue("18")] public virtual Measure TabThickness { get { return tabThickness; } set { diff --git a/src/GraphicObjects/Window.cs b/src/GraphicObjects/Window.cs index 9fb6bd29..bf6bd5cf 100644 --- a/src/GraphicObjects/Window.cs +++ b/src/GraphicObjects/Window.cs @@ -46,11 +46,15 @@ namespace Crow bool _resizable; bool _movable; bool hoverBorder = false; + bool isMaximized = false; + Measure savedH, savedW; Container _contentContainer; Direction currentDirection = Direction.None; public event EventHandler Closing; + public event EventHandler Maximized; + public event EventHandler Unmaximized; #region CTOR public Window () : base() { @@ -74,6 +78,7 @@ namespace Crow } #endregion + #region public properties [XmlAttributeAttribute()][DefaultValue("Window")] public string Title { get { return _title; } @@ -110,6 +115,24 @@ namespace Crow NotifyValueChanged ("Movable", _movable); } } + [XmlAttributeAttribute()][DefaultValue(false)] + public bool IsMaximized { + get { return isMaximized; } + set{ + if (value == isMaximized) + return; + isMaximized = value; + + if (isMaximized) + onMaximized (this, null); + else + onUnmaximized (this, null); + + NotifyValueChanged ("IsMaximized", isMaximized); + } + } + #endregion + #region GraphicObject Overrides public override void ResolveBindings () { @@ -272,19 +295,36 @@ namespace Crow base.onMouseDown (sender, e); } #endregion + protected void onMaximized (object sender, EventArgs e){ + savedW = this.Width; + savedH = this.Height; + this.Width = Measure.Stretched; + this.Height = Measure.Stretched; + + Maximized.Raise (sender, e); + } + protected void onUnmaximized (object sender, EventArgs e){ + this.Width = savedW; + this.Height = savedH; - public void onBorderMouseLeave (object sender, MouseMoveEventArgs e) + Unmaximized.Raise (sender, e); + } + + protected void onBorderMouseLeave (object sender, MouseMoveEventArgs e) { hoverBorder = false; currentDirection = Direction.None; Interface.CurrentInterface.MouseCursor = XCursor.Default; } - public void onBorderMouseEnter (object sender, MouseMoveEventArgs e) + protected void onBorderMouseEnter (object sender, MouseMoveEventArgs e) { hoverBorder = true; } + protected void butMaximizePress (object sender, MouseButtonEventArgs e){ + IsMaximized = !IsMaximized; + } protected void butQuitPress (object sender, MouseButtonEventArgs e) { Interface.CurrentInterface.MouseCursor = XCursor.Default; diff --git a/src/Interface.cs b/src/Interface.cs index 4a0789a2..052a5a19 100644 --- a/src/Interface.cs +++ b/src/Interface.cs @@ -151,6 +151,7 @@ namespace Crow XCursor.SE = XCursorFile.Load("#Crow.Images.Icons.Cursors.bottom_right_corner").Cursors[0]; XCursor.H = XCursorFile.Load("#Crow.Images.Icons.Cursors.sb_h_double_arrow").Cursors[0]; XCursor.V = XCursorFile.Load("#Crow.Images.Icons.Cursors.sb_v_double_arrow").Cursors[0]; + XCursor.Text = XCursorFile.Load("#Crow.Images.Icons.Cursors.ibeam").Cursors[0]; } #endregion diff --git a/src/XCursor.cs b/src/XCursor.cs index 8897753d..68173938 100644 --- a/src/XCursor.cs +++ b/src/XCursor.cs @@ -117,6 +117,7 @@ namespace Crow public static XCursor Default; public static XCursor Cross; public static XCursor Arrow; + public static XCursor Text; public static XCursor SW; public static XCursor SE; public static XCursor NW; -- 2.47.3