[longomatch] Handle more nicely segments updates



commit 146484d3b96350b83d3115ba5ce2e08ad0c0b811
Author: Andoni Morales Alastruey <ylatuya gmail com>
Date:   Tue May 20 17:01:05 2014 +0200

    Handle more nicely segments updates

 LongoMatch.Core/Interfaces/GUI/IPlayerBin.cs       |    2 +-
 LongoMatch.GUI.Multimedia/Gui/PlayerBin.cs         |   70 +++++++++++++------
 LongoMatch.GUI.Multimedia/Gui/PlayerCapturerBin.cs |    4 +-
 .../gtk-gui/LongoMatch.Gui.PlayerBin.cs            |   11 ---
 LongoMatch.GUI.Multimedia/gtk-gui/gui.stetic       |   11 ---
 LongoMatch.Services/Services/EventsManager.cs      |   46 +++++++------
 6 files changed, 76 insertions(+), 68 deletions(-)
---
diff --git a/LongoMatch.Core/Interfaces/GUI/IPlayerBin.cs b/LongoMatch.Core/Interfaces/GUI/IPlayerBin.cs
index a28fad8..edc7255 100644
--- a/LongoMatch.Core/Interfaces/GUI/IPlayerBin.cs
+++ b/LongoMatch.Core/Interfaces/GUI/IPlayerBin.cs
@@ -55,7 +55,7 @@ namespace LongoMatch.Interfaces.GUI
                void StepBackward();
                void FramerateUp();
                void FramerateDown();
-               void LoadPlay (string fileName, Play play);
+               void LoadPlay (string fileName, Play play, Time seekTime, bool playing);
                void LoadPlayListPlay (PlayListPlay play, bool hasNext);
                void CloseSegment();
        }
diff --git a/LongoMatch.GUI.Multimedia/Gui/PlayerBin.cs b/LongoMatch.GUI.Multimedia/Gui/PlayerBin.cs
index 7a3e846..5f5fb23 100644
--- a/LongoMatch.GUI.Multimedia/Gui/PlayerBin.cs
+++ b/LongoMatch.GUI.Multimedia/Gui/PlayerBin.cs
@@ -67,7 +67,7 @@ namespace LongoMatch.Gui
                string filename;
                double previousVLevel = 1;
                double[] seeksQueue;
-               object[] pendingSeek; //{start,stop,rate}
+               object[] pendingSeek; //{seekTime, rate, playing}
                protected VolumeWindow vwin;
                Seeker seeker;
                Segment segment;
@@ -78,7 +78,7 @@ namespace LongoMatch.Gui
                {
                        this.Build();
                        vwin = new VolumeWindow();
-                       vwin.VolumeChanged += new VolumeChangedHandler(OnVolumeChanged);
+                       ConnectSignals ();
                        tickHandler = new TickHandler(OnTick);
                        controlsbox.Visible = false;
                        UnSensitive();
@@ -206,13 +206,14 @@ namespace LongoMatch.Gui
                        else
                                nextbutton.Sensitive = false;
 
-                       LoadSegment (play.MediaFile.FilePath, play.Start, play.Stop, play.Rate);
+                       LoadSegment (play.MediaFile.FilePath, play.Start, play.Stop,
+                                    play.Start, true, play.Rate);
                }
                
-               public void LoadPlay (string filename, Play play) {
-                       LoadSegment (filename, play.Start, play.Stop, play.Rate);
+               public void LoadPlay (string filename, Play play, Time seekTime, bool playing) {
+                       LoadSegment (filename, play.Start, play.Stop, seekTime, playing, play.Rate);
                }
-
+               
                public void Close() {
                        player.Close();
                        filename = null;
@@ -305,10 +306,27 @@ namespace LongoMatch.Gui
                        }
                }
                
-               void LoadSegment (string filename, Time start, Time stop, float rate = 1) {
-                       Log.Debug (String.Format ("Loading player segment {0} {1} {2} {3}",
-                                  filename, start, stop, rate));
-                       Open (filename, false);
+               void ConnectSignals () {
+                       vwin.VolumeChanged += new VolumeChangedHandler(OnVolumeChanged);
+                       closebutton.Clicked += OnClosebuttonClicked;
+                       prevbutton.Clicked += OnPrevbuttonClicked;
+                       nextbutton.Clicked += OnNextbuttonClicked;
+                       playbutton.Clicked += OnPlaybuttonClicked;
+                       pausebutton.Clicked += OnPausebuttonClicked;
+                       drawbutton.Clicked += OnDrawButtonClicked;
+                       timescale.ValueChanged += OnTimescaleValueChanged;
+                       timescale.AdjustBounds += OnTimescaleAdjustBounds;
+               }
+               
+               void LoadSegment (string filename, Time start, Time stop, Time seekTime,
+                                 bool playing, float rate = 1) {
+                       Log.Debug (String.Format ("Update player segment {0} {1} {2}",
+                                                 start.ToMSecondsString(),
+                                                 stop.ToMSecondsString(), rate));
+                       if (filename != this.filename) {
+                               Open (filename, false);
+                       }
+                       player.Pause();
                        segment.Start = start;
                        segment.Stop = stop;
                        rate = rate == 0 ? 1 : rate;
@@ -318,11 +336,13 @@ namespace LongoMatch.Gui
                                           start.ToMSecondsString());
                                SetScaleValue ((int) (rate * SCALE_FPS));
                                player.Rate = (double) rate;
-                               player.Seek (start, true);
-                               player.Play ();
+                               player.Seek (seekTime, true);
+                               if (playing) {
+                                       player.Play ();
+                               }
                        } else {
                                Log.Debug ("Delaying seek until player is ready");
-                               pendingSeek = new object[3] {start, stop, rate};
+                               pendingSeek = new object[3] {seekTime, rate, playing};
                        }
                }
 
@@ -415,9 +435,11 @@ namespace LongoMatch.Gui
                void OnReadyToSeek() {
                        readyToSeek = true;
                        if(pendingSeek != null) {
-                               player.Rate = (float) pendingSeek [2];
+                               player.Rate = (float) pendingSeek [1];
                                player.Seek ((Time)pendingSeek[0], true);
-                               player.Play();
+                               if ((bool)pendingSeek[2]) {
+                                       player.Play();
+                               }
                                pendingSeek = null;
                        }
                }
@@ -430,20 +452,24 @@ namespace LongoMatch.Gui
                        }
 
                        if (SegmentLoaded) {
-                               Time duration = segment.Stop - segment.Start;
+                               Time dur, ct;
+                               double cp;
+
+                               dur = segment.Stop - segment.Start;
                                if (currentTime > segment.Stop) {
                                        player.Pause ();
                                }
-                               currentTime -= segment.Start;
-                               currentPosition = (float)currentTime.MSeconds/(float)(duration.MSeconds);
-                               slength = duration.ToMSecondsString();
-                               
+                               ct = currentTime - segment.Start;
+                               cp = (float)ct.MSeconds/(float)(dur.MSeconds);
+                               slength = dur.ToMSecondsString();
+                               timelabel.Text = ct.ToMSecondsString() + "/" + slength;
+                               timescale.Value = cp;
                        } else {
                                slength = length.ToMSecondsString ();
+                               timelabel.Text = currentTime.ToMSecondsString() + "/" + slength;
+                               timescale.Value = currentPosition;
                        }
 
-                       timelabel.Text = currentTime.ToMSecondsString() + "/" + slength;
-                       timescale.Value = currentPosition;
                        if (Tick != null)
                                Tick (currentTime, streamLength, currentPosition);
 
diff --git a/LongoMatch.GUI.Multimedia/Gui/PlayerCapturerBin.cs 
b/LongoMatch.GUI.Multimedia/Gui/PlayerCapturerBin.cs
index e35fa10..11ba7a1 100644
--- a/LongoMatch.GUI.Multimedia/Gui/PlayerCapturerBin.cs
+++ b/LongoMatch.GUI.Multimedia/Gui/PlayerCapturerBin.cs
@@ -211,13 +211,13 @@ namespace LongoMatch.Gui
                        playerbin.LoadPlayListPlay (play, hasNext);
                }
                
-               public void LoadPlay (string filename, Play play) {
+               public void LoadPlay (string filename, Play play, Time seekTime, bool playing) {
                        if (mode == PlayerOperationMode.PreviewCapturer) {
                                backtolivebutton.Visible = true;
                                ShowPlayer ();
                                LoadBackgroundPlayer(filename);
                        }
-                       playerbin.LoadPlay (filename, play);
+                       playerbin.LoadPlay (filename, play, seekTime, playing);
                }
                
                public void Seek (Time time, bool accurate) {
diff --git a/LongoMatch.GUI.Multimedia/gtk-gui/LongoMatch.Gui.PlayerBin.cs 
b/LongoMatch.GUI.Multimedia/gtk-gui/LongoMatch.Gui.PlayerBin.cs
index 3aec695..0d3d932 100644
--- a/LongoMatch.GUI.Multimedia/gtk-gui/LongoMatch.Gui.PlayerBin.cs
+++ b/LongoMatch.GUI.Multimedia/gtk-gui/LongoMatch.Gui.PlayerBin.cs
@@ -386,17 +386,6 @@ namespace LongoMatch.Gui
                        this.nextbutton.Hide ();
                        this.controlsbox.Hide ();
                        this.Show ();
-                       this.vscale1.FormatValue += new global::Gtk.FormatValueHandler 
(this.OnVscale1FormatValue);
-                       this.vscale1.ValueChanged += new global::System.EventHandler 
(this.OnVscale1ValueChanged);
-                       this.closebutton.Clicked += new global::System.EventHandler 
(this.OnClosebuttonClicked);
-                       this.drawbutton.Clicked += new global::System.EventHandler (this.OnDrawButtonClicked);
-                       this.playbutton.Clicked += new global::System.EventHandler (this.OnPlaybuttonClicked);
-                       this.pausebutton.Clicked += new global::System.EventHandler 
(this.OnPausebuttonClicked);
-                       this.prevbutton.Clicked += new global::System.EventHandler (this.OnPrevbuttonClicked);
-                       this.nextbutton.Clicked += new global::System.EventHandler (this.OnNextbuttonClicked);
-                       this.timescale.ValueChanged += new global::System.EventHandler 
(this.OnTimescaleValueChanged);
-                       this.timescale.AdjustBounds += new global::Gtk.AdjustBoundsHandler 
(this.OnTimescaleAdjustBounds);
-                       this.volumebutton.Clicked += new global::System.EventHandler 
(this.OnVolumebuttonClicked);
                }
        }
 }
diff --git a/LongoMatch.GUI.Multimedia/gtk-gui/gui.stetic b/LongoMatch.GUI.Multimedia/gtk-gui/gui.stetic
index 9f2d562..ba98ed3 100644
--- a/LongoMatch.GUI.Multimedia/gtk-gui/gui.stetic
+++ b/LongoMatch.GUI.Multimedia/gtk-gui/gui.stetic
@@ -152,8 +152,6 @@
                     <property name="DrawValue">True</property>
                     <property name="Digits">0</property>
                     <property name="ValuePos">Bottom</property>
-                    <signal name="FormatValue" handler="OnVscale1FormatValue" />
-                    <signal name="ValueChanged" handler="OnVscale1ValueChanged" />
                   </widget>
                   <packing>
                     <property name="Position">0</property>
@@ -191,7 +189,6 @@
                     <property name="Icon">stock:gtk-close Dnd</property>
                     <property name="Label" translatable="yes" />
                     <property name="UseUnderline">True</property>
-                    <signal name="Clicked" handler="OnClosebuttonClicked" />
                   </widget>
                   <packing>
                     <property name="Position">0</property>
@@ -208,7 +205,6 @@
                     <property name="Label" translatable="yes" />
                     <property name="UseUnderline">True</property>
                     <property name="Relief">None</property>
-                    <signal name="Clicked" handler="OnDrawButtonClicked" />
                   </widget>
                   <packing>
                     <property name="Position">1</property>
@@ -225,7 +221,6 @@
                     <property name="Label" translatable="yes" />
                     <property name="UseUnderline">True</property>
                     <property name="Relief">None</property>
-                    <signal name="Clicked" handler="OnPlaybuttonClicked" />
                   </widget>
                   <packing>
                     <property name="Position">2</property>
@@ -242,7 +237,6 @@
                     <property name="Label" translatable="yes" />
                     <property name="UseUnderline">True</property>
                     <property name="Relief">None</property>
-                    <signal name="Clicked" handler="OnPausebuttonClicked" />
                   </widget>
                   <packing>
                     <property name="Position">3</property>
@@ -260,7 +254,6 @@
                     <property name="Label" translatable="yes" />
                     <property name="UseUnderline">True</property>
                     <property name="Relief">None</property>
-                    <signal name="Clicked" handler="OnPrevbuttonClicked" />
                   </widget>
                   <packing>
                     <property name="Position">4</property>
@@ -279,7 +272,6 @@
                     <property name="Label" translatable="yes" />
                     <property name="UseUnderline">True</property>
                     <property name="Relief">None</property>
-                    <signal name="Clicked" handler="OnNextbuttonClicked" />
                   </widget>
                   <packing>
                     <property name="Position">5</property>
@@ -362,8 +354,6 @@
                 <property name="DrawValue">False</property>
                 <property name="Digits">0</property>
                 <property name="ValuePos">Top</property>
-                <signal name="ValueChanged" handler="OnTimescaleValueChanged" />
-                <signal name="AdjustBounds" handler="OnTimescaleAdjustBounds" />
               </widget>
               <packing>
                 <property name="Position">3</property>
@@ -388,7 +378,6 @@
                 <property name="Label" translatable="yes" />
                 <property name="UseUnderline">True</property>
                 <property name="Relief">None</property>
-                <signal name="Clicked" handler="OnVolumebuttonClicked" />
               </widget>
               <packing>
                 <property name="Position">5</property>
diff --git a/LongoMatch.Services/Services/EventsManager.cs b/LongoMatch.Services/Services/EventsManager.cs
index 69c2464..b8504e7 100644
--- a/LongoMatch.Services/Services/EventsManager.cs
+++ b/LongoMatch.Services/Services/EventsManager.cs
@@ -35,7 +35,7 @@ namespace LongoMatch.Services
        public class EventsManager
        {
                /* Current play loaded. null if no play is loaded */
-               TimeNode selectedTimeNode=null;
+               TimeNode loadedPlay=null;
                /* current project in use */
                Project openedProject;
                ProjectType projectType;
@@ -101,7 +101,7 @@ namespace LongoMatch.Services
                        analysisWindow.DuplicatePlay += OnDuplicatePlay;
 
                        /* Connect playlist events */
-                       analysisWindow.PlayListNodeSelectedEvent += (tn) => {selectedTimeNode = tn;};
+                       analysisWindow.PlayListNodeSelectedEvent += (tn) => {loadedPlay = tn;};
                        /* Connect tags events */
                        analysisWindow.TagPlayEvent += OnTagPlay;
 
@@ -157,6 +157,16 @@ namespace LongoMatch.Services
                        
                }
                
+               void LoadPlay (Play play, Time seekTime, bool playing) {
+                       player.LoadPlay (openedProject.Description.File.FilePath, play,
+                                        seekTime, playing);
+                       analysisWindow.UpdateSelectedPlay(play);
+                       loadedPlay = play;
+                       if (playing) {
+                               player.Play ();
+                       }
+               }
+               
                private void ProcessNewTag(Category category,Time pos) {
                        Time length, startTime, stopTime, start, stop, fStart, fStop;
 
@@ -223,13 +233,13 @@ namespace LongoMatch.Services
                        }
                }
 
-               protected virtual void OnNewTagAtPos (Category category, Time pos) {
+               void OnNewTagAtPos (Category category, Time pos) {
                        player.CloseSegment();
                        player.Seek (pos, true);
                        ProcessNewTag(category,pos);
                }
 
-               public virtual void OnNewTag(Category category) {
+               public void OnNewTag(Category category) {
                        Time pos;
 
                        if(projectType == ProjectType.FakeCaptureProject ||
@@ -242,13 +252,13 @@ namespace LongoMatch.Services
                        ProcessNewTag(category,pos);
                }
 
-               public virtual void OnNewPlayStart (Category category) {
+               void OnNewPlayStart (Category category) {
                        Time startTime = player.CurrentTime;
                        catsTime.Add (category, startTime);
                        Log.Debug("New play start time: " + startTime);
                }
                
-               public virtual void OnNewPlayStop(Category category) {
+               void OnNewPlayStop(Category category) {
                        int diff;
                        Time startTime, stopTime;
                        
@@ -278,14 +288,14 @@ namespace LongoMatch.Services
                        AddNewPlay(startTime, stopTime, category);
                }
                
-               public virtual void OnNewPlayCancel (Category category) {
+               void OnNewPlayCancel (Category category) {
                        try {
                                catsTime.Remove (category);
                        } catch {
                        }
                }
 
-               private void LaunchPlayTagger(Play play, bool showAllTags) {
+               void LaunchPlayTagger(Play play, bool showAllTags) {
                        guiToolkit.TagPlay(play, openedProject.Categories,
                                           openedProject.LocalTeamTemplate,
                                           openedProject.VisitorTeamTemplate,
@@ -294,27 +304,21 @@ namespace LongoMatch.Services
 
                void HandlePlaybackRateChanged (float rate)
                {
-                       if (selectedTimeNode != null) {
-                               selectedTimeNode.Rate = rate;
+                       if (loadedPlay != null) {
+                               loadedPlay.Rate = rate;
                        }
                }
 
-               protected virtual void OnPlaySelected(Play play)
+               void OnPlaySelected(Play play)
                {
-                       Log.Debug("Play selected: " + play);
-                       selectedTimeNode = play;
-                       player.LoadPlay (openedProject.Description.File.FilePath, play);
-                       analysisWindow.UpdateSelectedPlay(play);
+                       LoadPlay (play, play.Start, true);
                }
 
                protected virtual void OnTimeNodeChanged(TimeNode tNode, object val)
                {
                        /* FIXME: Tricky, create a new handler for categories */
                        if(tNode is Play && val is Time) {
-                               if(tNode != selectedTimeNode)
-                                       OnPlaySelected((Play)tNode);
-                               Time pos = (Time)val;
-                               player.Seek (pos, true);
+                               LoadPlay (tNode as Play, val as Time, false);
                        }
                        else if(tNode is Category) {
                                analysisWindow.UpdateCategories();
@@ -347,7 +351,7 @@ namespace LongoMatch.Services
 
                protected virtual void OnSegmentClosedEvent()
                {
-                       selectedTimeNode = null;
+                       loadedPlay = null;
                }
 
                protected virtual void OnSnapshotSeries(Play play) {
@@ -368,7 +372,7 @@ namespace LongoMatch.Services
                        Image pixbuf = null;
                        player.Pause();
                        pixbuf = player.CurrentFrame;
-                       guiToolkit.DrawingTool (pixbuf, selectedTimeNode as Play, time);
+                       guiToolkit.DrawingTool (pixbuf, loadedPlay as Play, time);
                }
 
                protected virtual void OnTagPlay(Play play) {


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