[longomatch] Add a new callback for objects that needs a redraw



commit c7fbad2808dff67b24e9737261a98611930352f3
Author: Andoni Morales Alastruey <ylatuya gmail com>
Date:   Mon Sep 22 21:15:07 2014 +0200

    Add a new callback for objects that needs a redraw
    
    Make it easier to redraw only parts of the canvas
    for objects that need it instead of forcing a full
    redraw. Most of the objects do not use it yet though

 LongoMatch.Core/Handlers/Drawing.cs              |    3 +++
 LongoMatch.Core/Interfaces/Drawing/ICanvas.cs    |    6 ++++--
 LongoMatch.Drawing/Canvas.cs                     |   19 ++++++++++++++++++-
 LongoMatch.Drawing/CanvasObjects/CanvasObject.cs |   10 +++++++++-
 LongoMatch.Drawing/Widgets/Blackboard.cs         |    4 ++--
 LongoMatch.Drawing/Widgets/CategoriesLabels.cs   |    2 +-
 LongoMatch.Drawing/Widgets/DashboardCanvas.cs    |   12 ++++++------
 LongoMatch.Drawing/Widgets/PlaysTimeline.cs      |    2 +-
 LongoMatch.Drawing/Widgets/PositionTagger.cs     |   10 +++++++---
 LongoMatch.Drawing/Widgets/TeamTagger.cs         |    2 +-
 LongoMatch.Drawing/Widgets/TimersTimeline.cs     |    2 +-
 11 files changed, 53 insertions(+), 19 deletions(-)
---
diff --git a/LongoMatch.Core/Handlers/Drawing.cs b/LongoMatch.Core/Handlers/Drawing.cs
index 92989aa..d500a27 100644
--- a/LongoMatch.Core/Handlers/Drawing.cs
+++ b/LongoMatch.Core/Handlers/Drawing.cs
@@ -27,5 +27,8 @@ namespace LongoMatch.Core.Handlers.Drawing
        public delegate void MotionHandler (Point coords);
        public delegate void ShowTooltipHandler (Point coords);
        public delegate void SizeChangedHandler ();
+       public delegate void CanvasHandler (ICanvasObject co);
+       public delegate void RedrawHandler (ICanvasObject co, Area area);
+
 }
 
diff --git a/LongoMatch.Core/Interfaces/Drawing/ICanvas.cs b/LongoMatch.Core/Interfaces/Drawing/ICanvas.cs
index a079c26..606232e 100644
--- a/LongoMatch.Core/Interfaces/Drawing/ICanvas.cs
+++ b/LongoMatch.Core/Interfaces/Drawing/ICanvas.cs
@@ -16,10 +16,9 @@
 //  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
 //
 using System;
-using LongoMatch.Core.Interfaces;
 using LongoMatch.Core.Common;
-using LongoMatch.Core.Store.Drawables;
 using LongoMatch.Core.Interfaces.Drawing;
+using LongoMatch.Core.Handlers.Drawing;
 
 namespace LongoMatch.Core.Interfaces.Drawing
 {
@@ -31,6 +30,9 @@ namespace LongoMatch.Core.Interfaces.Drawing
        
        public interface ICanvasObject: IDisposable
        {
+               event CanvasHandler ClickedEvent;
+               event RedrawHandler RedrawEvent;
+
                void Draw (IDrawingToolkit tk, Area area);
                bool Visible {set; get;}
                string Description {set; get;}
diff --git a/LongoMatch.Drawing/Canvas.cs b/LongoMatch.Drawing/Canvas.cs
index ed17f5f..204e2d9 100644
--- a/LongoMatch.Drawing/Canvas.cs
+++ b/LongoMatch.Drawing/Canvas.cs
@@ -71,7 +71,8 @@ namespace LongoMatch.Drawing
                protected void ClearObjects ()
                {
                        if (Objects != null) {
-                               foreach (CanvasObject co in Objects) {
+                               foreach (ICanvasObject co in Objects) {
+                                       co.RedrawEvent -= HandleRedrawEvent;
                                        co.Dispose ();
                                }
                                Objects.Clear ();
@@ -83,6 +84,17 @@ namespace LongoMatch.Drawing
                        set;
                }
 
+               public void AddObject (ICanvasObject co) {
+                       Objects.Add (co);
+                       co.RedrawEvent += HandleRedrawEvent;
+               }
+
+               public void RemoveObject (ICanvasObject co)
+               {
+                       co.RedrawEvent -= HandleRedrawEvent;
+                       Objects.Remove (co);
+               }
+
                protected Point ToUserCoords (Point p)
                {
                        return new Point ((p.X - translation.X) / scaleX,
@@ -90,6 +102,11 @@ namespace LongoMatch.Drawing
                
                }
 
+               void HandleRedrawEvent (ICanvasObject co, Area area)
+               {
+                       widget.ReDraw (area);
+               }
+
                public virtual void Draw (IContext context, Area area)
                {
                        tk.Context = context;
diff --git a/LongoMatch.Drawing/CanvasObjects/CanvasObject.cs 
b/LongoMatch.Drawing/CanvasObjects/CanvasObject.cs
index 9a6578d..93ca1a6 100644
--- a/LongoMatch.Drawing/CanvasObjects/CanvasObject.cs
+++ b/LongoMatch.Drawing/CanvasObjects/CanvasObject.cs
@@ -18,14 +18,15 @@
 using LongoMatch.Core.Interfaces.Drawing;
 using LongoMatch.Core.Common;
 using LongoMatch.Core.Store.Drawables;
+using LongoMatch.Core.Handlers.Drawing;
 using System;
 
 namespace LongoMatch.Drawing.CanvasObjects
 {
        public abstract class CanvasObject: ICanvasObject
        {
-               public delegate void CanvasHandler (CanvasObject co);
                public event CanvasHandler ClickedEvent;
+               public event RedrawHandler RedrawEvent;
                
                bool disposed;
 
@@ -88,6 +89,13 @@ namespace LongoMatch.Drawing.CanvasObjects
                        }
                }
 
+               protected void EmitRedrawEvent (CanvasObject co, Area area)
+               {
+                       if (RedrawEvent != null) {
+                               RedrawEvent (co, area);
+                       }
+               }
+               
                public abstract void Draw (IDrawingToolkit tk, Area area);
        }
 
diff --git a/LongoMatch.Drawing/Widgets/Blackboard.cs b/LongoMatch.Drawing/Widgets/Blackboard.cs
index 7ef8c4e..a1e3653 100644
--- a/LongoMatch.Drawing/Widgets/Blackboard.cs
+++ b/LongoMatch.Drawing/Widgets/Blackboard.cs
@@ -126,7 +126,7 @@ namespace LongoMatch.Drawing.Widgets
                public void DeleteSelection ()
                {
                        foreach (ICanvasDrawableObject o in Selections.Select (s => s.Drawable)) {
-                               Objects.Remove (o);
+                               RemoveObject (o);
                                drawing.Drawables.Remove ((Drawable)o.IDrawableObject);
                        }
                        ClearSelection ();
@@ -168,7 +168,7 @@ namespace LongoMatch.Drawing.Widgets
                ICanvasSelectableObject Add (IBlackboardObject drawable)
                {
                        ICanvasSelectableObject cso = Utils.CanvasFromDrawableObject (drawable);
-                       Objects.Add (cso);
+                       AddObject (cso);
                        return cso;
                }
 
diff --git a/LongoMatch.Drawing/Widgets/CategoriesLabels.cs b/LongoMatch.Drawing/Widgets/CategoriesLabels.cs
index 6f2f381..2360d27 100644
--- a/LongoMatch.Drawing/Widgets/CategoriesLabels.cs
+++ b/LongoMatch.Drawing/Widgets/CategoriesLabels.cs
@@ -70,7 +70,7 @@ namespace LongoMatch.Drawing.Widgets
                                /* Add the category label */
                                l = new CategoryLabel (eventType, w, h, i * h);
                                eventsLabels [eventType] = l;
-                               Objects.Add (l);
+                               AddObject (l);
                                i++;
                        }
                }
diff --git a/LongoMatch.Drawing/Widgets/DashboardCanvas.cs b/LongoMatch.Drawing/Widgets/DashboardCanvas.cs
index 18168e8..ee85cfe 100644
--- a/LongoMatch.Drawing/Widgets/DashboardCanvas.cs
+++ b/LongoMatch.Drawing/Widgets/DashboardCanvas.cs
@@ -205,7 +205,7 @@ namespace LongoMatch.Drawing.Widgets
                                TagObject to = new TagObject (tag);
                                to.ClickedEvent += HandleTaggerClickedEvent;
                                to.Mode = TagMode;
-                               Objects.Add (to);
+                               AddObject (to);
                        }
                        
                        foreach (AnalysisEventButton cat in template.List.OfType<AnalysisEventButton>()) {
@@ -213,27 +213,27 @@ namespace LongoMatch.Drawing.Widgets
                                co.ClickedEvent += HandleTaggerClickedEvent;
                                co.Mode = TagMode;
                                co.AddTag = AddTag;
-                               Objects.Add (co);
+                               AddObject (co);
                        }
 
                        foreach (PenaltyCardButton c in template.List.OfType<PenaltyCardButton>()) {
                                CardObject co = new CardObject (c);
                                co.ClickedEvent += HandleTaggerClickedEvent;
                                co.Mode = TagMode;
-                               Objects.Add (co);
+                               AddObject (co);
                        }
                        foreach (ScoreButton s in template.List.OfType<ScoreButton>()) {
                                ScoreObject co = new ScoreObject (s);
                                co.ClickedEvent += HandleTaggerClickedEvent;
                                co.Mode = TagMode;
-                               Objects.Add (co);
+                               AddObject (co);
                        }
 
                        foreach (TimerButton t in template.List.OfType<TimerButton>()) {
                                TimerObject to = new TimerObject (t);
                                to.ClickedEvent += HandleTaggerClickedEvent;
                                to.Mode = TagMode;
-                               Objects.Add (to);
+                               AddObject (to);
                        }
                        Edited = false;
                        SizeChanged ();
@@ -260,7 +260,7 @@ namespace LongoMatch.Drawing.Widgets
                        }
                }
 
-               void HandleTaggerClickedEvent (CanvasObject co)
+               void HandleTaggerClickedEvent (ICanvasObject co)
                {
                        TaggerObject tagger;
                        EventButton button;
diff --git a/LongoMatch.Drawing/Widgets/PlaysTimeline.cs b/LongoMatch.Drawing/Widgets/PlaysTimeline.cs
index aae6b4f..2eb1d24 100644
--- a/LongoMatch.Drawing/Widgets/PlaysTimeline.cs
+++ b/LongoMatch.Drawing/Widgets/PlaysTimeline.cs
@@ -120,7 +120,7 @@ namespace LongoMatch.Drawing.Widgets
                                                           i * StyleConf.TimelineCategoryHeight,
                                                           Utils.ColorForRow (i), playsFilter);
                                eventsTimelines [type] = tl;
-                               Objects.Add (tl);
+                               AddObject (tl);
                                i++;
                        }
                        UpdateVisibleCategories ();
diff --git a/LongoMatch.Drawing/Widgets/PositionTagger.cs b/LongoMatch.Drawing/Widgets/PositionTagger.cs
index f3cdff1..116678a 100644
--- a/LongoMatch.Drawing/Widgets/PositionTagger.cs
+++ b/LongoMatch.Drawing/Widgets/PositionTagger.cs
@@ -93,7 +93,7 @@ namespace LongoMatch.Drawing.Widgets
                public List<Point> Points {
                        set {
                                ClearObjects ();
-                               Objects.Add (new PositionObject (value, Background.Width, Background.Height));
+                               AddObject (new PositionObject (value, Background.Width, Background.Height));
                        }
                }
 
@@ -121,12 +121,16 @@ namespace LongoMatch.Drawing.Widgets
                        if (Filter != null) {
                                po.Visible = Filter.IsVisible (play);
                        }
-                       Objects.Add (po);
+                       AddObject (po);
                }
 
                public void RemovePlays (List<TimelineEvent> plays)
                {
-                       Objects.RemoveAll (o => plays.Contains ((o as PositionObject).Play));
+                       List<ICanvasObject> objects;
+
+                       foreach (ICanvasObject co in Objects.Where (o => plays.Contains ((o as 
PositionObject).Play))) {
+                               RemoveObject (co);
+                       }
                }
 
                void HandleFilterUpdated ()
diff --git a/LongoMatch.Drawing/Widgets/TeamTagger.cs b/LongoMatch.Drawing/Widgets/TeamTagger.cs
index d3d34a7..99b7d13 100644
--- a/LongoMatch.Drawing/Widgets/TeamTagger.cs
+++ b/LongoMatch.Drawing/Widgets/TeamTagger.cs
@@ -47,7 +47,7 @@ namespace LongoMatch.Drawing.Widgets
                        tagger.PlayersSubstitutionEvent += HandlePlayersSubstitutionEvent;
                        tagger.PlayersSelectionChangedEvent += HandlePlayersSelectionChangedEvent;
                        ObjectsCanMove = false;
-                       Objects.Add (tagger);
+                       AddObject (tagger);
                }
                
                protected override void Dispose (bool disposing)
diff --git a/LongoMatch.Drawing/Widgets/TimersTimeline.cs b/LongoMatch.Drawing/Widgets/TimersTimeline.cs
index f19c919..a4bdf65 100644
--- a/LongoMatch.Drawing/Widgets/TimersTimeline.cs
+++ b/LongoMatch.Drawing/Widgets/TimersTimeline.cs
@@ -79,7 +79,7 @@ namespace LongoMatch.Drawing.Widgets
                                foreach (Timer t in timers) {
                                        this.timers [t] = tl;
                                }
-                               Objects.Add (tl);
+                               AddObject (tl);
                        } else {
                                widget.Height = timers.Count * Constants.TIMER_HEIGHT;
                        }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]