[longomatch] Implement secondary media player.



commit de6727aa930709fceab47087d272b6a212ea3df8
Author: Julien Moutte <julien fluendo com>
Date:   Fri Mar 13 18:51:47 2015 +0100

    Implement secondary media player.

 LongoMatch.GUI/Gui/Component/ProjectPeriods.cs     |  161 +++++++++++--
 .../LongoMatch.Gui.Component.ProjectPeriods.cs     |  237 +++++++++++++++-----
 LongoMatch.GUI/gtk-gui/gui.stetic                  |  145 +++++++++++-
 3 files changed, 453 insertions(+), 90 deletions(-)
---
diff --git a/LongoMatch.GUI/Gui/Component/ProjectPeriods.cs b/LongoMatch.GUI/Gui/Component/ProjectPeriods.cs
index 122218a..1fb2ce9 100644
--- a/LongoMatch.GUI/Gui/Component/ProjectPeriods.cs
+++ b/LongoMatch.GUI/Gui/Component/ProjectPeriods.cs
@@ -23,6 +23,7 @@ using LongoMatch.Drawing.Widgets;
 using LongoMatch.Drawing.Cairo;
 using Mono.Unix;
 using Gtk;
+using Pango;
 using LongoMatch.Core.Common;
 using LongoMatch.Gui.Menus;
 using LongoMatch.Gui.Helpers;
@@ -49,29 +50,55 @@ namespace LongoMatch.Gui.Component
                        zoomscale.CanFocus = false;
                        zoomscale.Adjustment.Lower = 0;
                        zoomscale.Adjustment.Upper = 100;
-                       zoomscale.ValueChanged += HandleZoomChanged;
 
-                       zoomoutimage.Pixbuf = LongoMatch.Gui.Helpers.Misc.LoadIcon ("longomatch-zoom-out", 
14);
-                       zoominimage.Pixbuf = LongoMatch.Gui.Helpers.Misc.LoadIcon ("longomatch-zoom-in", 14);
+                       zoomoutimage.Pixbuf = Helpers.Misc.LoadIcon ("longomatch-zoom-out", 14);
+                       zoominimage.Pixbuf = Helpers.Misc.LoadIcon ("longomatch-zoom-in", 14);
 
-                       main_cam_playerbin.Tick += HandleTick;
-                       main_cam_playerbin.ShowControls = false;
-                       //sec_cam_playerbin.ShowControls = false;
+                       // Only main cam has audio for now
+                       main_cam_audio_button_image.Pixbuf = Helpers.Misc.LoadIcon 
("longomatch-control-volume-hi", IconSize.Button);
+                       sec_cam_audio_button_image.Pixbuf = Helpers.Misc.LoadIcon 
("longomatch-control-volume-off", IconSize.Button);
+                       main_cam_audio_button.Active = true;
+                       sec_cam_audio_button.Active = false;
 
-                       timerule = new Timerule (new WidgetWrapper (timerulearea)) { ObjectsCanMove = false };
+                       // We control visibility of those widgets
+                       sec_cam_vbox.NoShowAll = true;
+                       sec_cam_vbox.Visible = false;
+                       sec_cam_didactic_label.NoShowAll = true;
+                       sec_cam_didactic_label.Visible = true;
+                       sec_cam_didactic_label.Text = Catalog.GetString ("Drag the bars in the timeline to 
synchronize secondary video files with the main video");
+
+                       timerule = new Timerule (new WidgetWrapper (timerulearea));
                        camerasTimeline = new CamerasTimeline (new WidgetWrapper (timelinearea));
                        camerasLabels = new CamerasLabels (new WidgetWrapper (labelsarea));
 
-                       /* FIXME: Links Label size to the container */
-                       labelsarea.SizeRequested += (o, args) => {
-                               labels_vbox.WidthRequest = args.Requisition.Width;
-                       };
-
                        // Set some sane defaults
                        labels_vbox.WidthRequest = StyleConf.TimelineLabelsWidth;
                        // We need to align the timerule and the beginning of labels list
                        timerulearea.HeightRequest = StyleConf.TimelineCameraHeight;
 
+                       main_cam_label.ModifyFont (FontDescription.FromString (Config.Style.Font + " bold 
14"));
+                       sec_cam_label.ModifyFont (FontDescription.FromString (Config.Style.Font + " bold 
14"));
+
+                       ConnectSignals ();
+
+                       LongoMatch.Gui.Helpers.Misc.SetFocus (this, false);
+
+                       menu = new PeriodsMenu ();
+               }
+
+               void ConnectSignals ()
+               {
+                       zoomscale.ValueChanged += HandleZoomChanged;
+                       main_cam_audio_button.Toggled += HandleAudioToggled;
+                       sec_cam_audio_button.Toggled += HandleAudioToggled;
+
+                       main_cam_playerbin.Tick += HandleTick;
+                       main_cam_playerbin.PlayStateChanged += HandleStateChanged;
+
+                       // Listen for seek events from the timerule
+                       Config.EventsBroker.SeekEvent += HandleSeekEvent;
+                       // Handle dragging of cameras and periods
+                       camerasTimeline.CameraDragged += HandleCameraDragged;
                        camerasTimeline.TimeNodeChanged += HandleTimeNodeChanged;
                        camerasTimeline.ShowTimerMenuEvent += HandleShowTimerMenuEvent;
 
@@ -79,6 +106,11 @@ namespace LongoMatch.Gui.Component
                        scrolledwindow2.Vadjustment.ValueChanged += HandleScrollEvent;
                        scrolledwindow2.Hadjustment.ValueChanged += HandleScrollEvent;
 
+                       /* FIXME: Links Label size to the container */
+                       labelsarea.SizeRequested += (o, args) => {
+                               labels_vbox.WidthRequest = args.Requisition.Width;
+                       };
+
                        // Adjust our zoom factors when the window is resized
                        scrolledwindow2.SizeAllocated += (o, args) =>  {
                                UpdateMaxSecondsPerPixel ();
@@ -88,26 +120,36 @@ namespace LongoMatch.Gui.Component
                                int spacing = (int)scrolledwindow2.StyleGetProperty ("scrollbar-spacing");
                                zoomhbox.HeightRequest = args.Allocation.Height + spacing;
                        };
-
-                       LongoMatch.Gui.Helpers.Misc.SetFocus (this, false);
-
-                       menu = new PeriodsMenu ();
                }
 
                protected override void OnDestroyed ()
                {
+                       Config.EventsBroker.SeekEvent -= HandleSeekEvent;
+
                        main_cam_playerbin.Destroy ();
-                       //sec_cam_playerbin.Destroy ();
+                       sec_cam_playerbin.Destroy ();
+
                        timerule.Dispose ();
                        camerasLabels.Dispose ();
                        camerasTimeline.Dispose ();
+
                        base.OnDestroyed ();
                }
 
                public void Pause ()
                {
                        main_cam_playerbin.Pause ();
-                       //sec_cam_playerbin.Pause ();
+                       sec_cam_playerbin.Pause ();
+               }
+
+               public void Seek (Time time, bool accurate)
+               {
+                       if (main_cam_playerbin.Opened) {
+                               main_cam_playerbin.Seek (time, accurate);
+                       }
+                       if (sec_cam_playerbin.Opened) {
+                               sec_cam_playerbin.Seek (time, accurate);
+                       }
                }
 
                public void SaveChanges ()
@@ -134,8 +176,7 @@ namespace LongoMatch.Gui.Component
                                List<string> gamePeriods;
                                List<Period> periods;
                                MediaFile file;
-                               
-                               main_cam_playerbin.ShowControls = false;
+
                                this.project = value;
                                gamePeriods = value.Dashboard.GamePeriods;
 
@@ -176,7 +217,9 @@ namespace LongoMatch.Gui.Component
                                timerule.Duration = duration;
 
                                // Open media file
-                               main_cam_playerbin.Open (value.Description.FileSet);
+                               main_cam_label.Text = fileSet.First ().Name;
+                               main_cam_playerbin.ShowControls = false;
+                               main_cam_playerbin.Open (fileSet);
                        }
                }
 
@@ -215,12 +258,79 @@ namespace LongoMatch.Gui.Component
                        QueueDraw ();
                }
 
+               /// <summary>
+               /// Try to slave the secondary player to the first 
+               /// </summary>
+               /// <param name="playing">If set to <c>true</c> playing.</param>
+               void HandleStateChanged (bool playing)
+               {
+                       if (playing) {
+                               sec_cam_playerbin.Play ();
+                       } else {
+                               sec_cam_playerbin.Pause ();
+                       }
+               }
+
+               void HandleAudioToggled (object sender, EventArgs args)
+               {
+                       if (sender == main_cam_audio_button) {
+                               main_cam_playerbin.Volume = main_cam_audio_button.Active ? 1 : 0;
+                               main_cam_audio_button_image.Pixbuf = Helpers.Misc.LoadIcon 
(main_cam_audio_button.Active ? "longomatch-control-volume-hi" : "longomatch-control-volume-off", 
IconSize.Button);
+                       } else if (sender == sec_cam_audio_button) {
+                               sec_cam_playerbin.Volume = sec_cam_audio_button.Active ? 1 : 0;
+                               sec_cam_audio_button_image.Pixbuf = Helpers.Misc.LoadIcon 
(sec_cam_audio_button.Active ? "longomatch-control-volume-hi" : "longomatch-control-volume-off", 
IconSize.Button);
+                       }
+               }
+
+               void HandleCameraDragged (MediaFile mediafile, TimeNode timenode)
+               {
+                       // Start by pausing players
+                       main_cam_playerbin.Pause ();
+                       sec_cam_playerbin.Pause ();
+
+                       // Check if the CurrentTime of the time rule is in that node
+                       if (timenode.Start <= timerule.CurrentTime && timerule.CurrentTime <= timenode.Stop) {
+                               // Check if we need to show the player
+                               if (!sec_cam_vbox.Visible) {
+                                       sec_cam_didactic_label.Hide ();
+                                       sec_cam_vbox.Show ();
+                               }
+                               // Open this media file if needed
+                               if (!sec_cam_playerbin.Opened ||
+                                       sec_cam_playerbin.MediaFileSet.FirstOrDefault () != mediafile) {
+                                       MediaFileSet fileSet = new MediaFileSet ();
+                                       fileSet.Add (mediafile);
+
+                                       // Reload player with new cam
+                                       sec_cam_label.Text = mediafile.Name;
+                                       sec_cam_playerbin.ShowControls = false;
+                                       sec_cam_playerbin.Open (fileSet);
+
+                                       // Configure audio
+                                       HandleAudioToggled (sec_cam_audio_button, new EventArgs ());
+                               }
+                               // Seek to position 
+                               sec_cam_playerbin.Seek (timerule.CurrentTime, true);
+                       } else {
+                               // Camera is out of scope, show didactic message
+                               sec_cam_vbox.Hide ();
+                               sec_cam_didactic_label.Text = Catalog.GetString ("Camera out of scope");
+                               sec_cam_didactic_label.Show ();
+                       }
+               }
+
+               /// <summary>
+               /// Periods segments have moved, adjust main camera position to segment boundaries
+               /// </summary>
                void HandleTimeNodeChanged (TimeNode tNode, object val)
                {
                        Time time = val as Time;
+
                        main_cam_playerbin.Pause ();
-                       main_cam_playerbin.Seek (time, false);
-                       // FIXME: Reflect change in the MediaFile's offset.
+                       if (sec_cam_playerbin.Opened) {
+                               sec_cam_playerbin.Pause ();
+                       }
+                       Seek (time, false);
                }
 
                /// <summary>
@@ -242,7 +352,6 @@ namespace LongoMatch.Gui.Component
                {
                        // We zoom from our Maximum number of seconds per pixel to the minimum using the 0 to 
100 scale value
                        double secondsPerPixel = 0, minSecondsPerPixels = 0.01;
-                       double value = Math.Round (zoomscale.Value);
                        double diff = maxSecondsPerPixels - minSecondsPerPixels;
 
                        secondsPerPixel = maxSecondsPerPixels - (diff * zoomscale.Value / 100);
@@ -252,6 +361,10 @@ namespace LongoMatch.Gui.Component
                        QueueDraw ();
                }
 
+               void HandleSeekEvent (Time time, bool accurate) {
+                       Seek (time, false);
+               }
+
                void HandleShowTimerMenuEvent (Timer timer, Time time)
                {
                        menu.ShowMenu (project, timer, time, camerasTimeline.PeriodsTimeline);
diff --git a/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.ProjectPeriods.cs 
b/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.ProjectPeriods.cs
index 7b4e965..4e6a8b4 100644
--- a/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.ProjectPeriods.cs
+++ b/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.ProjectPeriods.cs
@@ -8,13 +8,39 @@ namespace LongoMatch.Gui.Component
                
                private global::Gtk.VPaned vpaned2;
                
-               private global::Gtk.VBox vbox2;
-               
                private global::Gtk.HBox playbins_hbox;
                
+               private global::Gtk.VBox main_cam_vbox;
+               
                private global::LongoMatch.Gui.PlayerBin main_cam_playerbin;
                
-               private global::Gtk.HBox hbox3;
+               private global::Gtk.HBox main_cam_hbox;
+               
+               private global::Gtk.Label main_cam_label;
+               
+               private global::Gtk.Alignment main_cam_audio_alignment;
+               
+               private global::Gtk.ToggleButton main_cam_audio_button;
+               
+               private global::Gtk.Image main_cam_audio_button_image;
+               
+               private global::Gtk.VBox sec_cam_vbox;
+               
+               private global::LongoMatch.Gui.PlayerBin sec_cam_playerbin;
+               
+               private global::Gtk.HBox sec_cam_hbox;
+               
+               private global::Gtk.Label sec_cam_label;
+               
+               private global::Gtk.Alignment sec_cam_audio_alignment;
+               
+               private global::Gtk.ToggleButton sec_cam_audio_button;
+               
+               private global::Gtk.Image sec_cam_audio_button_image;
+               
+               private global::Gtk.Label sec_cam_didactic_label;
+               
+               private global::Gtk.HBox hbox5;
                
                private global::Gtk.Alignment labels_alignment;
                
@@ -30,7 +56,7 @@ namespace LongoMatch.Gui.Component
                
                private global::Gtk.Image zoominimage;
                
-               private global::Gtk.VBox vbox7;
+               private global::Gtk.VBox vbox9;
                
                private global::Gtk.DrawingArea timerulearea;
                
@@ -53,32 +79,127 @@ namespace LongoMatch.Gui.Component
                        this.vpaned2.Name = "vpaned2";
                        this.vpaned2.Position = 400;
                        // Container child vpaned2.Gtk.Paned+PanedChild
-                       this.vbox2 = new global::Gtk.VBox ();
-                       this.vbox2.Name = "vbox2";
-                       // Container child vbox2.Gtk.Box+BoxChild
                        this.playbins_hbox = new global::Gtk.HBox ();
                        this.playbins_hbox.Name = "playbins_hbox";
                        this.playbins_hbox.Homogeneous = true;
                        this.playbins_hbox.Spacing = 15;
                        this.playbins_hbox.BorderWidth = ((uint)(15));
                        // Container child playbins_hbox.Gtk.Box+BoxChild
+                       this.main_cam_vbox = new global::Gtk.VBox ();
+                       this.main_cam_vbox.Name = "main_cam_vbox";
+                       this.main_cam_vbox.Spacing = 6;
+                       // Container child main_cam_vbox.Gtk.Box+BoxChild
                        this.main_cam_playerbin = new global::LongoMatch.Gui.PlayerBin ();
                        this.main_cam_playerbin.Events = ((global::Gdk.EventMask)(256));
                        this.main_cam_playerbin.Name = "main_cam_playerbin";
+                       this.main_cam_playerbin.Volume = 0;
                        this.main_cam_playerbin.CloseAlwaysVisible = false;
-                       this.playbins_hbox.Add (this.main_cam_playerbin);
-                       global::Gtk.Box.BoxChild w1 = ((global::Gtk.Box.BoxChild)(this.playbins_hbox 
[this.main_cam_playerbin]));
+                       this.main_cam_vbox.Add (this.main_cam_playerbin);
+                       global::Gtk.Box.BoxChild w1 = ((global::Gtk.Box.BoxChild)(this.main_cam_vbox 
[this.main_cam_playerbin]));
                        w1.Position = 0;
-                       this.vbox2.Add (this.playbins_hbox);
-                       global::Gtk.Box.BoxChild w2 = ((global::Gtk.Box.BoxChild)(this.vbox2 
[this.playbins_hbox]));
+                       // Container child main_cam_vbox.Gtk.Box+BoxChild
+                       this.main_cam_hbox = new global::Gtk.HBox ();
+                       this.main_cam_hbox.Name = "main_cam_hbox";
+                       this.main_cam_hbox.Spacing = 6;
+                       // Container child main_cam_hbox.Gtk.Box+BoxChild
+                       this.main_cam_label = new global::Gtk.Label ();
+                       this.main_cam_label.Name = "main_cam_label";
+                       this.main_cam_label.Xalign = 0F;
+                       this.main_cam_hbox.Add (this.main_cam_label);
+                       global::Gtk.Box.BoxChild w2 = ((global::Gtk.Box.BoxChild)(this.main_cam_hbox 
[this.main_cam_label]));
                        w2.Position = 0;
-                       this.vpaned2.Add (this.vbox2);
-                       global::Gtk.Paned.PanedChild w3 = ((global::Gtk.Paned.PanedChild)(this.vpaned2 
[this.vbox2]));
-                       w3.Resize = false;
+                       // Container child main_cam_hbox.Gtk.Box+BoxChild
+                       this.main_cam_audio_alignment = new global::Gtk.Alignment (0.5F, 0.5F, 1F, 1F);
+                       this.main_cam_audio_alignment.Name = "main_cam_audio_alignment";
+                       this.main_cam_audio_alignment.RightPadding = ((uint)(50));
+                       // Container child main_cam_audio_alignment.Gtk.Container+ContainerChild
+                       this.main_cam_audio_button = new global::Gtk.ToggleButton ();
+                       this.main_cam_audio_button.CanFocus = true;
+                       this.main_cam_audio_button.Name = "main_cam_audio_button";
+                       this.main_cam_audio_button.Active = true;
+                       // Container child main_cam_audio_button.Gtk.Container+ContainerChild
+                       this.main_cam_audio_button_image = new global::Gtk.Image ();
+                       this.main_cam_audio_button_image.Name = "main_cam_audio_button_image";
+                       this.main_cam_audio_button.Add (this.main_cam_audio_button_image);
+                       this.main_cam_audio_alignment.Add (this.main_cam_audio_button);
+                       this.main_cam_hbox.Add (this.main_cam_audio_alignment);
+                       global::Gtk.Box.BoxChild w5 = ((global::Gtk.Box.BoxChild)(this.main_cam_hbox 
[this.main_cam_audio_alignment]));
+                       w5.Position = 1;
+                       w5.Expand = false;
+                       w5.Fill = false;
+                       this.main_cam_vbox.Add (this.main_cam_hbox);
+                       global::Gtk.Box.BoxChild w6 = ((global::Gtk.Box.BoxChild)(this.main_cam_vbox 
[this.main_cam_hbox]));
+                       w6.Position = 1;
+                       w6.Expand = false;
+                       w6.Fill = false;
+                       this.playbins_hbox.Add (this.main_cam_vbox);
+                       global::Gtk.Box.BoxChild w7 = ((global::Gtk.Box.BoxChild)(this.playbins_hbox 
[this.main_cam_vbox]));
+                       w7.Position = 0;
+                       // Container child playbins_hbox.Gtk.Box+BoxChild
+                       this.sec_cam_vbox = new global::Gtk.VBox ();
+                       this.sec_cam_vbox.Name = "sec_cam_vbox";
+                       this.sec_cam_vbox.Spacing = 6;
+                       // Container child sec_cam_vbox.Gtk.Box+BoxChild
+                       this.sec_cam_playerbin = new global::LongoMatch.Gui.PlayerBin ();
+                       this.sec_cam_playerbin.Events = ((global::Gdk.EventMask)(256));
+                       this.sec_cam_playerbin.Name = "sec_cam_playerbin";
+                       this.sec_cam_playerbin.Volume = 0;
+                       this.sec_cam_playerbin.CloseAlwaysVisible = false;
+                       this.sec_cam_vbox.Add (this.sec_cam_playerbin);
+                       global::Gtk.Box.BoxChild w8 = ((global::Gtk.Box.BoxChild)(this.sec_cam_vbox 
[this.sec_cam_playerbin]));
+                       w8.Position = 0;
+                       // Container child sec_cam_vbox.Gtk.Box+BoxChild
+                       this.sec_cam_hbox = new global::Gtk.HBox ();
+                       this.sec_cam_hbox.Name = "sec_cam_hbox";
+                       this.sec_cam_hbox.Spacing = 6;
+                       // Container child sec_cam_hbox.Gtk.Box+BoxChild
+                       this.sec_cam_label = new global::Gtk.Label ();
+                       this.sec_cam_label.Name = "sec_cam_label";
+                       this.sec_cam_label.Xalign = 0F;
+                       this.sec_cam_hbox.Add (this.sec_cam_label);
+                       global::Gtk.Box.BoxChild w9 = ((global::Gtk.Box.BoxChild)(this.sec_cam_hbox 
[this.sec_cam_label]));
+                       w9.Position = 0;
+                       // Container child sec_cam_hbox.Gtk.Box+BoxChild
+                       this.sec_cam_audio_alignment = new global::Gtk.Alignment (0.5F, 0.5F, 1F, 1F);
+                       this.sec_cam_audio_alignment.Name = "sec_cam_audio_alignment";
+                       this.sec_cam_audio_alignment.RightPadding = ((uint)(50));
+                       // Container child sec_cam_audio_alignment.Gtk.Container+ContainerChild
+                       this.sec_cam_audio_button = new global::Gtk.ToggleButton ();
+                       this.sec_cam_audio_button.CanFocus = true;
+                       this.sec_cam_audio_button.Name = "sec_cam_audio_button";
+                       // Container child sec_cam_audio_button.Gtk.Container+ContainerChild
+                       this.sec_cam_audio_button_image = new global::Gtk.Image ();
+                       this.sec_cam_audio_button_image.Name = "sec_cam_audio_button_image";
+                       this.sec_cam_audio_button.Add (this.sec_cam_audio_button_image);
+                       this.sec_cam_audio_alignment.Add (this.sec_cam_audio_button);
+                       this.sec_cam_hbox.Add (this.sec_cam_audio_alignment);
+                       global::Gtk.Box.BoxChild w12 = ((global::Gtk.Box.BoxChild)(this.sec_cam_hbox 
[this.sec_cam_audio_alignment]));
+                       w12.Position = 1;
+                       w12.Expand = false;
+                       w12.Fill = false;
+                       this.sec_cam_vbox.Add (this.sec_cam_hbox);
+                       global::Gtk.Box.BoxChild w13 = ((global::Gtk.Box.BoxChild)(this.sec_cam_vbox 
[this.sec_cam_hbox]));
+                       w13.Position = 1;
+                       w13.Expand = false;
+                       w13.Fill = false;
+                       this.playbins_hbox.Add (this.sec_cam_vbox);
+                       global::Gtk.Box.BoxChild w14 = ((global::Gtk.Box.BoxChild)(this.playbins_hbox 
[this.sec_cam_vbox]));
+                       w14.Position = 1;
+                       // Container child playbins_hbox.Gtk.Box+BoxChild
+                       this.sec_cam_didactic_label = new global::Gtk.Label ();
+                       this.sec_cam_didactic_label.Name = "sec_cam_didactic_label";
+                       this.playbins_hbox.Add (this.sec_cam_didactic_label);
+                       global::Gtk.Box.BoxChild w15 = ((global::Gtk.Box.BoxChild)(this.playbins_hbox 
[this.sec_cam_didactic_label]));
+                       w15.Position = 2;
+                       w15.Expand = false;
+                       w15.Fill = false;
+                       this.vpaned2.Add (this.playbins_hbox);
+                       global::Gtk.Paned.PanedChild w16 = ((global::Gtk.Paned.PanedChild)(this.vpaned2 
[this.playbins_hbox]));
+                       w16.Resize = false;
                        // Container child vpaned2.Gtk.Paned+PanedChild
-                       this.hbox3 = new global::Gtk.HBox ();
-                       this.hbox3.Name = "hbox3";
-                       // Container child hbox3.Gtk.Box+BoxChild
+                       this.hbox5 = new global::Gtk.HBox ();
+                       this.hbox5.Name = "hbox5";
+                       // Container child hbox5.Gtk.Box+BoxChild
                        this.labels_alignment = new global::Gtk.Alignment (0.5F, 0.5F, 1F, 1F);
                        this.labels_alignment.Name = "labels_alignment";
                        // Container child labels_alignment.Gtk.Container+ContainerChild
@@ -88,8 +209,8 @@ namespace LongoMatch.Gui.Component
                        this.labelsarea = new global::Gtk.DrawingArea ();
                        this.labelsarea.Name = "labelsarea";
                        this.labels_vbox.Add (this.labelsarea);
-                       global::Gtk.Box.BoxChild w4 = ((global::Gtk.Box.BoxChild)(this.labels_vbox 
[this.labelsarea]));
-                       w4.Position = 0;
+                       global::Gtk.Box.BoxChild w17 = ((global::Gtk.Box.BoxChild)(this.labels_vbox 
[this.labelsarea]));
+                       w17.Position = 0;
                        // Container child labels_vbox.Gtk.Box+BoxChild
                        this.zoomhbox = new global::Gtk.HBox ();
                        this.zoomhbox.Name = "zoomhbox";
@@ -100,10 +221,10 @@ namespace LongoMatch.Gui.Component
                        this.zoomoutimage.HeightRequest = 8;
                        this.zoomoutimage.Name = "zoomoutimage";
                        this.zoomhbox.Add (this.zoomoutimage);
-                       global::Gtk.Box.BoxChild w5 = ((global::Gtk.Box.BoxChild)(this.zoomhbox 
[this.zoomoutimage]));
-                       w5.Position = 0;
-                       w5.Expand = false;
-                       w5.Fill = false;
+                       global::Gtk.Box.BoxChild w18 = ((global::Gtk.Box.BoxChild)(this.zoomhbox 
[this.zoomoutimage]));
+                       w18.Position = 0;
+                       w18.Expand = false;
+                       w18.Fill = false;
                        // Container child zoomhbox.Gtk.Box+BoxChild
                        this.zoomscale = new global::Gtk.HScale (null);
                        this.zoomscale.CanFocus = true;
@@ -115,39 +236,39 @@ namespace LongoMatch.Gui.Component
                        this.zoomscale.Digits = 0;
                        this.zoomscale.ValuePos = ((global::Gtk.PositionType)(2));
                        this.zoomhbox.Add (this.zoomscale);
-                       global::Gtk.Box.BoxChild w6 = ((global::Gtk.Box.BoxChild)(this.zoomhbox 
[this.zoomscale]));
-                       w6.Position = 1;
+                       global::Gtk.Box.BoxChild w19 = ((global::Gtk.Box.BoxChild)(this.zoomhbox 
[this.zoomscale]));
+                       w19.Position = 1;
                        // Container child zoomhbox.Gtk.Box+BoxChild
                        this.zoominimage = new global::Gtk.Image ();
                        this.zoominimage.WidthRequest = 14;
                        this.zoominimage.HeightRequest = 8;
                        this.zoominimage.Name = "zoominimage";
                        this.zoomhbox.Add (this.zoominimage);
-                       global::Gtk.Box.BoxChild w7 = ((global::Gtk.Box.BoxChild)(this.zoomhbox 
[this.zoominimage]));
-                       w7.Position = 2;
-                       w7.Expand = false;
-                       w7.Fill = false;
+                       global::Gtk.Box.BoxChild w20 = ((global::Gtk.Box.BoxChild)(this.zoomhbox 
[this.zoominimage]));
+                       w20.Position = 2;
+                       w20.Expand = false;
+                       w20.Fill = false;
                        this.labels_vbox.Add (this.zoomhbox);
-                       global::Gtk.Box.BoxChild w8 = ((global::Gtk.Box.BoxChild)(this.labels_vbox 
[this.zoomhbox]));
-                       w8.Position = 1;
-                       w8.Expand = false;
-                       w8.Fill = false;
+                       global::Gtk.Box.BoxChild w21 = ((global::Gtk.Box.BoxChild)(this.labels_vbox 
[this.zoomhbox]));
+                       w21.Position = 1;
+                       w21.Expand = false;
+                       w21.Fill = false;
                        this.labels_alignment.Add (this.labels_vbox);
-                       this.hbox3.Add (this.labels_alignment);
-                       global::Gtk.Box.BoxChild w10 = ((global::Gtk.Box.BoxChild)(this.hbox3 
[this.labels_alignment]));
-                       w10.Position = 0;
-                       w10.Expand = false;
-                       // Container child hbox3.Gtk.Box+BoxChild
-                       this.vbox7 = new global::Gtk.VBox ();
-                       this.vbox7.Name = "vbox7";
-                       // Container child vbox7.Gtk.Box+BoxChild
+                       this.hbox5.Add (this.labels_alignment);
+                       global::Gtk.Box.BoxChild w23 = ((global::Gtk.Box.BoxChild)(this.hbox5 
[this.labels_alignment]));
+                       w23.Position = 0;
+                       w23.Expand = false;
+                       // Container child hbox5.Gtk.Box+BoxChild
+                       this.vbox9 = new global::Gtk.VBox ();
+                       this.vbox9.Name = "vbox9";
+                       // Container child vbox9.Gtk.Box+BoxChild
                        this.timerulearea = new global::Gtk.DrawingArea ();
                        this.timerulearea.Name = "timerulearea";
-                       this.vbox7.Add (this.timerulearea);
-                       global::Gtk.Box.BoxChild w11 = ((global::Gtk.Box.BoxChild)(this.vbox7 
[this.timerulearea]));
-                       w11.Position = 0;
-                       w11.Expand = false;
-                       // Container child vbox7.Gtk.Box+BoxChild
+                       this.vbox9.Add (this.timerulearea);
+                       global::Gtk.Box.BoxChild w24 = ((global::Gtk.Box.BoxChild)(this.vbox9 
[this.timerulearea]));
+                       w24.Position = 0;
+                       w24.Expand = false;
+                       // Container child vbox9.Gtk.Box+BoxChild
                        this.scrolledwindow2 = new global::Gtk.ScrolledWindow ();
                        this.scrolledwindow2.HeightRequest = 50;
                        this.scrolledwindow2.CanFocus = true;
@@ -155,25 +276,27 @@ namespace LongoMatch.Gui.Component
                        this.scrolledwindow2.VscrollbarPolicy = ((global::Gtk.PolicyType)(0));
                        this.scrolledwindow2.HscrollbarPolicy = ((global::Gtk.PolicyType)(0));
                        // Container child scrolledwindow2.Gtk.Container+ContainerChild
-                       global::Gtk.Viewport w12 = new global::Gtk.Viewport ();
-                       w12.ShadowType = ((global::Gtk.ShadowType)(0));
+                       global::Gtk.Viewport w25 = new global::Gtk.Viewport ();
+                       w25.ShadowType = ((global::Gtk.ShadowType)(0));
                        // Container child GtkViewport.Gtk.Container+ContainerChild
                        this.timelinearea = new global::Gtk.DrawingArea ();
                        this.timelinearea.Name = "timelinearea";
-                       w12.Add (this.timelinearea);
-                       this.scrolledwindow2.Add (w12);
-                       this.vbox7.Add (this.scrolledwindow2);
-                       global::Gtk.Box.BoxChild w15 = ((global::Gtk.Box.BoxChild)(this.vbox7 
[this.scrolledwindow2]));
-                       w15.Position = 1;
-                       this.hbox3.Add (this.vbox7);
-                       global::Gtk.Box.BoxChild w16 = ((global::Gtk.Box.BoxChild)(this.hbox3 [this.vbox7]));
-                       w16.Position = 1;
-                       this.vpaned2.Add (this.hbox3);
+                       w25.Add (this.timelinearea);
+                       this.scrolledwindow2.Add (w25);
+                       this.vbox9.Add (this.scrolledwindow2);
+                       global::Gtk.Box.BoxChild w28 = ((global::Gtk.Box.BoxChild)(this.vbox9 
[this.scrolledwindow2]));
+                       w28.Position = 1;
+                       this.hbox5.Add (this.vbox9);
+                       global::Gtk.Box.BoxChild w29 = ((global::Gtk.Box.BoxChild)(this.hbox5 [this.vbox9]));
+                       w29.Position = 1;
+                       this.vpaned2.Add (this.hbox5);
                        this.headereventbox.Add (this.vpaned2);
                        this.Add (this.headereventbox);
                        if ((this.Child != null)) {
                                this.Child.ShowAll ();
                        }
+                       this.sec_cam_vbox.Hide ();
+                       this.sec_cam_didactic_label.Hide ();
                        this.Hide ();
                }
        }
diff --git a/LongoMatch.GUI/gtk-gui/gui.stetic b/LongoMatch.GUI/gtk-gui/gui.stetic
index ca2e979..ccc4c53 100644
--- a/LongoMatch.GUI/gtk-gui/gui.stetic
+++ b/LongoMatch.GUI/gtk-gui/gui.stetic
@@ -9657,7 +9657,7 @@ You can continue with the current capture, cancel it or save your project.
       </widget>
     </child>
   </widget>
-  <widget class="Gtk.Bin" id="LongoMatch.Gui.Component.ProjectPeriods" design-size="1639 475">
+  <widget class="Gtk.Bin" id="LongoMatch.Gui.Component.ProjectPeriods" design-size="3263 475">
     <property name="MemberName" />
     <property name="Visible">False</property>
     <child>
@@ -9669,18 +9669,20 @@ You can continue with the current capture, cancel it or save your project.
             <property name="CanFocus">True</property>
             <property name="Position">400</property>
             <child>
-              <widget class="Gtk.VBox" id="vbox2">
+              <widget class="Gtk.HBox" id="playbins_hbox">
                 <property name="MemberName" />
+                <property name="Homogeneous">True</property>
+                <property name="Spacing">15</property>
+                <property name="BorderWidth">15</property>
                 <child>
-                  <widget class="Gtk.HBox" id="playbins_hbox">
+                  <widget class="Gtk.VBox" id="main_cam_vbox">
                     <property name="MemberName" />
-                    <property name="Homogeneous">True</property>
-                    <property name="Spacing">15</property>
-                    <property name="BorderWidth">15</property>
+                    <property name="Spacing">6</property>
                     <child>
                       <widget class="LongoMatch.Gui.PlayerBin" id="main_cam_playerbin">
                         <property name="MemberName" />
                         <property name="Events">ButtonPressMask</property>
+                        <property name="Volume">0</property>
                         <property name="CloseAlwaysVisible">False</property>
                       </widget>
                       <packing>
@@ -9689,12 +9691,137 @@ You can continue with the current capture, cancel it or save your project.
                       </packing>
                     </child>
                     <child>
-                      <placeholder />
+                      <widget class="Gtk.HBox" id="main_cam_hbox">
+                        <property name="MemberName" />
+                        <property name="Spacing">6</property>
+                        <child>
+                          <widget class="Gtk.Label" id="main_cam_label">
+                            <property name="MemberName" />
+                            <property name="Xalign">0</property>
+                          </widget>
+                          <packing>
+                            <property name="Position">0</property>
+                            <property name="AutoSize">False</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <widget class="Gtk.Alignment" id="main_cam_audio_alignment">
+                            <property name="MemberName" />
+                            <property name="RightPadding">50</property>
+                            <child>
+                              <widget class="Gtk.ToggleButton" id="main_cam_audio_button">
+                                <property name="MemberName" />
+                                <property name="CanFocus">True</property>
+                                <property name="Type">Custom</property>
+                                <property name="Active">True</property>
+                                <child>
+                                  <widget class="Gtk.Image" id="main_cam_audio_button_image">
+                                    <property name="MemberName" />
+                                  </widget>
+                                </child>
+                              </widget>
+                            </child>
+                          </widget>
+                          <packing>
+                            <property name="Position">1</property>
+                            <property name="AutoSize">True</property>
+                            <property name="Expand">False</property>
+                            <property name="Fill">False</property>
+                          </packing>
+                        </child>
+                      </widget>
+                      <packing>
+                        <property name="Position">1</property>
+                        <property name="AutoSize">True</property>
+                        <property name="Expand">False</property>
+                        <property name="Fill">False</property>
+                      </packing>
                     </child>
                   </widget>
                   <packing>
                     <property name="Position">0</property>
+                    <property name="AutoSize">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="Gtk.VBox" id="sec_cam_vbox">
+                    <property name="MemberName" />
+                    <property name="Visible">False</property>
+                    <property name="Spacing">6</property>
+                    <child>
+                      <widget class="LongoMatch.Gui.PlayerBin" id="sec_cam_playerbin">
+                        <property name="MemberName" />
+                        <property name="Events">ButtonPressMask</property>
+                        <property name="Volume">0</property>
+                        <property name="CloseAlwaysVisible">False</property>
+                      </widget>
+                      <packing>
+                        <property name="Position">0</property>
+                        <property name="AutoSize">True</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <widget class="Gtk.HBox" id="sec_cam_hbox">
+                        <property name="MemberName" />
+                        <property name="Spacing">6</property>
+                        <child>
+                          <widget class="Gtk.Label" id="sec_cam_label">
+                            <property name="MemberName" />
+                            <property name="Xalign">0</property>
+                          </widget>
+                          <packing>
+                            <property name="Position">0</property>
+                            <property name="AutoSize">False</property>
+                          </packing>
+                        </child>
+                        <child>
+                          <widget class="Gtk.Alignment" id="sec_cam_audio_alignment">
+                            <property name="MemberName" />
+                            <property name="RightPadding">50</property>
+                            <child>
+                              <widget class="Gtk.ToggleButton" id="sec_cam_audio_button">
+                                <property name="MemberName" />
+                                <property name="CanFocus">True</property>
+                                <property name="Type">Custom</property>
+                                <child>
+                                  <widget class="Gtk.Image" id="sec_cam_audio_button_image">
+                                    <property name="MemberName" />
+                                  </widget>
+                                </child>
+                              </widget>
+                            </child>
+                          </widget>
+                          <packing>
+                            <property name="Position">1</property>
+                            <property name="AutoSize">True</property>
+                            <property name="Expand">False</property>
+                            <property name="Fill">False</property>
+                          </packing>
+                        </child>
+                      </widget>
+                      <packing>
+                        <property name="Position">1</property>
+                        <property name="AutoSize">True</property>
+                        <property name="Expand">False</property>
+                        <property name="Fill">False</property>
+                      </packing>
+                    </child>
+                  </widget>
+                  <packing>
+                    <property name="Position">1</property>
+                    <property name="AutoSize">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="Gtk.Label" id="sec_cam_didactic_label">
+                    <property name="MemberName" />
+                    <property name="Visible">False</property>
+                  </widget>
+                  <packing>
+                    <property name="Position">2</property>
                     <property name="AutoSize">True</property>
+                    <property name="Expand">False</property>
+                    <property name="Fill">False</property>
                   </packing>
                 </child>
               </widget>
@@ -9703,7 +9830,7 @@ You can continue with the current capture, cancel it or save your project.
               </packing>
             </child>
             <child>
-              <widget class="Gtk.HBox" id="hbox3">
+              <widget class="Gtk.HBox" id="hbox5">
                 <property name="MemberName" />
                 <child>
                   <widget class="Gtk.Alignment" id="labels_alignment">
@@ -9784,7 +9911,7 @@ You can continue with the current capture, cancel it or save your project.
                   </packing>
                 </child>
                 <child>
-                  <widget class="Gtk.VBox" id="vbox7">
+                  <widget class="Gtk.VBox" id="vbox9">
                     <property name="MemberName" />
                     <child>
                       <widget class="Gtk.DrawingArea" id="timerulearea">


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