From 639be44b59e9f7320473374037a6fa850b4413b6 Mon Sep 17 00:00:00 2001 From: jpbruyere Date: Tue, 23 Jun 2015 22:17:49 +0200 Subject: [PATCH] First working scrollbar with heavy use of binding and events in xml --- GOLib.csproj | 5 ++- Templates/Scrollbar.goml | 4 +- Tests/GOLIBTest_4.cs | 2 +- Tests/Interfaces/test4.goml | 2 +- src/CompilerServices/CompilerServices.cs | 18 ++++---- src/GraphicObjects/Container.cs | 2 +- src/GraphicObjects/GraphicObject.cs | 7 ++-- src/GraphicObjects/NumericControl.cs | 11 +---- src/GraphicObjects/Scrollbar.cs | 10 +++++ src/GraphicObjects/Scroller.cs | 52 +++++++++++++++--------- src/GraphicObjects/Slider.cs | 11 +++++ src/GraphicObjects/Spinner.cs | 6 +-- src/Interface.cs | 10 +++-- src/LayoutChangeEventArgs.cs | 15 +++++++ src/Rectangles.cs | 8 ++-- src/TextChangeEventArgs.cs | 11 ++--- src/ValueChangeEventArgs.cs | 11 +++-- 17 files changed, 116 insertions(+), 69 deletions(-) create mode 100644 src/LayoutChangeEventArgs.cs diff --git a/GOLib.csproj b/GOLib.csproj index c119407b..341b5257 100644 --- a/GOLib.csproj +++ b/GOLib.csproj @@ -77,7 +77,6 @@ - @@ -87,7 +86,6 @@ - @@ -113,6 +111,9 @@ + + + diff --git a/Templates/Scrollbar.goml b/Templates/Scrollbar.goml index bc47eb9e..0fe9da3d 100755 --- a/Templates/Scrollbar.goml +++ b/Templates/Scrollbar.goml @@ -4,7 +4,9 @@ - + diff --git a/Tests/GOLIBTest_4.cs b/Tests/GOLIBTest_4.cs index d9e899b1..5b421100 100644 --- a/Tests/GOLIBTest_4.cs +++ b/Tests/GOLIBTest_4.cs @@ -135,7 +135,7 @@ namespace test } ); i++; - if (i > 50) + if (i > 250) break; } ValueChanged.Raise(this, new ValueChangeEventArgs ("TestList", TestList)); diff --git a/Tests/Interfaces/test4.goml b/Tests/Interfaces/test4.goml index 3ceb7198..c468aef2 100755 --- a/Tests/Interfaces/test4.goml +++ b/Tests/Interfaces/test4.goml @@ -135,7 +135,7 @@ + Margin="5" VerticalScrolling="true" ScrollY="{../scrollbar1.Scroll}"> diff --git a/src/CompilerServices/CompilerServices.cs b/src/CompilerServices/CompilerServices.cs index a4f4110c..b2f2e14c 100644 --- a/src/CompilerServices/CompilerServices.cs +++ b/src/CompilerServices/CompilerServices.cs @@ -157,6 +157,7 @@ namespace go public static void ResolveBinding(DynAttribute binding, object _source) { object srcGO = _source; + string statement = binding.Value; Type srcType = _source.GetType (); Type dstType = binding.Source.GetType (); @@ -178,9 +179,9 @@ namespace go srcGO = (srcGO as GraphicObject).FindByName (bindTrg [0]); srcType = srcGO.GetType (); } - miSrc = srcType.GetMember (bindTrg.LastOrDefault()).FirstOrDefault (); - }else - miSrc = srcType.GetMember (binding.Value).FirstOrDefault (); + statement = bindTrg.LastOrDefault (); + } + miSrc = srcType.GetMember (statement).FirstOrDefault (); #region initialize target with actual value @@ -245,7 +246,7 @@ namespace go System.Reflection.Emit.Label labContinue = il.DefineLabel(); #region test if valueChange event is the correct one - il.Emit (OpCodes.Ldstr, binding.Value); + il.Emit (OpCodes.Ldstr, statement); //push name from arg il.Emit(OpCodes.Ldarg_1); FieldInfo fiMbName = typeof(ValueChangeEventArgs).GetField("MemberName"); @@ -257,11 +258,10 @@ namespace go il.MarkLabel(labContinue); #endregion - string[] srcLines = binding.Value.Trim().Split (new char[] { ';' }); - foreach (string srcLine in srcLines) { +// string[] srcLines = binding.Value.Trim().Split (new char[] { ';' }); +// foreach (string srcLine in srcLines) { //MethodInfo infoWriteLine = typeof(System.Diagnostics.Debug).GetMethod("WriteLine", new Type[] { typeof(string) }); - - string statement = srcLine.Trim (); + //load target ref onto the stack FieldInfo fiRefs = typeof(Interface).GetField("References"); @@ -300,7 +300,7 @@ namespace go // il.Emit(OpCodes.Callvirt, piTarget.GetSetMethod()); - } + //} il.MarkLabel(labFailed); il.Emit(OpCodes.Ret); diff --git a/src/GraphicObjects/Container.cs b/src/GraphicObjects/Container.cs index c0ac00c6..0283017b 100644 --- a/src/GraphicObjects/Container.cs +++ b/src/GraphicObjects/Container.cs @@ -25,7 +25,7 @@ namespace go get { return child; } set { child = value; } } - public T SetChild (T _child) + public virtual T SetChild (T _child) { return base.SetChild (_child); } diff --git a/src/GraphicObjects/GraphicObject.cs b/src/GraphicObjects/GraphicObject.cs index 5b896b53..cb26bca8 100644 --- a/src/GraphicObjects/GraphicObject.cs +++ b/src/GraphicObjects/GraphicObject.cs @@ -23,7 +23,7 @@ namespace go { #region IValueChange implementation public event EventHandler ValueChanged; - void NotifyValueChanged(string MemberName, object _value) + public virtual void NotifyValueChanged(string MemberName, object _value) { ValueChanged.Raise(this, new ValueChangeEventArgs(MemberName, _value)); } @@ -116,7 +116,7 @@ namespace go public event EventHandler KeyUp; public event EventHandler Focused; public event EventHandler Unfocused; - + public event EventHandler LayoutChanged; #endregion #region public properties @@ -462,7 +462,8 @@ namespace go if ((Parent as GenericStack).Orientation == Orientation.Vertical) this.Parent.RegisterForLayouting ((int)LayoutingType.PositionChildren); break; - } + } + LayoutChanged.Raise (this, new LayoutChangeEventArgs (layoutType)); } public virtual void UpdateLayout (LayoutingType layoutType) { diff --git a/src/GraphicObjects/NumericControl.cs b/src/GraphicObjects/NumericControl.cs index 61af27d4..d989f668 100644 --- a/src/GraphicObjects/NumericControl.cs +++ b/src/GraphicObjects/NumericControl.cs @@ -4,7 +4,7 @@ using System.ComponentModel; namespace go { - public abstract class NumericControl : TemplatedControl, IValueChange + public abstract class NumericControl : TemplatedControl { #region CTOR public NumericControl () : base() @@ -20,14 +20,7 @@ namespace go } #endregion - #region event handlers - public EventHandler ValueChanged; - public virtual void onValueChanged(object sender, ValueChangeEventArgs e) - { - ValueChanged.Raise (sender, e); - } - #endregion #region private fields double _actualValue, minValue, maxValue, smallStep, bigStep; @@ -97,7 +90,7 @@ namespace go else _actualValue = value; - onValueChanged(this,new ValueChangeEventArgs("Value", Convert.ToInt32( _actualValue))); + NotifyValueChanged("Value", _actualValue); registerForGraphicUpdate(); } } diff --git a/src/GraphicObjects/Scrollbar.cs b/src/GraphicObjects/Scrollbar.cs index f66ce83f..cb9e2aa8 100644 --- a/src/GraphicObjects/Scrollbar.cs +++ b/src/GraphicObjects/Scrollbar.cs @@ -57,6 +57,10 @@ namespace go if (_scroll == value) return; _scroll = value; + if (_scroll < 0.0) + _scroll = 0.0; + else if (_scroll > _maximumScroll) + _scroll = _maximumScroll; registerForGraphicUpdate (); ValueChanged.Raise(this, new ValueChangeEventArgs ("Scroll", _scroll)); } @@ -79,6 +83,12 @@ namespace go public void onScrollForth (object sender, MouseButtonEventArgs e) { Scroll += _slider.LargeIncrement; + + } + + public void onSliderValueChange(object sender, ValueChangeEventArgs e){ + Scroll = Convert.ToDouble(e.NewValue); } + } } diff --git a/src/GraphicObjects/Scroller.cs b/src/GraphicObjects/Scroller.cs index 089c7111..b19c93ca 100644 --- a/src/GraphicObjects/Scroller.cs +++ b/src/GraphicObjects/Scroller.cs @@ -20,8 +20,8 @@ namespace go bool _verticalScrolling; bool _horizontalScrolling; bool _scrollbarVisible; - int _scrollX = 0; - int _scrollY = 0; + double _scrollX = 0.0; + double _scrollY = 0.0; #region public properties @@ -44,26 +44,32 @@ namespace go } - [XmlIgnore] - public int ScrollX { + [XmlAttributeAttribute][DefaultValue(0.0)] + public double ScrollX { get { return _scrollX; } set { + if (_scrollX == value) + return; _scrollX = value; ValueChanged.Raise(this, new ValueChangeEventArgs("ScrollX", _scrollX)); + RegisterForRedraw(); } } - [XmlIgnore] - public int ScrollY { + [XmlAttributeAttribute][DefaultValue(0.0)] + public double ScrollY { get { return _scrollY; } set { + if (_scrollY == value) + return; _scrollY = value; ValueChanged.Raise(this, new ValueChangeEventArgs("ScrollY", _scrollY)); + RegisterForRedraw(); } } @@ -87,16 +93,24 @@ namespace go } #region GraphicObject Overrides - protected override void OnLayoutChanges (LayoutingType layoutType) + void OnChildLayoutChanges (object sender, LayoutChangeEventArgs arg) { - base.OnLayoutChanges (layoutType); - if (_verticalScrolling) { - if (layoutType == LayoutingType.Height) + if (arg.LayoutType == LayoutingType.Height) ValueChanged.Raise(this, new ValueChangeEventArgs("MaximumScroll", MaximumScroll)); - }else if (layoutType == LayoutingType.Width) + }else if (arg.LayoutType == LayoutingType.Width) ValueChanged.Raise(this, new ValueChangeEventArgs("MaximumScroll", MaximumScroll)); } + public override T SetChild (T _child) + { + GraphicObject c = child as GraphicObject; + if (c != null) + c.LayoutChanged -= OnChildLayoutChanges; + c = _child as GraphicObject; + if (c != null) + c.LayoutChanged += OnChildLayoutChanges; + return base.SetChild (_child); + } #endregion #region Mouse handling @@ -106,7 +120,7 @@ namespace go } public override void onMouseMove (object sender, MouseMoveEventArgs e) { - Point m = e.Position - new Point (ScrollX, ScrollY); + Point m = e.Position - new Point ((int)ScrollX, (int)ScrollY); base.onMouseMove (sender, new MouseMoveEventArgs(m.X,m.Y,e.XDelta,e.YDelta)); } public override void onMouseWheel (object sender, MouseWheelEventArgs e) @@ -125,8 +139,8 @@ namespace go ScrollY -= e.Delta * ScrollSpeed; - if (ScrollY < 0) - ScrollY = 0; + if (ScrollY < 0.0) + ScrollY = 0.0; else if (ScrollY > Child.Slot.Height - ClientRectangle.Height) ScrollY = Child.Slot.Height - ClientRectangle.Height; @@ -138,26 +152,26 @@ namespace go ScrollX -= e.Delta * ScrollSpeed; - if (ScrollX < 0) - ScrollX = 0; + if (ScrollX < 0.0) + ScrollX = 0.0; else if (ScrollX > Child.Slot.Width - ClientRectangle.Width) ScrollX = Child.Slot.Width - ClientRectangle.Width; } //renderBounds.Y = -scrollY; - RegisterForRedraw(); + //RegisterForRedraw(); //Parent.registerForGraphicUpdate (); } #endregion public override Rectangle ContextCoordinates (Rectangle r) { - return base.ContextCoordinates (r) - new Point(ScrollX,ScrollY); + return base.ContextCoordinates (r) - new Point((int)ScrollX,(int)ScrollY); } public override Rectangle ScreenCoordinates (Rectangle r) { - return base.ScreenCoordinates (r) - new Point(ScrollX,ScrollY); + return base.ScreenCoordinates (r) - new Point((int)ScrollX,(int)ScrollY); } public override void registerClipRect () diff --git a/src/GraphicObjects/Slider.cs b/src/GraphicObjects/Slider.cs index 488617de..cc9f2b05 100644 --- a/src/GraphicObjects/Slider.cs +++ b/src/GraphicObjects/Slider.cs @@ -63,7 +63,18 @@ namespace go set { _orientation = value; } } #endregion + [XmlAttributeAttribute()][DefaultValue(10.0)] + public override double Maximum { + get { return base.Maximum; } + set { + if (value == base.Maximum) + return; + base.Maximum = value; + LargeIncrement = base.Maximum / 10.0; + SmallIncrement = LargeIncrement / 5.0; + } + } #region GraphicObject Overrides [XmlAttributeAttribute()][DefaultValue("Gray")] public override Color Background { diff --git a/src/GraphicObjects/Spinner.cs b/src/GraphicObjects/Spinner.cs index 048dd849..ea992b18 100644 --- a/src/GraphicObjects/Spinner.cs +++ b/src/GraphicObjects/Spinner.cs @@ -65,11 +65,7 @@ namespace go Value -= this.SmallIncrement; labCpt.Text = Value.ToString (); } - public override void onValueChanged (object sender, ValueChangeEventArgs e) - { - //labCpt.Text = e.NewValue.ToString (); - base.onValueChanged (sender, e); - } + } } diff --git a/src/Interface.cs b/src/Interface.cs index 0c3098fc..2fe25c60 100644 --- a/src/Interface.cs +++ b/src/Interface.cs @@ -209,9 +209,13 @@ namespace go continue; } - FieldInfo fi = CompilerServices.getEventHandlerField (es.Source.GetType (), es.MemberName); - Delegate del = Delegate.CreateDelegate (fi.FieldType, hostClass, mi); - fi.SetValue (es.Source, del); + EventInfo ei = es.Source.GetType ().GetEvent (es.MemberName); + MethodInfo addHandler = ei.GetAddMethod (); + Delegate del = Delegate.CreateDelegate (ei.EventHandlerType, hostClass, mi); + + + addHandler.Invoke(es.Source, new object[] {del}); + } } else { CompilerServices.ResolveBinding (es, hostClass); diff --git a/src/LayoutChangeEventArgs.cs b/src/LayoutChangeEventArgs.cs new file mode 100644 index 00000000..bbe6f6fd --- /dev/null +++ b/src/LayoutChangeEventArgs.cs @@ -0,0 +1,15 @@ +using System; + +namespace go +{ + public class LayoutChangeEventArgs: EventArgs + { + public LayoutingType LayoutType; + + public LayoutChangeEventArgs (LayoutingType _layoutType) : base() + { + LayoutType = _layoutType; + } + } +} + diff --git a/src/Rectangles.cs b/src/Rectangles.cs index aa54605c..def2f66d 100644 --- a/src/Rectangles.cs +++ b/src/Rectangles.cs @@ -100,9 +100,9 @@ namespace go Rectangle r = rInList; if (sw.VerticalScrolling) - r.Top -= sw.ScrollY; + r.Top -= (int)sw.ScrollY; if (sw.HorizontalScrolling) - r.Left -= sw.ScrollX; + r.Left -= (int)sw.ScrollX; newList.Add(r); } @@ -122,11 +122,11 @@ namespace go if (sw != null) { if (sw.VerticalScrolling) { - rebasedR.Top -= sw.ScrollY; + rebasedR.Top -= (int)sw.ScrollY; // if (sw.scrollY < 0) // Debug.WriteLine (".."); }if (sw.HorizontalScrolling) - rebasedR.Left -= sw.ScrollX; + rebasedR.Left -= (int)sw.ScrollX; } newList.Add(rebasedR); diff --git a/src/TextChangeEventArgs.cs b/src/TextChangeEventArgs.cs index 532d72f0..9b9d3a2f 100644 --- a/src/TextChangeEventArgs.cs +++ b/src/TextChangeEventArgs.cs @@ -2,16 +2,13 @@ namespace go { - public class ValueChangeEventArgs: EventArgs + public class TextChangeEventArgs: EventArgs { - public string MemberName; - public object NewValue; + public String Text; - - public ValueChangeEventArgs (string _memberName, object _newValue) : base() + public TextChangeEventArgs (string _newValue) : base() { - MemberName = _memberName; - NewValue = _newValue; + Text = _newValue; } } } diff --git a/src/ValueChangeEventArgs.cs b/src/ValueChangeEventArgs.cs index 9b9d3a2f..532d72f0 100644 --- a/src/ValueChangeEventArgs.cs +++ b/src/ValueChangeEventArgs.cs @@ -2,13 +2,16 @@ namespace go { - public class TextChangeEventArgs: EventArgs + public class ValueChangeEventArgs: EventArgs { - public String Text; + public string MemberName; + public object NewValue; - public TextChangeEventArgs (string _newValue) : base() + + public ValueChangeEventArgs (string _memberName, object _newValue) : base() { - Text = _newValue; + MemberName = _memberName; + NewValue = _newValue; } } } -- 2.47.3