[longomatch] Decouple UI completetly from the backend
- From: Andoni Morales Alastruey <amorales src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [longomatch] Decouple UI completetly from the backend
- Date: Mon, 7 Jul 2014 11:18:03 +0000 (UTC)
commit 2c3562bc47cc2776f1efc2c47f5ccc98073c90ce
Author: Andoni Morales Alastruey <ylatuya gmail com>
Date: Sun Aug 18 21:24:58 2013 +0200
Decouple UI completetly from the backend
LongoMatch.Addins/AddinsManager.cs | 4 +-
LongoMatch.Core/Common/Enums.cs | 7 +
LongoMatch.Core/Handlers/Handlers.cs | 12 +-
.../GUI/{IMainWindow.cs => IAnalysisWindow.cs} | 38 +-
LongoMatch.Core/Interfaces/GUI/IGUIToolkit.cs | 11 +-
LongoMatch.Core/Interfaces/GUI/IMainController.cs | 50 ++
.../Interfaces/GUI/IProjectOptionsController.cs | 35 +
LongoMatch.Core/LongoMatch.Core.mdp | 6 +-
LongoMatch.GUI/Gui/Component/AnalysisComponent.cs | 664 ++++++++++++++++
LongoMatch.GUI/Gui/Component/Stats/GameViewer.cs | 1 +
.../Gui/Component/SubcategoiesTagsEditor.cs | 131 ++++
LongoMatch.GUI/Gui/GUIToolkit.cs | 27 +-
LongoMatch.GUI/Gui/MainWindow.cs | 791 +++-----------------
LongoMatch.GUI/LongoMatch.GUI.mdp | 4 +-
.../LongoMatch.Gui.Component.AnalysisComponent.cs | 176 +++++
.../LongoMatch.Gui.Component.Stats.Plotter.cs | 1 -
...goMatch.Gui.Component.SubcategoiesTagsEditor.cs | 197 +++++
.../gtk-gui/LongoMatch.Gui.MainWindow.cs | 185 +-----
LongoMatch.GUI/gtk-gui/gui.stetic | 385 +++++-----
LongoMatch.GUI/gtk-gui/objects.xml | 32 +
LongoMatch.Services/LongoMatch.Services.mdp | 1 +
LongoMatch.Services/Services/Core.cs | 61 +--
LongoMatch.Services/Services/DataBaseManager.cs | 2 +-
LongoMatch.Services/Services/EventsManager.cs | 94 ++-
LongoMatch.Services/Services/GameUnitsManager.cs | 48 +-
LongoMatch.Services/Services/HotKeysManager.cs | 37 +-
LongoMatch.Services/Services/PlaylistManager.cs | 53 +-
.../Services/ProjectOptionsManager.cs | 91 +++
LongoMatch.Services/Services/ProjectsManager.cs | 230 ++----
.../Services/RenderingJobsManager.cs | 4 +-
LongoMatch.Services/Services/ToolsManager.cs | 172 +++++
.../Services/VideoDrawingsManager.cs | 26 +-
LongoMatch/Main.cs | 4 +-
33 files changed, 2168 insertions(+), 1412 deletions(-)
---
diff --git a/LongoMatch.Addins/AddinsManager.cs b/LongoMatch.Addins/AddinsManager.cs
index 1be19be..8829b39 100644
--- a/LongoMatch.Addins/AddinsManager.cs
+++ b/LongoMatch.Addins/AddinsManager.cs
@@ -48,7 +48,7 @@ namespace LongoMatch.Addins
}
}
- public void LoadExportProjectAddins(IMainWindow mainWindow) {
+ public void LoadExportProjectAddins(IMainController mainWindow) {
foreach (IExportProject exportProject in
AddinManager.GetExtensionObjects<IExportProject> ()) {
try {
mainWindow.AddExportEntry(exportProject.GetMenuEntryName(),
exportProject.GetMenuEntryShortName(),
@@ -60,7 +60,7 @@ namespace LongoMatch.Addins
}
}
- public void LoadImportProjectAddins(IMainWindow mainWindow) {
+ public void LoadImportProjectAddins(IMainController mainWindow) {
foreach (IImportProject importProject in
AddinManager.GetExtensionObjects<IImportProject> ()) {
try{
mainWindow.AddImportEntry(importProject.GetMenuEntryName(),
importProject.GetMenuEntryShortName(),
diff --git a/LongoMatch.Core/Common/Enums.cs b/LongoMatch.Core/Common/Enums.cs
index 3e0f291..dc57dc4 100644
--- a/LongoMatch.Core/Common/Enums.cs
+++ b/LongoMatch.Core/Common/Enums.cs
@@ -131,4 +131,11 @@ namespace LongoMatch.Common
VideoEdition,
VideoConversion
}
+
+ public enum VideoAnalysisMode {
+ PredefinedTagging,
+ ManualTagging,
+ Timeline,
+ GameUnits,
+ }
}
diff --git a/LongoMatch.Core/Handlers/Handlers.cs b/LongoMatch.Core/Handlers/Handlers.cs
index e2c70bb..bc79da7 100644
--- a/LongoMatch.Core/Handlers/Handlers.cs
+++ b/LongoMatch.Core/Handlers/Handlers.cs
@@ -54,13 +54,15 @@ namespace LongoMatch.Handlers
/* Project Events */
public delegate void SaveProjectHandler(Project project, ProjectType projectType);
- public delegate void OpenedProjectChangedHandler(Project project, ProjectType projectType,
PlaysFilter filter);
+ public delegate void OpenedProjectChangedHandler(Project project, ProjectType projectType,
PlaysFilter filter,
+ IAnalysisWindow analysisWindow,
IProjectOptionsController projectOptions);
public delegate void OpenProjectHandler();
- public delegate void CloseOpenendProjectHandler(bool save);
+ public delegate void CloseOpenendProjectHandler();
public delegate void NewProjectHandler();
public delegate void ImportProjectHandler(string name, string filterName, string filter,
Func <string, Project> importProjectFunc, bool
requiresNewFile);
public delegate void ExportProjectHandler();
+ public delegate void QuitApplicationHandler ();
/* GUI */
public delegate void ManageJobsHandler();
@@ -147,4 +149,10 @@ namespace LongoMatch.Handlers
/* Show project stats */
public delegate void ShowProjectStats(Project project);
+
+ public delegate void ShowFullScreenHandler (bool fullscreen);
+ public delegate void PlaylistVisibiltyHandler (bool visible);
+ public delegate void AnalysisWidgetsVisibilityHandler (bool visible);
+ public delegate void AnalysisModeChangedHandler (VideoAnalysisMode mode);
+ public delegate void TagSubcategoriesChangedHandler (bool tagsubcategories);
}
diff --git a/LongoMatch.Core/Interfaces/GUI/IMainWindow.cs b/LongoMatch.Core/Interfaces/GUI/IAnalysisWindow.cs
similarity index 71%
rename from LongoMatch.Core/Interfaces/GUI/IMainWindow.cs
rename to LongoMatch.Core/Interfaces/GUI/IAnalysisWindow.cs
index f247fff..1674e9a 100644
--- a/LongoMatch.Core/Interfaces/GUI/IMainWindow.cs
+++ b/LongoMatch.Core/Interfaces/GUI/IAnalysisWindow.cs
@@ -25,7 +25,7 @@ using LongoMatch.Store.Templates;
namespace LongoMatch.Interfaces.GUI
{
- public interface IMainWindow
+ public interface IAnalysisWindow
{
/* Tags */
event NewTagHandler NewTagEvent;
@@ -51,25 +51,6 @@ namespace LongoMatch.Interfaces.GUI
/* Snapshots */
event SnapshotSeriesHandler SnapshotSeriesEvent;
- /* Projects */
- event SaveProjectHandler SaveProjectEvent;
- event NewProjectHandler NewProjectEvent;
- event OpenProjectHandler OpenProjectEvent;
- event CloseOpenendProjectHandler CloseOpenedProjectEvent;
- event ImportProjectHandler ImportProjectEvent;
- event ExportProjectHandler ExportProjectEvent;
-
- /* Managers */
- event ManageJobsHandler ManageJobsEvent;
- event ManageTeamsHandler ManageTeamsEvent;
- event ManageCategoriesHandler ManageCategoriesEvent;
- event ManageProjects ManageProjectsEvent;
- event ManageDatabases ManageDatabasesEvent;
- event EditPreferences EditPreferencesEvent;
-
- /* Stats */
- event ShowProjectStats ShowProjectStatsEvent;
-
/* Game Units events */
event GameUnitHandler GameUnitEvent;
event UnitChangedHandler UnitChanged;
@@ -77,27 +58,28 @@ namespace LongoMatch.Interfaces.GUI
event UnitsDeletedHandler UnitDeleted;
event UnitAddedHandler UnitAdded;
- event KeyHandler KeyPressed;
+ /* Error handling */
+ event CloseOpenendProjectHandler CloseOpenedProjectEvent;
- /* Convert Video Files */
- event ConvertVideoFilesHandler ConvertVideoFilesEvent;
+ event KeyHandler KeyPressed;
void SetProject(Project project, ProjectType projectType, CaptureSettings props, PlaysFilter
filter);
+ void CloseOpenedProject ();
void AddPlay(Play play);
void UpdateSelectedPlay (Play play);
void UpdateCategories (Categories categories);
void DeletePlays (List<Play> plays);
void UpdateGameUnits (GameUnitsList gameUnits);
- IRenderingStateBar RenderingStateBar{get;}
+ bool Fullscreen {set;}
+ bool WidgetsVisible {set;}
+ bool PlaylistVisible {set;}
+ VideoAnalysisMode AnalysisMode {set;}
+
IPlayer Player{get;}
ICapturer Capturer{get;}
IPlaylistWidget Playlist{get;}
ITemplatesService TemplatesService{set;}
-
- void AddExportEntry (string name, string shortName, Action<Project, IGUIToolkit>
exportAction);
- void AddImportEntry (string name, string shortName, string filterName, string filter,
- Func<string, Project> importFunc, bool requiresNewFile);
}
}
diff --git a/LongoMatch.Core/Interfaces/GUI/IGUIToolkit.cs b/LongoMatch.Core/Interfaces/GUI/IGUIToolkit.cs
index 0adb8d7..4f1f4eb 100644
--- a/LongoMatch.Core/Interfaces/GUI/IGUIToolkit.cs
+++ b/LongoMatch.Core/Interfaces/GUI/IGUIToolkit.cs
@@ -30,9 +30,12 @@ namespace LongoMatch.Interfaces.GUI
{
public interface IGUIToolkit
{
- IMainWindow MainWindow {get;}
+ IMainController MainController {get;}
+ IRenderingStateBar RenderingStateBar {get;}
Version Version {get;}
+ void Quit ();
+
/* Messages */
void InfoMessage(string message, Widget parent=null);
void WarningMessage(string message, Widget parent=null);
@@ -54,6 +57,12 @@ namespace LongoMatch.Interfaces.GUI
List<EditionJob> ConfigureRenderingJob (IPlayList playlist);
void ExportFrameSeries(Project openenedProject, Play play, string snapshotDir);
+ void OpenProject (Project project, ProjectType projectType,
+ CaptureSettings props, PlaysFilter filter,
+ out IAnalysisWindow analysisWindow,
+ out IProjectOptionsController projectOptionsController);
+ void CloseProject ();
+
ProjectDescription SelectProject(List<ProjectDescription> projects);
ProjectType SelectNewProjectType();
diff --git a/LongoMatch.Core/Interfaces/GUI/IMainController.cs
b/LongoMatch.Core/Interfaces/GUI/IMainController.cs
new file mode 100644
index 0000000..84e8f46
--- /dev/null
+++ b/LongoMatch.Core/Interfaces/GUI/IMainController.cs
@@ -0,0 +1,50 @@
+//
+// Copyright (C) 2013 Andoni Morales Alastruey
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+//
+using System;
+using LongoMatch.Handlers;
+using LongoMatch.Store;
+
+namespace LongoMatch.Interfaces.GUI
+{
+ public interface IMainController
+ {
+ /* Projects */
+ event NewProjectHandler NewProjectEvent;
+ event OpenProjectHandler OpenProjectEvent;
+ event ImportProjectHandler ImportProjectEvent;
+ event ExportProjectHandler ExportProjectEvent;
+ event QuitApplicationHandler QuitApplicationEvent;
+
+ /* Managers */
+ event ManageJobsHandler ManageJobsEvent;
+ event ManageTeamsHandler ManageTeamsEvent;
+ event ManageCategoriesHandler ManageCategoriesEvent;
+ event ManageProjects ManageProjectsEvent;
+ event ManageDatabases ManageDatabasesEvent;
+ event EditPreferences EditPreferencesEvent;
+
+ /* Convert Video Files */
+ event ConvertVideoFilesHandler ConvertVideoFilesEvent;
+
+ void AddExportEntry (string name, string shortName, Action<Project, IGUIToolkit>
exportAction);
+ void AddImportEntry (string name, string shortName, string filterName,
+ string filter, Func<string, Project> importFunc,
+ bool requiresNewFile);
+ }
+}
+
diff --git a/LongoMatch.Core/Interfaces/GUI/IProjectOptionsController.cs
b/LongoMatch.Core/Interfaces/GUI/IProjectOptionsController.cs
new file mode 100644
index 0000000..021fe10
--- /dev/null
+++ b/LongoMatch.Core/Interfaces/GUI/IProjectOptionsController.cs
@@ -0,0 +1,35 @@
+//
+// Copyright (C) 2013 Andoni Morales Alastruey
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+//
+using System;
+using LongoMatch.Handlers;
+
+namespace LongoMatch.Interfaces.GUI
+{
+ public interface IProjectOptionsController
+ {
+ event SaveProjectHandler SaveProjectEvent;
+ event CloseOpenendProjectHandler CloseOpenedProjectEvent;
+ event ShowFullScreenHandler ShowFullScreenEvent;
+ event PlaylistVisibiltyHandler PlaylistVisibilityEvent;
+ event AnalysisWidgetsVisibilityHandler AnalysisWidgetsVisibilityEvent;
+ event AnalysisModeChangedHandler AnalysisModeChangedEvent;
+ event ShowProjectStats ShowProjectStatsEvent;
+ event TagSubcategoriesChangedHandler TagSubcategoriesChangedEvent;
+ }
+}
+
diff --git a/LongoMatch.Core/LongoMatch.Core.mdp b/LongoMatch.Core/LongoMatch.Core.mdp
index d229c42..f1c5e79 100644
--- a/LongoMatch.Core/LongoMatch.Core.mdp
+++ b/LongoMatch.Core/LongoMatch.Core.mdp
@@ -74,7 +74,7 @@
<File subtype="Code" buildaction="Compile" name="Interfaces/GUI/IRenderingStateBar.cs" />
<File subtype="Code" buildaction="Compile" name="Interfaces/GUI/IPlayer.cs" />
<File subtype="Code" buildaction="Compile" name="Handlers/Multimedia.cs" />
- <File subtype="Code" buildaction="Compile" name="Interfaces/GUI/IMainWindow.cs" />
+ <File subtype="Code" buildaction="Compile" name="Interfaces/GUI/IAnalysisWindow.cs" />
<File subtype="Code" buildaction="Compile" name="Interfaces/GUI/ICapturer.cs" />
<File subtype="Code" buildaction="Compile" name="Interfaces/GUI/IPlaylistWidget.cs" />
<File subtype="Directory" buildaction="Compile" name="Interfaces" />
@@ -107,6 +107,8 @@
<File subtype="Code" buildaction="Compile" name="Common/EncodingQuality.cs" />
<File subtype="Code" buildaction="Compile" name="Common/Gettext.cs" />
<File subtype="Code" buildaction="Compile" name="Common/Exceptions.cs" />
+ <File subtype="Code" buildaction="Compile" name="Interfaces/GUI/IMainController.cs" />
+ <File subtype="Code" buildaction="Compile" name="Interfaces/GUI/IProjectOptionsController.cs" />
<File subtype="Code" buildaction="EmbedAsResource" name="../images/field_background.svg" />
<File subtype="Code" buildaction="EmbedAsResource" name="../images/goal_background.svg" />
<File subtype="Code" buildaction="EmbedAsResource" name="../images/half_field_background.svg" />
@@ -120,4 +122,4 @@
<ProjectReference type="Gac" localcopy="True" refto="gtk-sharp, Version=2.12.0.0, Culture=neutral,
PublicKeyToken=35e10195dab3c99f" />
<ProjectReference type="Gac" localcopy="True" refto="System.Drawing, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a" />
</References>
-</Project>
\ No newline at end of file
+</Project>
diff --git a/LongoMatch.GUI/Gui/Component/AnalysisComponent.cs
b/LongoMatch.GUI/Gui/Component/AnalysisComponent.cs
new file mode 100644
index 0000000..df79861
--- /dev/null
+++ b/LongoMatch.GUI/Gui/Component/AnalysisComponent.cs
@@ -0,0 +1,664 @@
+//
+// Copyright (C) 2013 Andoni Morales Alastruey
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+//
+using System;
+using LongoMatch.Interfaces.GUI;
+using LongoMatch.Handlers;
+using LongoMatch.Common;
+using LongoMatch.Store;
+using LongoMatch.Interfaces;
+using LongoMatch.Store.Templates;
+using System.Collections.Generic;
+using Gdk;
+using Gtk;
+using LongoMatch.Gui.Helpers;
+using Mono.Posix;
+
+namespace LongoMatch.Gui.Component
+{
+ [System.ComponentModel.ToolboxItem(true)]
+ public partial class AnalysisComponent : Gtk.Bin, IAnalysisWindow
+ {
+ /* Error handling */
+ public event CloseOpenendProjectHandler CloseOpenedProjectEvent;
+
+ /* Tags */
+ public event NewTagHandler NewTagEvent;
+ public event NewTagStartHandler NewTagStartEvent;
+ public event NewTagStopHandler NewTagStopEvent;
+ public event NewTagCancelHandler NewTagCancelEvent;
+ public event PlaySelectedHandler PlaySelectedEvent;
+ public event NewTagAtFrameHandler NewTagAtFrameEvent;
+ public event TagPlayHandler TagPlayEvent;
+ public event PlaysDeletedHandler PlaysDeletedEvent;
+ public event TimeNodeChangedHandler TimeNodeChanged;
+ public event PlayCategoryChangedHandler PlayCategoryChanged;
+ public event DuplicatePlayHandler DuplicatePlay;
+
+ /* Playlist */
+ public event RenderPlaylistHandler RenderPlaylistEvent;
+ public event PlayListNodeAddedHandler PlayListNodeAddedEvent;
+ public event PlayListNodeSelectedHandler PlayListNodeSelectedEvent;
+ public event OpenPlaylistHandler OpenPlaylistEvent;
+ public event NewPlaylistHandler NewPlaylistEvent;
+ public event SavePlaylistHandler SavePlaylistEvent;
+
+ /* Snapshots */
+ public event SnapshotSeriesHandler SnapshotSeriesEvent;
+
+ /* Game Units events */
+ public event GameUnitHandler GameUnitEvent;
+ public event UnitChangedHandler UnitChanged;
+ public event UnitSelectedHandler UnitSelected;
+ public event UnitsDeletedHandler UnitDeleted;
+ public event UnitAddedHandler UnitAdded;
+
+ public event KeyHandler KeyPressed;
+
+ static Project openedProject;
+ ProjectType projectType;
+ TimeNode selectedTimeNode;
+ TimeLineWidget timeline;
+ bool gameUnitsActionVisible, detachedPlayer;
+ GameUnitsTimelineWidget guTimeline;
+ IGUIToolkit guiToolKit;
+ Gtk.Window playerWindow;
+ VideoAnalysisMode analysisMode;
+
+ public AnalysisComponent ()
+ {
+ this.Build ();
+ projectType = ProjectType.None;
+
+ timeline = new TimeLineWidget();
+ downbox.PackStart(timeline, true, true, 0);
+
+ guTimeline = new GameUnitsTimelineWidget ();
+ downbox.PackStart(guTimeline, true, true, 0);
+
+ playercapturer.Mode = PlayerCapturerBin.PlayerOperationMode.Player;
+ playercapturer.SetLogo(System.IO.Path.Combine(Config.ImagesDir,"background.png"));
+ playercapturer.LogoMode = true;
+ playercapturer.Tick += OnTick;
+ playercapturer.Detach += DetachPlayer;
+ playercapturer.Logo = System.IO.Path.Combine(Config.ImagesDir,"background.png");
+ playercapturer.CaptureFinished += (sender, e) => {
+ EmitCloseOpenedProject();
+ (downbox[videowidgetsbox] as Box.BoxChild).Expand = true;
+ (downbox[buttonswidget] as Box.BoxChild).Expand = false;
+ };
+
+ buttonswidget.Mode = TagMode.Predifined;
+ ConnectSignals();
+ AnalysisMode = VideoAnalysisMode.PredefinedTagging;
+
+ postagger.SetMode (false);
+ }
+
+ public IPlayer Player{
+ get {
+ return playercapturer;
+ }
+ }
+
+ public ICapturer Capturer{
+ get {
+ return playercapturer;
+ }
+ }
+
+ public IPlaylistWidget Playlist{
+ get {
+ return playlist;
+ }
+ }
+
+ public ITemplatesService TemplatesService {
+ set {
+ playsSelection.TemplatesService = value;
+ }
+ }
+
+ public bool Fullscreen {
+ set {
+ playercapturer.FullScreen = value;
+ }
+ }
+
+ public bool WidgetsVisible {
+ set {
+ if(openedProject == null)
+ return;
+
+ leftbox.Visible = value;
+ timeline.Visible = value && AnalysisMode == VideoAnalysisMode.Timeline;
+ buttonswidget.Visible = value && (AnalysisMode ==
VideoAnalysisMode.ManualTagging ||
+ AnalysisMode ==
VideoAnalysisMode.PredefinedTagging);
+ if (Config.UseGameUnits) {
+ guTimeline.Visible = value && AnalysisMode ==
VideoAnalysisMode.GameUnits;
+ gameunitstaggerwidget1.Visible = value && (
+ AnalysisMode == VideoAnalysisMode.GameUnits ||
+ AnalysisMode == VideoAnalysisMode.PredefinedTagging ||
+ AnalysisMode == VideoAnalysisMode.ManualTagging);
+ }
+ if(value) {
+ SetTagsBoxVisibility (false);
+ } else {
+ if (selectedTimeNode != null)
+ SetTagsBoxVisibility (true);
+ }
+ }
+ }
+
+ public bool PlaylistVisible {
+ set {
+ SetPlaylistVisibility (value);
+ playsSelection.PlayListLoaded = value;
+ }
+ }
+
+ public VideoAnalysisMode AnalysisMode {
+ set {
+ buttonswidget.Visible = (value == VideoAnalysisMode.ManualTagging) ||
+ (value == VideoAnalysisMode.PredefinedTagging);
+ timeline.Visible = value == VideoAnalysisMode.Timeline;
+ if (Config.UseGameUnits) {
+ guTimeline.Visible = value == VideoAnalysisMode.GameUnits;
+ gameunitstaggerwidget1.Visible = buttonswidget.Visible ||
guTimeline.Visible;
+ }
+ if(value == VideoAnalysisMode.ManualTagging)
+ buttonswidget.Mode = TagMode.Free;
+ else if (value == VideoAnalysisMode.ManualTagging)
+ buttonswidget.Mode = TagMode.Predifined;
+ analysisMode = value;
+
+ }
+ protected get {
+ return analysisMode;
+ }
+ }
+
+ public void AddPlay(Play play) {
+ playsSelection.AddPlay(play);
+ timeline.AddPlay(play);
+ timeline.QueueDraw();
+ }
+
+ public void UpdateSelectedPlay (Play play) {
+ selectedTimeNode = play;
+ timeline.SelectedTimeNode = play;
+ postagger.LoadPlay (play, false);
+ SetTagsBoxVisibility (true);
+ notes.Play= play;
+ }
+
+ public void UpdateCategories (Categories categories) {
+ buttonswidget.Categories = openedProject.Categories;
+ }
+
+ public void DeletePlays (List<Play> plays) {
+ playsSelection.RemovePlays(plays);
+ timeline.RemovePlays(plays);
+ timeline.QueueDraw();
+ }
+
+ public void UpdateGameUnits (GameUnitsList gameUnits) {
+ gameUnitsActionVisible = gameUnits != null && gameUnits.Count > 0;
+ //GameUnitsViewAction.Sensitive = gameUnitsActionVisible;
+ if (gameUnits == null) {
+ gameunitstaggerwidget1.Visible = false;
+ return;
+ }
+ gameunitstaggerwidget1.Visible = true;
+ gameunitstaggerwidget1.GameUnits = gameUnits;
+ }
+
+ private void ConnectSignals() {
+ /* Adding Handlers for each event */
+
+ /* Connect new mark event */
+ buttonswidget.NewMarkEvent += EmitNewTag;;
+ buttonswidget.NewMarkStartEvent += EmitNewTagStart;
+
+ buttonswidget.NewMarkStopEvent += EmitNewTagStop;
+ buttonswidget.NewMarkCancelEvent += EmitNewTagCancel;
+ timeline.NewMarkEvent += EmitNewTagAtFrame;
+
+ /* Connect TimeNodeChanged events */
+ timeline.TimeNodeChanged += EmitTimeNodeChanged;
+ notes.TimeNodeChanged += EmitTimeNodeChanged;
+
+ /* Connect TimeNodeDeleted events */
+ playsSelection.PlaysDeleted += EmitPlaysDeleted;
+ timeline.TimeNodeDeleted += EmitPlaysDeleted;
+
+ /* Connect TimeNodeSelected events */
+ playsSelection.PlaySelected += OnTimeNodeSelected;
+ timeline.TimeNodeSelected += OnTimeNodeSelected;
+
+ /* Connect TimeNodeChangedEvent */
+ playsSelection.TimeNodeChanged += EmitTimeNodeChanged;
+
+ /* Connect PlayCategoryChanged events */
+ playsSelection.PlayCategoryChanged += EmitPlayCategoryChanged;
+
+ /* Connect playlist events */
+ playlist.PlayListNodeSelected += EmitPlayListNodeSelected;
+ playlist.NewPlaylistEvent += EmitNewPlaylist;
+ playlist.OpenPlaylistEvent += EmitOpenPlaylist;
+ playlist.SavePlaylistEvent += EmitSavePlaylist;
+
+ /* Connect PlayListNodeAdded events */
+ playsSelection.PlayListNodeAdded += OnPlayListNodeAdded;
+ timeline.PlayListNodeAdded += OnPlayListNodeAdded;
+
+ /* Connect duplicate plays */
+ playsSelection.DuplicatePlay += EmitDuplicatePlay;
+
+ /* Connect tags events */
+ playsSelection.TagPlay += EmitTagPlay;
+ timeline.TagPlay += EmitTagPlay;
+
+ /* Connect SnapshotSeries events */
+ playsSelection.SnapshotSeries += EmitSnapshotSeries;
+ timeline.SnapshotSeries += EmitSnapshotSeries;
+
+ playlist.RenderPlaylistEvent += EmitRenderPlaylist;
+ playsSelection.RenderPlaylist += EmitRenderPlaylist;
+ timeline.RenderPlaylist += EmitRenderPlaylist;
+
+ /* Game Units event */
+ gameunitstaggerwidget1.GameUnitEvent += EmitGameUnitEvent;
+ guTimeline.UnitAdded += EmitUnitAdded;;
+ guTimeline.UnitDeleted += EmitUnitDeleted;
+ guTimeline.UnitSelected += EmitUnitSelected;
+ guTimeline.UnitChanged += EmitUnitChanged;
+
+ playercapturer.Error += OnMultimediaError;
+ playercapturer.SegmentClosedEvent += OnSegmentClosedEvent;
+
+ KeyPressEvent += (o, args) => (EmitKeyPressed(o, (int)args.Event.Key,
(int)args.Event.State));
+ }
+
+ void DetachPlayer (bool detach) {
+ if (detach == detachedPlayer)
+ return;
+
+ detachedPlayer = detach;
+
+ if (detach) {
+ EventBox box;
+ Log.Debug("Detaching player");
+
+ playerWindow = new Gtk.Window(Constants.SOFTWARE_NAME);
+ playerWindow.Icon = Stetic.IconLoader.LoadIcon(this, "longomatch",
IconSize.Button);
+ playerWindow.DeleteEvent += (o, args) => DetachPlayer(false);
+ box = new EventBox();
+
+ box.KeyPressEvent += (o, args) => OnKeyPressEvent(args.Event);
+ playerWindow.Add(box);
+
+ box.Show();
+ playerWindow.Show();
+
+ playercapturer.Reparent(box);
+ videowidgetsbox.Visible = false;
+ if (openedProject != null) {
+ buttonswidget.Visible = true;
+ timeline.Visible = true;
+ if (Config.UseGameUnits) {
+ guTimeline.Visible = true;
+ gameunitstaggerwidget1.Visible = true;
+ }
+ }
+ } else {
+ Log.Debug("Attaching player again");
+ videowidgetsbox.Visible = true;
+ playercapturer.Reparent(this.videowidgetsbox);
+ playerWindow.Destroy();
+
+ AnalysisMode = analysisMode;
+ }
+ playercapturer.Detached = detach;
+ }
+
+ public void CloseOpenedProject () {
+ openedProject = null;
+ projectType = ProjectType.None;
+ ResetGUI ();
+ return;
+ }
+
+ public void SetProject(Project project, ProjectType projectType, CaptureSettings props,
PlaysFilter filter)
+ {
+ bool isLive = false;
+
+ /* Update tabs labels */
+ var desc = project.Description;
+
+ if(projectType == ProjectType.FileProject) {
+ playercapturer.LogoMode = false;
+ timeline.SetProject (project, filter);
+ guTimeline.Project = project;
+
+ } else {
+ isLive = true;
+ if(projectType == ProjectType.FakeCaptureProject) {
+ playercapturer.Type = CapturerType.Fake;
+ playercapturer.Mode = PlayerCapturerBin.PlayerOperationMode.Capturer;
+ } else {
+ playercapturer.Mode =
PlayerCapturerBin.PlayerOperationMode.PreviewCapturer;
+ }
+ }
+
+ if(projectType == ProjectType.FakeCaptureProject) {
+#if OS_TYPE_LINUX
+ /* This deadlocks in Windows and OS X */
+ (downbox[videowidgetsbox] as Box.BoxChild).Expand = false;
+#endif
+ (downbox[buttonswidget] as Box.BoxChild).Expand = true;
+ }
+
+ openedProject = project;
+ this.projectType = projectType;
+
+ playsSelection.SetProject(project, isLive, filter);
+ buttonswidget.Categories = project.Categories;
+ ShowWidgets ();
+ postagger.LoadBackgrounds (openedProject.Categories.FieldBackground,
+ openedProject.Categories.HalfFieldBackground,
+ openedProject.Categories.GoalBackground);
+ ShowWidgets();
+ }
+
+ void SetPlaylistVisibility (bool visible) {
+ if (visible) {
+ righthbox.Visible = true;
+ playlist.Visible = true;
+ } else {
+ playlist.Visible = false;
+ if (!tagsvbox.Visible)
+ righthbox.Visible = false;
+ }
+ }
+
+ void SetTagsBoxVisibility (bool visible) {
+ if (visible) {
+ righthbox.Visible = true;
+ tagsvbox.Visible = true;
+ } else {
+ tagsvbox.Visible = false;
+ if (!playlist.Visible)
+ righthbox.Visible = false;
+ }
+ }
+
+ private void ResetGUI() {
+ bool playlistVisible = playlist.Visible;
+ playercapturer.Mode = PlayerCapturerBin.PlayerOperationMode.Player;
+ playercapturer.LogoMode = true;
+ ClearWidgets();
+ HideWidgets();
+ SetPlaylistVisibility (playlistVisible);
+ SetTagsBoxVisibility (false);
+ selectedTimeNode = null;
+ if (detachedPlayer)
+ DetachPlayer(false);
+ }
+
+ private void ShowWidgets() {
+ leftbox.Show();
+ if(analysisMode == VideoAnalysisMode.ManualTagging ||
+ analysisMode == VideoAnalysisMode.PredefinedTagging) {
+ buttonswidget.Show();
+ gameunitstaggerwidget1.Show();
+ } else if (analysisMode == VideoAnalysisMode.Timeline) {
+ timeline.Show();
+ } else if (analysisMode == VideoAnalysisMode.GameUnits) {
+ gameunitstaggerwidget1.Show();
+ guTimeline.Show();
+ }
+ }
+
+ private void HideWidgets() {
+ leftbox.Hide();
+ SetTagsBoxVisibility (false);
+ buttonswidget.Hide();
+ timeline.Hide();
+ gameunitstaggerwidget1.Hide();
+ guTimeline.Hide();
+ }
+
+ private void ClearWidgets() {
+ buttonswidget.Categories = null;
+ playsSelection.Clear();
+ }
+
+ protected override bool OnKeyPressEvent(EventKey evnt)
+ {
+ Gdk.Key key = evnt.Key;
+ Gdk.ModifierType modifier = evnt.State;
+ bool ret;
+
+ ret = base.OnKeyPressEvent(evnt);
+
+ if(openedProject == null && !playercapturer.Opened)
+ return ret;
+
+ if(projectType != ProjectType.CaptureProject &&
+ projectType != ProjectType.URICaptureProject &&
+ projectType != ProjectType.FakeCaptureProject) {
+ switch(key) {
+ case Constants.SEEK_FORWARD:
+ if(modifier == Constants.STEP)
+ playercapturer.StepForward();
+ else
+ playercapturer.SeekToNextFrame(selectedTimeNode != null);
+ break;
+ case Constants.SEEK_BACKWARD:
+ if(modifier == Constants.STEP)
+ playercapturer.StepBackward();
+ else
+ playercapturer.SeekToPreviousFrame(selectedTimeNode != null);
+ break;
+ case Constants.FRAMERATE_UP:
+ playercapturer.FramerateUp();
+ break;
+ case Constants.FRAMERATE_DOWN:
+ playercapturer.FramerateDown();
+ break;
+ case Constants.TOGGLE_PLAY:
+ playercapturer.TogglePlay();
+ break;
+ }
+ } else {
+ switch(key) {
+ case Constants.TOGGLE_PLAY:
+ playercapturer.TogglePause();
+ break;
+ }
+ }
+ return ret;
+ }
+
+ protected virtual void OnTimeNodeSelected(Play play)
+ {
+ SetTagsBoxVisibility (true);
+ if (PlaySelectedEvent != null)
+ PlaySelectedEvent(play);
+ }
+
+ protected virtual void OnSegmentClosedEvent()
+ {
+ SetTagsBoxVisibility (false);
+ timeline.SelectedTimeNode = null;
+ selectedTimeNode = null;
+ }
+
+ protected virtual void OnTick(object o, long currentTime, long streamLength,
+ float currentPosition, bool seekable)
+ {
+ if(currentTime != 0 && timeline != null && openedProject != null) {
+ uint frame = (uint)(currentTime * openedProject.Description.File.Fps / 1000);
+ timeline.CurrentFrame = frame;
+ guTimeline.CurrentFrame = frame;
+ }
+ gameunitstaggerwidget1.CurrentTime = new Time{MSeconds = (int)currentTime};
+ }
+
+ protected virtual void OnMultimediaError(object o, string message)
+ {
+ MessagesHelpers.ErrorMessage (this,
+ Catalog.GetString("The following error happened and" +
+ " the current project will be closed:")+"\n" + message);
+ EmitCloseOpenedProject ();
+ }
+
+ private void EmitCloseOpenedProject () {
+ if (CloseOpenedProjectEvent != null)
+ CloseOpenedProjectEvent ();
+ }
+
+ private void EmitPlaySelected(Play play)
+ {
+ if (PlaySelectedEvent != null)
+ PlaySelectedEvent(play);
+ }
+
+ private void EmitTimeNodeChanged(TimeNode tNode, object val)
+ {
+ if (TimeNodeChanged != null)
+ TimeNodeChanged(tNode, val);
+ }
+
+ private void EmitPlaysDeleted(List<Play> plays)
+ {
+ if (PlaysDeletedEvent != null)
+ PlaysDeletedEvent(plays);
+ }
+
+ protected virtual void EmitPlayCategoryChanged(Play play, Category cat)
+ {
+ if(PlayCategoryChanged != null)
+ PlayCategoryChanged(play, cat);
+ }
+
+ private void OnPlayListNodeAdded(List<Play> plays)
+ {
+ if (PlayListNodeAddedEvent != null)
+ PlayListNodeAddedEvent(plays);
+ }
+
+ private void EmitPlayListNodeSelected(PlayListPlay plNode)
+ {
+ if (PlayListNodeSelectedEvent != null)
+ PlayListNodeSelectedEvent(plNode);
+ }
+
+ private void EmitSnapshotSeries(Play play) {
+ if (SnapshotSeriesEvent != null)
+ SnapshotSeriesEvent (play);
+ }
+
+ private void EmitNewTagAtFrame(Category category, int frame) {
+ if (NewTagAtFrameEvent != null)
+ NewTagAtFrameEvent(category, frame);
+ }
+
+ private void EmitNewTag(Category category) {
+ if (NewTagEvent != null)
+ NewTagEvent(category);
+ }
+
+ private void EmitNewTagStart(Category category) {
+ if (NewTagStartEvent != null)
+ NewTagStartEvent (category);
+ }
+
+ private void EmitNewTagStop(Category category) {
+ if (NewTagStopEvent != null)
+ NewTagStopEvent (category);
+ }
+
+ private void EmitNewTagCancel(Category category) {
+ if (NewTagCancelEvent != null)
+ NewTagCancelEvent (category);
+ }
+
+ private void EmitRenderPlaylist(IPlayList playlist) {
+ if (RenderPlaylistEvent != null)
+ RenderPlaylistEvent(playlist);
+ }
+
+ private void EmitTagPlay(Play play) {
+ if (TagPlayEvent != null)
+ TagPlayEvent (play);
+ }
+
+ private void EmitNewPlaylist() {
+ if (NewPlaylistEvent != null)
+ NewPlaylistEvent();
+ }
+
+ private void EmitOpenPlaylist() {
+ if (OpenPlaylistEvent != null)
+ OpenPlaylistEvent();
+ }
+
+ private void EmitSavePlaylist() {
+ if (SavePlaylistEvent != null)
+ SavePlaylistEvent();
+ }
+
+ private void EmitGameUnitEvent(GameUnit gameUnit, GameUnitEventType eType) {
+ if (GameUnitEvent != null)
+ GameUnitEvent(gameUnit, eType);
+ }
+
+ private void EmitUnitAdded(GameUnit gameUnit, int frame) {
+ if (UnitAdded != null)
+ UnitAdded(gameUnit, frame);
+ }
+
+ private void EmitUnitDeleted(GameUnit gameUnit, List<TimelineNode> units) {
+ if (UnitDeleted != null)
+ UnitDeleted(gameUnit, units);
+ }
+
+ private void EmitUnitSelected(GameUnit gameUnit, TimelineNode unit) {
+ if (UnitSelected != null)
+ UnitSelected(gameUnit, unit);
+ }
+
+ private void EmitUnitChanged(GameUnit gameUnit, TimelineNode unit, Time time) {
+ if (UnitChanged != null)
+ UnitChanged(gameUnit, unit, time);
+ }
+
+ private void EmitKeyPressed(object sender, int key, int modifier) {
+ if (KeyPressed != null)
+ KeyPressed(sender, key, modifier);
+ }
+
+ void EmitDuplicatePlay (Play play)
+ {
+ if (DuplicatePlay != null)
+ DuplicatePlay (play);
+ }
+ }
+}
+
diff --git a/LongoMatch.GUI/Gui/Component/Stats/GameViewer.cs
b/LongoMatch.GUI/Gui/Component/Stats/GameViewer.cs
index 30bae1d..b035011 100644
--- a/LongoMatch.GUI/Gui/Component/Stats/GameViewer.cs
+++ b/LongoMatch.GUI/Gui/Component/Stats/GameViewer.cs
@@ -67,6 +67,7 @@ namespace LongoMatch.Gui.Component
}
void UpdateGui () {
+
homelabel.Text = stats.LocalTeam;
awaylabel.Text = stats.VisitorTeam;
GetMaxSize(out catsMaxSize, out subcatsMaxSize);
diff --git a/LongoMatch.GUI/Gui/Component/SubcategoiesTagsEditor.cs
b/LongoMatch.GUI/Gui/Component/SubcategoiesTagsEditor.cs
new file mode 100644
index 0000000..47374f6
--- /dev/null
+++ b/LongoMatch.GUI/Gui/Component/SubcategoiesTagsEditor.cs
@@ -0,0 +1,131 @@
+//
+// Copyright (C) 2013 Andoni Morales Alastruey
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+//
+using System;
+using LongoMatch.Store;
+using System.Collections.Generic;
+using Gdk;
+using Gtk;
+
+namespace LongoMatch.Gui.Component
+{
+ [System.ComponentModel.ToolboxItem(true)]
+ public partial class SubcategoiesTagsEditor : Gtk.Bin
+ {
+ TagSubCategory template;
+ Dictionary<string, Widget> tagsDict;
+ Color templateExistsColor;
+
+ public SubcategoiesTagsEditor ()
+ {
+ this.Build ();
+ Gdk.Color.Parse("red", ref templateExistsColor);
+ tagsDict = new Dictionary<string, Widget>();
+ addtagbutton.Clicked += OnAddTag;
+ tagentry.Activated += OnAddTag;
+ nameentry.Changed += OnNameChanged;
+ multicheckbutton.Toggled += OnMultiToggled;
+ fastcheckbutton.Toggled += OnFastToggled;
+ TemplatesNames = new List<string>();
+ }
+
+ public List<string> TemplatesNames {
+ get;
+ set;
+ }
+
+ public TagSubCategory Template {
+ set{
+ template = value;
+ nameentry.Text = template.Name;
+ fastcheckbutton.Active = template.FastTag;
+ multicheckbutton.Active = template.AllowMultiple;
+
+ foreach (string tag in template)
+ AddTag(tag, false);
+ }
+ get {
+ return template;
+ }
+ }
+
+ public bool CheckName {
+ set;
+ get;
+ }
+
+ private void RemoveTag (string tag) {
+ tagsbox.Remove(tagsDict[tag]);
+ tagsDict.Remove(tag);
+ template.Remove(tag);
+ }
+
+ private void AddTag(string tag, bool update) {
+ HBox box;
+ Label label;
+ Button button;
+
+ if (tagsDict.ContainsKey(tag))
+ return;
+
+ box = new HBox();
+ label = new Label(tag);
+ label.Justify = Justification.Left;
+ button = new Button("gtk-delete");
+ button.Clicked += delegate {
+ RemoveTag(tag);
+ };
+ box.PackStart(label, true, false, 0);
+ box.PackStart(button, false, false, 0);
+
+ tagsbox.PackStart(box, false, false, 0);
+ box.ShowAll();
+
+ tagsDict.Add(tag, box);
+ if (update)
+ template.Add(tag);
+ }
+
+ protected virtual void OnNameChanged (object sender, EventArgs e)
+ {
+ if ((CheckName && TemplatesNames.Contains(nameentry.Text)) ||
+ nameentry.Text == "") {
+ nameentry.ModifyText(StateType.Normal, templateExistsColor);
+ } else {
+ nameentry.ModifyText(StateType.Normal);
+ template.Name = nameentry.Text;
+ }
+ }
+
+ protected virtual void OnMultiToggled (object sender, System.EventArgs e)
+ {
+ template.AllowMultiple = multicheckbutton.Active;
+ }
+
+ protected virtual void OnFastToggled (object sender, System.EventArgs e)
+ {
+ template.FastTag = fastcheckbutton.Active;
+
+ }
+
+ protected virtual void OnAddTag (object sender, System.EventArgs e)
+ {
+ AddTag(tagentry.Text, true);
+ }
+ }
+}
+
diff --git a/LongoMatch.GUI/Gui/GUIToolkit.cs b/LongoMatch.GUI/Gui/GUIToolkit.cs
index 2c3c180..3574b8a 100644
--- a/LongoMatch.GUI/Gui/GUIToolkit.cs
+++ b/LongoMatch.GUI/Gui/GUIToolkit.cs
@@ -40,7 +40,7 @@ namespace LongoMatch.Gui
public class GUIToolkit: IGUIToolkit
{
static GUIToolkit instance;
- IMainWindow mainWindow;
+ MainWindow mainWindow;
public GUIToolkit (Version version)
{
@@ -56,12 +56,18 @@ namespace LongoMatch.Gui
}
}
- public IMainWindow MainWindow{
+ public IMainController MainController {
get {
return mainWindow;
}
}
+ public IRenderingStateBar RenderingStateBar {
+ get {
+ return mainWindow.RenderingStateBar;
+ }
+ }
+
public Version Version {
get;
set;
@@ -367,6 +373,23 @@ namespace LongoMatch.Gui
return remuxer.Remux (mainWindow as Gtk.Window);
}
+ public void OpenProject (Project project, ProjectType projectType,
+ CaptureSettings props, PlaysFilter filter,
+ out IAnalysisWindow analysisWindow,
+ out IProjectOptionsController projectOptionsController)
+ {
+ analysisWindow = mainWindow.SetProject (project, projectType, props, filter);
+ projectOptionsController = mainWindow;
+ }
+
+ public void CloseProject ()
+ {
+ mainWindow.CloseProject ();
+ }
+
+ public void Quit () {
+ Gtk.Application.Quit ();
+ }
}
}
diff --git a/LongoMatch.GUI/Gui/MainWindow.cs b/LongoMatch.GUI/Gui/MainWindow.cs
index e416b93..f275f8e 100644
--- a/LongoMatch.GUI/Gui/MainWindow.cs
+++ b/LongoMatch.GUI/Gui/MainWindow.cs
@@ -42,72 +42,37 @@ namespace LongoMatch.Gui
{
[System.ComponentModel.Category("LongoMatch")]
[System.ComponentModel.ToolboxItem(false)]
- public partial class MainWindow : Gtk.Window, IMainWindow
+ public partial class MainWindow : Gtk.Window, IMainController, IProjectOptionsController
{
-
- /* Tags */
- public event NewTagHandler NewTagEvent;
- public event NewTagStartHandler NewTagStartEvent;
- public event NewTagStopHandler NewTagStopEvent;
- public event NewTagCancelHandler NewTagCancelEvent;
- public event PlaySelectedHandler PlaySelectedEvent;
- public event NewTagAtFrameHandler NewTagAtFrameEvent;
- public event TagPlayHandler TagPlayEvent;
- public event PlaysDeletedHandler PlaysDeletedEvent;
- public event TimeNodeChangedHandler TimeNodeChanged;
- public event PlayCategoryChangedHandler PlayCategoryChanged;
- public event DuplicatePlayHandler DuplicatePlay;
-
- /* Playlist */
- public event RenderPlaylistHandler RenderPlaylistEvent;
- public event PlayListNodeAddedHandler PlayListNodeAddedEvent;
- public event PlayListNodeSelectedHandler PlayListNodeSelectedEvent;
- public event OpenPlaylistHandler OpenPlaylistEvent;
- public event NewPlaylistHandler NewPlaylistEvent;
- public event SavePlaylistHandler SavePlaylistEvent;
-
- /* Video Converter */
- public event ConvertVideoFilesHandler ConvertVideoFilesEvent;
-
- /* Snapshots */
- public event SnapshotSeriesHandler SnapshotSeriesEvent;
-
- /* Projects */
- public event SaveProjectHandler SaveProjectEvent;
+ /* IMainController */
public event NewProjectHandler NewProjectEvent;
public event OpenProjectHandler OpenProjectEvent;
- public event CloseOpenendProjectHandler CloseOpenedProjectEvent;
public event ImportProjectHandler ImportProjectEvent;
public event ExportProjectHandler ExportProjectEvent;
- public event ShowProjectStats ShowProjectStatsEvent;
+ public event QuitApplicationHandler QuitApplicationEvent;
- /* Managers */
public event ManageJobsHandler ManageJobsEvent;
public event ManageTeamsHandler ManageTeamsEvent;
public event ManageCategoriesHandler ManageCategoriesEvent;
public event ManageProjects ManageProjectsEvent;
public event ManageDatabases ManageDatabasesEvent;
public event EditPreferences EditPreferencesEvent;
+ public event ConvertVideoFilesHandler ConvertVideoFilesEvent;
- /* Game Units events */
- public event GameUnitHandler GameUnitEvent;
- public event UnitChangedHandler UnitChanged;
- public event UnitSelectedHandler UnitSelected;
- public event UnitsDeletedHandler UnitDeleted;
- public event UnitAddedHandler UnitAdded;
+ /* IProjectOptionsController */
+ public event SaveProjectHandler SaveProjectEvent;
+ public event CloseOpenendProjectHandler CloseOpenedProjectEvent;
+ public event ShowProjectStats ShowProjectStatsEvent;
+ public event ShowFullScreenHandler ShowFullScreenEvent;
+ public event PlaylistVisibiltyHandler PlaylistVisibilityEvent;
+ public event AnalysisWidgetsVisibilityHandler AnalysisWidgetsVisibilityEvent;
+ public event AnalysisModeChangedHandler AnalysisModeChangedEvent;
+ public event TagSubcategoriesChangedHandler TagSubcategoriesChangedEvent;
- public event KeyHandler KeyPressed;
-
- private static Project openedProject;
- private ProjectType projectType;
- private TimeNode selectedTimeNode;
-
- TimeLineWidget timeline;
- bool gameUnitsActionVisible;
- GameUnitsTimelineWidget guTimeline;
IGUIToolkit guiToolKit;
- Gtk.Window playerWindow;
- bool detachedPlayer;
+ IAnalysisWindow analysisWindow;
+ Project openedProject;
+ ProjectType projectType;
#region Constructors
public MainWindow(IGUIToolkit guiToolkit) :
@@ -116,30 +81,11 @@ namespace LongoMatch.Gui
Screen screen;
this.Build();
- Title = Constants.SOFTWARE_NAME;
-
this.guiToolKit = guiToolkit;
-
- projectType = ProjectType.None;
-
- timeline = new TimeLineWidget();
- downbox.PackStart(timeline, true, true, 0);
-
- guTimeline = new GameUnitsTimelineWidget ();
- downbox.PackStart(guTimeline, true, true, 0);
-
+ Title = Constants.SOFTWARE_NAME;
TagSubcategoriesAction.Active = !Config.FastTagging;
+ projectType = ProjectType.None;
- playercapturer.Mode = PlayerCapturerBin.PlayerOperationMode.Player;
- playercapturer.SetLogo(System.IO.Path.Combine(Config.ImagesDir,"background.png"));
- playercapturer.LogoMode = true;
- playercapturer.Tick += OnTick;
- playercapturer.Detach += DetachPlayer;
-
- playercapturer.Logo = System.IO.Path.Combine(Config.ImagesDir,"background.png");
- playercapturer.CaptureFinished += (sender, e) => {CloseCaptureProject();};
-
- buttonswidget.Mode = TagMode.Predifined;
ConnectSignals();
ConnectMenuSignals();
@@ -154,77 +100,18 @@ namespace LongoMatch.Gui
false);
screen = Display.Default.DefaultScreen;
this.Resize(screen.Width * 80 / 100, screen.Height * 80 / 100);
- postagger.SetMode (false);
+ analysisWindow = new AnalysisComponent();
}
#endregion
#region Plubic Methods
- public void AddPlay(Play play) {
- playsSelection.AddPlay(play);
- timeline.AddPlay(play);
- timeline.QueueDraw();
- }
-
- public void UpdateSelectedPlay (Play play) {
- selectedTimeNode = play;
- timeline.SelectedTimeNode = play;
- postagger.LoadPlay (play, false);
- SetTagsBoxVisibility (true);
- notes.Play= play;
- }
-
- public void UpdateCategories (Categories categories) {
- buttonswidget.Categories = openedProject.Categories;
- }
-
- public void DeletePlays (List<Play> plays) {
- playsSelection.RemovePlays(plays);
- timeline.RemovePlays(plays);
- timeline.QueueDraw();
- }
-
public IRenderingStateBar RenderingStateBar{
get {
return renderingstatebar1;
}
}
- public IPlayer Player{
- get {
- return playercapturer;
- }
- }
-
- public ICapturer Capturer{
- get {
- return playercapturer;
- }
- }
-
- public IPlaylistWidget Playlist{
- get {
- return playlist;
- }
- }
-
- public ITemplatesService TemplatesService {
- set {
- playsSelection.TemplatesService = value;
- }
- }
-
- public void UpdateGameUnits (GameUnitsList gameUnits) {
- gameUnitsActionVisible = gameUnits != null && gameUnits.Count > 0;
- GameUnitsViewAction.Sensitive = gameUnitsActionVisible;
- if (gameUnits == null) {
- gameunitstaggerwidget1.Visible = false;
- return;
- }
- gameunitstaggerwidget1.Visible = true;
- gameunitstaggerwidget1.GameUnits = gameUnits;
- }
-
public void AddExportEntry (string name, string shortName, Action<Project, IGUIToolkit>
exportAction) {
MenuItem parent = (MenuItem)
this.UIManager.GetWidget("/menubar1/ToolsAction/ExportProjectAction1");
@@ -243,6 +130,32 @@ namespace LongoMatch.Gui
item.Show();
(parent.Submenu as Menu).Append(item);
}
+
+ public IAnalysisWindow SetProject(Project project, ProjectType projectType, CaptureSettings
props, PlaysFilter filter)
+ {
+ ExportProjectAction1.Sensitive = true;
+
+ openedProject = project;
+ if (projectType == ProjectType.FileProject) {
+ Title = System.IO.Path.GetFileNameWithoutExtension(
+ openedProject.Description.File.FilePath) + " - " +
Constants.SOFTWARE_NAME;
+ } else {
+ Title = Constants.SOFTWARE_NAME;
+ }
+ MakeActionsSensitive(true, projectType);
+ analysisWindow.SetProject (project, projectType, props, filter);
+ (analysisWindow as Gtk.Widget).Show();
+ centralbox.PackStart (analysisWindow as Gtk.Widget, true, true, 0);
+ return analysisWindow;
+ }
+
+ public void CloseProject () {
+ openedProject = null;
+ projectType = ProjectType.None;
+ centralbox.Remove (analysisWindow as Gtk.Widget);
+ ResetGUI ();
+ }
+
#endregion
#region Private Methods
@@ -255,77 +168,13 @@ namespace LongoMatch.Gui
private void ConnectSignals() {
/* Adding Handlers for each event */
-
- /* Connect new mark event */
- buttonswidget.NewMarkEvent += EmitNewTag;;
- buttonswidget.NewMarkStartEvent += EmitNewTagStart;
- buttonswidget.NewMarkStopEvent += EmitNewTagStop;
- buttonswidget.NewMarkCancelEvent += EmitNewTagCancel;
- timeline.NewMarkEvent += EmitNewTagAtFrame;
-
- /* Connect TimeNodeChanged events */
- timeline.TimeNodeChanged += EmitTimeNodeChanged;
- notes.TimeNodeChanged += EmitTimeNodeChanged;
-
- /* Connect TimeNodeDeleted events */
- playsSelection.PlaysDeleted += EmitPlaysDeleted;
- timeline.TimeNodeDeleted += EmitPlaysDeleted;
-
- /* Connect TimeNodeSelected events */
- playsSelection.PlaySelected += OnTimeNodeSelected;
- timeline.TimeNodeSelected += OnTimeNodeSelected;
-
- /* Connect TimeNodeChangedEvent */
- playsSelection.TimeNodeChanged += EmitTimeNodeChanged;
-
- /* Connect PlayCategoryChanged events */
- playsSelection.PlayCategoryChanged += EmitPlayCategoryChanged;
-
- /* Connect playlist events */
- playlist.PlayListNodeSelected += EmitPlayListNodeSelected;
- playlist.NewPlaylistEvent += EmitNewPlaylist;
- playlist.OpenPlaylistEvent += EmitOpenPlaylist;
- playlist.SavePlaylistEvent += EmitSavePlaylist;
-
- /* Connect PlayListNodeAdded events */
- playsSelection.PlayListNodeAdded += OnPlayListNodeAdded;
- timeline.PlayListNodeAdded += OnPlayListNodeAdded;
-
- /* Connect duplicate plays */
- playsSelection.DuplicatePlay += EmitDuplicatePlay;
-
- /* Connect tags events */
- playsSelection.TagPlay += EmitTagPlay;
- timeline.TagPlay += EmitTagPlay;
-
- /* Connect SnapshotSeries events */
- playsSelection.SnapshotSeries += EmitSnapshotSeries;
- timeline.SnapshotSeries += EmitSnapshotSeries;
-
- playlist.RenderPlaylistEvent += EmitRenderPlaylist;
- playsSelection.RenderPlaylist += EmitRenderPlaylist;
- timeline.RenderPlaylist += EmitRenderPlaylist;
-
renderingstatebar1.ManageJobs += (e, o) => {EmitManageJobs();};
-
openAction.Activated += (sender, e) => {EmitSaveProject();};
-
- /* Game Units event */
- gameunitstaggerwidget1.GameUnitEvent += EmitGameUnitEvent;
- guTimeline.UnitAdded += EmitUnitAdded;;
- guTimeline.UnitDeleted += EmitUnitDeleted;
- guTimeline.UnitSelected += EmitUnitSelected;
- guTimeline.UnitChanged += EmitUnitChanged;
-
- playercapturer.Error += OnMultimediaError;
- playercapturer.SegmentClosedEvent += OnSegmentClosedEvent;
-
- KeyPressEvent += (o, args) => (EmitKeyPressed(o, (int)args.Event.Key,
(int)args.Event.State));
}
private void ConnectMenuSignals() {
SaveProjectAction.Activated += (o, e) => {EmitSaveProject();};
- CloseProjectAction.Activated += (o, e) => {PromptCloseProject();};
+ CloseProjectAction.Activated += (o, e) => {EmitCloseOpenedProject ();};
ExportToProjectFileAction.Activated += (o, e) => {EmitExportProject();};
QuitAction.Activated += (o, e) => {CloseAndQuit();};
CategoriesTemplatesManagerAction.Activated += (o, e) => {EmitManageCategories();};
@@ -336,152 +185,9 @@ namespace LongoMatch.Gui
ShowProjectStatsAction.Activated += (sender, e) => {EmitShowProjectStats();};
}
- void DetachPlayer (bool detach) {
- if (detach == detachedPlayer)
- return;
-
- detachedPlayer = detach;
-
- if (detach) {
- EventBox box;
- Log.Debug("Detaching player");
-
- playerWindow = new Gtk.Window(Constants.SOFTWARE_NAME);
- playerWindow.Icon = Stetic.IconLoader.LoadIcon(this, "longomatch",
IconSize.Button);
- playerWindow.DeleteEvent += (o, args) => DetachPlayer(false);
- box = new EventBox();
-
- box.KeyPressEvent += (o, args) => OnKeyPressEvent(args.Event);
- playerWindow.Add(box);
-
- box.Show();
- playerWindow.Show();
-
- playercapturer.Reparent(box);
- videowidgetsbox.Visible = false;
- if (openedProject != null) {
- buttonswidget.Visible = true;
- timeline.Visible = true;
- if (Config.UseGameUnits) {
- guTimeline.Visible = true;
- gameunitstaggerwidget1.Visible = true;
- }
- }
- } else {
- ToggleAction action;
-
- Log.Debug("Attaching player again");
- videowidgetsbox.Visible = true;
- playercapturer.Reparent(this.videowidgetsbox);
- playerWindow.Destroy();
-
- if (ManualTaggingViewAction.Active)
- action = ManualTaggingViewAction;
- else if (TimelineViewAction.Active)
- action = TimelineViewAction;
- else if (GameUnitsViewAction.Active)
- action = GameUnitsViewAction;
- else
- action = TaggingViewAction;
- OnViewToggled(action, new EventArgs());
- }
- playercapturer.Detached = detach;
- }
-
- public void SetProject(Project project, ProjectType projectType, CaptureSettings props,
PlaysFilter filter)
- {
- bool isLive = false;
-
- /* Update tabs labels */
- var desc = project.Description;
-
- ExportProjectAction1.Sensitive = true;
-
- if(projectType == ProjectType.FileProject) {
- Title = System.IO.Path.GetFileNameWithoutExtension(desc.File.FilePath) +
- " - " + Constants.SOFTWARE_NAME;
- playercapturer.LogoMode = false;
- timeline.SetProject (project, filter);
- guTimeline.Project = project;
-
- } else {
- Title = Constants.SOFTWARE_NAME;
- isLive = true;
- if(projectType == ProjectType.FakeCaptureProject) {
- playercapturer.Type = CapturerType.Fake;
- playercapturer.Mode = PlayerCapturerBin.PlayerOperationMode.Capturer;
- } else {
- playercapturer.Mode =
PlayerCapturerBin.PlayerOperationMode.PreviewCapturer;
- }
- }
-
- if(projectType == ProjectType.FakeCaptureProject) {
-#if OS_TYPE_LINUX
- /* This deadlocks in Windows and OS X */
- (downbox[videowidgetsbox] as Box.BoxChild).Expand = false;
-#endif
- (downbox[buttonswidget] as Box.BoxChild).Expand = true;
- }
-
- openedProject = project;
- this.projectType = projectType;
-
- filter.FilterUpdated += OnFilterUpdated;
- playsSelection.SetProject(project, isLive, filter);
- buttonswidget.Categories = project.Categories;
- MakeActionsSensitive(true,projectType);
- postagger.LoadBackgrounds (openedProject.Categories.FieldBackground,
- openedProject.Categories.HalfFieldBackground,
- openedProject.Categories.GoalBackground);
- ShowWidgets();
- }
-
- void SetPlaylistVisibility (bool visible) {
- if (visible) {
- righthbox.Visible = true;
- playlist.Visible = true;
- } else {
- playlist.Visible = false;
- if (!tagsvbox.Visible)
- righthbox.Visible = false;
- }
- }
-
- void SetTagsBoxVisibility (bool visible) {
- if (visible) {
- righthbox.Visible = true;
- tagsvbox.Visible = true;
- } else {
- tagsvbox.Visible = false;
- if (!playlist.Visible)
- righthbox.Visible = false;
- }
- }
-
- private void CloseCaptureProject() {
- if(projectType == ProjectType.CaptureProject ||
- projectType == ProjectType.URICaptureProject) {
- playercapturer.Close();
- playercapturer.Mode = PlayerCapturerBin.PlayerOperationMode.Player;
- EmitSaveProject();
- } else if(projectType == ProjectType.FakeCaptureProject) {
- EmitCloseOpenedProject(true);
- }
- }
-
private void ResetGUI() {
- bool playlistVisible = playlist.Visible;
Title = Constants.SOFTWARE_NAME;
- playercapturer.Mode = PlayerCapturerBin.PlayerOperationMode.Player;
- playercapturer.LogoMode = true;
- ClearWidgets();
- HideWidgets();
- SetPlaylistVisibility (playlistVisible);
- SetTagsBoxVisibility (false);
- selectedTimeNode = null;
MakeActionsSensitive(false, projectType);
- if (detachedPlayer)
- DetachPlayer(false);
}
private void MakeActionsSensitive(bool sensitive, ProjectType projectType) {
@@ -491,88 +197,24 @@ namespace LongoMatch.Gui
ManualTaggingViewAction.Sensitive = sensitive;
ExportProjectAction1.Sensitive = sensitive;
ShowProjectStatsAction.Sensitive = sensitive;
- GameUnitsViewAction.Sensitive = sensitive2 && gameUnitsActionVisible;
+ //GameUnitsViewAction.Sensitive = sensitive2 && gameUnitsActionVisible;
TimelineViewAction.Sensitive = sensitive2;
HideAllWidgetsAction.Sensitive=sensitive2;
SaveProjectAction.Sensitive = sensitive2;
}
- private void ShowWidgets() {
- leftbox.Show();
- if(TaggingViewAction.Active || ManualTaggingViewAction.Active) {
- buttonswidget.Show();
- gameunitstaggerwidget1.Show();
- } else if (TimelineViewAction.Active) {
- timeline.Show();
- } else if (GameUnitsViewAction.Active) {
- gameunitstaggerwidget1.Show();
- guTimeline.Show();
- }
- }
-
- private void HideWidgets() {
- leftbox.Hide();
- SetTagsBoxVisibility (false);
- buttonswidget.Hide();
- timeline.Hide();
- gameunitstaggerwidget1.Hide();
- guTimeline.Hide();
- }
-
- private void ClearWidgets() {
- buttonswidget.Categories = null;
- playsSelection.Clear();
- }
-
- private bool PromptCloseProject() {
- int res;
- EndCaptureDialog dialog;
-
- if(openedProject == null)
- return true;
-
- if(projectType == ProjectType.FileProject) {
- MessageDialog md = new MessageDialog(this, DialogFlags.Modal,
- MessageType.Question,
ButtonsType.OkCancel,
- Catalog.GetString("Do you want to close
the current project?"));
- res = md.Run();
- md.Destroy();
- if(res == (int)ResponseType.Ok) {
- EmitCloseOpenedProject(true);
- return true;
- }
- return false;
- }
-
- /* Capture project */
- dialog = new EndCaptureDialog(openedProject.Description.File.FilePath);
- dialog.TransientFor = (Gtk.Window)this.Toplevel;
- res = dialog.Run();
- dialog.Destroy();
+ private void CloseAndQuit() {
+ EmitCloseOpenedProject ();
- /* Close project wihtout saving */
- if(res == (int)EndCaptureResponse.Quit) {
- EmitCloseOpenedProject(false);
- (downbox[videowidgetsbox] as Box.BoxChild).Expand = true;
- (downbox[buttonswidget] as Box.BoxChild).Expand = false;
- return true;
- } else if(res == (int)EndCaptureResponse.Save) {
- /* Close and save project */
- EmitCloseOpenedProject(true);
- (downbox[videowidgetsbox] as Box.BoxChild).Expand = true;
- (downbox[buttonswidget] as Box.BoxChild).Expand = false;
- return true;
- } else
- /* Continue with the current project */
- return false;
+ if (openedProject == null && QuitApplicationEvent != null) {
+ QuitApplicationEvent ();
+ }
}
-
- private void CloseAndQuit() {
- if(!PromptCloseProject())
- return;
- EmitSaveProject();
- playercapturer.Dispose();
- Application.Quit();
+
+ protected override bool OnDeleteEvent (Event evnt)
+ {
+ CloseAndQuit ();
+ return true;
}
#endregion
@@ -581,16 +223,14 @@ namespace LongoMatch.Gui
#region File
protected virtual void OnNewActivated(object sender, System.EventArgs e)
{
- if(!PromptCloseProject())
- return;
- EmitNewProject();
+ if (NewProjectEvent != null)
+ NewProjectEvent();
}
protected virtual void OnOpenActivated(object sender, System.EventArgs e)
{
- if(!PromptCloseProject())
- return;
- EmitOpenProject();
+ if(OpenProjectEvent != null)
+ OpenProjectEvent();
}
#endregion
@@ -617,42 +257,26 @@ namespace LongoMatch.Gui
#region View
protected void OnTagSubcategoriesActionToggled (object sender, System.EventArgs e)
{
- Config.FastTagging = !TagSubcategoriesAction.Active;
+ if (TagSubcategoriesChangedEvent != null)
+ TagSubcategoriesChangedEvent (TagSubcategoriesAction.Active);
}
protected virtual void OnFullScreenActionToggled(object sender, System.EventArgs e)
{
- playercapturer.FullScreen = (sender as Gtk.ToggleAction).Active;
+ if (ShowFullScreenEvent != null)
+ ShowFullScreenEvent ((sender as Gtk.ToggleAction).Active);
}
protected virtual void OnPlaylistActionToggled(object sender, System.EventArgs e)
{
- bool visible = (sender as Gtk.ToggleAction).Active;
- SetPlaylistVisibility (visible);
- playsSelection.PlayListLoaded=visible;
+ if (PlaylistVisibilityEvent != null)
+ PlaylistVisibilityEvent ((sender as Gtk.ToggleAction).Active);
}
protected virtual void OnHideAllWidgetsActionToggled(object sender, System.EventArgs e)
{
- ToggleAction action = sender as ToggleAction;
-
- if(openedProject == null)
- return;
-
- leftbox.Visible = !action.Active;
- timeline.Visible = !action.Active && TimelineViewAction.Active;
- buttonswidget.Visible = !action.Active &&
- (TaggingViewAction.Active || ManualTaggingViewAction.Active);
- if (Config.UseGameUnits) {
- guTimeline.Visible = !action.Visible && GameUnitsViewAction.Active;
- gameunitstaggerwidget1.Visible = !action.Active &&
(GameUnitsViewAction.Active ||
- TaggingViewAction.Active || ManualTaggingViewAction.Active);
- }
- if(action.Active) {
- SetTagsBoxVisibility (false);
- } else {
- if (selectedTimeNode != null)
- SetTagsBoxVisibility (true);
+ if (AnalysisWidgetsVisibilityEvent != null) {
+ AnalysisWidgetsVisibilityEvent ((sender as ToggleAction).Active);
}
}
@@ -663,18 +287,25 @@ namespace LongoMatch.Gui
if (!action.Active)
return;
- buttonswidget.Visible = action == ManualTaggingViewAction || sender ==
TaggingViewAction;
- timeline.Visible = action == TimelineViewAction;
- if (Config.UseGameUnits) {
- guTimeline.Visible = action == GameUnitsViewAction;
- gameunitstaggerwidget1.Visible = buttonswidget.Visible || guTimeline.Visible;
+ if (AnalysisModeChangedEvent != null) {
+ VideoAnalysisMode mode;
+
+ if (sender == ManualTaggingViewAction) {
+ mode = VideoAnalysisMode.ManualTagging;
+ } else if (sender == TaggingViewAction) {
+ mode = VideoAnalysisMode.PredefinedTagging;
+ } else if (sender == TimelineViewAction) {
+ mode = VideoAnalysisMode.Timeline;
+ } else if (sender == GameUnitsViewAction) {
+ mode = VideoAnalysisMode.GameUnits;
+ } else {
+ return;
+ }
+ AnalysisModeChangedEvent (mode);
}
- if(action == ManualTaggingViewAction)
- buttonswidget.Mode = TagMode.Free;
- else
- buttonswidget.Mode = TagMode.Predifined;
}
#endregion
+
#region Help
protected virtual void OnHelpAction1Activated(object sender, System.EventArgs e)
{
@@ -700,113 +331,8 @@ namespace LongoMatch.Gui
}
#endregion
-
- protected override bool OnKeyPressEvent(EventKey evnt)
- {
- Gdk.Key key = evnt.Key;
- Gdk.ModifierType modifier = evnt.State;
- bool ret;
-
- ret = base.OnKeyPressEvent(evnt);
-
- if(openedProject == null && !playercapturer.Opened)
- return ret;
-
- if(projectType != ProjectType.CaptureProject &&
- projectType != ProjectType.URICaptureProject &&
- projectType != ProjectType.FakeCaptureProject) {
- switch(key) {
- case Constants.SEEK_FORWARD:
- if(modifier == Constants.STEP)
- playercapturer.StepForward();
- else
- playercapturer.SeekToNextFrame(selectedTimeNode != null);
- break;
- case Constants.SEEK_BACKWARD:
- if(modifier == Constants.STEP)
- playercapturer.StepBackward();
- else
- playercapturer.SeekToPreviousFrame(selectedTimeNode != null);
- break;
- case Constants.FRAMERATE_UP:
- playercapturer.FramerateUp();
- break;
- case Constants.FRAMERATE_DOWN:
- playercapturer.FramerateDown();
- break;
- case Constants.TOGGLE_PLAY:
- playercapturer.TogglePlay();
- break;
- }
- } else {
- switch(key) {
- case Constants.TOGGLE_PLAY:
- playercapturer.TogglePause();
- break;
- }
- }
- return ret;
- }
-
- protected virtual void OnTimeNodeSelected(Play play)
- {
- SetTagsBoxVisibility (true);
- if (PlaySelectedEvent != null)
- PlaySelectedEvent(play);
- }
-
- protected virtual void OnSegmentClosedEvent()
- {
- SetTagsBoxVisibility (false);
- timeline.SelectedTimeNode = null;
- selectedTimeNode = null;
- }
-
- protected virtual void OnTick(object o, long currentTime, long streamLength,
- float currentPosition, bool seekable)
- {
- if(currentTime != 0 && timeline != null && openedProject != null) {
- uint frame = (uint)(currentTime * openedProject.Description.File.Fps / 1000);
- timeline.CurrentFrame = frame;
- guTimeline.CurrentFrame = frame;
- }
- gameunitstaggerwidget1.CurrentTime = new Time{MSeconds = (int)currentTime};
- buttonswidget.CurrentTime = new Time{MSeconds = (int)currentTime};
- }
-
- protected virtual void OnUpdate(Version version, string URL) {
- LongoMatch.Gui.Dialog.UpdateDialog updater = new LongoMatch.Gui.Dialog.UpdateDialog();
- updater.Fill(version, URL);
- updater.TransientFor = this;
- updater.Run();
- updater.Destroy();
- }
-
- protected virtual void OnDrawingToolActionToggled(object sender, System.EventArgs e)
- {
- drawingtoolbox1.Visible = DrawingToolAction.Active;
- drawingtoolbox1.DrawingVisibility = DrawingToolAction.Active;
- }
-
- protected override bool OnDeleteEvent(Gdk.Event evnt)
- {
- CloseAndQuit();
- return true;
- }
-
- protected virtual void OnMultimediaError(object o, string message)
- {
- MessagesHelpers.ErrorMessage (this,
- Catalog.GetString("The following error happened and" +
- " the current project will be closed:")+"\n" + message);
- EmitCloseOpenedProject(true);
- }
-
- protected virtual void OnFilterUpdated()
- {
- }
#endregion
-
+
#region Events
private void EmitEditPreferences ()
@@ -815,98 +341,14 @@ namespace LongoMatch.Gui
EditPreferencesEvent();
}
- private void EmitPlaySelected(Play play)
- {
- if (PlaySelectedEvent != null)
- PlaySelectedEvent(play);
- }
-
- private void EmitTimeNodeChanged(TimeNode tNode, object val)
- {
- if (TimeNodeChanged != null)
- TimeNodeChanged(tNode, val);
- }
-
- private void EmitPlaysDeleted(List<Play> plays)
- {
- if (PlaysDeletedEvent != null)
- PlaysDeletedEvent(plays);
- }
-
- protected virtual void EmitPlayCategoryChanged(Play play, Category cat)
- {
- if(PlayCategoryChanged != null)
- PlayCategoryChanged(play, cat);
- }
-
- private void OnPlayListNodeAdded(List<Play> play)
- {
- if (PlayListNodeAddedEvent != null)
- PlayListNodeAddedEvent(play);
- }
-
- private void EmitPlayListNodeSelected(PlayListPlay plNode)
- {
- if (PlayListNodeSelectedEvent != null)
- PlayListNodeSelectedEvent(plNode);
- }
-
- private void EmitSnapshotSeries(Play play) {
- if (SnapshotSeriesEvent != null)
- SnapshotSeriesEvent (play);
- }
-
- private void EmitNewTagAtFrame(Category category, int frame) {
- if (NewTagAtFrameEvent != null)
- NewTagAtFrameEvent(category, frame);
- }
-
- private void EmitNewTag(Category category) {
- if (NewTagEvent != null)
- NewTagEvent(category);
- }
-
- private void EmitNewTagStart(Category category) {
- if (NewTagStartEvent != null)
- NewTagStartEvent (category);
- }
-
- private void EmitNewTagStop(Category category) {
- if (NewTagStopEvent != null)
- NewTagStopEvent (category);
- }
-
- private void EmitNewTagCancel(Category category) {
- if (NewTagCancelEvent != null)
- NewTagCancelEvent (category);
- }
-
- private void EmitRenderPlaylist(IPlayList playlist) {
- if (RenderPlaylistEvent != null)
- RenderPlaylistEvent(playlist);
- }
-
- private void EmitTagPlay(Play play) {
- if (TagPlayEvent != null)
- TagPlayEvent (play);
- }
-
private void EmitSaveProject() {
if (SaveProjectEvent != null)
SaveProjectEvent(openedProject, projectType);
}
- private void EmitNewProject() {
- if (NewProjectEvent != null)
- NewProjectEvent();
- }
-
- private void EmitCloseOpenedProject(bool save) {
+ private void EmitCloseOpenedProject() {
if (CloseOpenedProjectEvent != null)
- CloseOpenedProjectEvent(save);
- openedProject = null;
- projectType = ProjectType.None;
- ResetGUI();
+ CloseOpenedProjectEvent ();
}
private void EmitImportProject(string name, string filterName, string filter,
@@ -915,11 +357,6 @@ namespace LongoMatch.Gui
ImportProjectEvent(name, filterName, filter, func, requiresNewFile);
}
- private void EmitOpenProject() {
- if(OpenProjectEvent != null)
- OpenProjectEvent();
- }
-
private void EmitExportProject() {
if(ExportProjectEvent != null)
ExportProjectEvent();
@@ -951,58 +388,6 @@ namespace LongoMatch.Gui
if (ManageDatabasesEvent != null)
ManageDatabasesEvent();
}
-
- private void EmitNewPlaylist() {
- if (NewPlaylistEvent != null)
- NewPlaylistEvent();
- }
-
- private void EmitOpenPlaylist() {
- if (OpenPlaylistEvent != null)
- OpenPlaylistEvent();
- }
-
- private void EmitSavePlaylist() {
- if (SavePlaylistEvent != null)
- SavePlaylistEvent();
- }
-
- private void EmitGameUnitEvent(GameUnit gameUnit, GameUnitEventType eType) {
- if (GameUnitEvent != null)
- GameUnitEvent(gameUnit, eType);
- }
-
- private void EmitUnitAdded(GameUnit gameUnit, int frame) {
- if (UnitAdded != null)
- UnitAdded(gameUnit, frame);
- }
-
- private void EmitUnitDeleted(GameUnit gameUnit, List<TimelineNode> units) {
- if (UnitDeleted != null)
- UnitDeleted(gameUnit, units);
- }
-
- private void EmitUnitSelected(GameUnit gameUnit, TimelineNode unit) {
- if (UnitSelected != null)
- UnitSelected(gameUnit, unit);
- }
-
- private void EmitUnitChanged(GameUnit gameUnit, TimelineNode unit, Time time) {
- if (UnitChanged != null)
- UnitChanged(gameUnit, unit, time);
- }
-
- private void EmitKeyPressed(object sender, int key, int modifier) {
- if (KeyPressed != null)
- KeyPressed(sender, key, modifier);
- }
-
- void EmitDuplicatePlay (Play play)
- {
- if (DuplicatePlay != null)
- DuplicatePlay (play);
- }
-
#endregion
}
}
diff --git a/LongoMatch.GUI/LongoMatch.GUI.mdp b/LongoMatch.GUI/LongoMatch.GUI.mdp
index a5a8124..a3c4204 100644
--- a/LongoMatch.GUI/LongoMatch.GUI.mdp
+++ b/LongoMatch.GUI/LongoMatch.GUI.mdp
@@ -200,6 +200,8 @@
<File subtype="Code" buildaction="Compile"
name="gtk-gui/LongoMatch.Gui.Component.Stats.PlayerSubcategoryViewer.cs" />
<File subtype="Code" buildaction="Compile" name="Gui/Component/ButtonTagger.cs" />
<File subtype="Code" buildaction="Compile" name="gtk-gui/LongoMatch.Gui.Component.ButtonTagger.cs" />
+ <File subtype="Code" buildaction="Compile" name="Gui/Component/AnalysisComponent.cs" />
+ <File subtype="Code" buildaction="Compile" name="gtk-gui/LongoMatch.Gui.Component.AnalysisComponent.cs"
/>
</Contents>
<References>
<ProjectReference type="Gac" localcopy="True" refto="atk-sharp, Version=2.12.0.0, Culture=neutral,
PublicKeyToken=35e10195dab3c99f" />
@@ -218,4 +220,4 @@
<ProjectReference type="Project" localcopy="True" refto="OxyPlotMono" />
</References>
<LanguageParameters ApplicationIcon="." CodePage="65001" ctype="CSharpProjectParameters" />
-</Project>
\ No newline at end of file
+</Project>
diff --git a/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.AnalysisComponent.cs
b/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.AnalysisComponent.cs
new file mode 100644
index 0000000..adc7ad8
--- /dev/null
+++ b/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.AnalysisComponent.cs
@@ -0,0 +1,176 @@
+
+// This file has been generated by the GUI designer. Do not modify.
+namespace LongoMatch.Gui.Component
+{
+ public partial class AnalysisComponent
+ {
+ private global::Gtk.HPaned hpaned;
+ private global::Gtk.VBox leftbox;
+ private global::LongoMatch.Gui.Component.PlaysSelectionWidget playsSelection;
+ private global::Gtk.HPaned hpaned1;
+ private global::Gtk.VBox downbox;
+ private global::Gtk.HBox videowidgetsbox;
+ private global::LongoMatch.Gui.Component.DrawingToolBox drawingtoolbox1;
+ private global::LongoMatch.Gui.PlayerCapturerBin playercapturer;
+ private global::LongoMatch.Gui.Component.ButtonsWidget buttonswidget;
+ private global::LongoMatch.Gui.Component.GameUnitsTagger gameunitstaggerwidget1;
+ private global::Gtk.HBox righthbox;
+ private global::Gtk.VBox tagsvbox;
+ private global::LongoMatch.Gui.Component.PlaysCoordinatesTagger postagger;
+ private global::Gtk.Frame notesframe;
+ private global::Gtk.Alignment GtkAlignment22;
+ private global::LongoMatch.Gui.Component.NotesWidget notes;
+ private global::Gtk.Label GtkLabel31;
+ private global::LongoMatch.Gui.Component.PlayListWidget playlist;
+
+ protected virtual void Build ()
+ {
+ global::Stetic.Gui.Initialize (this);
+ // Widget LongoMatch.Gui.Component.AnalysisComponent
+ global::Stetic.BinContainer.Attach (this);
+ this.Name = "LongoMatch.Gui.Component.AnalysisComponent";
+ // Container child
LongoMatch.Gui.Component.AnalysisComponent.Gtk.Container+ContainerChild
+ this.hpaned = new global::Gtk.HPaned ();
+ this.hpaned.CanFocus = true;
+ this.hpaned.Name = "hpaned";
+ this.hpaned.Position = 233;
+ // Container child hpaned.Gtk.Paned+PanedChild
+ this.leftbox = new global::Gtk.VBox ();
+ this.leftbox.Name = "leftbox";
+ this.leftbox.Spacing = 6;
+ // Container child leftbox.Gtk.Box+BoxChild
+ this.playsSelection = new global::LongoMatch.Gui.Component.PlaysSelectionWidget ();
+ this.playsSelection.Events = ((global::Gdk.EventMask)(256));
+ this.playsSelection.Name = "playsSelection";
+ this.leftbox.Add (this.playsSelection);
+ global::Gtk.Box.BoxChild w1 = ((global::Gtk.Box.BoxChild)(this.leftbox
[this.playsSelection]));
+ w1.Position = 0;
+ this.hpaned.Add (this.leftbox);
+ global::Gtk.Paned.PanedChild w2 = ((global::Gtk.Paned.PanedChild)(this.hpaned
[this.leftbox]));
+ w2.Resize = false;
+ // Container child hpaned.Gtk.Paned+PanedChild
+ this.hpaned1 = new global::Gtk.HPaned ();
+ this.hpaned1.CanFocus = true;
+ this.hpaned1.Name = "hpaned1";
+ this.hpaned1.Position = 1160;
+ // Container child hpaned1.Gtk.Paned+PanedChild
+ this.downbox = new global::Gtk.VBox ();
+ this.downbox.Name = "downbox";
+ this.downbox.Spacing = 6;
+ // Container child downbox.Gtk.Box+BoxChild
+ this.videowidgetsbox = new global::Gtk.HBox ();
+ this.videowidgetsbox.Name = "videowidgetsbox";
+ this.videowidgetsbox.Spacing = 6;
+ // Container child videowidgetsbox.Gtk.Box+BoxChild
+ this.drawingtoolbox1 = new global::LongoMatch.Gui.Component.DrawingToolBox ();
+ this.drawingtoolbox1.Events = ((global::Gdk.EventMask)(256));
+ this.drawingtoolbox1.Name = "drawingtoolbox1";
+ this.videowidgetsbox.Add (this.drawingtoolbox1);
+ global::Gtk.Box.BoxChild w3 = ((global::Gtk.Box.BoxChild)(this.videowidgetsbox
[this.drawingtoolbox1]));
+ w3.Position = 0;
+ w3.Expand = false;
+ w3.Fill = false;
+ // Container child videowidgetsbox.Gtk.Box+BoxChild
+ this.playercapturer = new global::LongoMatch.Gui.PlayerCapturerBin ();
+ this.playercapturer.Events = ((global::Gdk.EventMask)(256));
+ this.playercapturer.Name = "playercapturer";
+ this.playercapturer.Detached = false;
+ this.playercapturer.ExpandLogo = false;
+ this.playercapturer.Rate = 0F;
+ this.videowidgetsbox.Add (this.playercapturer);
+ global::Gtk.Box.BoxChild w4 = ((global::Gtk.Box.BoxChild)(this.videowidgetsbox
[this.playercapturer]));
+ w4.Position = 1;
+ this.downbox.Add (this.videowidgetsbox);
+ global::Gtk.Box.BoxChild w5 = ((global::Gtk.Box.BoxChild)(this.downbox
[this.videowidgetsbox]));
+ w5.Position = 0;
+ // Container child downbox.Gtk.Box+BoxChild
+ this.buttonswidget = new global::LongoMatch.Gui.Component.ButtonsWidget ();
+ this.buttonswidget.Events = ((global::Gdk.EventMask)(256));
+ this.buttonswidget.Name = "buttonswidget";
+ this.downbox.Add (this.buttonswidget);
+ global::Gtk.Box.BoxChild w6 = ((global::Gtk.Box.BoxChild)(this.downbox
[this.buttonswidget]));
+ w6.Position = 1;
+ w6.Expand = false;
+ // Container child downbox.Gtk.Box+BoxChild
+ this.gameunitstaggerwidget1 = new global::LongoMatch.Gui.Component.GameUnitsTagger ();
+ this.gameunitstaggerwidget1.Events = ((global::Gdk.EventMask)(256));
+ this.gameunitstaggerwidget1.Name = "gameunitstaggerwidget1";
+ this.downbox.Add (this.gameunitstaggerwidget1);
+ global::Gtk.Box.BoxChild w7 = ((global::Gtk.Box.BoxChild)(this.downbox
[this.gameunitstaggerwidget1]));
+ w7.Position = 2;
+ w7.Expand = false;
+ this.hpaned1.Add (this.downbox);
+ global::Gtk.Paned.PanedChild w8 = ((global::Gtk.Paned.PanedChild)(this.hpaned1
[this.downbox]));
+ w8.Resize = false;
+ w8.Shrink = false;
+ // Container child hpaned1.Gtk.Paned+PanedChild
+ this.righthbox = new global::Gtk.HBox ();
+ this.righthbox.WidthRequest = 100;
+ this.righthbox.Name = "righthbox";
+ this.righthbox.Spacing = 6;
+ // Container child righthbox.Gtk.Box+BoxChild
+ this.tagsvbox = new global::Gtk.VBox ();
+ this.tagsvbox.WidthRequest = 100;
+ this.tagsvbox.Name = "tagsvbox";
+ this.tagsvbox.Spacing = 6;
+ // Container child tagsvbox.Gtk.Box+BoxChild
+ this.postagger = new global::LongoMatch.Gui.Component.PlaysCoordinatesTagger ();
+ this.postagger.Events = ((global::Gdk.EventMask)(256));
+ this.postagger.Name = "postagger";
+ this.tagsvbox.Add (this.postagger);
+ global::Gtk.Box.BoxChild w9 = ((global::Gtk.Box.BoxChild)(this.tagsvbox
[this.postagger]));
+ w9.Position = 0;
+ // Container child tagsvbox.Gtk.Box+BoxChild
+ this.notesframe = new global::Gtk.Frame ();
+ this.notesframe.Name = "notesframe";
+ this.notesframe.ShadowType = ((global::Gtk.ShadowType)(0));
+ // Container child notesframe.Gtk.Container+ContainerChild
+ this.GtkAlignment22 = new global::Gtk.Alignment (0F, 0F, 1F, 1F);
+ this.GtkAlignment22.Name = "GtkAlignment22";
+ this.GtkAlignment22.LeftPadding = ((uint)(12));
+ // Container child GtkAlignment22.Gtk.Container+ContainerChild
+ this.notes = new global::LongoMatch.Gui.Component.NotesWidget ();
+ this.notes.Events = ((global::Gdk.EventMask)(256));
+ this.notes.Name = "notes";
+ this.GtkAlignment22.Add (this.notes);
+ this.notesframe.Add (this.GtkAlignment22);
+ this.GtkLabel31 = new global::Gtk.Label ();
+ this.GtkLabel31.Name = "GtkLabel31";
+ this.GtkLabel31.LabelProp = global::Mono.Unix.Catalog.GetString ("<b>Notes</b>");
+ this.GtkLabel31.UseMarkup = true;
+ this.notesframe.LabelWidget = this.GtkLabel31;
+ this.tagsvbox.Add (this.notesframe);
+ global::Gtk.Box.BoxChild w12 = ((global::Gtk.Box.BoxChild)(this.tagsvbox
[this.notesframe]));
+ w12.Position = 1;
+ this.righthbox.Add (this.tagsvbox);
+ global::Gtk.Box.BoxChild w13 = ((global::Gtk.Box.BoxChild)(this.righthbox
[this.tagsvbox]));
+ w13.Position = 0;
+ // Container child righthbox.Gtk.Box+BoxChild
+ this.playlist = new global::LongoMatch.Gui.Component.PlayListWidget ();
+ this.playlist.WidthRequest = 100;
+ this.playlist.Events = ((global::Gdk.EventMask)(256));
+ this.playlist.Name = "playlist";
+ this.righthbox.Add (this.playlist);
+ global::Gtk.Box.BoxChild w14 = ((global::Gtk.Box.BoxChild)(this.righthbox
[this.playlist]));
+ w14.Position = 1;
+ this.hpaned1.Add (this.righthbox);
+ global::Gtk.Paned.PanedChild w15 = ((global::Gtk.Paned.PanedChild)(this.hpaned1
[this.righthbox]));
+ w15.Resize = false;
+ w15.Shrink = false;
+ this.hpaned.Add (this.hpaned1);
+ global::Gtk.Paned.PanedChild w16 = ((global::Gtk.Paned.PanedChild)(this.hpaned
[this.hpaned1]));
+ w16.Shrink = false;
+ this.Add (this.hpaned);
+ if ((this.Child != null)) {
+ this.Child.ShowAll ();
+ }
+ this.leftbox.Hide ();
+ this.drawingtoolbox1.Hide ();
+ this.buttonswidget.Hide ();
+ this.tagsvbox.Hide ();
+ this.playlist.Hide ();
+ this.righthbox.Hide ();
+ this.Hide ();
+ }
+ }
+}
diff --git a/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.Stats.Plotter.cs
b/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.Stats.Plotter.cs
index 9d59a08..ad9cc26 100644
--- a/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.Stats.Plotter.cs
+++ b/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.Stats.Plotter.cs
@@ -31,7 +31,6 @@ namespace LongoMatch.Gui.Component.Stats
this.historadiobutton = new global::Gtk.RadioButton
(global::Mono.Unix.Catalog.GetString ("Histogram"));
this.historadiobutton.CanFocus = true;
this.historadiobutton.Name = "historadiobutton";
- this.historadiobutton.Active = true;
this.historadiobutton.DrawIndicator = true;
this.historadiobutton.UseUnderline = true;
this.historadiobutton.Group = new global::GLib.SList (global::System.IntPtr.Zero);
diff --git a/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.SubcategoiesTagsEditor.cs
b/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.SubcategoiesTagsEditor.cs
new file mode 100644
index 0000000..01e9e0a
--- /dev/null
+++ b/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.SubcategoiesTagsEditor.cs
@@ -0,0 +1,197 @@
+
+// This file has been generated by the GUI designer. Do not modify.
+namespace LongoMatch.Gui.Component
+{
+ public partial class SubcategoiesTagsEditor
+ {
+ private global::Gtk.VBox vbox2;
+ private global::Gtk.Table table1;
+ private global::Gtk.CheckButton fastcheckbutton;
+ private global::Gtk.Label label1;
+ private global::Gtk.CheckButton multicheckbutton;
+ private global::Gtk.Entry nameentry;
+ private global::Gtk.Frame frame1;
+ private global::Gtk.Alignment GtkAlignment2;
+ private global::Gtk.VBox vbox3;
+ private global::Gtk.ScrolledWindow scrolledwindow1;
+ private global::Gtk.VBox tagsbox;
+ private global::Gtk.HBox hbox1;
+ private global::Gtk.Entry tagentry;
+ private global::Gtk.Button addtagbutton;
+ private global::Gtk.Button deletebutton;
+ private global::Gtk.Label GtkLabel4;
+
+ protected virtual void Build ()
+ {
+ global::Stetic.Gui.Initialize (this);
+ // Widget LongoMatch.Gui.Component.SubcategoiesTagsEditor
+ global::Stetic.BinContainer.Attach (this);
+ this.Name = "LongoMatch.Gui.Component.SubcategoiesTagsEditor";
+ // Container child
LongoMatch.Gui.Component.SubcategoiesTagsEditor.Gtk.Container+ContainerChild
+ this.vbox2 = new global::Gtk.VBox ();
+ this.vbox2.Name = "vbox2";
+ this.vbox2.Spacing = 6;
+ // Container child vbox2.Gtk.Box+BoxChild
+ this.table1 = new global::Gtk.Table (((uint)(2)), ((uint)(2)), false);
+ this.table1.Name = "table1";
+ this.table1.RowSpacing = ((uint)(6));
+ this.table1.ColumnSpacing = ((uint)(6));
+ // Container child table1.Gtk.Table+TableChild
+ this.fastcheckbutton = new global::Gtk.CheckButton ();
+ this.fastcheckbutton.TooltipMarkup = "When this option is selected, the subcategory
can be tagged right after creating a new play";
+ this.fastcheckbutton.CanFocus = true;
+ this.fastcheckbutton.Name = "fastcheckbutton";
+ this.fastcheckbutton.Label = global::Mono.Unix.Catalog.GetString ("Quick tag");
+ this.fastcheckbutton.Active = true;
+ this.fastcheckbutton.DrawIndicator = true;
+ this.fastcheckbutton.UseUnderline = true;
+ this.table1.Add (this.fastcheckbutton);
+ global::Gtk.Table.TableChild w1 = ((global::Gtk.Table.TableChild)(this.table1
[this.fastcheckbutton]));
+ w1.TopAttach = ((uint)(1));
+ w1.BottomAttach = ((uint)(2));
+ w1.LeftAttach = ((uint)(1));
+ w1.RightAttach = ((uint)(2));
+ w1.XOptions = ((global::Gtk.AttachOptions)(4));
+ w1.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child table1.Gtk.Table+TableChild
+ this.label1 = new global::Gtk.Label ();
+ this.label1.Name = "label1";
+ this.label1.LabelProp = global::Mono.Unix.Catalog.GetString ("Subcategory name:");
+ this.table1.Add (this.label1);
+ global::Gtk.Table.TableChild w2 = ((global::Gtk.Table.TableChild)(this.table1
[this.label1]));
+ w2.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child table1.Gtk.Table+TableChild
+ this.multicheckbutton = new global::Gtk.CheckButton ();
+ this.multicheckbutton.TooltipMarkup = "This options allows you to select multiple
tags instead of just one";
+ this.multicheckbutton.CanFocus = true;
+ this.multicheckbutton.Name = "multicheckbutton";
+ this.multicheckbutton.Label = global::Mono.Unix.Catalog.GetString ("Allow multiple
selections");
+ this.multicheckbutton.Active = true;
+ this.multicheckbutton.DrawIndicator = true;
+ this.multicheckbutton.UseUnderline = true;
+ this.table1.Add (this.multicheckbutton);
+ global::Gtk.Table.TableChild w3 = ((global::Gtk.Table.TableChild)(this.table1
[this.multicheckbutton]));
+ w3.TopAttach = ((uint)(1));
+ w3.BottomAttach = ((uint)(2));
+ w3.XOptions = ((global::Gtk.AttachOptions)(4));
+ w3.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child table1.Gtk.Table+TableChild
+ this.nameentry = new global::Gtk.Entry ();
+ this.nameentry.CanFocus = true;
+ this.nameentry.Name = "nameentry";
+ this.nameentry.Text = global::Mono.Unix.Catalog.GetString ("Goal type");
+ this.nameentry.IsEditable = true;
+ this.nameentry.InvisibleChar = '•';
+ this.table1.Add (this.nameentry);
+ global::Gtk.Table.TableChild w4 = ((global::Gtk.Table.TableChild)(this.table1
[this.nameentry]));
+ w4.LeftAttach = ((uint)(1));
+ w4.RightAttach = ((uint)(2));
+ w4.YOptions = ((global::Gtk.AttachOptions)(4));
+ this.vbox2.Add (this.table1);
+ global::Gtk.Box.BoxChild w5 = ((global::Gtk.Box.BoxChild)(this.vbox2 [this.table1]));
+ w5.Position = 0;
+ w5.Expand = false;
+ w5.Fill = false;
+ // Container child vbox2.Gtk.Box+BoxChild
+ this.frame1 = new global::Gtk.Frame ();
+ this.frame1.Name = "frame1";
+ this.frame1.ShadowType = ((global::Gtk.ShadowType)(1));
+ // Container child frame1.Gtk.Container+ContainerChild
+ this.GtkAlignment2 = new global::Gtk.Alignment (0F, 0F, 1F, 1F);
+ this.GtkAlignment2.Name = "GtkAlignment2";
+ this.GtkAlignment2.LeftPadding = ((uint)(12));
+ // Container child GtkAlignment2.Gtk.Container+ContainerChild
+ this.vbox3 = new global::Gtk.VBox ();
+ this.vbox3.Name = "vbox3";
+ this.vbox3.Spacing = 6;
+ // Container child vbox3.Gtk.Box+BoxChild
+ this.scrolledwindow1 = new global::Gtk.ScrolledWindow ();
+ this.scrolledwindow1.CanFocus = true;
+ this.scrolledwindow1.Name = "scrolledwindow1";
+ // Container child scrolledwindow1.Gtk.Container+ContainerChild
+ global::Gtk.Viewport w6 = new global::Gtk.Viewport ();
+ w6.ShadowType = ((global::Gtk.ShadowType)(0));
+ // Container child GtkViewport.Gtk.Container+ContainerChild
+ this.tagsbox = new global::Gtk.VBox ();
+ this.tagsbox.Name = "tagsbox";
+ this.tagsbox.Spacing = 6;
+ w6.Add (this.tagsbox);
+ this.scrolledwindow1.Add (w6);
+ this.vbox3.Add (this.scrolledwindow1);
+ global::Gtk.Box.BoxChild w9 = ((global::Gtk.Box.BoxChild)(this.vbox3
[this.scrolledwindow1]));
+ w9.Position = 0;
+ // Container child vbox3.Gtk.Box+BoxChild
+ this.hbox1 = new global::Gtk.HBox ();
+ this.hbox1.Name = "hbox1";
+ this.hbox1.Spacing = 6;
+ // Container child hbox1.Gtk.Box+BoxChild
+ this.tagentry = new global::Gtk.Entry ();
+ this.tagentry.CanFocus = true;
+ this.tagentry.Name = "tagentry";
+ this.tagentry.Text = global::Mono.Unix.Catalog.GetString ("Penalty");
+ this.tagentry.IsEditable = true;
+ this.tagentry.InvisibleChar = '•';
+ this.hbox1.Add (this.tagentry);
+ global::Gtk.Box.BoxChild w10 = ((global::Gtk.Box.BoxChild)(this.hbox1
[this.tagentry]));
+ w10.Position = 0;
+ // Container child hbox1.Gtk.Box+BoxChild
+ this.addtagbutton = new global::Gtk.Button ();
+ this.addtagbutton.CanFocus = true;
+ this.addtagbutton.Name = "addtagbutton";
+ this.addtagbutton.UseUnderline = true;
+ // Container child addtagbutton.Gtk.Container+ContainerChild
+ global::Gtk.Alignment w11 = new global::Gtk.Alignment (0.5F, 0.5F, 0F, 0F);
+ // Container child GtkAlignment.Gtk.Container+ContainerChild
+ global::Gtk.HBox w12 = new global::Gtk.HBox ();
+ w12.Spacing = 2;
+ // Container child GtkHBox.Gtk.Container+ContainerChild
+ global::Gtk.Image w13 = new global::Gtk.Image ();
+ w13.Pixbuf = global::Stetic.IconLoader.LoadIcon (this, "gtk-add",
global::Gtk.IconSize.Menu);
+ w12.Add (w13);
+ // Container child GtkHBox.Gtk.Container+ContainerChild
+ global::Gtk.Label w15 = new global::Gtk.Label ();
+ w15.LabelProp = global::Mono.Unix.Catalog.GetString ("Add tag");
+ w15.UseUnderline = true;
+ w12.Add (w15);
+ w11.Add (w12);
+ this.addtagbutton.Add (w11);
+ this.hbox1.Add (this.addtagbutton);
+ global::Gtk.Box.BoxChild w19 = ((global::Gtk.Box.BoxChild)(this.hbox1
[this.addtagbutton]));
+ w19.Position = 1;
+ w19.Expand = false;
+ w19.Fill = false;
+ this.vbox3.Add (this.hbox1);
+ global::Gtk.Box.BoxChild w20 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.hbox1]));
+ w20.Position = 1;
+ w20.Expand = false;
+ w20.Fill = false;
+ // Container child vbox3.Gtk.Box+BoxChild
+ this.deletebutton = new global::Gtk.Button ();
+ this.deletebutton.CanFocus = true;
+ this.deletebutton.Name = "deletebutton";
+ this.deletebutton.UseStock = true;
+ this.deletebutton.UseUnderline = true;
+ this.deletebutton.Label = "gtk-remove";
+ this.vbox3.Add (this.deletebutton);
+ global::Gtk.Box.BoxChild w21 = ((global::Gtk.Box.BoxChild)(this.vbox3
[this.deletebutton]));
+ w21.Position = 2;
+ w21.Expand = false;
+ w21.Fill = false;
+ this.GtkAlignment2.Add (this.vbox3);
+ this.frame1.Add (this.GtkAlignment2);
+ this.GtkLabel4 = new global::Gtk.Label ();
+ this.GtkLabel4.Name = "GtkLabel4";
+ this.GtkLabel4.LabelProp = global::Mono.Unix.Catalog.GetString ("<b>Tags</b>");
+ this.GtkLabel4.UseMarkup = true;
+ this.frame1.LabelWidget = this.GtkLabel4;
+ this.vbox2.Add (this.frame1);
+ global::Gtk.Box.BoxChild w24 = ((global::Gtk.Box.BoxChild)(this.vbox2 [this.frame1]));
+ w24.Position = 1;
+ this.Add (this.vbox2);
+ if ((this.Child != null)) {
+ this.Child.ShowAll ();
+ }
+ this.Hide ();
+ }
+ }
+}
diff --git a/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.MainWindow.cs
b/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.MainWindow.cs
index fc078be..e8b7286 100644
--- a/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.MainWindow.cs
+++ b/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.MainWindow.cs
@@ -25,7 +25,6 @@ namespace LongoMatch.Gui
private global::Gtk.Action TeamsTemplatesManagerAction;
private global::Gtk.ToggleAction HideAllWidgetsAction;
private global::Gtk.Action HelpAction1;
- private global::Gtk.ToggleAction DrawingToolAction;
private global::Gtk.Action ImportProjectAction;
private global::Gtk.RadioAction ManualTaggingViewAction;
private global::Gtk.RadioAction GameUnitsViewAction;
@@ -43,24 +42,7 @@ namespace LongoMatch.Gui
private global::Gtk.VBox vbox1;
private global::Gtk.VBox menubox;
private global::Gtk.MenuBar menubar1;
- private global::Gtk.HPaned hpaned;
- private global::Gtk.VBox leftbox;
- private global::LongoMatch.Gui.Component.PlaysSelectionWidget playsSelection;
- private global::Gtk.HPaned hpaned1;
- private global::Gtk.VBox downbox;
- private global::Gtk.HBox videowidgetsbox;
- private global::LongoMatch.Gui.Component.DrawingToolBox drawingtoolbox1;
- private global::LongoMatch.Gui.PlayerCapturerBin playercapturer;
- private global::LongoMatch.Gui.Component.ButtonsWidget buttonswidget;
- private global::LongoMatch.Gui.Component.GameUnitsTagger gameunitstaggerwidget1;
- private global::Gtk.HBox righthbox;
- private global::Gtk.VBox tagsvbox;
- private global::LongoMatch.Gui.Component.PlaysCoordinatesTagger postagger;
- private global::Gtk.Frame notesframe;
- private global::Gtk.Alignment GtkAlignment22;
- private global::LongoMatch.Gui.Component.NotesWidget notes;
- private global::Gtk.Label GtkLabel31;
- private global::LongoMatch.Gui.Component.PlayListWidget playlist;
+ private global::Gtk.HBox centralbox;
private global::Gtk.Statusbar statusbar1;
private global::LongoMatch.Gui.Component.RenderingStateBar renderingstatebar1;
@@ -139,9 +121,6 @@ namespace LongoMatch.Gui
this.HelpAction1 = new global::Gtk.Action ("HelpAction1",
global::Mono.Unix.Catalog.GetString ("_Help"), null, "gtk-help");
this.HelpAction1.ShortLabel = global::Mono.Unix.Catalog.GetString ("_Help");
w1.Add (this.HelpAction1, null);
- this.DrawingToolAction = new global::Gtk.ToggleAction ("DrawingToolAction",
global::Mono.Unix.Catalog.GetString ("_Drawing Tool"), null, null);
- this.DrawingToolAction.ShortLabel = global::Mono.Unix.Catalog.GetString ("Drawing
Tool");
- w1.Add (this.DrawingToolAction, "<Control>d");
this.ImportProjectAction = new global::Gtk.Action ("ImportProjectAction",
global::Mono.Unix.Catalog.GetString ("_Import Project"), null, "stock-import");
this.ImportProjectAction.ShortLabel = global::Mono.Unix.Catalog.GetString ("_Import
Project");
w1.Add (this.ImportProjectAction, "<Control>i");
@@ -220,139 +199,12 @@ namespace LongoMatch.Gui
w3.Expand = false;
w3.Fill = false;
// Container child vbox1.Gtk.Box+BoxChild
- this.hpaned = new global::Gtk.HPaned ();
- this.hpaned.CanFocus = true;
- this.hpaned.Name = "hpaned";
- this.hpaned.Position = 243;
- // Container child hpaned.Gtk.Paned+PanedChild
- this.leftbox = new global::Gtk.VBox ();
- this.leftbox.Name = "leftbox";
- this.leftbox.Spacing = 6;
- // Container child leftbox.Gtk.Box+BoxChild
- this.playsSelection = new global::LongoMatch.Gui.Component.PlaysSelectionWidget ();
- this.playsSelection.Events = ((global::Gdk.EventMask)(256));
- this.playsSelection.Name = "playsSelection";
- this.leftbox.Add (this.playsSelection);
- global::Gtk.Box.BoxChild w4 = ((global::Gtk.Box.BoxChild)(this.leftbox
[this.playsSelection]));
- w4.Position = 0;
- this.hpaned.Add (this.leftbox);
- global::Gtk.Paned.PanedChild w5 = ((global::Gtk.Paned.PanedChild)(this.hpaned
[this.leftbox]));
- w5.Resize = false;
- // Container child hpaned.Gtk.Paned+PanedChild
- this.hpaned1 = new global::Gtk.HPaned ();
- this.hpaned1.CanFocus = true;
- this.hpaned1.Name = "hpaned1";
- this.hpaned1.Position = 952;
- // Container child hpaned1.Gtk.Paned+PanedChild
- this.downbox = new global::Gtk.VBox ();
- this.downbox.Name = "downbox";
- this.downbox.Spacing = 6;
- // Container child downbox.Gtk.Box+BoxChild
- this.videowidgetsbox = new global::Gtk.HBox ();
- this.videowidgetsbox.Name = "videowidgetsbox";
- this.videowidgetsbox.Spacing = 6;
- // Container child videowidgetsbox.Gtk.Box+BoxChild
- this.drawingtoolbox1 = new global::LongoMatch.Gui.Component.DrawingToolBox ();
- this.drawingtoolbox1.Events = ((global::Gdk.EventMask)(256));
- this.drawingtoolbox1.Name = "drawingtoolbox1";
- this.videowidgetsbox.Add (this.drawingtoolbox1);
- global::Gtk.Box.BoxChild w6 = ((global::Gtk.Box.BoxChild)(this.videowidgetsbox
[this.drawingtoolbox1]));
- w6.Position = 0;
- w6.Expand = false;
- w6.Fill = false;
- // Container child videowidgetsbox.Gtk.Box+BoxChild
- this.playercapturer = new global::LongoMatch.Gui.PlayerCapturerBin ();
- this.playercapturer.Events = ((global::Gdk.EventMask)(256));
- this.playercapturer.Name = "playercapturer";
- this.playercapturer.Detached = false;
- this.playercapturer.ExpandLogo = false;
- this.playercapturer.Rate = 0F;
- this.videowidgetsbox.Add (this.playercapturer);
- global::Gtk.Box.BoxChild w7 = ((global::Gtk.Box.BoxChild)(this.videowidgetsbox
[this.playercapturer]));
- w7.Position = 1;
- this.downbox.Add (this.videowidgetsbox);
- global::Gtk.Box.BoxChild w8 = ((global::Gtk.Box.BoxChild)(this.downbox
[this.videowidgetsbox]));
- w8.Position = 0;
- // Container child downbox.Gtk.Box+BoxChild
- this.buttonswidget = new global::LongoMatch.Gui.Component.ButtonsWidget ();
- this.buttonswidget.Events = ((global::Gdk.EventMask)(256));
- this.buttonswidget.Name = "buttonswidget";
- this.downbox.Add (this.buttonswidget);
- global::Gtk.Box.BoxChild w9 = ((global::Gtk.Box.BoxChild)(this.downbox
[this.buttonswidget]));
- w9.Position = 1;
- w9.Expand = false;
- // Container child downbox.Gtk.Box+BoxChild
- this.gameunitstaggerwidget1 = new global::LongoMatch.Gui.Component.GameUnitsTagger ();
- this.gameunitstaggerwidget1.Events = ((global::Gdk.EventMask)(256));
- this.gameunitstaggerwidget1.Name = "gameunitstaggerwidget1";
- this.downbox.Add (this.gameunitstaggerwidget1);
- global::Gtk.Box.BoxChild w10 = ((global::Gtk.Box.BoxChild)(this.downbox
[this.gameunitstaggerwidget1]));
- w10.Position = 2;
- w10.Expand = false;
- this.hpaned1.Add (this.downbox);
- global::Gtk.Paned.PanedChild w11 = ((global::Gtk.Paned.PanedChild)(this.hpaned1
[this.downbox]));
- w11.Resize = false;
- w11.Shrink = false;
- // Container child hpaned1.Gtk.Paned+PanedChild
- this.righthbox = new global::Gtk.HBox ();
- this.righthbox.WidthRequest = 100;
- this.righthbox.Name = "righthbox";
- this.righthbox.Spacing = 6;
- // Container child righthbox.Gtk.Box+BoxChild
- this.tagsvbox = new global::Gtk.VBox ();
- this.tagsvbox.WidthRequest = 100;
- this.tagsvbox.Name = "tagsvbox";
- this.tagsvbox.Spacing = 6;
- // Container child tagsvbox.Gtk.Box+BoxChild
- this.postagger = new global::LongoMatch.Gui.Component.PlaysCoordinatesTagger ();
- this.postagger.Events = ((global::Gdk.EventMask)(256));
- this.postagger.Name = "postagger";
- this.tagsvbox.Add (this.postagger);
- global::Gtk.Box.BoxChild w12 = ((global::Gtk.Box.BoxChild)(this.tagsvbox
[this.postagger]));
- w12.Position = 0;
- // Container child tagsvbox.Gtk.Box+BoxChild
- this.notesframe = new global::Gtk.Frame ();
- this.notesframe.Name = "notesframe";
- this.notesframe.ShadowType = ((global::Gtk.ShadowType)(0));
- // Container child notesframe.Gtk.Container+ContainerChild
- this.GtkAlignment22 = new global::Gtk.Alignment (0F, 0F, 1F, 1F);
- this.GtkAlignment22.Name = "GtkAlignment22";
- this.GtkAlignment22.LeftPadding = ((uint)(12));
- // Container child GtkAlignment22.Gtk.Container+ContainerChild
- this.notes = new global::LongoMatch.Gui.Component.NotesWidget ();
- this.notes.Events = ((global::Gdk.EventMask)(256));
- this.notes.Name = "notes";
- this.GtkAlignment22.Add (this.notes);
- this.notesframe.Add (this.GtkAlignment22);
- this.GtkLabel31 = new global::Gtk.Label ();
- this.GtkLabel31.Name = "GtkLabel31";
- this.GtkLabel31.LabelProp = global::Mono.Unix.Catalog.GetString ("<b>Notes</b>");
- this.GtkLabel31.UseMarkup = true;
- this.notesframe.LabelWidget = this.GtkLabel31;
- this.tagsvbox.Add (this.notesframe);
- global::Gtk.Box.BoxChild w15 = ((global::Gtk.Box.BoxChild)(this.tagsvbox
[this.notesframe]));
- w15.Position = 1;
- this.righthbox.Add (this.tagsvbox);
- global::Gtk.Box.BoxChild w16 = ((global::Gtk.Box.BoxChild)(this.righthbox
[this.tagsvbox]));
- w16.Position = 0;
- // Container child righthbox.Gtk.Box+BoxChild
- this.playlist = new global::LongoMatch.Gui.Component.PlayListWidget ();
- this.playlist.WidthRequest = 100;
- this.playlist.Events = ((global::Gdk.EventMask)(256));
- this.playlist.Name = "playlist";
- this.righthbox.Add (this.playlist);
- global::Gtk.Box.BoxChild w17 = ((global::Gtk.Box.BoxChild)(this.righthbox
[this.playlist]));
- w17.Position = 1;
- this.hpaned1.Add (this.righthbox);
- global::Gtk.Paned.PanedChild w18 = ((global::Gtk.Paned.PanedChild)(this.hpaned1
[this.righthbox]));
- w18.Resize = false;
- w18.Shrink = false;
- this.hpaned.Add (this.hpaned1);
- global::Gtk.Paned.PanedChild w19 = ((global::Gtk.Paned.PanedChild)(this.hpaned
[this.hpaned1]));
- w19.Shrink = false;
- this.vbox1.Add (this.hpaned);
- global::Gtk.Box.BoxChild w20 = ((global::Gtk.Box.BoxChild)(this.vbox1 [this.hpaned]));
- w20.Position = 1;
+ this.centralbox = new global::Gtk.HBox ();
+ this.centralbox.Name = "centralbox";
+ this.centralbox.Spacing = 6;
+ this.vbox1.Add (this.centralbox);
+ global::Gtk.Box.BoxChild w4 = ((global::Gtk.Box.BoxChild)(this.vbox1
[this.centralbox]));
+ w4.Position = 1;
// Container child vbox1.Gtk.Box+BoxChild
this.statusbar1 = new global::Gtk.Statusbar ();
this.statusbar1.Name = "statusbar1";
@@ -363,27 +215,21 @@ namespace LongoMatch.Gui
this.renderingstatebar1.Name = "renderingstatebar1";
this.renderingstatebar1.Fraction = 0;
this.statusbar1.Add (this.renderingstatebar1);
- global::Gtk.Box.BoxChild w21 = ((global::Gtk.Box.BoxChild)(this.statusbar1
[this.renderingstatebar1]));
- w21.Position = 2;
- w21.Expand = false;
- w21.Fill = false;
+ global::Gtk.Box.BoxChild w5 = ((global::Gtk.Box.BoxChild)(this.statusbar1
[this.renderingstatebar1]));
+ w5.Position = 2;
+ w5.Expand = false;
+ w5.Fill = false;
this.vbox1.Add (this.statusbar1);
- global::Gtk.Box.BoxChild w22 = ((global::Gtk.Box.BoxChild)(this.vbox1
[this.statusbar1]));
- w22.Position = 2;
- w22.Expand = false;
- w22.Fill = false;
+ global::Gtk.Box.BoxChild w6 = ((global::Gtk.Box.BoxChild)(this.vbox1
[this.statusbar1]));
+ w6.Position = 2;
+ w6.Expand = false;
+ w6.Fill = false;
this.Add (this.vbox1);
if ((this.Child != null)) {
this.Child.ShowAll ();
}
this.DefaultWidth = 1503;
this.DefaultHeight = 686;
- this.leftbox.Hide ();
- this.drawingtoolbox1.Hide ();
- this.buttonswidget.Hide ();
- this.tagsvbox.Hide ();
- this.playlist.Hide ();
- this.righthbox.Hide ();
this.renderingstatebar1.Hide ();
this.Show ();
this.NewPojectAction.Activated += new global::System.EventHandler
(this.OnNewActivated);
@@ -395,7 +241,6 @@ namespace LongoMatch.Gui
this.AboutAction.Activated += new global::System.EventHandler
(this.OnAboutActionActivated);
this.HideAllWidgetsAction.Toggled += new global::System.EventHandler
(this.OnHideAllWidgetsActionToggled);
this.HelpAction1.Activated += new global::System.EventHandler
(this.OnHelpAction1Activated);
- this.DrawingToolAction.Toggled += new global::System.EventHandler
(this.OnDrawingToolActionToggled);
this.ManualTaggingViewAction.Toggled += new global::System.EventHandler
(this.OnViewToggled);
this.GameUnitsViewAction.Toggled += new global::System.EventHandler
(this.OnViewToggled);
this.dialogInfoAction.Activated += new global::System.EventHandler
(this.OnDialogInfoActionActivated);
diff --git a/LongoMatch.GUI/gtk-gui/gui.stetic b/LongoMatch.GUI/gtk-gui/gui.stetic
index 8ecfafa..e4c35fd 100644
--- a/LongoMatch.GUI/gtk-gui/gui.stetic
+++ b/LongoMatch.GUI/gtk-gui/gui.stetic
@@ -1704,15 +1704,6 @@
<property name="StockId">gtk-help</property>
<signal name="Activated" handler="OnHelpAction1Activated" />
</action>
- <action id="DrawingToolAction">
- <property name="Type">Toggle</property>
- <property name="Accelerator"><Control>d</property>
- <property name="Label" translatable="yes">_Drawing Tool</property>
- <property name="ShortLabel" translatable="yes">Drawing Tool</property>
- <property name="DrawAsRadio">False</property>
- <property name="Active">False</property>
- <signal name="Toggled" handler="OnDrawingToolActionToggled" />
- </action>
<action id="ImportProjectAction">
<property name="Type">Action</property>
<property name="Accelerator"><Control>i</property>
@@ -1883,193 +1874,16 @@
</packing>
</child>
<child>
- <widget class="Gtk.HPaned" id="hpaned">
+ <widget class="Gtk.HBox" id="centralbox">
<property name="MemberName" />
- <property name="CanFocus">True</property>
- <property name="Position">243</property>
- <child>
- <widget class="Gtk.VBox" id="leftbox">
- <property name="MemberName" />
- <property name="Visible">False</property>
- <property name="Spacing">6</property>
- <child>
- <widget class="LongoMatch.Gui.Component.PlaysSelectionWidget" id="playsSelection">
- <property name="MemberName" />
- <property name="Events">ButtonPressMask</property>
- </widget>
- <packing>
- <property name="Position">0</property>
- <property name="AutoSize">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="Resize">False</property>
- </packing>
- </child>
+ <property name="Spacing">6</property>
<child>
- <widget class="Gtk.HPaned" id="hpaned1">
- <property name="MemberName" />
- <property name="CanFocus">True</property>
- <property name="Position">952</property>
- <child>
- <widget class="Gtk.VBox" id="downbox">
- <property name="MemberName" />
- <property name="Spacing">6</property>
- <child>
- <widget class="Gtk.HBox" id="videowidgetsbox">
- <property name="MemberName" />
- <property name="Spacing">6</property>
- <child>
- <widget class="LongoMatch.Gui.Component.DrawingToolBox" id="drawingtoolbox1">
- <property name="MemberName" />
- <property name="Visible">False</property>
- <property name="Events">ButtonPressMask</property>
- </widget>
- <packing>
- <property name="Position">0</property>
- <property name="AutoSize">True</property>
- <property name="Expand">False</property>
- <property name="Fill">False</property>
- </packing>
- </child>
- <child>
- <widget class="LongoMatch.Gui.PlayerCapturerBin" id="playercapturer">
- <property name="MemberName" />
- <property name="Events">ButtonPressMask</property>
- <property name="Detached">False</property>
- <property name="ExpandLogo">False</property>
- <property name="Rate">0</property>
- </widget>
- <packing>
- <property name="Position">1</property>
- <property name="AutoSize">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="Position">0</property>
- <property name="AutoSize">False</property>
- </packing>
- </child>
- <child>
- <widget class="LongoMatch.Gui.Component.ButtonsWidget" id="buttonswidget">
- <property name="MemberName" />
- <property name="Visible">False</property>
- <property name="Events">ButtonPressMask</property>
- </widget>
- <packing>
- <property name="Position">1</property>
- <property name="AutoSize">False</property>
- <property name="Expand">False</property>
- </packing>
- </child>
- <child>
- <widget class="LongoMatch.Gui.Component.GameUnitsTagger" id="gameunitstaggerwidget1">
- <property name="MemberName" />
- <property name="Events">ButtonPressMask</property>
- </widget>
- <packing>
- <property name="Position">2</property>
- <property name="AutoSize">False</property>
- <property name="Expand">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="Resize">False</property>
- <property name="Shrink">False</property>
- </packing>
- </child>
- <child>
- <widget class="Gtk.HBox" id="righthbox">
- <property name="MemberName" />
- <property name="WidthRequest">100</property>
- <property name="Visible">False</property>
- <property name="Spacing">6</property>
- <child>
- <widget class="Gtk.VBox" id="tagsvbox">
- <property name="MemberName" />
- <property name="WidthRequest">100</property>
- <property name="Visible">False</property>
- <property name="Spacing">6</property>
- <child>
- <widget class="LongoMatch.Gui.Component.PlaysCoordinatesTagger" id="postagger">
- <property name="MemberName" />
- <property name="Events">ButtonPressMask</property>
- </widget>
- <packing>
- <property name="Position">0</property>
- <property name="AutoSize">True</property>
- </packing>
- </child>
- <child>
- <widget class="Gtk.Frame" id="notesframe">
- <property name="MemberName" />
- <property name="ShadowType">None</property>
- <child>
- <widget class="Gtk.Alignment" id="GtkAlignment22">
- <property name="MemberName" />
- <property name="Xalign">0</property>
- <property name="Yalign">0</property>
- <property name="LeftPadding">12</property>
- <child>
- <widget class="LongoMatch.Gui.Component.NotesWidget" id="notes">
- <property name="MemberName" />
- <property name="Events">ButtonPressMask</property>
- </widget>
- </child>
- </widget>
- </child>
- <child>
- <widget class="Gtk.Label" id="GtkLabel31">
- <property name="MemberName" />
- <property name="LabelProp"
translatable="yes"><b>Notes</b></property>
- <property name="UseMarkup">True</property>
- </widget>
- <packing>
- <property name="type">label_item</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="Position">1</property>
- <property name="AutoSize">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="Position">0</property>
- <property name="AutoSize">False</property>
- </packing>
- </child>
- <child>
- <widget class="LongoMatch.Gui.Component.PlayListWidget" id="playlist">
- <property name="MemberName" />
- <property name="WidthRequest">100</property>
- <property name="Visible">False</property>
- <property name="Events">ButtonPressMask</property>
- </widget>
- <packing>
- <property name="Position">1</property>
- <property name="AutoSize">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="Resize">False</property>
- <property name="Shrink">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="Shrink">False</property>
- </packing>
+ <placeholder />
</child>
</widget>
<packing>
<property name="Position">1</property>
- <property name="AutoSize">False</property>
+ <property name="AutoSize">True</property>
</packing>
</child>
<child>
@@ -8844,7 +8658,6 @@ Defining <b> Game Units </b> will help you during the analysis to in
<property name="MemberName" />
<property name="CanFocus">True</property>
<property name="Label" translatable="yes">Histogram</property>
- <property name="Active">True</property>
<property name="DrawIndicator">True</property>
<property name="HasLabel">True</property>
<property name="UseUnderline">True</property>
@@ -9247,6 +9060,196 @@ Defining <b> Game Units </b> will help you during the analysis to in
</widget>
</child>
</widget>
+ <widget class="Gtk.Bin" id="LongoMatch.Gui.Component.AnalysisComponent" design-size="1524 648">
+ <property name="MemberName" />
+ <property name="Visible">False</property>
+ <child>
+ <widget class="Gtk.HPaned" id="hpaned">
+ <property name="MemberName" />
+ <property name="CanFocus">True</property>
+ <property name="Position">233</property>
+ <child>
+ <widget class="Gtk.VBox" id="leftbox">
+ <property name="MemberName" />
+ <property name="Visible">False</property>
+ <property name="Spacing">6</property>
+ <child>
+ <widget class="LongoMatch.Gui.Component.PlaysSelectionWidget" id="playsSelection">
+ <property name="MemberName" />
+ <property name="Events">ButtonPressMask</property>
+ </widget>
+ <packing>
+ <property name="Position">0</property>
+ <property name="AutoSize">True</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="Resize">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.HPaned" id="hpaned1">
+ <property name="MemberName" />
+ <property name="CanFocus">True</property>
+ <property name="Position">1160</property>
+ <child>
+ <widget class="Gtk.VBox" id="downbox">
+ <property name="MemberName" />
+ <property name="Spacing">6</property>
+ <child>
+ <widget class="Gtk.HBox" id="videowidgetsbox">
+ <property name="MemberName" />
+ <property name="Spacing">6</property>
+ <child>
+ <widget class="LongoMatch.Gui.Component.DrawingToolBox" id="drawingtoolbox1">
+ <property name="MemberName" />
+ <property name="Visible">False</property>
+ <property name="Events">ButtonPressMask</property>
+ </widget>
+ <packing>
+ <property name="Position">0</property>
+ <property name="AutoSize">True</property>
+ <property name="Expand">False</property>
+ <property name="Fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="LongoMatch.Gui.PlayerCapturerBin" id="playercapturer">
+ <property name="MemberName" />
+ <property name="Events">ButtonPressMask</property>
+ <property name="Detached">False</property>
+ <property name="ExpandLogo">False</property>
+ <property name="Rate">0</property>
+ </widget>
+ <packing>
+ <property name="Position">1</property>
+ <property name="AutoSize">False</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="Position">0</property>
+ <property name="AutoSize">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="LongoMatch.Gui.Component.ButtonsWidget" id="buttonswidget">
+ <property name="MemberName" />
+ <property name="Visible">False</property>
+ <property name="Events">ButtonPressMask</property>
+ </widget>
+ <packing>
+ <property name="Position">1</property>
+ <property name="AutoSize">False</property>
+ <property name="Expand">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="LongoMatch.Gui.Component.GameUnitsTagger" id="gameunitstaggerwidget1">
+ <property name="MemberName" />
+ <property name="Events">ButtonPressMask</property>
+ </widget>
+ <packing>
+ <property name="Position">2</property>
+ <property name="AutoSize">False</property>
+ <property name="Expand">False</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="Resize">False</property>
+ <property name="Shrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.HBox" id="righthbox">
+ <property name="MemberName" />
+ <property name="WidthRequest">100</property>
+ <property name="Visible">False</property>
+ <property name="Spacing">6</property>
+ <child>
+ <widget class="Gtk.VBox" id="tagsvbox">
+ <property name="MemberName" />
+ <property name="WidthRequest">100</property>
+ <property name="Visible">False</property>
+ <property name="Spacing">6</property>
+ <child>
+ <widget class="LongoMatch.Gui.Component.PlaysCoordinatesTagger" id="postagger">
+ <property name="MemberName" />
+ <property name="Events">ButtonPressMask</property>
+ </widget>
+ <packing>
+ <property name="Position">0</property>
+ <property name="AutoSize">True</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Frame" id="notesframe">
+ <property name="MemberName" />
+ <property name="ShadowType">None</property>
+ <child>
+ <widget class="Gtk.Alignment" id="GtkAlignment22">
+ <property name="MemberName" />
+ <property name="Xalign">0</property>
+ <property name="Yalign">0</property>
+ <property name="LeftPadding">12</property>
+ <child>
+ <widget class="LongoMatch.Gui.Component.NotesWidget" id="notes">
+ <property name="MemberName" />
+ <property name="Events">ButtonPressMask</property>
+ </widget>
+ </child>
+ </widget>
+ </child>
+ <child>
+ <widget class="Gtk.Label" id="GtkLabel31">
+ <property name="MemberName" />
+ <property name="LabelProp" translatable="yes"><b>Notes</b></property>
+ <property name="UseMarkup">True</property>
+ </widget>
+ <packing>
+ <property name="type">label_item</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="Position">1</property>
+ <property name="AutoSize">False</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="Position">0</property>
+ <property name="AutoSize">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="LongoMatch.Gui.Component.PlayListWidget" id="playlist">
+ <property name="MemberName" />
+ <property name="WidthRequest">100</property>
+ <property name="Visible">False</property>
+ <property name="Events">ButtonPressMask</property>
+ </widget>
+ <packing>
+ <property name="Position">1</property>
+ <property name="AutoSize">False</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="Resize">False</property>
+ <property name="Shrink">False</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="Shrink">False</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
<widget class="Gtk.Bin" id="LongoMatch.Gui.Component.Stats.PlayersViewer" design-size="642 459">
<property name="MemberName" />
<property name="Visible">False</property>
diff --git a/LongoMatch.GUI/gtk-gui/objects.xml b/LongoMatch.GUI/gtk-gui/objects.xml
index e2b33a3..f76d513 100644
--- a/LongoMatch.GUI/gtk-gui/objects.xml
+++ b/LongoMatch.GUI/gtk-gui/objects.xml
@@ -452,4 +452,36 @@
</itemgroup>
</signals>
</object>
+ <object type="LongoMatch.Gui.Component.AnalysisComponent" palette-category="General"
allow-children="false" base-type="Gtk.Bin">
+ <itemgroups />
+ <signals>
+ <itemgroup label="IAnalysisWindow Signals">
+ <signal name="NewTagEvent" />
+ <signal name="NewTagStartEvent" />
+ <signal name="NewTagStopEvent" />
+ <signal name="PlaySelectedEvent" />
+ <signal name="NewTagAtFrameEvent" />
+ <signal name="TagPlayEvent" />
+ <signal name="PlaysDeletedEvent" />
+ <signal name="TimeNodeChanged" />
+ <signal name="PlayCategoryChanged" />
+ <signal name="RenderPlaylistEvent" />
+ <signal name="PlayListNodeAddedEvent" />
+ <signal name="PlayListNodeSelectedEvent" />
+ <signal name="OpenPlaylistEvent" />
+ <signal name="NewPlaylistEvent" />
+ <signal name="SavePlaylistEvent" />
+ <signal name="SnapshotSeriesEvent" />
+ <signal name="GameUnitEvent" />
+ <signal name="UnitChanged" />
+ <signal name="UnitSelected" />
+ <signal name="UnitDeleted" />
+ <signal name="UnitAdded" />
+ <signal name="KeyPressed" />
+ <signal name="CloseOpenedProjectEvent" />
+ <signal name="NewTagCancelEvent" />
+ <signal name="DuplicatePlay" />
+ </itemgroup>
+ </signals>
+ </object>
</objects>
\ No newline at end of file
diff --git a/LongoMatch.Services/LongoMatch.Services.mdp b/LongoMatch.Services/LongoMatch.Services.mdp
index aa92697..aca8068 100644
--- a/LongoMatch.Services/LongoMatch.Services.mdp
+++ b/LongoMatch.Services/LongoMatch.Services.mdp
@@ -31,6 +31,7 @@
<File subtype="Directory" buildaction="Compile" name="Services" />
<File subtype="Code" buildaction="Compile" name="Services/DataBaseManager.cs" />
<File subtype="Code" buildaction="Compile" name="Services/MigrationsManager.cs" />
+ <File subtype="Code" buildaction="Compile" name="Services/ToolsManager.cs" />
</Contents>
<References>
<ProjectReference type="Gac" localcopy="True" refto="System, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089" />
diff --git a/LongoMatch.Services/Services/Core.cs b/LongoMatch.Services/Services/Core.cs
index de7c0a9..367e87f 100644
--- a/LongoMatch.Services/Services/Core.cs
+++ b/LongoMatch.Services/Services/Core.cs
@@ -35,15 +35,14 @@ namespace LongoMatch.Services
{
public class Core
{
- static TemplatesService ts;
static DataBaseManager dbManager;
static EventsManager eManager;
static HotKeysManager hkManager;
static GameUnitsManager guManager;
static PlaylistManager plManager;
static RenderingJobsManager videoRenderer;
- static IMainWindow mainWindow;
static IGUIToolkit guiToolkit;
+ static ToolsManager toolsManager;
#if OSTYPE_WINDOWS
[DllImport("libglib-2.0-0.dll") /* willfully unmapped */ ]
static extern void g_setenv (String env, String val);
@@ -76,18 +75,15 @@ namespace LongoMatch.Services
public static void Start(IGUIToolkit guiToolkit, IMultimediaToolkit multimediaToolkit) {
Core.guiToolkit = guiToolkit;
- Core.mainWindow = guiToolkit.MainWindow;
- StartServices(guiToolkit, multimediaToolkit);
- BindEvents(Core.mainWindow);
+ StartServices (guiToolkit, multimediaToolkit);
+ BindEvents (guiToolkit.MainController);
}
- public static void StartServices(IGUIToolkit guiToolkit, IMultimediaToolkit
multimediaToolkit){
+ public static void StartServices (IGUIToolkit guiToolkit, IMultimediaToolkit
multimediaToolkit){
ProjectsManager projectsManager;
+ TemplatesService ts;
- /* Start TemplatesService */
- ts = new TemplatesService(Config.TemplatesDir);
- Core.mainWindow.TemplatesService = ts;
-
+ ts = new TemplatesService (Config.TemplatesDir);
/* Start DB services */
dbManager = new DataBaseManager (Config.DBDir, guiToolkit);
dbManager.SetActiveByName (Config.CurrentDatabase);
@@ -99,25 +95,28 @@ namespace LongoMatch.Services
/* Start the rendering jobs manager */
videoRenderer = new RenderingJobsManager(multimediaToolkit, guiToolkit);
+ projectsManager = new ProjectsManager(guiToolkit, multimediaToolkit, ts);
+
+ /* State the tools manager */
+ toolsManager = new ToolsManager (guiToolkit, multimediaToolkit, projectsManager, ts);
+
/* Start the events manager */
- eManager = new EventsManager(guiToolkit, videoRenderer);
+ eManager = new EventsManager(guiToolkit, videoRenderer, projectsManager);
/* Start the hotkeys manager */
- hkManager = new HotKeysManager(guiToolkit.MainWindow);
+ hkManager = new HotKeysManager(projectsManager);
hkManager.newMarkEvent += eManager.OnNewTag;
/* Start Game Units manager */
- guManager = new GameUnitsManager(mainWindow, mainWindow.Player);
+ guManager = new GameUnitsManager(projectsManager);
/* Start playlists manager */
- plManager = new PlaylistManager(guiToolkit, videoRenderer);
+ plManager = new PlaylistManager(guiToolkit, videoRenderer, projectsManager);
- projectsManager = new ProjectsManager(guiToolkit, multimediaToolkit);
- projectsManager.OpenedProjectChanged += OnOpenedProjectChanged;
}
- public static void BindEvents(IMainWindow mainWindow) {
- mainWindow.EditPreferencesEvent += () => {guiToolkit.OpenPreferencesEditor();};
+ public static void BindEvents(IMainController mainController) {
+ mainController.QuitApplicationEvent += () => {guiToolkit.Quit();};
}
public static void CheckDirs() {
@@ -143,32 +142,6 @@ namespace LongoMatch.Services
}
}
- public static TemplatesService TemplatesService {
- get {
- return ts;
- }
- }
-
- public static IGUIToolkit GUIToolkit {
- get {
- return guiToolkit;
- }
- }
-
- private static void OnOpenedProjectChanged (Project project, ProjectType projectType,
- PlaysFilter filter) {
- if (project != null) {
- hkManager.Categories=project.Categories;
- } else {
- hkManager.Categories=null;
- }
-
- eManager.SetProject (project, projectType, filter);
- guManager.OpenedProject = project;
- plManager.OpenedProject = project;
- dbManager.OpenedProject = project;
- }
-
private static void SetupBaseDir() {
string home;
diff --git a/LongoMatch.Services/Services/DataBaseManager.cs b/LongoMatch.Services/Services/DataBaseManager.cs
index 1c94e61..1ad24ba 100644
--- a/LongoMatch.Services/Services/DataBaseManager.cs
+++ b/LongoMatch.Services/Services/DataBaseManager.cs
@@ -117,7 +117,7 @@ namespace LongoMatch.DB
void ConnectSignals ()
{
- guiToolkit.MainWindow.ManageDatabasesEvent += () => {
+ guiToolkit.MainController.ManageDatabasesEvent += () => {
if (OpenedProject != null) {
var msg = Catalog.GetString("Close the current project to open the
database manager");
guiToolkit.ErrorMessage (msg);
diff --git a/LongoMatch.Services/Services/EventsManager.cs b/LongoMatch.Services/Services/EventsManager.cs
index f7db18a..8b5e7dc 100644
--- a/LongoMatch.Services/Services/EventsManager.cs
+++ b/LongoMatch.Services/Services/EventsManager.cs
@@ -43,67 +43,78 @@ namespace LongoMatch.Services
/* current project in use */
Project openedProject;
ProjectType projectType;
- Time startTime;
PlaysFilter filter;
Dictionary<Category, Time> catsTime;
IGUIToolkit guiToolkit;
- IMainWindow mainWindow;
+ IAnalysisWindow analysisWindow;
+ IProjectOptionsController poController;
IPlayer player;
ICapturer capturer;
IRenderingJobsManager renderer;
- public EventsManager(IGUIToolkit guiToolkit, IRenderingJobsManager renderer)
+ public EventsManager(IGUIToolkit guiToolkit, IRenderingJobsManager renderer,
+ ProjectsManager pManager)
{
this.guiToolkit = guiToolkit;
this.renderer = renderer;
- mainWindow = guiToolkit.MainWindow;
- player = mainWindow.Player;
- capturer = mainWindow.Capturer;
- drawingManager = new VideoDrawingsManager(player);
+ pManager.OpenedProjectChanged += HandleOpenedProjectChanged;
+ drawingManager = new VideoDrawingsManager(pManager);
catsTime = new Dictionary<Category, Time>();
- ConnectSignals();
}
- void Save (Project project) {
- if (Config.AutoSave) {
- Core.DB.UpdateProject (project);
- }
- }
-
- public void SetProject (Project project, ProjectType projectType,
- PlaysFilter filter)
+ void HandleOpenedProjectChanged (Project project, ProjectType projectType,
+ PlaysFilter filter, IAnalysisWindow analysisWindow,
+ IProjectOptionsController projectOptionsController)
{
- this.filter = filter;
this.openedProject = project;
this.projectType = projectType;
+ this.filter = filter;
catsTime.Clear ();
+
+ if (project == null)
+ return;
+
+ player = analysisWindow.Player;
+ capturer = analysisWindow.Capturer;
+ this.poController = projectOptionsController;
+ if (this.analysisWindow != analysisWindow) {
+ this.analysisWindow = analysisWindow;
+ ConnectSignals();
+ }
}
+ void Save (Project project) {
+ if (Config.AutoSave) {
+ Core.DB.UpdateProject (project);
+ }
+ }
+
private void ConnectSignals() {
/* Adding Handlers for each event */
/* Connect tagging related events */
- mainWindow.NewTagEvent += OnNewTag;
- mainWindow.NewTagStartEvent += OnNewPlayStart;
- mainWindow.NewTagStopEvent += OnNewPlayStop;
- mainWindow.NewTagCancelEvent += OnNewPlayCancel;
- mainWindow.NewTagAtFrameEvent += OnNewTagAtFrame;
- mainWindow.TimeNodeChanged += OnTimeNodeChanged;
- mainWindow.PlaysDeletedEvent += OnPlaysDeleted;
- mainWindow.PlaySelectedEvent += OnPlaySelected;
- mainWindow.PlayCategoryChanged += OnPlayCategoryChanged;
- mainWindow.DuplicatePlay += OnDuplicatePlay;
+ analysisWindow.NewTagEvent += OnNewTag;
+ analysisWindow.NewTagStartEvent += OnNewPlayStart;
+ analysisWindow.NewTagStopEvent += OnNewPlayStop;
+ analysisWindow.NewTagCancelEvent += OnNewPlayCancel;
+ analysisWindow.NewTagAtFrameEvent += OnNewTagAtFrame;
+ analysisWindow.TimeNodeChanged += OnTimeNodeChanged;
+ analysisWindow.PlaysDeletedEvent += OnPlaysDeleted;
+ analysisWindow.PlaySelectedEvent += OnPlaySelected;
+ analysisWindow.PlayCategoryChanged += OnPlayCategoryChanged;
+ analysisWindow.DuplicatePlay += OnDuplicatePlay;
/* Connect playlist events */
- mainWindow.PlayListNodeSelectedEvent += (tn) => {selectedTimeNode = tn;};
+ analysisWindow.PlayListNodeSelectedEvent += (tn) => {selectedTimeNode = tn;};
/* Connect tags events */
- mainWindow.TagPlayEvent += OnTagPlay;
+ analysisWindow.TagPlayEvent += OnTagPlay;
/* Connect SnapshotSeries events */
- mainWindow.SnapshotSeriesEvent += OnSnapshotSeries;
+ analysisWindow.SnapshotSeriesEvent += OnSnapshotSeries;
- mainWindow.ShowProjectStatsEvent += HandleShowProjectStatsEvent;
+ poController.ShowProjectStatsEvent += HandleShowProjectStatsEvent;
+ poController.TagSubcategoriesChangedEvent += HandleTagSubcategoriesChangedEvent;
/* Connect player events */
player.Prev += OnPrev;
@@ -112,6 +123,11 @@ namespace LongoMatch.Services
player.PlaybackRateChanged += HandlePlaybackRateChanged;
}
+ void HandleTagSubcategoriesChangedEvent (bool tagsubcategories)
+ {
+ Config.FastTagging = !tagsubcategories;
+ }
+
void HandleShowProjectStatsEvent (Project project)
{
guiToolkit.ShowProjectStats (project);
@@ -197,7 +213,7 @@ namespace LongoMatch.Services
/* Tag subcategories of the new play */
if (!Config.FastTagging)
LaunchPlayTagger(play, false);
- mainWindow.AddPlay(play);
+ analysisWindow.AddPlay(play);
filter.Update();
if (projectType == ProjectType.FileProject) {
player.Play();
@@ -233,7 +249,8 @@ namespace LongoMatch.Services
}
public virtual void OnNewPlayStart (Category category) {
- catsTime.Add (category, new Time {MSeconds = (int)player.CurrentTime});
+ Time startTime = new Time {MSeconds = (int)player.CurrentTime};
+ catsTime.Add (category, startTime);
Log.Debug("New play start time: " + startTime);
}
@@ -294,7 +311,7 @@ namespace LongoMatch.Services
selectedTimeNode = play;
player.SetStartStop(play.Start.MSeconds,play.Stop.MSeconds, play.Rate);
drawingManager.Play=play;
- mainWindow.UpdateSelectedPlay(play);
+ analysisWindow.UpdateSelectedPlay(play);
}
protected virtual void OnTimeNodeChanged(TimeNode tNode, object val)
@@ -312,7 +329,7 @@ namespace LongoMatch.Services
}
}
else if(tNode is Category) {
- mainWindow.UpdateCategories(openedProject.Categories);
+ analysisWindow.UpdateCategories(openedProject.Categories);
}
filter.Update();
}
@@ -320,7 +337,7 @@ namespace LongoMatch.Services
protected virtual void OnPlaysDeleted(List<Play> plays)
{
Log.Debug(plays.Count + " plays deleted");
- mainWindow.DeletePlays(plays);
+ analysisWindow.DeletePlays(plays);
openedProject.RemovePlays(plays);
if(projectType == ProjectType.FileProject) {
@@ -336,7 +353,7 @@ namespace LongoMatch.Services
/* The category is also serialized and desarialized */
copy.Category = play.Category;
openedProject.AddPlay (copy);
- mainWindow.AddPlay (copy);
+ analysisWindow.AddPlay (copy);
filter.Update();
}
@@ -379,8 +396,9 @@ namespace LongoMatch.Services
newplay.Name = play.Name;
newplay.Notes = play.Notes;
newplay.Drawings = play.Drawings;
- mainWindow.AddPlay(newplay);
+ analysisWindow.AddPlay(newplay);
Save (openedProject);
}
+
}
}
diff --git a/LongoMatch.Services/Services/GameUnitsManager.cs
b/LongoMatch.Services/Services/GameUnitsManager.cs
index 6969168..a1b34f7 100644
--- a/LongoMatch.Services/Services/GameUnitsManager.cs
+++ b/LongoMatch.Services/Services/GameUnitsManager.cs
@@ -26,42 +26,40 @@ namespace LongoMatch.Services
{
public class GameUnitsManager
{
- IMainWindow mainWindow;
+ IAnalysisWindow analysisWindow;
IPlayer player;
Project openedProject;
Dictionary<GameUnit, Time> gameUnitsStarted;
ushort fps;
-
- public GameUnitsManager (IMainWindow mainWindow, IPlayer player)
+ public GameUnitsManager (ProjectsManager pManager)
{
- this.mainWindow = mainWindow;
- this.player = player;
gameUnitsStarted = new Dictionary<GameUnit, Time>();
- mainWindow.GameUnitEvent += HandleMainWindowGameUnitEvent;
- mainWindow.UnitAdded += HandleUnitAdded;
- mainWindow.UnitChanged += HandleUnitChanged;
- mainWindow.UnitDeleted += HandleUnitDeleted;
- mainWindow.UnitSelected += HandleUnitSelected;
+ pManager.OpenedProjectChanged += HandleOpenedProjectChanged;
}
- public Project OpenedProject{
- set {
- openedProject = value;
- gameUnitsStarted.Clear();
-
- if (openedProject == null)
- return;
-
- fps = openedProject.Description.File.Fps;
- mainWindow.UpdateGameUnits(value.GameUnits);
+ void HandleOpenedProjectChanged (Project project, ProjectType projectType, PlaysFilter filter,
+ IAnalysisWindow analysisWindow, IProjectOptionsController
projectOptions)
+ {
+ openedProject = project;
+ if (openedProject == null)
+ return;
+
+ if (this.analysisWindow != analysisWindow) {
+ analysisWindow.GameUnitEvent += HandleMainWindowGameUnitEvent;
+ analysisWindow.UnitAdded += HandleUnitAdded;
+ analysisWindow.UnitChanged += HandleUnitChanged;
+ analysisWindow.UnitDeleted += HandleUnitDeleted;
+ analysisWindow.UnitSelected += HandleUnitSelected;
}
+ this.analysisWindow = analysisWindow;
+ this.player = analysisWindow.Player;
+ gameUnitsStarted.Clear();
+
+ fps = openedProject.Description.File.Fps;
+ analysisWindow.UpdateGameUnits(openedProject.GameUnits);
}
-
- private void ConnectSignals() {
- mainWindow.GameUnitEvent += HandleMainWindowGameUnitEvent;
- }
-
+
private void StartGameUnit(GameUnit gameUnit) {
if (gameUnitsStarted.ContainsKey(gameUnit)){
Log.Warning("Trying to start a game unit that was already started");
diff --git a/LongoMatch.Services/Services/HotKeysManager.cs b/LongoMatch.Services/Services/HotKeysManager.cs
index 7b3bc31..3367d41 100644
--- a/LongoMatch.Services/Services/HotKeysManager.cs
+++ b/LongoMatch.Services/Services/HotKeysManager.cs
@@ -39,27 +39,32 @@ namespace LongoMatch.Services
Dictionary<HotKey, Category> dic;
bool ignoreKeys;
+ IAnalysisWindow analysisWindow;
- public HotKeysManager(IMainWindow mainWindow)
+ public HotKeysManager(ProjectsManager pManager)
{
dic = new Dictionary<HotKey,Category>();
- mainWindow.KeyPressed += KeyListener;
+ pManager.OpenedProjectChanged += HandleOpenedProjectChanged;
}
- // Set the active Hotkeys for the current project
- public Categories Categories {
- set {
- dic.Clear();
- if(value == null) {
- ignoreKeys = true;
- return;
- }
- ignoreKeys = false;
- foreach(Category cat in value) {
- if(cat.HotKey.Defined &&
- !dic.ContainsKey(cat.HotKey))
- dic.Add(cat.HotKey, cat);
- }
+ void HandleOpenedProjectChanged (Project project, LongoMatch.Common.ProjectType projectType,
LongoMatch.Common.PlaysFilter filter, IAnalysisWindow analysisWindow, IProjectOptionsController
projectOptions)
+ {
+ if(project == null) {
+ ignoreKeys = true;
+ return;
+ }
+
+ if (this.analysisWindow != analysisWindow) {
+ analysisWindow.KeyPressed += KeyListener;
+ this.analysisWindow = analysisWindow;
+ }
+
+ dic.Clear();
+ ignoreKeys = false;
+ foreach(Category cat in project.Categories) {
+ if(cat.HotKey.Defined &&
+ !dic.ContainsKey(cat.HotKey))
+ dic.Add(cat.HotKey, cat);
}
}
diff --git a/LongoMatch.Services/Services/PlaylistManager.cs b/LongoMatch.Services/Services/PlaylistManager.cs
index e5b5a8a..6595205 100644
--- a/LongoMatch.Services/Services/PlaylistManager.cs
+++ b/LongoMatch.Services/Services/PlaylistManager.cs
@@ -35,30 +35,39 @@ namespace LongoMatch.Services
IPlayList playlist;
IPlayer player;
IRenderingJobsManager videoRenderer;
+ IAnalysisWindow analysisWindow;
/* FIXME */
TimeNode selectedTimeNode;
bool clockStarted;
Timer timeout;
+ Project openedProject;
- public PlaylistManager (IGUIToolkit guiToolkit, IRenderingJobsManager videoRenderer)
+ public PlaylistManager (IGUIToolkit guiToolkit, IRenderingJobsManager videoRenderer,
+ ProjectsManager pManager)
{
this.videoRenderer = videoRenderer;
this.guiToolkit = guiToolkit;
- playlistWidget = guiToolkit.MainWindow.Playlist;
- player = guiToolkit.MainWindow.Player;
- BindEvents(guiToolkit.MainWindow, guiToolkit.MainWindow.Player);
+ pManager.OpenedProjectChanged += HandleOpenedProjectChanged;
+ }
+
+ void HandleOpenedProjectChanged (Project project, ProjectType projectType, PlaysFilter
filter, IAnalysisWindow analysisWindow, IProjectOptionsController projectOptions)
+ {
+ openedProject = project;
+ if (project != null) {
+ playlistWidget = analysisWindow.Playlist;
+ player = analysisWindow.Player;
+ if (this.analysisWindow != analysisWindow) {
+ BindEvents(analysisWindow);
+ this.analysisWindow = analysisWindow;
+ }
+ }
}
public void Stop() {
StopClock();
}
- public Project OpenedProject {
- get;
- set;
- }
-
public void Load(string filePath) {
try {
playlist = PlayList.Load(filePath);
@@ -70,24 +79,24 @@ namespace LongoMatch.Services
}
}
- private void BindEvents(IMainWindow mainWindow, IPlayer player) {
+ private void BindEvents(IAnalysisWindow analysisWindow) {
/* Track loaded element */
- mainWindow.PlaySelectedEvent += (p) => {selectedTimeNode = p;};
- player.SegmentClosedEvent += () => {selectedTimeNode = null;};
+ analysisWindow.PlaySelectedEvent += (p) => {selectedTimeNode = p;};
+ analysisWindow.Player.SegmentClosedEvent += () => {selectedTimeNode = null;};
/* Handle New/Open/Save playlist */
- mainWindow.OpenPlaylistEvent += OnOpenPlaylist;
- mainWindow.NewPlaylistEvent += OnNewPlaylist;
- mainWindow.SavePlaylistEvent += OnSavePlaylist;
+ analysisWindow.OpenPlaylistEvent += OnOpenPlaylist;
+ analysisWindow.NewPlaylistEvent += OnNewPlaylist;
+ analysisWindow.SavePlaylistEvent += OnSavePlaylist;
/* Handle Add/Select/Rate events from other widgets */
- mainWindow.PlayListNodeAddedEvent += OnPlayListNodeAdded;
- mainWindow.PlayListNodeSelectedEvent += LoadPlaylistPlay;
- mainWindow.RenderPlaylistEvent += OnRenderPlaylistEvent;
+ analysisWindow.PlayListNodeAddedEvent += OnPlayListNodeAdded;
+ analysisWindow.PlayListNodeSelectedEvent += LoadPlaylistPlay;
+ analysisWindow.RenderPlaylistEvent += OnRenderPlaylistEvent;
/* Handle Next/Prev from the player */
- player.Next += () => {Next();};
- player.Prev += () => {
+ analysisWindow.Player.Next += () => {Next();};
+ analysisWindow.Player.Prev += () => {
if(selectedTimeNode is PlayListPlay)
Prev();
};
@@ -98,7 +107,7 @@ namespace LongoMatch.Services
guiToolkit.InfoMessage(Catalog.GetString("You have not loaded any playlist
yet."));
} else {
foreach (Play p in plays) {
- PlayListPlay pl = new PlayListPlay (p,
OpenedProject.Description.File, true);
+ PlayListPlay pl = new PlayListPlay (p,
openedProject.Description.File, true);
playlist.Add(pl);
playlistWidget.Add(pl);
}
@@ -107,7 +116,7 @@ namespace LongoMatch.Services
private void LoadPlaylistPlay(PlayListPlay play)
{
- if(OpenedProject != null) {
+ if(openedProject != null) {
guiToolkit.ErrorMessage(Catalog.GetString(
"Please, close the opened project to play the playlist."));
Stop();
diff --git a/LongoMatch.Services/Services/ProjectOptionsManager.cs
b/LongoMatch.Services/Services/ProjectOptionsManager.cs
new file mode 100644
index 0000000..851d272
--- /dev/null
+++ b/LongoMatch.Services/Services/ProjectOptionsManager.cs
@@ -0,0 +1,91 @@
+//
+// Copyright (C) 2013 Andoni Morales Alastruey
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+//
+using System;
+
+namespace LongoMatch.Services.Services
+{
+ public class ProjectOptionsManager
+ {
+ public ProjectOptionsManager ()
+ {
+ }
+
+ protected void OnTagSubcategoriesActionToggled (object sender, System.EventArgs e)
+ {
+ if (TagSubcategoriesChangedEvent != null)
+ TagSubcategoriesChangedEvent (!TagSubcategoriesAction.Active);
+ Config.FastTagging = !TagSubcategoriesAction.Active;
+ }
+
+ protected virtual void OnFullScreenActionToggled(object sender, System.EventArgs e)
+ {
+ playercapturer.FullScreen = (sender as Gtk.ToggleAction).Active;
+ }
+
+ protected virtual void OnPlaylistActionToggled(object sender, System.EventArgs e)
+ {
+ bool visible = (sender as Gtk.ToggleAction).Active;
+ SetPlaylistVisibility (visible);
+ playsSelection.PlayListLoaded=visible;
+ }
+
+ protected virtual void OnHideAllWidgetsActionToggled(object sender, System.EventArgs e)
+ {
+ ToggleAction action = sender as ToggleAction;
+
+ if(openedProject == null)
+ return;
+
+ leftbox.Visible = !action.Active;
+ timeline.Visible = !action.Active && TimelineViewAction.Active;
+ buttonswidget.Visible = !action.Active &&
+ (TaggingViewAction.Active || ManualTaggingViewAction.Active);
+ if (Config.UseGameUnits) {
+ guTimeline.Visible = !action.Visible && GameUnitsViewAction.Active;
+ gameunitstaggerwidget1.Visible = !action.Active &&
(GameUnitsViewAction.Active ||
+ TaggingViewAction.Active || ManualTaggingViewAction.Active);
+ }
+ if(action.Active) {
+ SetTagsBoxVisibility (false);
+ } else {
+ if (selectedTimeNode != null)
+ SetTagsBoxVisibility (true);
+ }
+ }
+
+ protected virtual void OnViewToggled(object sender, System.EventArgs e)
+ {
+ ToggleAction action = sender as Gtk.ToggleAction;
+
+ if (!action.Active)
+ return;
+
+ buttonswidget.Visible = action == ManualTaggingViewAction || sender ==
TaggingViewAction;
+ timeline.Visible = action == TimelineViewAction;
+ if (Config.UseGameUnits) {
+ guTimeline.Visible = action == GameUnitsViewAction;
+ gameunitstaggerwidget1.Visible = buttonswidget.Visible || guTimeline.Visible;
+ }
+ if(action == ManualTaggingViewAction)
+ buttonswidget.Mode = TagMode.Free;
+ else
+ buttonswidget.Mode = TagMode.Predifined;
+ }
+ }
+}
+
diff --git a/LongoMatch.Services/Services/ProjectsManager.cs b/LongoMatch.Services/Services/ProjectsManager.cs
index cc57c21..6be741f 100644
--- a/LongoMatch.Services/Services/ProjectsManager.cs
+++ b/LongoMatch.Services/Services/ProjectsManager.cs
@@ -38,27 +38,23 @@ namespace LongoMatch.Services
IGUIToolkit guiToolkit;
IMultimediaToolkit multimediaToolkit;
- IMainWindow mainWindow;
+ IMainController mainController;
+ IAnalysisWindow analysisWindow;
+ IProjectOptionsController projectOptionsController;
+ TemplatesService ts;
- public ProjectsManager(IGUIToolkit guiToolkit, IMultimediaToolkit multimediaToolkit) {
+ public ProjectsManager (IGUIToolkit guiToolkit, IMultimediaToolkit multimediaToolkit,
+ TemplatesService ts) {
this.multimediaToolkit = multimediaToolkit;
this.guiToolkit = guiToolkit;
- mainWindow = guiToolkit.MainWindow;
- Player = mainWindow.Player;
- Capturer = mainWindow.Capturer;
+ this.ts =ts;
+ mainController = guiToolkit.MainController;
ConnectSignals();
}
public void ConnectSignals() {
- mainWindow.NewProjectEvent += NewProject;
- mainWindow.OpenProjectEvent += OpenProject;
- mainWindow.CloseOpenedProjectEvent += CloseOpenedProject;
- mainWindow.SaveProjectEvent += SaveProject;
- mainWindow.ImportProjectEvent += ImportProject;
- mainWindow.ExportProjectEvent += ExportProject;
- mainWindow.ManageProjectsEvent += OpenProjectsManager;
- mainWindow.ManageCategoriesEvent += OpenCategoriesTemplatesManager;
- mainWindow.ManageTeamsEvent += OpenTeamsTemplatesManager;
+ mainController.NewProjectEvent += NewProject;
+ mainController.OpenProjectEvent += OpenProject;
}
public Project OpenedProject {
@@ -88,7 +84,8 @@ namespace LongoMatch.Services
private void EmitProjectChanged() {
if (OpenedProjectChanged != null)
- OpenedProjectChanged(OpenedProject, OpenedProjectType, PlaysFilter);
+ OpenedProjectChanged (OpenedProject, OpenedProjectType, PlaysFilter,
+ analysisWindow, projectOptionsController);
}
void RemuxOutputFile (EncodingSettings settings) {
@@ -166,71 +163,21 @@ namespace LongoMatch.Services
SetProject(project, ProjectType.FileProject, new CaptureSettings());
}
- private void ImportProject(string name, string filterName, string filter,
- Func<string, Project> importProject, bool requiresNewFile) {
- Project project;
- string fileName;
-
- Log.Debug("Importing project");
- /* Show a file chooser dialog to select the file to import */
- fileName = guiToolkit.OpenFile(name, null, Config.HomeDir, filterName,
- new string[] {filter});
-
- if(fileName == null)
- return;
-
- /* try to import the project and show a message error is the file
- * is not a valid project */
- try {
- project = importProject(fileName);
- }
- catch(Exception ex) {
- guiToolkit.ErrorMessage(Catalog.GetString("Error importing project:") +
- "\n"+ex.Message);
- Log.Exception(ex);
- return;
- }
-
- if (requiresNewFile) {
- string videofile;
-
- guiToolkit.InfoMessage (Catalog.GetString("This project doesn't have any file
associated.\n" +
- "Select one in the next window"));
- videofile = guiToolkit.OpenFile(Catalog.GetString("Select a video file"),
null,
- Config.HomeDir, null, null);
- if (videofile == null) {
- guiToolkit.ErrorMessage (Catalog.GetString("Could not import project,
you need a video file"));
- return;
- } else {
- try {
- project.Description.File =
multimediaToolkit.DiscoverFile(videofile);
- } catch (Exception ex) {
- guiToolkit.ErrorMessage (ex.Message);
- return;
- }
- CreateThumbnails (project);
- }
- }
-
- /* If the project exists ask if we want to overwrite it */
- if(Core.DB.Exists(project)) {
- var res = guiToolkit.QuestionMessage(Catalog.GetString("A project already
exists for the file:") +
- project.Description.File.FilePath+ "\n" +
- Catalog.GetString("Do you want to overwrite it?"), null);
- if(!res)
- return;
- Core.DB.UpdateProject(project);
- } else {
- Core.DB.AddProject(project);
- }
-
- guiToolkit.InfoMessage(Catalog.GetString("Project successfully imported."));
- }
-
private bool SetProject(Project project, ProjectType projectType, CaptureSettings props)
{
- if(OpenedProject != null)
+ if (OpenedProject != null) {
CloseOpenedProject(true);
+ }
+
+ PlaysFilter = new PlaysFilter(project);
+ guiToolkit.OpenProject (project, projectType, props, PlaysFilter,
+ out analysisWindow, out projectOptionsController);
+ Player = analysisWindow.Player;
+ Capturer = analysisWindow.Capturer;
+ projectOptionsController.CloseOpenedProjectEvent += () => {PromptCloseProject ();};
+ projectOptionsController.SaveProjectEvent += SaveProject;
+ OpenedProject = project;
+ OpenedProjectType = projectType;
if(projectType == ProjectType.FileProject) {
// Check if the file associated to the project exists
@@ -244,8 +191,9 @@ namespace LongoMatch.Services
Player.Open(project.Description.File.FilePath);
}
catch(Exception ex) {
+ Log.Exception (ex);
guiToolkit.ErrorMessage(Catalog.GetString("An error occurred opening
this project:") + "\n" + ex.Message);
- CloseOpenedProject(true);
+ CloseOpenedProject (false);
return false;
}
@@ -257,7 +205,7 @@ namespace LongoMatch.Services
Capturer.Type = CapturerType.Live;
} catch(Exception ex) {
guiToolkit.ErrorMessage(ex.Message);
- CloseOpenedProject(false);
+ CloseOpenedProject (false);
return false;
}
} else
@@ -265,10 +213,6 @@ namespace LongoMatch.Services
Capturer.Run();
}
- OpenedProject = project;
- OpenedProjectType = projectType;
- PlaysFilter = new PlaysFilter(project);
- mainWindow.SetProject(project, projectType, props, PlaysFilter);
EmitProjectChanged();
return true;
}
@@ -300,34 +244,49 @@ namespace LongoMatch.Services
fChooser.Destroy();
}*/
- private void CreateThumbnails(Project project) {
- IFramesCapturer capturer;
- IBusyDialog dialog;
+ private bool PromptCloseProject() {
+ int res;
+ //EndCaptureDialog dialog;
- dialog = guiToolkit.BusyDialog(Catalog.GetString("Creating video thumbnails. This can
take a while."));
- dialog.Show();
- dialog.Pulse();
+ if(OpenedProject == null)
+ return true;
- /* Create all the thumbnails */
- capturer = multimediaToolkit.GetFramesCapturer();
- capturer.Open(project.Description.File.FilePath);
- foreach(Play play in project.AllPlays()) {
- try {
- capturer.SeekTime(play.Start.MSeconds + ((play.Stop -
play.Start).MSeconds/2),
- true);
- play.Miniature =
capturer.GetCurrentFrame(Constants.THUMBNAIL_MAX_WIDTH,
- Constants.THUMBNAIL_MAX_HEIGHT);
- dialog.Pulse();
-
- } catch (Exception ex) {
- Log.Exception(ex);
+ if(OpenedProjectType == ProjectType.FileProject) {
+ bool ret;
+ ret = guiToolkit.QuestionMessage (
+ Catalog.GetString("Do you want to close the current project?"), null);
+ if (ret) {
+ CloseOpenedProject (true);
+ return true;
}
+ return false;
}
- capturer.Dispose();
+
+ res = 0;
+ /* Capture project */
+ /*dialog = new EndCaptureDialog();
+ dialog.TransientFor = (Gtk.Window)this.Toplevel;
+
+ res = dialog.Run();
dialog.Destroy();
+
+ /* Close project wihtout saving */
+ if(res == (int)EndCaptureResponse.Quit) {
+ CloseOpenedProject (false);
+ return true;
+ } else if(res == (int)EndCaptureResponse.Save) {
+ /* Close and save project */
+ CloseOpenedProject (true);
+ return true;
+ } else
+ /* Continue with the current project */
+ return false;
}
-
- private void CloseOpenedProject(bool save) {
+
+ private void CloseOpenedProject (bool save) {
+ if(OpenedProject == null)
+ return;
+
if (save)
SaveProject(OpenedProject, OpenedProjectType);
@@ -340,6 +299,7 @@ namespace LongoMatch.Services
OpenedProject.Clear();
OpenedProject = null;
OpenedProjectType = ProjectType.None;
+ guiToolkit.CloseProject ();
EmitProjectChanged();
}
@@ -373,6 +333,10 @@ namespace LongoMatch.Services
Log.Debug("Creating new project");
+ if (!PromptCloseProject ()) {
+ return;
+ }
+
/* Show the project selection dialog */
projectType = guiToolkit.SelectNewProjectType();
@@ -382,17 +346,15 @@ namespace LongoMatch.Services
guiToolkit.ErrorMessage(Catalog.GetString("No capture devices were
found."));
return;
}
- project = guiToolkit.NewCaptureProject(Core.DB, Core.TemplatesService,
devices,
- out captureSettings);
+ project = guiToolkit.NewCaptureProject(Core.DB, ts, devices, out
captureSettings);
} else if (projectType == ProjectType.FakeCaptureProject) {
- project = guiToolkit.NewFakeProject(Core.DB, Core.TemplatesService);
+ project = guiToolkit.NewFakeProject(Core.DB, ts);
} else if (projectType == ProjectType.FileProject) {
- project = guiToolkit.NewFileProject(Core.DB, Core.TemplatesService);
+ project = guiToolkit.NewFileProject(Core.DB, ts);
if (project != null)
Core.DB.AddProject(project);
} else if (projectType == ProjectType.URICaptureProject) {
- project = guiToolkit.NewURICaptureProject(Core.DB, Core.TemplatesService,
- out captureSettings);
+ project = guiToolkit.NewURICaptureProject(Core.DB, ts, out captureSettings);
} else {
project = null;
}
@@ -405,6 +367,10 @@ namespace LongoMatch.Services
Project project = null;
ProjectDescription projectDescription = null;
+ if (!PromptCloseProject ()) {
+ return;
+ }
+
projectDescription = guiToolkit.SelectProject(Core.DB.GetAllProjects());
if (projectDescription == null)
return;
@@ -421,50 +387,12 @@ namespace LongoMatch.Services
Catalog.GetString("You are opening a live project without any video
file associated yet.") +
"\n" + Catalog.GetString("Select a video file in the next step."));
- project = guiToolkit.EditFakeProject(Core.DB, project, Core.TemplatesService);
+ project = guiToolkit.EditFakeProject(Core.DB, project, ts);
if (project == null)
return;
- CreateThumbnails(project);
+ ToolsManager.CreateThumbnails(project, guiToolkit,
multimediaToolkit.GetFramesCapturer());
}
SetProject(project, ProjectType.FileProject, new CaptureSettings());
}
-
- protected void ExportProject() {
- if (OpenedProject == null) {
- Log.Warning("Opened project is null and can't be exported");
- }
-
- string filename = guiToolkit.SaveFile(Catalog.GetString("Save project"), null,
- Config.HomeDir, Constants.PROJECT_NAME, new string[] {Constants.PROJECT_EXT});
-
- if (filename == null)
- return;
-
- System.IO.Path.ChangeExtension(filename, Constants.PROJECT_EXT);
-
- try {
- Project.Export(OpenedProject, filename);
- guiToolkit.InfoMessage(Catalog.GetString("Project exported successfully"));
- }catch (Exception ex) {
- guiToolkit.ErrorMessage(Catalog.GetString("Error exporting project"));
- Log.Exception(ex);
- }
- }
-
- protected void OpenCategoriesTemplatesManager()
- {
- guiToolkit.OpenCategoriesTemplatesManager (Core.TemplatesService);
- }
-
- protected void OpenTeamsTemplatesManager()
- {
- guiToolkit.OpenTeamsTemplatesManager (Core.TemplatesService.TeamTemplateProvider);
- }
-
- protected void OpenProjectsManager()
- {
- guiToolkit.OpenProjectsManager(OpenedProject, Core.DB, Core.TemplatesService);
- }
-
}
}
diff --git a/LongoMatch.Services/Services/RenderingJobsManager.cs
b/LongoMatch.Services/Services/RenderingJobsManager.cs
index d520637..d8250ad 100644
--- a/LongoMatch.Services/Services/RenderingJobsManager.cs
+++ b/LongoMatch.Services/Services/RenderingJobsManager.cs
@@ -43,13 +43,13 @@ namespace LongoMatch.Services
{
this.guiToolkit = guiToolkit;
this.multimediaToolkit = multimediaToolkit;
- this.stateBar = guiToolkit.MainWindow.RenderingStateBar;
+ this.stateBar = guiToolkit.RenderingStateBar;
capturer = multimediaToolkit.GetFramesCapturer();
jobs = new List<Job>();
pendingJobs = new List<Job>();
stateBar.Cancel += (sender, e) => CancelCurrentJob();
stateBar.ManageJobs += (sender, e) => ManageJobs();
- guiToolkit.MainWindow.ConvertVideoFilesEvent += delegate(List<MediaFile> inputFiles,
EncodingSettings encSettings) {
+ guiToolkit.MainController.ConvertVideoFilesEvent += delegate(List<MediaFile>
inputFiles, EncodingSettings encSettings) {
ConversionJob job = new ConversionJob(inputFiles, encSettings);
AddJob (job);
};;
diff --git a/LongoMatch.Services/Services/ToolsManager.cs b/LongoMatch.Services/Services/ToolsManager.cs
new file mode 100644
index 0000000..9c75616
--- /dev/null
+++ b/LongoMatch.Services/Services/ToolsManager.cs
@@ -0,0 +1,172 @@
+//
+// Copyright (C) 2013 Andoni Morales Alastruey
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+//
+using System;
+using Mono.Unix;
+
+using LongoMatch.Interfaces.GUI;
+using LongoMatch.Interfaces.Multimedia;
+using LongoMatch.Store;
+using LongoMatch.Common;
+
+namespace LongoMatch.Services {
+
+ public class ToolsManager
+ {
+
+ TemplatesService templatesService;
+ Project openedProject;
+ IGUIToolkit guiToolkit;
+ IMultimediaToolkit multimediaToolkit;
+
+ public ToolsManager (IGUIToolkit guiToolkit, IMultimediaToolkit multimediaToolkit,
+ ProjectsManager projectsManager,
+ TemplatesService templatesService)
+ {
+ this.guiToolkit = guiToolkit;
+ this.multimediaToolkit = multimediaToolkit;
+ this.templatesService = templatesService;
+ projectsManager.OpenedProjectChanged += (project, projectType, filter,
analysisWindow, projectOptions) => {
+ this.openedProject = project;
+ };
+
+ guiToolkit.MainController.EditPreferencesEvent += () => {
+ guiToolkit.OpenPreferencesEditor();
+ };
+ guiToolkit.MainController.ManageCategoriesEvent += () => {
+ guiToolkit.OpenCategoriesTemplatesManager (this.templatesService);
+ };
+ guiToolkit.MainController.ManageTeamsEvent += () => {
+ guiToolkit.OpenTeamsTemplatesManager
(this.templatesService.TeamTemplateProvider);
+ };
+ guiToolkit.MainController.ManageProjectsEvent += () => {
+ guiToolkit.OpenProjectsManager(this.openedProject, Core.DB, templatesService);
+ };
+
+ guiToolkit.MainController.ImportProjectEvent += ImportProject;
+ guiToolkit.MainController.ExportProjectEvent += ExportProject;
+ }
+
+ void ExportProject() {
+ if (openedProject == null) {
+ Log.Warning("Opened project is null and can't be exported");
+ }
+
+ string filename = guiToolkit.SaveFile (Catalog.GetString ("Save project"), null,
+ Config.HomeDir, Constants.PROJECT_NAME, new string[] {Constants.PROJECT_EXT});
+
+ if (filename == null)
+ return;
+
+ System.IO.Path.ChangeExtension (filename, Constants.PROJECT_EXT);
+
+ try {
+ Project.Export (openedProject, filename);
+ guiToolkit.InfoMessage (Catalog.GetString("Project exported successfully"));
+ } catch (Exception ex) {
+ guiToolkit.ErrorMessage (Catalog.GetString("Error exporting project"));
+ Log.Exception (ex);
+ }
+ }
+
+ private void ImportProject(string name, string filterName, string filter,
+ Func<string, Project> importProject, bool requiresNewFile) {
+ Project project;
+ string fileName;
+
+ Log.Debug("Importing project");
+ /* Show a file chooser dialog to select the file to import */
+ fileName = guiToolkit.OpenFile(name, null, Config.HomeDir, filterName,
+ new string[] {filter});
+
+ if(fileName == null)
+ return;
+
+ /* try to import the project and show a message error is the file
+ * is not a valid project */
+ try {
+ project = importProject (fileName);
+ }
+ catch(Exception ex) {
+ guiToolkit.ErrorMessage (Catalog.GetString ("Error importing project:") +
+ "\n"+ex.Message);
+ Log.Exception(ex);
+ return;
+ }
+
+ if (requiresNewFile) {
+ string videofile;
+
+ guiToolkit.InfoMessage (Catalog.GetString ("This project doesn't have any
file associated.\n" +
+ "Select one in the next window"));
+ videofile = guiToolkit.OpenFile (Catalog.GetString ("Select a video file"),
null,
+ Config.HomeDir, null, null);
+ if (videofile == null) {
+ guiToolkit.ErrorMessage (Catalog.GetString ("Could not import
project, you need a video file"));
+ return;
+ } else {
+ try {
+ project.Description.File = multimediaToolkit.DiscoverFile
(videofile);
+ } catch (Exception ex) {
+ guiToolkit.ErrorMessage (ex.Message);
+ return;
+ }
+ CreateThumbnails (project, guiToolkit,
multimediaToolkit.GetFramesCapturer());
+ }
+ }
+
+ /* If the project exists ask if we want to overwrite it */
+ if (Core.DB.Exists (project)) {
+ var res = guiToolkit.QuestionMessage (Catalog.GetString ("A project already
exists for the file:") +
+ project.Description.File.FilePath+ "\n"
+
+ Catalog.GetString ("Do you want to
overwrite it?"), null);
+ if(!res)
+ return;
+ Core.DB.UpdateProject(project);
+ } else {
+ Core.DB.AddProject(project);
+ }
+ guiToolkit.InfoMessage(Catalog.GetString("Project successfully imported."));
+ }
+
+ public static void CreateThumbnails(Project project, IGUIToolkit guiToolkit, IFramesCapturer
capturer) {
+ IBusyDialog dialog;
+
+ dialog = guiToolkit.BusyDialog(Catalog.GetString("Creating video thumbnails. This can
take a while."));
+ dialog.Show();
+ dialog.Pulse();
+
+ /* Create all the thumbnails */
+ capturer.Open(project.Description.File.FilePath);
+ foreach(Play play in project.AllPlays()) {
+ try {
+ capturer.SeekTime(play.Start.MSeconds + ((play.Stop -
play.Start).MSeconds/2),
+ true);
+ play.Miniature =
capturer.GetCurrentFrame(Constants.THUMBNAIL_MAX_WIDTH,
+ Constants.THUMBNAIL_MAX_HEIGHT);
+ dialog.Pulse();
+
+ } catch (Exception ex) {
+ Log.Exception(ex);
+ }
+ }
+ capturer.Dispose();
+ dialog.Destroy();
+ }
+ }
+}
+
diff --git a/LongoMatch.Services/Services/VideoDrawingsManager.cs
b/LongoMatch.Services/Services/VideoDrawingsManager.cs
index d4c8164..0749c2b 100644
--- a/LongoMatch.Services/Services/VideoDrawingsManager.cs
+++ b/LongoMatch.Services/Services/VideoDrawingsManager.cs
@@ -37,14 +37,20 @@ namespace LongoMatch.Services
bool canStop;
Play loadedPlay;
- public VideoDrawingsManager(IPlayer player)
+ public VideoDrawingsManager(ProjectsManager pManager)
{
- this.player = player;
+ pManager.OpenedProjectChanged += HandleOpenedProjectChanged;
}
~ VideoDrawingsManager() {
StopClock();
}
+
+ void HandleOpenedProjectChanged (Project project, ProjectType projectType, PlaysFilter filter,
+ IAnalysisWindow analysisWindow, IProjectOptionsController
projectOptions)
+ {
+ player = analysisWindow.Player;
+ }
public Play Play {
set {
@@ -77,15 +83,19 @@ namespace LongoMatch.Services
}
private void ConnectSignals() {
- player.PlayStateChanged += OnStateChanged;
- player.SeekEvent += OnSeekEvent;
- player.SegmentClosedEvent += OnSegmentCloseEvent;
+ if (player != null) {
+ player.PlayStateChanged += OnStateChanged;
+ player.SeekEvent += OnSeekEvent;
+ player.SegmentClosedEvent += OnSegmentCloseEvent;
+ }
}
private void DisconnectSignals() {
- player.PlayStateChanged -= OnStateChanged;
- player.SeekEvent -= OnSeekEvent;
- player.SegmentClosedEvent -= OnSegmentCloseEvent;
+ if (player != null) {
+ player.PlayStateChanged -= OnStateChanged;
+ player.SeekEvent -= OnSeekEvent;
+ player.SegmentClosedEvent -= OnSegmentCloseEvent;
+ }
}
private int NextStopTime() {
diff --git a/LongoMatch/Main.cs b/LongoMatch/Main.cs
index 1f1ab14..7a89d40 100644
--- a/LongoMatch/Main.cs
+++ b/LongoMatch/Main.cs
@@ -63,8 +63,8 @@ namespace LongoMatch
manager.LoadConfigModifierAddins();
GUIToolkit guiToolkit = new GUIToolkit(version);
IMultimediaToolkit multimediaToolkit = new MultimediaFactory();
- manager.LoadExportProjectAddins(guiToolkit.MainWindow);
- manager.LoadImportProjectAddins(guiToolkit.MainWindow);
+ manager.LoadExportProjectAddins(guiToolkit.MainController);
+ manager.LoadImportProjectAddins(guiToolkit.MainController);
try {
Core.Start(guiToolkit, multimediaToolkit);
} catch (DBLockedException locked) {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]