[longomatch] Refactor data model and add a migration tool for the old db
- From: Andoni Morales Alastruey <amorales src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [longomatch] Refactor data model and add a migration tool for the old db
- Date: Mon, 7 Jul 2014 11:28:23 +0000 (UTC)
commit 8cff0e503953b7e211ab5a9b42f403e9c9ead057
Author: Andoni Morales Alastruey <ylatuya gmail com>
Date: Tue Jun 10 11:20:11 2014 +0200
Refactor data model and add a migration tool for the old db
LongoMatch.Addins/LongoMatch.Addins.mdp | 2 +-
LongoMatch.Core/Common/Cloner.cs | 4 +-
LongoMatch.Core/Common/Color.cs | 2 +
LongoMatch.Core/Common/Image.cs | 4 +-
LongoMatch.Core/Common/PlayList.cs | 4 +-
LongoMatch.Core/Common/PlaysFilter.cs | 24 +-
LongoMatch.Core/Common/Serializer.cs | 240 +
LongoMatch.Core/Config.cs | 19 +-
LongoMatch.Core/Handlers/Handlers.cs | 12 +-
.../{Store/GameUnit.cs => Interfaces/IIDObject.cs} | 34 +-
LongoMatch.Core/Interfaces/ITag.cs | 2 +-
LongoMatch.Core/Interfaces/ITemplates.cs | 17 +-
LongoMatch.Core/Interfaces/ITemplatesService.cs | 6 -
LongoMatch.Core/Interfaces/ITimelineNode.cs | 6 -
LongoMatch.Core/LongoMatch.Core.mdp | 13 +-
LongoMatch.Core/Stats/GameUnitStats.cs | 121 -
LongoMatch.Core/Stats/GameUnitsStats.cs | 94 -
LongoMatch.Core/Stats/ProjectStats.cs | 113 +-
LongoMatch.Core/Stats/SubCategoryStat.cs | 6 +-
LongoMatch.Core/Store/Category.cs | 82 +-
LongoMatch.Core/Store/Coordinates.cs | 23 +-
LongoMatch.Core/Store/Drawing.cs | 31 +-
LongoMatch.Core/Store/HotKey.cs | 56 +-
LongoMatch.Core/Store/MediaFile.cs | 162 +-
LongoMatch.Core/Store/Period.cs | 2 +
LongoMatch.Core/Store/PixbufTimeNode.cs | 24 +-
LongoMatch.Core/Store/Play.cs | 92 +-
LongoMatch.Core/Store/Player.cs | 37 +-
LongoMatch.Core/Store/Point.cs | 2 +
LongoMatch.Core/Store/Project.cs | 97 +-
LongoMatch.Core/Store/ProjectDescription.cs | 24 +-
LongoMatch.Core/Store/SubCategory.cs | 113 +-
LongoMatch.Core/Store/Tag.cs | 78 +-
LongoMatch.Core/Store/TagStore.cs | 65 +-
.../Store/Templates/CategoriesTemplate.cs | 107 +-
LongoMatch.Core/Store/Templates/TeamTemplate.cs | 54 +-
LongoMatch.Core/Store/Time.cs | 2 +
LongoMatch.Core/Utils.cs | 2 +-
LongoMatch.Drawing/Widgets/CategoriesLabels.cs | 2 +-
LongoMatch.Drawing/Widgets/PlaysTimeline.cs | 8 +-
LongoMatch.Drawing/Widgets/TeamTagger.cs | 18 +-
LongoMatch.GUI.Multimedia/Gui/PlayerBin.cs | 6 +-
.../gtk-gui/LongoMatch.Gui.CapturerBin.cs | 2 +-
.../gtk-gui/LongoMatch.Gui.PlayerBin.cs | 3 +-
.../gtk-gui/LongoMatch.Gui.PlayerCapturerBin.cs | 2 +-
.../gtk-gui/LongoMatch.Gui.VolumeWindow.cs | 2 +-
LongoMatch.GUI.Multimedia/gtk-gui/generated.cs | 22 +-
LongoMatch.GUI.Multimedia/gtk-gui/gui.stetic | 2 +-
LongoMatch.GUI/Gui/Component/ButtonsWidget.cs | 4 +-
LongoMatch.GUI/Gui/Component/CategoryProperties.cs | 104 +-
LongoMatch.GUI/Gui/Component/CoordinatesTagger.cs | 16 +-
.../Gui/Component/PlayersListTreeWidget.cs | 8 +-
.../Gui/Component/PlaysCoordinatesTagger.cs | 11 +-
.../Gui/Component/PlaysListTreeWidget.cs | 4 +-
.../Gui/Component/PlaysSelectionWidget.cs | 6 +-
.../Gui/Component/Stats/PlayersViewer.cs | 2 +-
LongoMatch.GUI/Gui/Component/TaggerWidget.cs | 13 +-
LongoMatch.GUI/Gui/Component/TeamTemplateEditor.cs | 4 +-
LongoMatch.GUI/Gui/Component/Timeline.cs | 2 +-
LongoMatch.GUI/Gui/Dialog/EditCategoryDialog.cs | 2 +-
LongoMatch.GUI/Gui/Dialog/SubCategoryTagsEditor.cs | 6 +-
LongoMatch.GUI/Gui/Dialog/TaggerDialog.cs | 24 +-
LongoMatch.GUI/Gui/GUIToolkit.cs | 5 -
LongoMatch.GUI/Gui/Panel/OpenProjectPanel.cs | 2 +-
LongoMatch.GUI/Gui/Panel/ProjectsManagerPanel.cs | 6 +-
.../Gui/TreeView/CategoriesFilterTreeView.cs | 16 +-
LongoMatch.GUI/Gui/TreeView/ListTreeViewBase.cs | 2 +-
.../Gui/TreeView/PlayersFilterTreeView.cs | 2 +-
.../Gui/TreeView/SubCategoriesTreeView.cs | 12 +-
LongoMatch.GUI/LongoMatch.GUI.mdp | 18 -
.../LongoMatch.Gui.Component.GameUnitWidget.cs | 52 -
.../LongoMatch.Gui.Component.GameUnitsEditor.cs | 126 -
.../LongoMatch.Gui.Component.GameUnitsTagger.cs | 26 -
.../LongoMatch.Gui.Component.PlayersTagger.cs | 51 -
...LongoMatch.Gui.Component.PlayersTaggerWidget.cs | 37 -
.../LongoMatch.Gui.Component.StringTaggerWidget.cs | 43 -
.../LongoMatch.Gui.Component.TaggerWidget.cs | 126 -
.../LongoMatch.Gui.Dialog.SubCategoryTagsEditor.cs | 217 -
.../gtk-gui/LongoMatch.Gui.Dialog.TaggerDialog.cs | 117 -
.../LongoMatch.Gui.Panel.ProjectsManagerPanel.cs | 1 +
LongoMatch.GUI/gtk-gui/gui.stetic | 952 +---
LongoMatch.GUI/gtk-gui/objects.xml | 72 +-
LongoMatch.Migration/Common/Color.cs | 90 +
.../Common/Config.cs | 42 +-
LongoMatch.Migration/Common/ConsoleCrayon.cs | 280 +
LongoMatch.Migration/Common/Constants.cs | 114 +
.../Common/Enums.cs | 57 +-
LongoMatch.Migration/Common/Image.cs | 191 +
LongoMatch.Migration/Common/Log.cs | 443 ++
.../Common/SerializableObject.cs | 100 +-
LongoMatch.Migration/Converter.cs | 173 +
LongoMatch.Migration/Core/Category.cs | 251 +
.../Core/Coordinates.cs | 63 +-
LongoMatch.Migration/Core/Drawing.cs | 89 +
.../Core}/GameUnit.cs | 0
.../Core}/GameUnitsList.cs | 0
LongoMatch.Migration/Core/HotKey.cs | 155 +
.../Core/Interfaces/ISubCategory.cs | 25 +-
.../Core/Interfaces/ITag.cs | 24 +-
LongoMatch.Migration/Core/Interfaces/ITemplates.cs | 68 +
.../Core/Interfaces/ITimelineNode.cs | 37 +-
LongoMatch.Migration/Core/MediaFile.cs | 226 +
.../Core/Period.cs | 46 +-
LongoMatch.Migration/Core/PixbufTimeNode.cs | 67 +
LongoMatch.Migration/Core/Play.cs | 268 +
LongoMatch.Migration/Core/PlayListPlay.cs | 78 +
LongoMatch.Migration/Core/Player.cs | 162 +
LongoMatch.Migration/Core/Point.cs | 110 +
LongoMatch.Migration/Core/Project.cs | 295 +
LongoMatch.Migration/Core/ProjectDescription.cs | 162 +
LongoMatch.Migration/Core/SubCategory.cs | 195 +
LongoMatch.Migration/Core/Tag.cs | 140 +
LongoMatch.Migration/Core/TagStore.cs | 109 +
.../Core/Templates/CategoriesTemplate.cs | 231 +
.../Core}/Templates/SubCategoryTemplate.cs | 2 +
.../Core/Templates/TeamTemplate.cs | 180 +
LongoMatch.Migration/Core/Time.cs | 187 +
LongoMatch.Migration/Core/TimeNode.cs | 88 +
LongoMatch.Migration/Core/TimelineNode.cs | 127 +
.../Core/Timer.cs | 55 +-
LongoMatch.Migration/Data/default.lct | Bin 0 -> 29655 bytes
LongoMatch.Migration/Data/default.ltt | Bin 0 -> 19754 bytes
LongoMatch.Migration/Data/project.lgm | Bin 0 -> 120659 bytes
LongoMatch.Migration/DataBase.cs | 554 ++
LongoMatch.Migration/LongoMatch.Migration.csproj | 70 +
LongoMatch.Migration/LongoMatch.Migration.mdp | 89 +
LongoMatch.Migration/MainWindow.cs | 182 +
.../GameUnit.cs => LongoMatch.Migration/Program.cs | 38 +-
LongoMatch.Migration/Properties/AssemblyInfo.cs | 51 +
.../Tests/CateogiresTest.cs | 44 +-
.../Tests/TestProject.cs | 43 +-
.../Tests/TestTeam.cs | 41 +-
LongoMatch.Migration/gtk-gui/MainWindow.cs | 120 +
LongoMatch.Migration/gtk-gui/generated.cs | 63 +
LongoMatch.Migration/gtk-gui/gui.stetic | 118 +
...LongoMatch.Migration.mdp-Release-2014-06-06.xml | 6219 ++++++++++++++++++++
LongoMatch.Multimedia/LongoMatch.Multimedia.mdp | 14 +-
LongoMatch.Plugins/CSVExporter.cs | 40 +-
LongoMatch.Plugins/LongoMatch.Plugins.mdp | 6 +-
LongoMatch.Services/LongoMatch.Services.mdp | 1 -
LongoMatch.Services/Services/Core.cs | 7 +-
LongoMatch.Services/Services/EventsManager.cs | 29 +-
LongoMatch.Services/Services/FileDB.cs | 24 +-
LongoMatch.Services/Services/HotKeysManager.cs | 2 +-
LongoMatch.Services/Services/MigrationsManager.cs | 158 -
LongoMatch.Services/Services/ProjectsManager.cs | 10 +-
.../Services/RenderingJobsManager.cs | 12 +-
LongoMatch.Services/Services/TemplatesService.cs | 65 +-
LongoMatch.Services/Services/ToolsManager.cs | 2 +-
LongoMatch.mds | 8 +
Tests/Core/TestCategoriesTemplate.cs | 17 +-
Tests/Core/TestCategory.cs | 19 +-
Tests/Core/TestColor.cs | 2 +-
Tests/Core/TestCoordinates.cs | 28 +-
.../Store/GameUnit.cs => Tests/Core/TestImage.cs | 39 +-
Tests/Core/TestMediaFile.cs | 7 +-
Tests/Core/TestPlay.cs | 61 +-
Tests/Core/TestPlayer.cs | 17 +-
Tests/Core/TestProject.cs | 101 +-
Tests/Core/TestProjectDescription.cs | 2 +-
Tests/Core/TestSubCategory.cs | 51 +-
Tests/Core/TestTagStore.cs | 42 +-
Tests/Core/TestTeamTemplate.cs | 39 +-
.../Store/GameUnit.cs => Tests/Core/TestTime.cs | 38 +-
Tests/Services/TestDatabase.cs | 14 +-
Tests/Tests.mdp | 16 +-
Tests/Utils.cs | 10 +-
167 files changed, 13317 insertions(+), 4058 deletions(-)
---
diff --git a/LongoMatch.Addins/LongoMatch.Addins.mdp b/LongoMatch.Addins/LongoMatch.Addins.mdp
index 2ad0171..70f43f0 100644
--- a/LongoMatch.Addins/LongoMatch.Addins.mdp
+++ b/LongoMatch.Addins/LongoMatch.Addins.mdp
@@ -22,7 +22,7 @@
<File subtype="Code" buildaction="Compile" name="ExtensionPoints/IMultimediaBackend.cs" />
</Contents>
<References>
- <ProjectReference type="Gac" localcopy="True" refto="Mono.Addins, Version=0.6.0.0, Culture=neutral,
PublicKeyToken=0738eb9f132ed756" />
+ <ProjectReference type="Package" localcopy="True" refto="Mono.Addins, Version=0.6.0.0, Culture=neutral,
PublicKeyToken=0738eb9f132ed756" />
<ProjectReference type="Project" localcopy="True" refto="LongoMatch.Core" />
</References>
</Project>
\ No newline at end of file
diff --git a/LongoMatch.Core/Common/Cloner.cs b/LongoMatch.Core/Common/Cloner.cs
index 72277c5..e2777e2 100644
--- a/LongoMatch.Core/Common/Cloner.cs
+++ b/LongoMatch.Core/Common/Cloner.cs
@@ -30,9 +30,9 @@ namespace LongoMatch.Common
Stream s = new MemoryStream();
using (s) {
- SerializableObject.Save<T>(source, s, SerializationType.Binary);
+ Serializer.Save<T>(source, s, SerializationType.Binary);
s.Seek(0, SeekOrigin.Begin);
- return SerializableObject.Load<T>(s, SerializationType.Binary);
+ return Serializer.Load<T>(s, SerializationType.Binary);
}
}
}
diff --git a/LongoMatch.Core/Common/Color.cs b/LongoMatch.Core/Common/Color.cs
index d616103..03c77d5 100644
--- a/LongoMatch.Core/Common/Color.cs
+++ b/LongoMatch.Core/Common/Color.cs
@@ -16,9 +16,11 @@
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
//
using System;
+using Newtonsoft.Json;
namespace LongoMatch.Common
{
+ [JsonConverter (typeof (LongoMatchConverter))]
public class Color
{
public Color (byte r, byte g, byte b, byte a=byte.MaxValue)
diff --git a/LongoMatch.Core/Common/Image.cs b/LongoMatch.Core/Common/Image.cs
index 09352a0..245a79b 100644
--- a/LongoMatch.Core/Common/Image.cs
+++ b/LongoMatch.Core/Common/Image.cs
@@ -16,6 +16,7 @@
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
//
using System.Runtime.Serialization;
+using Newtonsoft.Json;
namespace LongoMatch.Common
{
@@ -29,6 +30,7 @@ namespace LongoMatch.Common
#endif
[Serializable]
+ [JsonConverter (typeof(LongoMatchConverter))]
public class Image: ISerializable, IDisposable
{
SImage image;
@@ -84,7 +86,7 @@ namespace LongoMatch.Common
#if HAVE_GTK
- public byte[] Serialize () {
+ public virtual byte[] Serialize () {
if (image == null)
return null;
return image.SaveToBuffer("png");
diff --git a/LongoMatch.Core/Common/PlayList.cs b/LongoMatch.Core/Common/PlayList.cs
index 4c48277..fbde01a 100644
--- a/LongoMatch.Core/Common/PlayList.cs
+++ b/LongoMatch.Core/Common/PlayList.cs
@@ -62,7 +62,7 @@ namespace LongoMatch.Common
}
public void Save(string filePath) {
- SerializableObject.Save(this, filePath);
+ Serializer.Save(this, filePath);
}
public static PlayList Load(string filePath) {
@@ -73,7 +73,7 @@ namespace LongoMatch.Common
if(!System.IO.File.Exists(filePath))
pl = new PlayList();
else
- pl = SerializableObject.LoadSafe<PlayList>(filePath);
+ pl = Serializer.LoadSafe<PlayList>(filePath);
pl.Filename = filename;
return pl;
}
diff --git a/LongoMatch.Core/Common/PlaysFilter.cs b/LongoMatch.Core/Common/PlaysFilter.cs
index ccc9388..8c6a243 100644
--- a/LongoMatch.Core/Common/PlaysFilter.cs
+++ b/LongoMatch.Core/Common/PlaysFilter.cs
@@ -75,25 +75,23 @@ namespace LongoMatch.Common
public void ClearCategoriesFilter () {
categoriesFilter.Clear();
- foreach (var cat in project.Categories) {
+ foreach (Category cat in project.Categories.List) {
List<SubCategoryTags> list = new List<SubCategoryTags>();
categoriesFilter.Add(cat, list);
- foreach (var subcat in cat.SubCategories) {
- if (subcat is TagSubCategory) {
+ foreach (SubCategory subcat in cat.SubCategories) {
SubCategoryTags subcatTags = new SubCategoryTags{SubCategory =
subcat};
list.Add(subcatTags);
- foreach (var option in subcat as TagSubCategory)
+ foreach (string option in subcat.Options)
subcatTags.Add (option);
- }
}
}
}
public void ClearPlayersFilter () {
playersFilter.Clear();
- foreach (var player in project.LocalTeamTemplate)
+ foreach (var player in project.LocalTeamTemplate.List)
playersFilter.Add(player);
- foreach (var player in project.VisitorTeamTemplate)
+ foreach (var player in project.VisitorTeamTemplate.List)
playersFilter.Add(player);
}
@@ -111,7 +109,7 @@ namespace LongoMatch.Common
playersFilter.Add(player);
}
- public void FilterSubCategory (Category cat, ISubCategory subcat, string option, bool
filtered) {
+ public void FilterSubCategory (Category cat, SubCategory subcat, string option, bool
filtered) {
SubCategoryTags tsub = categoriesFilter[cat].Find(s => s.SubCategory == subcat);
if (filtered) {
tsub.Add(option);
@@ -149,7 +147,7 @@ namespace LongoMatch.Common
void UpdateVisiblePlayers () {
visiblePlayers = new List<Player>();
- foreach (Player p in project.LocalTeamTemplate.Concat (project.VisitorTeamTemplate)) {
+ foreach (Player p in project.LocalTeamTemplate.List.Concat
(project.VisitorTeamTemplate.List)) {
if (PlayersFilterEnabled && ! playersFilter.Contains (p)) {
continue;
}
@@ -178,13 +176,13 @@ namespace LongoMatch.Common
bool cat_match=true, player_match=true;
visiblePlays = new List<Play>();
- foreach (Play play in project.AllPlays()) {
+ foreach (Play play in project.Timeline) {
if (CategoriesFilterEnabled) {
cat_match = false;
foreach (var subcat in categoriesFilter[play.Category]) {
bool match = false;
foreach (var option in subcat) {
- StringTag tag = new
StringTag{SubCategory=subcat.SubCategory, Value=option};
+ Tag tag = new Tag{SubCategory=subcat.SubCategory,
Value=option};
if (play.Tags.Contains(tag)) {
match = true;
break;
@@ -203,7 +201,7 @@ namespace LongoMatch.Common
}
if (PlayersFilterEnabled)
- player_match =
VisiblePlayers.Intersect(play.Players.GetTagsValues()).Count() != 0;
+ player_match = VisiblePlayers.Intersect(play.Players).Count() != 0;
if (player_match && cat_match) {
visiblePlays.Add (play);
@@ -218,7 +216,7 @@ namespace LongoMatch.Common
}
class SubCategoryTags: List<string> {
- public ISubCategory SubCategory {
+ public SubCategory SubCategory {
get;
set;
}
diff --git a/LongoMatch.Core/Common/Serializer.cs b/LongoMatch.Core/Common/Serializer.cs
new file mode 100644
index 0000000..c780981
--- /dev/null
+++ b/LongoMatch.Core/Common/Serializer.cs
@@ -0,0 +1,240 @@
+//
+// Copyright (C) 2010 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 System.IO;
+using System.Collections.Generic;
+using System.Linq;
+using System.Runtime.Serialization.Formatters.Binary;
+using System.Xml.Serialization;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Serialization;
+using LongoMatch.Interfaces;
+using System.Reflection;
+using LongoMatch.Store.Templates;
+using Newtonsoft.Json.Converters;
+using LongoMatch.Store;
+using System.Globalization;
+using System.Text;
+
+namespace LongoMatch.Common
+{
+ public class Serializer
+ {
+ public static void Save<T>(T obj, Stream stream,
+ SerializationType type=SerializationType.Json) {
+ switch (type) {
+ case SerializationType.Binary:
+ BinaryFormatter formatter = new BinaryFormatter();
+ formatter.Serialize(stream, obj);
+ break;
+ case SerializationType.Xml:
+ XmlSerializer xmlformatter = new XmlSerializer(typeof(T));
+ xmlformatter.Serialize(stream, obj);
+ break;
+ case SerializationType.Json:
+ StreamWriter sw = new StreamWriter (stream);
+ sw.Write (JsonConvert.SerializeObject (obj, JsonSettings));
+ sw.Flush();
+ break;
+ }
+ }
+
+ public static void Save<T>(T obj, string filepath,
+ SerializationType type=SerializationType.Json) {
+ Stream stream = new FileStream(filepath, FileMode.Create, FileAccess.Write,
FileShare.None);
+ using (stream) {
+ Save<T> (obj, stream, type);
+ stream.Close();
+ }
+ }
+
+ public static T Load<T>(Stream stream,
+ SerializationType type=SerializationType.Json) {
+ switch (type) {
+ case SerializationType.Binary:
+ BinaryFormatter formatter = new BinaryFormatter();
+ return (T)formatter.Deserialize(stream);
+ case SerializationType.Xml:
+ XmlSerializer xmlformatter = new XmlSerializer(typeof(T));
+ return (T) xmlformatter.Deserialize(stream);
+ case SerializationType.Json:
+ StreamReader sr = new StreamReader (stream);
+ return JsonConvert.DeserializeObject<T> (sr.ReadToEnd(), JsonSettings);
+ default:
+ throw new Exception();
+ }
+ }
+
+ public static T Load<T>(string filepath,
+ SerializationType type=SerializationType.Json) {
+ Stream stream = new FileStream(filepath, FileMode.Open, FileAccess.Read,
FileShare.Read);
+ using (stream) {
+ return Load<T> (stream, type);
+ }
+ }
+
+ public static T LoadSafe<T>(string filepath) {
+
+ Stream stream = new FileStream (filepath, FileMode.Open,
+ FileAccess.Read, FileShare.Read);
+ using (stream) {
+ try {
+ return Load<T> (stream, SerializationType.Json);
+ } catch (Exception e) {
+ Log.Exception (e);
+ stream.Seek (0, SeekOrigin.Begin);
+ return Load<T> (stream, SerializationType.Binary);
+ }
+ }
+ }
+
+ static JsonSerializerSettings JsonSettings {
+ get{
+ JsonSerializerSettings settings = new JsonSerializerSettings ();
+ settings.Formatting = Formatting.Indented;
+ settings.PreserveReferencesHandling = PreserveReferencesHandling.Objects;
+ settings.TypeNameHandling = TypeNameHandling.Objects;
+ settings.Converters.Add (new VersionConverter ());
+ //settings.ReferenceResolver = new IdReferenceResolver ();
+ return settings;
+ }
+ }
+ }
+
+ public class LongoMatchConverter : JsonConverter
+ {
+ public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
+ {
+ if (value is Time) {
+ Time time = value as Time;
+ if (time != null) {
+ writer.WriteValue(time.MSeconds);
+ }
+ } else if (value is Color) {
+ Color color = value as Color;
+ if (color != null) {
+ writer.WriteValue(String.Format ("#{0}{1}{2}{3}",
+ color.R.ToString ("X2"),
+ color.G.ToString ("X2"),
+ color.B.ToString ("X2"),
+ color.A.ToString ("X2")));
+ }
+ } else if (value is Image) {
+ Image image = value as Image;
+ if (image != null) {
+ writer.WriteValue(image.Serialize());
+ }
+ } else if (value is HotKey) {
+ HotKey hotkey = value as HotKey;
+ if (hotkey != null) {
+ writer.WriteValue(String.Format ("{0} {1}", hotkey.Key,
hotkey.Modifier));
+ }
+ } else if (value is Point) {
+ Point p = value as Point;
+ if (p != null) {
+ writer.WriteValue(String.Format ("{0} {1}", p.X, p.Y));
+ }
+ }
+ }
+
+ public override object ReadJson(JsonReader reader, Type objectType, object existingValue,
JsonSerializer serializer)
+ {
+ if (reader.Value != null) {
+ if (objectType == typeof (Time)) {
+ Int64 t = (Int64) reader.Value;
+ return new Time((int)t);
+ } else if (objectType == typeof (Color)) {
+ string rgbStr = (string) reader.Value;
+ return new Color(Byte.Parse (rgbStr.Substring(1,2),
NumberStyles.HexNumber),
+ Byte.Parse (rgbStr.Substring(3,2),
NumberStyles.HexNumber),
+ Byte.Parse (rgbStr.Substring(5,2),
NumberStyles.HexNumber),
+ Byte.Parse (rgbStr.Substring(7,2),
NumberStyles.HexNumber));
+ } else if (objectType == typeof (Image)) {
+ byte[] buf = Convert.FromBase64String ((string)reader.Value);
+ return Image.Deserialize (buf);
+ } else if (objectType == typeof (HotKey)) {
+ string[] hk = ((string)reader.Value).Split (' ');
+ return new HotKey {Key = int.Parse(hk[0]), Modifier =
int.Parse(hk[1])};
+ } else if (objectType == typeof (Point)) {
+ string[] ps = ((string)reader.Value).Split (' ');
+ return new Point (double.Parse(ps[0]), double.Parse(ps[1]));
+ }
+ }
+ return null;
+ }
+
+ public override bool CanConvert(Type objectType)
+ {
+ return (
+ objectType == typeof(Time) ||
+ objectType == typeof(Color) ||
+ objectType == typeof(HotKey) ||
+ objectType == typeof(Image));
+ }
+ }
+
+ public class IdReferenceResolver : IReferenceResolver
+ {
+ private int _references;
+ private readonly Dictionary<string, object> _idtoobjects;
+ private readonly Dictionary<object, string> _objectstoid;
+
+ public IdReferenceResolver () {
+ _references = 0;
+ _idtoobjects = new Dictionary<string, object>();
+ _objectstoid = new Dictionary<object, string>();
+ }
+
+ public object ResolveReference(object context, string reference)
+ {
+ object p;
+ _idtoobjects.TryGetValue(reference, out p);
+ return p;
+ }
+
+ public string GetReference(object context, object value)
+ {
+ string referenceStr;
+ if (value is IIDObject) {
+ IIDObject p = (IIDObject)value;
+ referenceStr = p.ID.ToString();
+ } else {
+ if (!_objectstoid.TryGetValue (value, out referenceStr)) {
+ _references++;
+ referenceStr = _references.ToString(CultureInfo.InvariantCulture);
+ }
+ }
+ _idtoobjects[referenceStr] = value;
+ _objectstoid[value] = referenceStr;
+ return referenceStr;
+ }
+
+ public bool IsReferenced(object context, object value)
+ {
+ string reference;
+ return _objectstoid.TryGetValue (value, out reference);
+ }
+
+ public void AddReference(object context, string reference, object value)
+ {
+ _idtoobjects[reference] = value;
+ _objectstoid[value] = reference;
+ }
+ }
+}
+
diff --git a/LongoMatch.Core/Config.cs b/LongoMatch.Core/Config.cs
index 4107850..757f537 100644
--- a/LongoMatch.Core/Config.cs
+++ b/LongoMatch.Core/Config.cs
@@ -37,7 +37,6 @@ namespace LongoMatch
public static IDrawingToolkit DrawingToolkit;
public static ITeamTemplatesProvider TeamTemplatesProvider;
public static ICategoriesTemplatesProvider CategoriesTemplatesProvider;
- public static ISubcategoriesTemplatesProvider SubcategoriesTemplatesProvider;
public static EventsBroker EventsBroker;
public static IDataBaseManager DatabaseManager;
@@ -49,7 +48,7 @@ namespace LongoMatch
if (File.Exists(Config.ConfigFile)) {
Log.Information ("Loading config from " + Config.ConfigFile);
try {
- state = SerializableObject.LoadSafe<ConfigState>(Config.ConfigFile);
+ state = Serializer.LoadSafe<ConfigState>(Config.ConfigFile);
} catch (Exception ex) {
Log.Error ("Error loading config");
Log.Exception (ex);
@@ -65,7 +64,7 @@ namespace LongoMatch
public static void Save () {
try {
- SerializableObject.Save(state, Config.ConfigFile);
+ Serializer.Save(state, Config.ConfigFile);
} catch (Exception ex) {
Log.Error ("Errro saving config");
Log.Exception (ex);
@@ -152,7 +151,19 @@ namespace LongoMatch
public static string DBDir {
get {
- return Path.Combine(configDirectory, "db");
+ return Path.Combine(homeDirectory, "db");
+ }
+ }
+
+ public static string AnalysisDir {
+ get {
+ return Path.Combine(DBDir, "analysis");
+ }
+
+ }
+ public static string TeamsDir {
+ get {
+ return Path.Combine(DBDir, "teams");
}
}
diff --git a/LongoMatch.Core/Handlers/Handlers.cs b/LongoMatch.Core/Handlers/Handlers.cs
index 52754de..ee312b3 100644
--- a/LongoMatch.Core/Handlers/Handlers.cs
+++ b/LongoMatch.Core/Handlers/Handlers.cs
@@ -126,8 +126,8 @@ namespace LongoMatch.Handlers
public delegate void CategoriesHandler(List<Category> categoriesList);
/* Edit Subcategory properties */
- public delegate void SubCategoryHandler(ISubCategory subcat);
- public delegate void SubCategoriesHandler(List<ISubCategory> subcat);
+ public delegate void SubCategoryHandler(SubCategory subcat);
+ public delegate void SubCategoriesHandler(List<SubCategory> subcat);
/* Edit player properties */
public delegate void PlayerPropertiesHandler(Player player);
@@ -137,14 +137,6 @@ namespace LongoMatch.Handlers
public delegate void ProjectsSelectedHandler(List<ProjectDescription> projects);
public delegate void ProjectSelectedHandler(ProjectDescription project);
- /* Start/Stop/Cancel game units */
- public delegate void GameUnitHandler(GameUnit gameUnit, GameUnitEventType eType);
-
- public delegate void UnitChangedHandler (GameUnit gameUnit, TimelineNode unit, Time time);
- public delegate void UnitSelectedHandler (GameUnit gameUnit, TimelineNode unit);
- public delegate void UnitAddedHandler (GameUnit gameUnit, int frame);
- public delegate void UnitsDeletedHandler (GameUnit gameUnit, List<TimelineNode> unit);
-
public delegate void KeyHandler (object sender, int key, int modifier);
/* The plays filter was updated */
diff --git a/LongoMatch.Core/Store/GameUnit.cs b/LongoMatch.Core/Interfaces/IIDObject.cs
similarity index 66%
copy from LongoMatch.Core/Store/GameUnit.cs
copy to LongoMatch.Core/Interfaces/IIDObject.cs
index f9ce9b9..101e76f 100644
--- a/LongoMatch.Core/Store/GameUnit.cs
+++ b/LongoMatch.Core/Interfaces/IIDObject.cs
@@ -1,43 +1,27 @@
-//
-// Copyright (C) 2011 andoni
-//
+//
+// Copyright (C) 2014 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 System.Collections.Generic;
-namespace LongoMatch.Store
+namespace LongoMatch.Interfaces
{
- [Serializable]
- public class GameUnit: List<TimelineNode>
+ public interface IIDObject
{
-
- public GameUnit (string name)
- {
- Name=name;
- }
-
- public string Name {
- get;
- set;
- }
-
- public override string ToString ()
- {
- return string.Format ("[GameUnit: Name={0}]", Name);
- }
+ Guid ID {get;set;}
}
}
diff --git a/LongoMatch.Core/Interfaces/ITag.cs b/LongoMatch.Core/Interfaces/ITag.cs
index 90c3e0a..825423c 100644
--- a/LongoMatch.Core/Interfaces/ITag.cs
+++ b/LongoMatch.Core/Interfaces/ITag.cs
@@ -22,7 +22,7 @@ namespace LongoMatch.Interfaces
{
public interface ITag<T>
{
- ISubCategory SubCategory {set;get;}
+ SubCategory SubCategory {set;get;}
T Value {set;get;}
}
}
diff --git a/LongoMatch.Core/Interfaces/ITemplates.cs b/LongoMatch.Core/Interfaces/ITemplates.cs
index a6d17c9..fad1fca 100644
--- a/LongoMatch.Core/Interfaces/ITemplates.cs
+++ b/LongoMatch.Core/Interfaces/ITemplates.cs
@@ -22,13 +22,14 @@ using LongoMatch.Store.Templates;
namespace LongoMatch.Interfaces
{
- public interface ITemplate
+ public interface ITemplate: IIDObject
{
void Save (string filename);
string Name {get; set;}
}
- public interface ITemplate<T>: ITemplate, IList<T> {
+ public interface ITemplate<T>: ITemplate {
+ List<T> List {get;set;}
T AddDefaultItem (int index);
}
@@ -50,19 +51,7 @@ namespace LongoMatch.Interfaces
void Update (ITemplate<U> template);
}
- public interface ITemplateWidget<T, U> where T: ITemplate<U>
- {
- T Template {get; set;}
- bool Edited {get; set;}
- bool CanExport {get; set;}
- Project Project {get; set;}
- }
-
public interface ICategoriesTemplatesProvider: ITemplateProvider<Categories, Category> {}
public interface ITeamTemplatesProvider: ITemplateProvider<TeamTemplate, Player> {}
- public interface ISubcategoriesTemplatesProvider: ITemplateProvider<SubCategoryTemplate, string> {}
-
- public interface ICategoriesTemplatesEditor: ITemplateWidget<Categories, Category> {}
- public interface ITeamTemplatesEditor: ITemplateWidget<TeamTemplate, Player> {}
}
diff --git a/LongoMatch.Core/Interfaces/ITemplatesService.cs b/LongoMatch.Core/Interfaces/ITemplatesService.cs
index 0dbf170..1178f5e 100644
--- a/LongoMatch.Core/Interfaces/ITemplatesService.cs
+++ b/LongoMatch.Core/Interfaces/ITemplatesService.cs
@@ -26,15 +26,9 @@ namespace LongoMatch.Interfaces
{
ITemplateProvider<T, U> GetTemplateProvider<T, U>() where T: ITemplate<U>;
- ISubcategoriesTemplatesProvider SubCategoriesTemplateProvider {get;}
-
ITeamTemplatesProvider TeamTemplateProvider {get;}
ICategoriesTemplatesProvider CategoriesTemplateProvider {get;}
-
- List<PlayerSubCategory> PlayerSubcategories {get;}
-
- List<TeamSubCategory> TeamSubcategories {get;}
}
}
diff --git a/LongoMatch.Core/Interfaces/ITimelineNode.cs b/LongoMatch.Core/Interfaces/ITimelineNode.cs
index d0ff33d..b271fd9 100644
--- a/LongoMatch.Core/Interfaces/ITimelineNode.cs
+++ b/LongoMatch.Core/Interfaces/ITimelineNode.cs
@@ -25,14 +25,8 @@ namespace LongoMatch.Interfaces
string Name {get;set;}
Time Start {get;set;}
Time Stop {get;set;}
- uint StartFrame {get; set;}
- uint StopFrame {get; set;}
bool Selected {get; set;}
- uint CentralFrame {get;}
- uint TotalFrames {get;}
- uint KeyFrame {get;}
bool HasDrawings {get;}
- bool HasFrame(int frame);
}
}
diff --git a/LongoMatch.Core/LongoMatch.Core.mdp b/LongoMatch.Core/LongoMatch.Core.mdp
index 2d75243..c5b047f 100644
--- a/LongoMatch.Core/LongoMatch.Core.mdp
+++ b/LongoMatch.Core/LongoMatch.Core.mdp
@@ -19,7 +19,6 @@
<File subtype="Code" buildaction="Compile" name="Common/Constants.cs" />
<File subtype="Code" buildaction="Compile" name="Common/Enums.cs" />
<File subtype="Code" buildaction="Compile" name="Common/Log.cs" />
- <File subtype="Code" buildaction="Compile" name="Common/SerializableObject.cs" />
<File subtype="Code" buildaction="Compile" name="Store/Category.cs" />
<File subtype="Code" buildaction="Compile" name="Store/Drawing.cs" />
<File subtype="Code" buildaction="Compile" name="Store/HotKey.cs" />
@@ -35,10 +34,7 @@
<File subtype="Code" buildaction="Compile" name="Store/Time.cs" />
<File subtype="Code" buildaction="Compile" name="Store/TimeNode.cs" />
<File subtype="Code" buildaction="Compile" name="Store/Templates/CategoriesTemplate.cs" />
- <File subtype="Code" buildaction="Compile" name="Store/Templates/SubCategoryTemplate.cs" />
<File subtype="Code" buildaction="Compile" name="Store/Templates/TeamTemplate.cs" />
- <File subtype="Code" buildaction="Compile" name="Interfaces/ISubCategory.cs" />
- <File subtype="Code" buildaction="Compile" name="Interfaces/ITag.cs" />
<File subtype="Code" buildaction="Compile" name="Interfaces/ITemplates.cs" />
<File subtype="Directory" buildaction="Compile" name="." />
<File subtype="Directory" buildaction="Compile" name="Common" />
@@ -66,8 +62,6 @@
<File subtype="Code" buildaction="Compile" name="Config.cs" />
<File subtype="Code" buildaction="Compile" name="Interfaces/ITemplatesService.cs" />
<File subtype="Code" buildaction="Compile" name="Interfaces/IDatabase.cs" />
- <File subtype="Code" buildaction="Compile" name="Store/GameUnit.cs" />
- <File subtype="Code" buildaction="Compile" name="Store/GameUnitsList.cs" />
<File subtype="Code" buildaction="Compile" name="Store/TimelineNode.cs" />
<File subtype="Code" buildaction="Compile" name="Interfaces/ITimelineNode.cs" />
<File subtype="Directory" buildaction="Compile" name="Interfaces/GUI" />
@@ -96,8 +90,6 @@
<File subtype="Code" buildaction="Compile" name="Stats/Stat.cs" />
<File subtype="Code" buildaction="Compile" name="Stats/SubCategoryStat.cs" />
<File subtype="Code" buildaction="Compile" name="Stats/PlayersStats.cs" />
- <File subtype="Code" buildaction="Compile" name="Stats/GameUnitStats.cs" />
- <File subtype="Code" buildaction="Compile" name="Stats/GameUnitsStats.cs" />
<File subtype="Code" buildaction="Compile" name="Common/PlaysFilter.cs" />
<File subtype="Code" buildaction="Compile" name="Interfaces/Multimedia/IRemuxer.cs" />
<File subtype="Code" buildaction="Compile" name="Interfaces/Multimedia/IVideoConverter.cs" />
@@ -139,6 +131,11 @@
<File subtype="Code" buildaction="Compile" name="Store/Timer.cs" />
<File subtype="Code" buildaction="Compile" name="Store/Period.cs" />
<File subtype="Code" buildaction="Compile" name="Common/EventsBroker.cs" />
+ <File subtype="Directory" buildaction="Compile" name="Store" />
+ <File subtype="Directory" buildaction="Compile" name="Store" />
+ <File subtype="Directory" buildaction="Compile" name="Store" />
+ <File subtype="Code" buildaction="Compile" name="Common/Serializer.cs" />
+ <File subtype="Code" buildaction="Compile" name="Interfaces/IIDObject.cs" />
</Contents>
<References>
<ProjectReference type="Package" localcopy="True" refto="System, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089" />
diff --git a/LongoMatch.Core/Stats/ProjectStats.cs b/LongoMatch.Core/Stats/ProjectStats.cs
index 27d9252..4cc7655 100644
--- a/LongoMatch.Core/Stats/ProjectStats.cs
+++ b/LongoMatch.Core/Stats/ProjectStats.cs
@@ -29,7 +29,6 @@ namespace LongoMatch.Stats
public class ProjectStats: IDisposable
{
List<CategoryStats> catStats;
- GameUnitsStats guStats;
PlaysFilter filter;
Project project;
@@ -112,12 +111,6 @@ namespace LongoMatch.Stats
}
}
- public GameUnitsStats GameUnitsStats {
- get {
- return guStats;
- }
- }
-
public PlaysFilter Filter {
set {
filter = value;
@@ -126,7 +119,6 @@ namespace LongoMatch.Stats
}
void UpdateGameUnitsStats () {
- guStats = new GameUnitsStats(project.GameUnits, (int)project.Description.File.Length);
}
void CountPlaysInTeam (List<Play> plays, out int localTeamCount, out int visitorTeamCount) {
@@ -141,7 +133,7 @@ namespace LongoMatch.Stats
HalfField = project.Categories.HalfFieldBackground;
Goal = project.Categories.GoalBackground;
- foreach (Category cat in project.Categories) {
+ foreach (Category cat in project.Categories.List) {
CategoryStats stats;
List<Play> plays, homePlays, awayPlays, untagged;
int localTeamCount, visitorTeamCount;
@@ -155,8 +147,8 @@ namespace LongoMatch.Stats
/* Get the plays where the team is not tagged but we have at least one player
from a team tagged */
untagged = plays.Where (p=> p.Team == Team.NONE).ToList();
- homePlays.AddRange (untagged.Where (p => p.Players.Tags.Where (pt =>
project.LocalTeamTemplate.Contains(pt.Value)).Count() != 0).ToList());
- awayPlays.AddRange (untagged.Where (p => p.Players.Tags.Where (pt =>
project.VisitorTeamTemplate.Contains(pt.Value)).Count() != 0).ToList());
+ homePlays.AddRange (untagged.Where (p => p.Players.Where (pt =>
project.LocalTeamTemplate.List.Contains(pt)).Count() != 0).ToList());
+ awayPlays.AddRange (untagged.Where (p => p.Players.Where (pt =>
project.VisitorTeamTemplate.List.Contains(pt)).Count() != 0).ToList());
stats = new CategoryStats(cat, plays.Count, homePlays.Count(),
awayPlays.Count());
@@ -172,43 +164,22 @@ namespace LongoMatch.Stats
stats.AwayGoalCoordinates = awayPlays.Select (p => p.GoalPosition).Where(p
=>p != null).ToList();
catStats.Add (stats);
- foreach (ISubCategory subcat in cat.SubCategories) {
+ foreach (SubCategory subcat in cat.SubCategories) {
SubCategoryStat subcatStat;
- if (subcat is PlayerSubCategory)
- continue;
-
subcatStat = new SubCategoryStat(subcat);
stats.AddSubcatStat(subcatStat);
- if (subcat is TagSubCategory) {
- foreach (string option in subcat.ElementsDesc()) {
- List<Play> subcatPlays;
- StringTag tag;
-
- tag = new StringTag{SubCategory=subcat, Value=option};
- subcatPlays = plays.Where(p =>
p.Tags.Tags.Contains(tag)).ToList();
- GetSubcategoryStats(subcatPlays, subcatStat, option,
- stats.TotalCount, out localTeamCount, out
visitorTeamCount);
- GetPlayersStats(project, subcatPlays, option,
subcatStat, cat);
- }
- }
-
- if (subcat is TeamSubCategory) {
- List<Team> teams = new List<Team>();
- teams.Add(Team.LOCAL);
- teams.Add(Team.VISITOR);
+ foreach (string option in subcat.Options) {
+ List<Play> subcatPlays;
+ Tag tag;
- foreach (Team team in teams) {
- List<Play> subcatPlays;
- TeamTag tag;
-
- tag = new TeamTag{SubCategory=subcat, Value=team};
- subcatPlays = plays.Where(p =>
p.Teams.Tags.Contains(tag)).ToList();
- GetSubcategoryStats(subcatPlays, subcatStat,
team.ToString(),
- stats.TotalCount, out localTeamCount, out
visitorTeamCount);
- }
- }
+ tag = new Tag{SubCategory=subcat, Value=option};
+ subcatPlays = plays.Where(p =>
p.TagsStore.Tags.Contains(tag)).ToList();
+ GetSubcategoryStats(subcatPlays, subcatStat, option,
+ stats.TotalCount, out localTeamCount, out
visitorTeamCount);
+ GetPlayersStats(project, subcatPlays, option, subcatStat,
cat);
+ }
}
}
}
@@ -228,38 +199,34 @@ namespace LongoMatch.Stats
void GetPlayersStats (Project project, List<Play> subcatPlays, string optionName,
SubCategoryStat subcatStat, Category cat)
{
- foreach (ISubCategory subcat in cat.SubCategories) {
- PlayerSubCategory playerSubcat;
- Dictionary<Player, int> localPlayerCount = new Dictionary<Player, int>();
- Dictionary<Player, int> visitorPlayerCount = new Dictionary<Player, int>();
-
- if (!(subcat is PlayerSubCategory))
- continue;
-
- playerSubcat = subcat as PlayerSubCategory;
-
- if (playerSubcat.Contains(Team.LOCAL) || playerSubcat.Contains(Team.BOTH)){
- foreach (Player player in project.LocalTeamTemplate) {
- localPlayerCount.Add(player, GetPlayerCount(subcatPlays,
player, subcat as PlayerSubCategory));
- }
- subcatStat.AddPlayersStats(optionName, subcat.Name, Team.LOCAL,
localPlayerCount);
- }
-
- if (playerSubcat.Contains(Team.VISITOR) || playerSubcat.Contains(Team.BOTH)){
- foreach (Player player in project.VisitorTeamTemplate) {
- visitorPlayerCount.Add(player, GetPlayerCount(subcatPlays,
player, subcat as PlayerSubCategory));
- }
- subcatStat.AddPlayersStats(optionName, subcat.Name, Team.VISITOR,
visitorPlayerCount);
- }
- }
- }
-
- int GetPlayerCount(List<Play> plays, Player player, PlayerSubCategory subcat)
+// foreach (SubCategory subcat in cat.SubCategories) {
+// Dictionary<Player, int> localPlayerCount = new Dictionary<Player, int>();
+// Dictionary<Player, int> visitorPlayerCount = new Dictionary<Player, int>();
+//
+// if (!(subcat is PlayerSubCategory))
+// continue;
+//
+// playerSubcat = subcat as PlayerSubCategory;
+//
+// if (playerSubcat.Contains(Team.LOCAL) || playerSubcat.Contains(Team.BOTH)){
+// foreach (Player player in project.LocalTeamTemplate.List) {
+// localPlayerCount.Add(player, GetPlayerCount(subcatPlays,
player, subcat as PlayerSubCategory));
+// }
+// subcatStat.AddPlayersStats(optionName, subcat.Name, Team.LOCAL,
localPlayerCount);
+// }
+//
+// if (playerSubcat.Contains(Team.VISITOR) || playerSubcat.Contains(Team.BOTH)){
+// foreach (Player player in project.VisitorTeamTemplate.List) {
+// visitorPlayerCount.Add(player, GetPlayerCount(subcatPlays,
player, subcat as PlayerSubCategory));
+// }
+// subcatStat.AddPlayersStats(optionName, subcat.Name, Team.VISITOR,
visitorPlayerCount);
+// }
+// }
+ }
+
+ int GetPlayerCount(List<Play> plays, Player player)
{
- PlayerTag tag;
-
- tag = new PlayerTag{SubCategory=subcat, Value=player};
- return plays.Where(p => p.Players.Contains(tag)).Count();
+ return plays.Where(p => p.Players.Contains(player)).Count();
}
}
}
diff --git a/LongoMatch.Core/Stats/SubCategoryStat.cs b/LongoMatch.Core/Stats/SubCategoryStat.cs
index 73a5cec..fce5530 100644
--- a/LongoMatch.Core/Stats/SubCategoryStat.cs
+++ b/LongoMatch.Core/Stats/SubCategoryStat.cs
@@ -30,9 +30,9 @@ namespace LongoMatch.Stats
List<PercentualStat> optionStats;
Dictionary<string, List<PlayersStats>> localPlayersStats;
Dictionary<string, List<PlayersStats>> visitorPlayersStats;
- ISubCategory subcat;
+ SubCategory subcat;
- public SubCategoryStat (ISubCategory subcat)
+ public SubCategoryStat (SubCategory subcat)
{
Name = subcat.Name;
this.subcat = subcat;
@@ -53,7 +53,7 @@ namespace LongoMatch.Stats
}
}
- public ISubCategory SubCategory {
+ public SubCategory SubCategory {
get {
return subcat;
}
diff --git a/LongoMatch.Core/Store/Category.cs b/LongoMatch.Core/Store/Category.cs
index bad6784..005ac58 100644
--- a/LongoMatch.Core/Store/Category.cs
+++ b/LongoMatch.Core/Store/Category.cs
@@ -36,31 +36,26 @@ namespace LongoMatch.Store
/// tagged in this category
/// </summary>
[Serializable]
- public class Category:TimeNode, ISerializable
+ public class Category:TimeNode, IIDObject
{
- [JsonProperty ("UUID")]
- private Guid _UUID;
-
#region Constructors
- #endregion
public Category() {
- _UUID = System.Guid.NewGuid();
- SubCategories = new List<ISubCategory>();
+ ID = System.Guid.NewGuid();
+ SubCategories = new List<SubCategory>();
TagGoalPosition = false;
TagFieldPosition = true;
}
+ #endregion
#region Properties
/// <summary>
/// Unique ID for this category
/// </summary>
- [JsonIgnore]
- public Guid UUID {
- get {
- return _UUID;
- }
+ public Guid ID {
+ get;
+ set;
}
/// <summary>
@@ -95,7 +90,7 @@ namespace LongoMatch.Store
set;
}
- public List<ISubCategory> SubCategories {
+ public List<SubCategory> SubCategories {
get;
set;
}
@@ -155,67 +150,6 @@ namespace LongoMatch.Store
SortMethod = SortMethodType.SortByName;
}
}
-
- // this constructor is automatically called during deserialization
- public Category(SerializationInfo info, StreamingContext context) {
- _UUID = (Guid)info.GetValue("uuid", typeof(Guid));
- Name = (string) info.GetValue("name", typeof(string));
- Start = (Time)info.GetValue("start", typeof(Time));
- Stop = (Time)info.GetValue("stop", typeof(Time));
- HotKey = (HotKey)info.GetValue("hotkey", typeof(HotKey));
- SubCategories = (List<ISubCategory>)info.GetValue("subcategories",
typeof(List<ISubCategory>));
- Position = (Int32) info.GetValue("position", typeof (Int32));
- SortMethod = (SortMethodType)info.GetValue("sort_method", typeof(SortMethodType));
- Color = Color.ColorFromUShort ((ushort)info.GetValue("red", typeof(ushort)),
- (ushort)info.GetValue("green", typeof(ushort)),
- (ushort)info.GetValue("blue", typeof(ushort)));
- try {
- TagFieldPosition = (bool) info.GetValue("tagfieldpos", typeof (bool));
- } catch {
- TagFieldPosition = true;
- }
- try {
- TagHalfFieldPosition =(bool) info.GetValue("taghalffieldpos", typeof (bool));
- } catch {
- TagHalfFieldPosition = false;
- }
- try {
- TagGoalPosition = (bool) info.GetValue("taggoalpos", typeof (bool));
- } catch {
- TagGoalPosition = false;
- }
- try {
- FieldPositionIsDistance =(bool) info.GetValue("fieldposisdist", typeof
(bool));
- } catch {
- FieldPositionIsDistance = false;
- }
- try {
- HalfFieldPositionIsDistance =(bool) info.GetValue("halffieldposisdist",
typeof (bool));
- } catch {
- HalfFieldPositionIsDistance = false;
- }
- }
-
- // this method is automatically called during serialization
- public void GetObjectData(SerializationInfo info, StreamingContext context) {
- info.AddValue("uuid", UUID);
- info.AddValue("name", Name);
- info.AddValue("start", Start);
- info.AddValue("stop", Stop);
- info.AddValue("hotkey", HotKey);
- info.AddValue("position", Position);
- info.AddValue("subcategories", SubCategories);
- /* Convert to ushort for backward compatibility */
- info.AddValue("red", (ushort) Color.R);
- info.AddValue("green", (ushort) Color.G);
- info.AddValue("blue", (ushort) Color.B);
- info.AddValue("sort_method", SortMethod);
- info.AddValue("tagfieldpos", TagFieldPosition);
- info.AddValue("taghalffieldpos", TagHalfFieldPosition);
- info.AddValue("taggoalpos", TagGoalPosition);
- info.AddValue("fieldposisdist", FieldPositionIsDistance);
- info.AddValue("halffieldposisdist", HalfFieldPositionIsDistance);
- }
#endregion
}
diff --git a/LongoMatch.Core/Store/Coordinates.cs b/LongoMatch.Core/Store/Coordinates.cs
index 46df10a..7b9f215 100644
--- a/LongoMatch.Core/Store/Coordinates.cs
+++ b/LongoMatch.Core/Store/Coordinates.cs
@@ -21,10 +21,17 @@ using System.Collections.Generic;
namespace LongoMatch.Common
{
[Serializable]
- public class Coordinates: List<Point>
+ public class Coordinates
{
+
public Coordinates ()
{
+ Points = new List<Point> ();
+ }
+
+ public List<Point> Points {
+ get;
+ set;
}
public override bool Equals (object obj)
@@ -33,11 +40,11 @@ namespace LongoMatch.Common
if (c == null)
return false;
- if (c.Count != Count)
+ if (c.Points.Count != Points.Count)
return false;
- for (int i=0; i<Count; i++) {
- if (c[i] != this[i])
+ for (int i=0; i < Points.Count; i++) {
+ if (!c.Points[i].Equals (Points[i]))
return false;
}
return true;
@@ -47,8 +54,12 @@ namespace LongoMatch.Common
{
string s = "";
- for (int i=0; i<Count; i++) {
- s += this[i].X.ToString() + this[i].Y.ToString();
+ if (Points.Count == 0) {
+ return base.GetHashCode ();
+ }
+
+ for (int i=0; i < Points.Count; i++) {
+ s += this.Points[i].X.ToString() + this.Points[i].Y.ToString();
}
return int.Parse(s);
diff --git a/LongoMatch.Core/Store/Drawing.cs b/LongoMatch.Core/Store/Drawing.cs
index 047e69f..e30c9ff 100644
--- a/LongoMatch.Core/Store/Drawing.cs
+++ b/LongoMatch.Core/Store/Drawing.cs
@@ -27,7 +27,6 @@ namespace LongoMatch.Store
[Serializable]
public class Drawing
{
- private byte[] drawingBuf;
private const int DEFAULT_PAUSE_TIME = 5000;
/// <summary>
@@ -37,44 +36,21 @@ namespace LongoMatch.Store
/// which stop time is stored in a int value
/// </summary>
public Drawing() {
- PauseTime = DEFAULT_PAUSE_TIME;
+ Pause = new Time (DEFAULT_PAUSE_TIME);
}
/// <summary>
/// Pixbuf with the drawing
/// </summary>
public Image Pixbuf {
- get {
- if(drawingBuf != null)
- return Image.Deserialize(drawingBuf);
- else return null;
- }
- set {
- drawingBuf = value.Serialize();
- }
- }
-
- /// <summary>
- /// Render time of the drawing
- /// </summary>
- public Time Render {
get;
set;
}
/// <summary>
- /// Time to pause the playback and display the drawing
- /// </summary>
- public Time Pause {
- set;
- get;
- }
-
- /// <summary>
/// Render time of the drawing
/// </summary>
- [JsonIgnore]
- public int RenderTime {
+ public Time Render {
get;
set;
}
@@ -82,8 +58,7 @@ namespace LongoMatch.Store
/// <summary>
/// Time to pause the playback and display the drawing
/// </summary>
- [JsonIgnore]
- public int PauseTime {
+ public Time Pause {
set;
get;
}
diff --git a/LongoMatch.Core/Store/HotKey.cs b/LongoMatch.Core/Store/HotKey.cs
index fc6a4a3..44db021 100644
--- a/LongoMatch.Core/Store/HotKey.cs
+++ b/LongoMatch.Core/Store/HotKey.cs
@@ -24,6 +24,10 @@ using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using Mono.Unix;
+using Newtonsoft.Json;
+using LongoMatch.Common;
+
+
#if HAVE_GTK
using Gdk;
#endif
@@ -37,19 +41,17 @@ namespace LongoMatch.Store
/// 'key' and 'modifier' are set to -1 when it's initialized
/// </summary>
[Serializable]
+ [JsonConverter (typeof (LongoMatchConverter))]
public class HotKey : IEquatable<HotKey>
{
- private int key;
- private int modifier;
-
#region Constructors
/// <summary>
/// Creates a new undefined HotKey
/// </summary>
public HotKey()
{
- this.key = -1;
- this.modifier = -1;
+ Key = -1;
+ Modifier = -1;
}
#endregion
@@ -58,49 +60,55 @@ namespace LongoMatch.Store
/// Gdk Key
/// </summary>
public int Key {
- get {
- return key;
- }
- set {
- key = value;
- }
+ get;
+ set;
}
/// <summary>
/// Key modifier. Only Alt and Shift can be used
/// </summary>
public int Modifier {
- get {
- return modifier;
- }
- set {
- modifier = value;
- }
+ get;
+ set;
}
/// <summary>
/// Get whether the hotkey is defined or not
/// </summary>
+ [JsonIgnore]
public Boolean Defined {
get {
- return (key!=-1 && modifier != -1);
+ return (Key!=-1 && Modifier != -1);
}
}
#endregion
#region Public Methods
- public bool Equals(HotKey hotkeyComp) {
+ public bool Equals (HotKey hotkeyComp) {
+ if (hotkeyComp == null)
+ return false;
return (this.Key == hotkeyComp.Key && this.Modifier == hotkeyComp.Modifier);
}
#endregion
#region Operators
- static public bool operator == (HotKey hk1, HotKey hk2) {
- return hk1.Equals(hk2);
+ static public bool operator == (HotKey a, HotKey b) {
+ // If both are null, or both are same instance, return true.
+ if (System.Object.ReferenceEquals(a, b))
+ {
+ return true;
+ }
+
+ // If one is null, but not both, return false.
+ if (((object)a == null) || ((object)b == null))
+ {
+ return false;
+ }
+ return a.Equals(b);
}
- static public bool operator != (HotKey hk1, HotKey hk2) {
- return !hk1.Equals(hk2);
+ static public bool operator != (HotKey a, HotKey b) {
+ return !(a == b);
}
#endregion
@@ -117,7 +125,7 @@ namespace LongoMatch.Store
public override int GetHashCode()
{
- return key ^ modifier;
+ return Key ^ Modifier;
}
public override string ToString()
diff --git a/LongoMatch.Core/Store/MediaFile.cs b/LongoMatch.Core/Store/MediaFile.cs
index 0d05cef..5dc7734 100644
--- a/LongoMatch.Core/Store/MediaFile.cs
+++ b/LongoMatch.Core/Store/MediaFile.cs
@@ -30,21 +30,6 @@ namespace LongoMatch.Store
[Serializable]
public class MediaFile
{
-
- string filePath;
- long length; // In MSeconds
- ushort fps;
- bool hasAudio;
- bool hasVideo;
- string container;
- string videoCodec;
- string audioCodec;
- uint videoHeight;
- uint videoWidth;
- double par;
- byte[] thumbnailBuf;
-
-
public MediaFile() {}
public MediaFile(string filePath,
@@ -60,147 +45,78 @@ namespace LongoMatch.Store
double par,
Image preview)
{
- this.filePath = filePath;
- this.length = length;
- this.hasAudio = hasAudio;
- this.hasVideo = hasVideo;
- this.container = container;
- this.videoCodec = videoCodec;
- this.audioCodec = audioCodec;
- this.videoHeight = videoHeight;
- this.videoWidth = videoWidth;
- if(fps == 0)
- //For audio Files
- this.fps=25;
- else
- this.fps = fps;
- this.Preview = preview;
+ FilePath = filePath;
+ Duration = new Time ((int)length);
+ HasAudio = hasAudio;
+ HasVideo = hasVideo;
+ Container = container;
+ VideoCodec = videoCodec;
+ AudioCodec = audioCodec;
+ VideoHeight = videoHeight;
+ VideoWidth = videoWidth;
+ Fps = fps;
+ Preview = preview;
Par = par;
}
public string FilePath {
- get {
- return this.filePath;
- }
- set {
- this.filePath = value;
- }
+ get;
+ set;
}
public Time Duration {
- get {
- return new Time ((int) length);
- }
- }
-
- public long Length {
- get {
- return this.length;
- }
- set {
- this.length = value;
- }
+ get;
+ set;
}
public bool HasVideo {
- get {
- return this.hasVideo;
- }
- set {
- this.hasVideo = value;
- }
+ get;
+ set;
}
public bool HasAudio {
- get {
- return this.hasAudio;
- }
- set {
- this.hasAudio = value;
- }
+ get;
+ set;
}
public string Container {
- get {
- return this.container;
- }
- set {
- this.container = value;
- }
+ get;
+ set;
}
public string VideoCodec {
- get {
- return this.videoCodec;
- }
- set {
- this.videoCodec = value;
- }
+ get;
+ set;
}
public string AudioCodec {
- get {
- return this.audioCodec;
- }
- set {
- this.audioCodec = value;
- }
+ get;
+ set;
}
public uint VideoWidth {
- get {
- return this.videoWidth;
- }
- set {
- this.videoWidth= value;
- }
+ get;
+ set;
}
public uint VideoHeight {
- get {
- return this.videoHeight;
- }
- set {
- this.videoHeight= value;
- }
+ get;
+ set;
}
public ushort Fps {
- get {
- return this.fps;
- }
- set {
- if(value == 0)
- //For audio Files
- this.fps=25;
- else
- this.fps = value;
- }
+ get;
+ set;
}
public double Par {
- get {
- if (par == 0)
- return 1;
- return par;
- }
- set {
- par = value;
- }
+ get;
+ set;
}
public Image Preview {
- get {
- if(thumbnailBuf != null)
- return Image.Deserialize(thumbnailBuf);
- return null;
- }
- set {
- if(value != null) {
- thumbnailBuf = value.Serialize();
- } else
- thumbnailBuf = null;
- }
+ get;
+ set;
}
[JsonIgnore]
@@ -209,18 +125,12 @@ namespace LongoMatch.Store
string desc = String.Format ("<b>File path</b>: {0}\n", FilePath);
desc += String.Format ("<b>Format</b>: {0}x{1} @ {2}fps\n", VideoWidth,
VideoHeight, Fps);
- desc += String.Format ("<b>Duration</b>: {0}\n",
- new Time {MSeconds=(int)Length}.ToSecondsString());
+ desc += String.Format ("<b>Duration</b>: {0}\n", Duration.ToSecondsString ());
desc += String.Format ("<b>Video Codec</b>: {0}\n", VideoCodec);
desc += String.Format ("<b>Audio Codec</b>: {0}\n", AudioCodec);
desc += String.Format ("<b>Container</b>: {0}\n", Container);
return desc;
}
}
-
- public uint GetFrames() {
- return (uint)(Fps*Length/1000);
- }
-
}
}
diff --git a/LongoMatch.Core/Store/Period.cs b/LongoMatch.Core/Store/Period.cs
index 215f6cf..90d1b4d 100644
--- a/LongoMatch.Core/Store/Period.cs
+++ b/LongoMatch.Core/Store/Period.cs
@@ -18,6 +18,7 @@
using System;
using System.Linq;
using System.Collections.Generic;
+using Newtonsoft.Json;
namespace LongoMatch.Store
{
@@ -28,6 +29,7 @@ namespace LongoMatch.Store
{
}
+ [JsonIgnore]
public TimeNode PeriodNode {
get {
return new TimeNode {Name=Name,
diff --git a/LongoMatch.Core/Store/PixbufTimeNode.cs b/LongoMatch.Core/Store/PixbufTimeNode.cs
index 5902f3f..6faa2ad 100644
--- a/LongoMatch.Core/Store/PixbufTimeNode.cs
+++ b/LongoMatch.Core/Store/PixbufTimeNode.cs
@@ -33,35 +33,15 @@ namespace LongoMatch.Store
[Serializable]
public class PixbufTimeNode : TimeNode
{
- private byte[] thumbnailBuf;
-
- #region Contructors
public PixbufTimeNode() {
}
- #endregion
- #region Properties
/// <summary>
/// Segment thumbnail
/// </summary>
public Image Miniature {
- get {
- if(thumbnailBuf != null)
- return Image.Deserialize(thumbnailBuf);
- else return null;
- } set {
- if (value == null)
- thumbnailBuf = null;
- else {
- if (value.Height > Constants.MAX_THUMBNAIL_SIZE ||
- value.Width > Constants.MAX_THUMBNAIL_SIZE) {
- value.Scale(Constants.MAX_THUMBNAIL_SIZE,
Constants.MAX_THUMBNAIL_SIZE);
- }
- thumbnailBuf = value.Serialize();
- }
- }
+ get;
+ set;
}
-
- #endregion
}
}
diff --git a/LongoMatch.Core/Store/Play.cs b/LongoMatch.Core/Store/Play.cs
index 1cbaaab..edf87c1 100644
--- a/LongoMatch.Core/Store/Play.cs
+++ b/LongoMatch.Core/Store/Play.cs
@@ -34,22 +34,27 @@ namespace LongoMatch.Store
/// </summary>
[Serializable]
- public class Play : PixbufTimeNode, ITimelineNode
+ public class Play : PixbufTimeNode, ITimelineNode, IIDObject
{
#region Constructors
public Play() {
Drawings = new List<Drawing>();
- Tags = new StringTagStore();
- Players = new PlayersTagStore();
- Teams = new TeamsTagStore();
+ Players = new List<Player> ();
+ Tags = new List<Tag>();
Fps = 25;
PlaybackRate = 1.0;
+ ID = Guid.NewGuid ();
}
#endregion
#region Properties
+ public Guid ID {
+ get;
+ set;
+ }
+
/// <summary>
/// Category in which this play is tagged
/// </summary>
@@ -90,31 +95,6 @@ namespace LongoMatch.Store
}
/// <summary>
- /// Stop frame number
- /// </summary>
- [JsonIgnore]
- public uint StopFrame {
- get {
- return (uint)(Stop.MSeconds * Fps / 1000);
- }
- set {
- Stop = new Time {MSeconds = (int)(1000 * value / Fps)};
- }
- }
-
- /// <summary>
- /// Get the key frame number if this play as key frame drawing or 0
- /// </summary>
- [JsonIgnore]
- public uint KeyFrame {
- get {
- if(HasDrawings)
- return (uint) KeyFrameDrawing.RenderTime * Fps / 1000;
- else return 0;
- }
- }
-
- /// <summary>
/// Get/Set wheter this play is actually loaded. Used in <see
cref="LongoMatch.Gui.Component.TimeScale">
/// </summary>
public bool Selected {
@@ -156,49 +136,26 @@ namespace LongoMatch.Store
}
}
- /// <summary>
- /// Central frame number using (stopFrame-startFrame)/2
- /// </summary>
- [JsonIgnore]
- public uint CentralFrame {
- get {
- return StopFrame-((TotalFrames)/2);
- }
- }
-
- /// <summary>
- /// Number of frames inside the play's boundaries
- /// </summary>
- [JsonIgnore]
- public uint TotalFrames {
- get {
- return StopFrame-StartFrame;
- }
- }
-
- public Team Team {
- get;
- set;
- }
-
- public string GamePeriod {
+ public List<Player> Players {
get;
set;
}
- public StringTagStore Tags {
+ public Team Team {
get;
set;
}
-
- public PlayersTagStore Players {
+
+ public List<Tag> Tags {
get;
set;
}
- public TeamsTagStore Teams {
- get;
- set;
+ [JsonIgnore]
+ public TagsStore TagsStore {
+ get {
+ return new TagsStore {Tags=Tags};
+ }
}
public Coordinates FieldPosition {
@@ -224,19 +181,6 @@ namespace LongoMatch.Store
#endregion
#region Public methods
- /// <summary>
- /// Check if the frame number is inside the play boundaries
- /// </summary>
- /// <param name="frame">
- /// A <see cref="System.Int32"/> with the frame number
- /// </param>
- /// <returns>
- /// A <see cref="System.Boolean"/>
- /// </returns>
- public bool HasFrame(int frame) {
- return (frame>=StartFrame && frame<StopFrame);
- }
-
public override string ToString()
{
return Name + "\n" + Start.ToMSecondsString() + " - " + Stop.ToMSecondsString();
diff --git a/LongoMatch.Core/Store/Player.cs b/LongoMatch.Core/Store/Player.cs
index ee9a6b2..55d3b04 100644
--- a/LongoMatch.Core/Store/Player.cs
+++ b/LongoMatch.Core/Store/Player.cs
@@ -18,6 +18,8 @@
using System;
using LongoMatch.Common;
+using Newtonsoft.Json;
+using LongoMatch.Interfaces;
namespace LongoMatch.Store
{
@@ -25,17 +27,24 @@ namespace LongoMatch.Store
/// Player of a team
/// </summary>
[Serializable]
- public class Player
+ public class Player: IIDObject
{
- private byte[] photo;
#region Constructors
public Player()
{
+ ID = Guid.NewGuid ();
}
+
#endregion
#region Properties
+
+ public Guid ID {
+ get;
+ set;
+ }
+
/// <summary>
/// My name
/// </summary>
@@ -43,6 +52,16 @@ namespace LongoMatch.Store
get;
set;
}
+
+ public string FirstName {
+ get;
+ set;
+ }
+
+ public string NickName {
+ get;
+ set;
+ }
/// <summary>
/// My position in the field
@@ -64,18 +83,8 @@ namespace LongoMatch.Store
/// My photo
/// </summary>
public Image Photo {
- get {
- if(photo != null)
- return Image.Deserialize(photo);
- else
- return null;
- }
- set {
- if(value != null)
- photo = value.Serialize();
- else
- photo = null;
- }
+ get;
+ set;
}
/// <summary>
diff --git a/LongoMatch.Core/Store/Point.cs b/LongoMatch.Core/Store/Point.cs
index b7ad06f..2e8c082 100644
--- a/LongoMatch.Core/Store/Point.cs
+++ b/LongoMatch.Core/Store/Point.cs
@@ -18,11 +18,13 @@
using System;
using System.Collections.Generic;
+using Newtonsoft.Json;
namespace LongoMatch.Common
{
[Serializable]
+ [JsonConverter (typeof (LongoMatchConverter))]
public class Point {
public Point (double x, double y) {
diff --git a/LongoMatch.Core/Store/Project.cs b/LongoMatch.Core/Store/Project.cs
index dfa72f1..a795060 100644
--- a/LongoMatch.Core/Store/Project.cs
+++ b/LongoMatch.Core/Store/Project.cs
@@ -45,19 +45,14 @@ namespace LongoMatch.Store
/// </summary>
///
[Serializable]
- public class Project : IComparable
+ public class Project : IComparable, IIDObject
{
-
- [JsonProperty ("UUID")]
- readonly Guid _UUID;
ProjectDescription description;
- [JsonProperty ("Timeline")]
- List<Play> timeline;
#region Constructors
public Project() {
- _UUID = System.Guid.NewGuid();
- timeline = new List<Play>();
+ ID = System.Guid.NewGuid();
+ Timeline = new List<Play>();
Categories = new Categories();
LocalTeamTemplate = new TeamTemplate();
VisitorTeamTemplate = new TeamTemplate();
@@ -71,11 +66,14 @@ namespace LongoMatch.Store
/// <summary>
/// Unique ID for the project
/// </summary>
- [JsonIgnore]
- public Guid UUID {
- get {
- return _UUID;
- }
+ public Guid ID {
+ get;
+ set;
+ }
+
+ public List<Play> Timeline {
+ get;
+ set;
}
public ProjectDescription Description {
@@ -84,7 +82,7 @@ namespace LongoMatch.Store
}
set {
if (value != null) {
- value.UUID = UUID;
+ value.ID = ID;
}
description = value;
}
@@ -93,6 +91,7 @@ namespace LongoMatch.Store
/// <value>
/// Categories template
/// </value>
+ [JsonProperty(Order = -10)]
public Categories Categories {
get;
set;
@@ -101,6 +100,7 @@ namespace LongoMatch.Store
/// <value>
/// Local team template
/// </value>
+ [JsonProperty(Order = -9)]
public TeamTemplate LocalTeamTemplate {
get;
set;
@@ -109,6 +109,7 @@ namespace LongoMatch.Store
/// <value>
/// Visitor team template
/// </value>
+ [JsonProperty(Order = -8)]
public TeamTemplate VisitorTeamTemplate {
get;
set;
@@ -125,20 +126,9 @@ namespace LongoMatch.Store
}
[JsonIgnore]
- [Obsolete("Game units have been replaced with timers")]
- public GameUnitsList GameUnits {
- set {
- Categories.GameUnits = value;
- }
- get {
- return Categories.GameUnits;
- }
- }
-
- [JsonIgnore]
public IEnumerable<IGrouping<Category, Play>> PlaysGroupedByCategory {
get {
- return timeline.GroupBy(play => play.Category);
+ return Timeline.GroupBy(play => play.Category);
}
}
#endregion
@@ -148,10 +138,10 @@ namespace LongoMatch.Store
/// Frees all the project's resources helping the GC
/// </summary>
public void Clear() {
- timeline.Clear();
- Categories.Clear();
- VisitorTeamTemplate.Clear();
- LocalTeamTemplate.Clear();
+ Timeline.Clear();
+ Categories.List.Clear();
+ VisitorTeamTemplate.List.Clear();
+ LocalTeamTemplate.List.Clear();
Periods.Clear();
Timers.Clear();
}
@@ -188,12 +178,12 @@ namespace LongoMatch.Store
Miniature = miniature,
Fps = Description.File.Fps,
};
- timeline.Add(play);
+ Timeline.Add(play);
return play;
}
public void AddPlay (Play play) {
- timeline.Add(play);
+ Timeline.Add(play);
}
/// <summary>
@@ -207,7 +197,7 @@ namespace LongoMatch.Store
/// </param>
public void RemovePlays(List<Play> plays) {
foreach(Play play in plays)
- timeline.Remove(play);
+ Timeline.Remove(play);
}
/// <summary>
@@ -217,56 +207,47 @@ namespace LongoMatch.Store
/// A <see cref="System.Int32"/>: category index
/// </param>
public void RemoveCategory(Category category) {
- if(Categories.Count == 1)
+ if(Categories.List.Count == 1)
throw new Exception("You can't remove the last Category");
- Categories.Remove(category);
+ Categories.List.Remove(category);
- timeline.RemoveAll(p => p.Category.UUID == category.UUID);
+ Timeline.RemoveAll(p => p.Category.ID == category.ID);
}
public void RemovePlayer(TeamTemplate template, Player player) {
- if(template.Count == 1)
+ if(template.List.Count == 1)
throw new Exception("You can't remove the last Player");
- template.Remove(player);
- foreach (var play in timeline) {
- play.Players.RemoveByPlayer(player);
+ template.List.Remove(player);
+ foreach (var play in Timeline) {
+ play.Players.RemoveAll (p => p == player);
}
}
- public void DeleteSubcategoryTags(Category cat, List<ISubCategory> subcategories) {
- foreach (var play in timeline.Where(p => p.Category == cat)) {
+ public void DeleteSubcategoryTags(Category cat, List<SubCategory> subcategories) {
+ foreach (var play in Timeline.Where(p => p.Category == cat)) {
foreach (var subcat in subcategories) {
Log.Error(play.Name);
- if (subcat is TagSubCategory)
- play.Tags.RemoveBySubcategory(subcat);
- else if (subcat is TeamSubCategory)
- play.Teams.RemoveBySubcategory(subcat);
- else if (subcat is PlayerSubCategory)
- play.Players.RemoveBySubcategory(subcat);
+ if (subcat is SubCategory)
+ play.TagsStore.RemoveBySubcategory(subcat);
}
}
}
public List<Play> PlaysInCategory(Category category) {
- return timeline.Where(p => p.Category.UUID == category.UUID).ToList();
+ return Timeline.Where(p => p.Category.ID == category.ID).ToList();
}
- public List<Play> AllPlays() {
- return timeline;
- }
-
-
public bool Equals(Project project) {
if(project == null)
return false;
else
- return UUID == project.UUID;
+ return ID == project.ID;
}
public int CompareTo(object obj) {
if(obj is Project) {
Project project = (Project) obj;
- return UUID.CompareTo(project.UUID);
+ return ID.CompareTo(project.ID);
}
else
throw new ArgumentException("object is not a Project and cannot be compared");
@@ -274,12 +255,12 @@ namespace LongoMatch.Store
public static void Export(Project project, string file) {
file = Path.ChangeExtension(file, Constants.PROJECT_EXT);
- SerializableObject.Save(project, file);
+ Serializer.Save(project, file);
}
public static Project Import(string file) {
try {
- return SerializableObject.Load<Project>(file);
+ return Serializer.Load<Project>(file);
}
catch (Exception e){
Log.Exception (e);
diff --git a/LongoMatch.Core/Store/ProjectDescription.cs b/LongoMatch.Core/Store/ProjectDescription.cs
index 3d2ab5b..68f0deb 100644
--- a/LongoMatch.Core/Store/ProjectDescription.cs
+++ b/LongoMatch.Core/Store/ProjectDescription.cs
@@ -19,6 +19,7 @@
using System;
using Newtonsoft.Json;
using LongoMatch.Store;
+using LongoMatch.Interfaces;
namespace LongoMatch.Store
{
@@ -27,12 +28,12 @@ namespace LongoMatch.Store
/// Describes a project in LongoMatch.
/// </summary>
[Serializable]
- public class ProjectDescription : IComparable
+ public class ProjectDescription : IComparable, IIDObject
{
/// <summary>
/// Unique ID of the parent project
/// </summary>
- public Guid UUID {
+ public Guid ID {
get;
set;
}
@@ -72,7 +73,22 @@ namespace LongoMatch.Store
get;
set;
}
+
+ public string Category {
+ get;
+ set;
+ }
+ public string Group {
+ get;
+ set;
+ }
+
+ public string Phase {
+ get;
+ set;
+ }
+
/// <summary>
/// Name of the local team
/// </summary>
@@ -113,7 +129,7 @@ namespace LongoMatch.Store
get;
set;
}
-
+
/// <summary>
/// String representing the video format like "widhtxheight fps"
/// </summary>
@@ -137,7 +153,7 @@ namespace LongoMatch.Store
ProjectDescription project = (ProjectDescription) obj;
if (File == null || project.File == null)
- return UUID.CompareTo(project.UUID);
+ return ID.CompareTo(project.ID);
return this.File.FilePath.CompareTo(project.File.FilePath);
}
else
diff --git a/LongoMatch.Core/Store/SubCategory.cs b/LongoMatch.Core/Store/SubCategory.cs
index f05f8e8..f97fcf5 100644
--- a/LongoMatch.Core/Store/SubCategory.cs
+++ b/LongoMatch.Core/Store/SubCategory.cs
@@ -41,18 +41,15 @@ namespace LongoMatch.Store
/// Goal category to extends its tags.
/// </summary>
[Serializable]
- [JsonObject]
- public class SubCategory<T>: List<T>, ISubCategory
+ public class SubCategory
{
public SubCategory() {
Name = "";
AllowMultiple = true;
- FastTag = true;
+ Options = new List<string>();
}
- public SubCategory(IEnumerable<T> list): base(list) {}
-
/// <summary>
/// Name of the subcategory
/// </summary>
@@ -60,25 +57,25 @@ namespace LongoMatch.Store
get;
set;
}
-
+
/// <summary>
- /// Wheter this subcategory allow multiple options.
- /// eg: Team will only allow one option, because a goal can't be scored by 2 teams
+ /// Gets or sets the list of available options.
/// </summary>
- public bool AllowMultiple {
+ /// <value>The options.</value>
+ public List<string> Options {
get;
set;
}
/// <summary>
- /// Whether this SubCategory should be added to the tagging widget shown after
- /// creating a new play.
+ /// Wheter this subcategory allow multiple options.
+ /// eg: Team will only allow one option, because a goal can't be scored by 2 teams
/// </summary>
- public bool FastTag {
+ public bool AllowMultiple {
get;
set;
}
-
+
protected string RenderDesc(string type, string values) {
string str;
@@ -89,98 +86,12 @@ namespace LongoMatch.Store
}
public virtual string ToMarkupString(){
- return this.ToString();
- }
-
- public List<string> ElementsDesc () {
- return this.Select(e => e.ToString()).ToList();
- }
- }
-
- [Serializable]
- public class TagSubCategory: SubCategory<string> {
-
- public TagSubCategory () {}
-
- public TagSubCategory (IEnumerable<string> tags): base(tags) {}
-
- public override string ToMarkupString(){
- string tags = "";
+ string tags;
- foreach (string tag in this) {
- if (tags == "")
- tags += tag;
- else
- tags += " - " + tag;
- }
+ tags = String.Join (" - ", Options);
return RenderDesc (Catalog.GetString("Tags list"),
Catalog.GetString("Tags:" +
String.Format(" <b>{0}</b>", tags)));
}
-
- }
-
- /// <summary>
- /// SubCategory to tag Players
- /// Stores a list of teams to be shown in the options.
- /// The teams LOCAL, VISITOR will be then mapped to a list of players
- /// for this team, so that a change in the team's templates will not
- /// affect the list of available players.
- /// </summary>
- [Serializable]
- public class PlayerSubCategory: SubCategory<Team> {
-
- public bool PositionFilter {get; set;}
-
- public override string ToMarkupString(){
- string teams = "";
- if (this.Contains(Team.LOCAL))
- teams += Catalog.GetString("Local ");
- if (this.Contains(Team.VISITOR))
- teams += Catalog.GetString("Visitor");
-
- return RenderDesc(Catalog.GetString("List of players"),
- Catalog.GetString("Teams:" +
- String.Format(" <b>{0}</b>", teams)));
- }
- }
-
- /// <summary>
- /// SubCategory to tag teams
- /// A list of options containing the teams to be shown in the options.
- /// The teams LOCAL, VISITOR and NONE are then mapped to real team names
- /// so that a change in the name doesn't affect the category.
- /// </summary>
- [Serializable]
- public class TeamSubCategory: SubCategory<Team> {
-
- public TeamSubCategory() {
- Name = Catalog.GetString("Team");
- AllowMultiple=true;
- FastTag=true;
- Add(Team.LOCAL);
- Add(Team.VISITOR);
- }
-
- public override string ToMarkupString(){
- return RenderDesc(Catalog.GetString("Team selection"), "");
- }
- }
-
- /// <summary>
- /// SubCategory to tag locations or trajectories in the game field
- /// </summary>
- [Serializable]
- public class CoordinatesSubCategory: SubCategory<Coordinates> {
-
- /* Use 1 for locations or 2 for trajectories */
- public int NumCoordinates {
- get;
- set;
- }
-
- public override string ToMarkupString(){
- return RenderDesc(Catalog.GetString("Coordinates"), "");
- }
}
}
\ No newline at end of file
diff --git a/LongoMatch.Core/Store/Tag.cs b/LongoMatch.Core/Store/Tag.cs
index 0f87028..ec8b720 100644
--- a/LongoMatch.Core/Store/Tag.cs
+++ b/LongoMatch.Core/Store/Tag.cs
@@ -27,88 +27,24 @@ namespace LongoMatch.Store
{
[Serializable]
- public class Tag<T>: ITag<T>
+ public class Tag
{
public Tag() {
}
- public ISubCategory SubCategory {
+ public SubCategory SubCategory {
set;
get;
}
- public T Value {
+ public string Value {
get;
set;
}
- }
-
- [Serializable]
- public class StringTag: Tag<string>
- {
- public StringTag() {}
-
- public override bool Equals (object obj)
- {
- StringTag tag = obj as StringTag;
- if (tag == null)
- return false;
- return Value.Equals (tag.Value) && SubCategory.Equals(tag.SubCategory);
- }
-
- public override int GetHashCode ()
- {
- return Value.GetHashCode ();
- }
- }
-
- [Serializable]
- public class PlayerTag: Tag<Player>
- {
- public PlayerTag() {}
-
- public override bool Equals (object obj)
- {
- PlayerTag tag = obj as PlayerTag;
- if (tag == null)
- return false;
- return Value.Equals (tag.Value) && SubCategory.Equals(tag.SubCategory) ;
- }
-
- public override int GetHashCode ()
- {
- return Value.GetHashCode ();
- }
- }
-
- [Serializable]
- public class TeamTag: Tag<Team>
- {
- public TeamTag() {}
-
- public override bool Equals (object obj)
- {
- TeamTag tag = obj as TeamTag;
- if (tag == null)
- return false;
- return Value.Equals (tag.Value) && SubCategory.Equals(tag.SubCategory);
- }
-
- public override int GetHashCode ()
- {
- return Value.GetHashCode ();
- }
- }
-
- [Serializable]
- public class CoordinatesTag: Tag<Coordinates>
- {
- public CoordinatesTag() {}
-
public override bool Equals (object obj)
{
- CoordinatesTag tag = obj as CoordinatesTag;
+ Tag tag = obj as Tag;
if (tag == null)
return false;
return Value.Equals (tag.Value) && SubCategory.Equals(tag.SubCategory);
@@ -116,7 +52,11 @@ namespace LongoMatch.Store
public override int GetHashCode ()
{
- return Value.GetHashCode ();
+ if (Value != null) {
+ return Value.GetHashCode ();
+ } else {
+ return base.GetHashCode ();
+ }
}
}
}
diff --git a/LongoMatch.Core/Store/TagStore.cs b/LongoMatch.Core/Store/TagStore.cs
index 92d8323..282ed0f 100644
--- a/LongoMatch.Core/Store/TagStore.cs
+++ b/LongoMatch.Core/Store/TagStore.cs
@@ -27,83 +27,58 @@ using LongoMatch.Store;
namespace LongoMatch.Store
{
[Serializable]
- [JsonObject (MemberSerialization = MemberSerialization.OptIn)]
- public class TagsStore<T, W> where T:ITag<W>
+ public class TagsStore
{
- protected List<T> tagsList;
-
public TagsStore(){
- tagsList = new List<T>();
+ Tags = new List<Tag>();
}
- [JsonProperty ("Tags")]
- public List<T> Tags {
- get{
- return tagsList;
- }
- set {
- tagsList = value;
- }
+ public List<Tag> Tags {
+ get;
+ set;
}
- public void Add(T tag) {
+ public void Add(Tag tag) {
Log.Debug(String.Format("Adding tag {0} with subcategory{1}", tag, tag.SubCategory));
- tagsList.Add(tag);
+ Tags.Add(tag);
}
- public void Remove(T tag) {
+ public void Remove(Tag tag) {
try {
- tagsList.Remove (tag);
+ Tags.Remove (tag);
} catch (Exception e) {
Log.Warning("Error removing tag " + tag.ToString());
Log.Exception(e);
}
}
- public bool Contains(T tag) {
- return tagsList.Contains(tag);
+ public bool Contains(Tag tag) {
+ return Tags.Contains(tag);
}
- public void RemoveBySubcategory(ISubCategory subcat) {
- tagsList.RemoveAll(t => t.SubCategory == subcat);
+ public void RemoveBySubcategory(SubCategory subcat) {
+ Tags.RemoveAll(t => t.SubCategory == subcat);
}
- public List<T> AllUniqueElements {
+ [JsonIgnore]
+ public List<Tag> AllUniqueElements {
get {
- return (from tag in tagsList
+ return (from tag in Tags
group tag by tag into g
select g.Key).ToList();
}
}
- public List<T> GetTags(ISubCategory subCategory) {
- return (from tag in tagsList
+ public List<Tag> GetTags(SubCategory subCategory) {
+ return (from tag in Tags
where tag.SubCategory.Equals(subCategory)
select tag).ToList();
}
- public List<W> GetTagsValues() {
- return (from tag in tagsList
+ public List<string> GetTagsValues() {
+ return (from tag in Tags
select tag.Value).ToList();
}
}
-
- [Serializable]
- public class StringTagStore: TagsStore<StringTag, string> {}
-
- [Serializable]
- public class PlayersTagStore: TagsStore<PlayerTag, Player> {
-
- public void RemoveByPlayer(Player player) {
- tagsList.RemoveAll(t => t.Value == player);
- }
-
- }
-
- [Serializable]
- public class TeamsTagStore: TagsStore<TeamTag, Team> {}
-
- [Serializable]
- public class CoordinatesTagStore: TagsStore<CoordinatesTag, Coordinates> {}
}
diff --git a/LongoMatch.Core/Store/Templates/CategoriesTemplate.cs
b/LongoMatch.Core/Store/Templates/CategoriesTemplate.cs
index c04487f..21684a4 100644
--- a/LongoMatch.Core/Store/Templates/CategoriesTemplate.cs
+++ b/LongoMatch.Core/Store/Templates/CategoriesTemplate.cs
@@ -40,13 +40,8 @@ namespace LongoMatch.Store.Templates
/// The <see cref="LongoMatch.DB.Project"/> must handle all the changes
/// </summary>
[Serializable]
- [JsonObject]
- public class Categories: List<Category>, ITemplate, ITemplate<Category>
+ public class Categories: ITemplate, ITemplate<Category>
{
- /* Database additions */
- GameUnitsList gameUnits;
- Version version;
- byte[] fieldImage, halfFieldImage, goalImage ;
/// <summary>
/// Creates a new template
@@ -55,28 +50,23 @@ namespace LongoMatch.Store.Templates
FieldBackground = Config.FieldBackground;
HalfFieldBackground = Config.HalfFieldBackground;
GoalBackground = Config.GoalBackground;
+ ID = Guid.NewGuid ();
+ List = new List<Category>();
}
-
- public string Name {
+
+ public Guid ID {
get;
set;
}
- public Version Version {
+ public List<Category> List {
get;
set;
}
-
- public GameUnitsList GameUnits {
- set {
- gameUnits = value;
- }
- get {
- if (gameUnits == null) {
- gameUnits = new GameUnitsList();
- }
- return gameUnits;
- }
+
+ public string Name {
+ get;
+ set;
}
public List<string> GamePeriods {
@@ -89,83 +79,34 @@ namespace LongoMatch.Store.Templates
set;
}
-
-
- /* Keep this for backwards compatiblity with 0.18.11 */
- [JsonIgnore]
- public Image FieldBackgroundImage {get; set;}
- [JsonIgnore]
- public Image HalfFieldBackgroundImage {get; set;}
- [JsonIgnore]
- public Image GoalBackgroundImage {get; set;}
-
public Image FieldBackground {
- get {
- if(fieldImage != null)
- return Image.Deserialize(fieldImage);
- else return null;
- }
- set {
- if (value != null) {
- if (value.Width > 500) {
- value.Scale (500, 500);
- }
- fieldImage = value.Serialize();
- }
- else
- fieldImage = null;
- }
+ get;
+ set;
}
public Image HalfFieldBackground {
- get {
- if(halfFieldImage != null)
- return Image.Deserialize(halfFieldImage);
- else return null;
- }
- set {
- if (value != null) {
- if (value.Width > 500) {
- value.Scale (500, 500);
- }
- halfFieldImage = value.Serialize();
- }
- else
- halfFieldImage = null;
- }
+ get;
+ set;
}
public Image GoalBackground {
- get {
- if(goalImage != null)
- return Image.Deserialize(goalImage);
- else return null;
- }
- set {
- if (value != null) {
- if (value.Width > 500) {
- value.Scale (500, 500);
- }
- goalImage = value.Serialize();
- }
- else
- goalImage = null;
- }
+ get;
+ set;
}
public void Save(string filePath) {
- SerializableObject.Save(this, filePath);
+ Serializer.Save(this, filePath);
}
public void AddDefaultSubcategories (Category cat) {
- TagSubCategory resultsubcat;
+ SubCategory resultsubcat;
- resultsubcat = new TagSubCategory {
+ resultsubcat = new SubCategory {
Name = Catalog.GetString ("Outcome"),
AllowMultiple = false,
};
- resultsubcat.Add (Catalog.GetString ("Success"));
- resultsubcat.Add (Catalog.GetString ("Failure"));
+ resultsubcat.Options.Add (Catalog.GetString ("Success"));
+ resultsubcat.Options.Add (Catalog.GetString ("Failure"));
cat.SubCategories.Add(resultsubcat);
}
@@ -173,7 +114,6 @@ namespace LongoMatch.Store.Templates
Color c = Color.Red;
HotKey h = new HotKey();
-
Category cat = new Category {
Name = "Category " + index,
Color = c,
@@ -184,12 +124,12 @@ namespace LongoMatch.Store.Templates
Position = index-1,
};
AddDefaultSubcategories(cat);
- Insert(index, cat);
+ List.Insert(index, cat);
return cat;
}
public static Categories Load(string filePath) {
- Categories cat = SerializableObject.LoadSafe<Categories>(filePath);
+ Categories cat = Serializer.LoadSafe<Categories>(filePath);
if (cat.GamePeriods == null) {
cat.GamePeriods = new List<string>();
cat.GamePeriods.Add ("1");
@@ -206,7 +146,6 @@ namespace LongoMatch.Store.Templates
periods.Add ("1");
periods.Add ("2");
defaultTemplate.GamePeriods = periods;
- defaultTemplate.Version = new Version (Constants.DB_MAYOR_VERSION,
Constants.DB_MINOR_VERSION);
return defaultTemplate;
}
diff --git a/LongoMatch.Core/Store/Templates/TeamTemplate.cs b/LongoMatch.Core/Store/Templates/TeamTemplate.cs
index 5e8cbdf..239024e 100644
--- a/LongoMatch.Core/Store/Templates/TeamTemplate.cs
+++ b/LongoMatch.Core/Store/Templates/TeamTemplate.cs
@@ -28,21 +28,30 @@ using LongoMatch.Interfaces;
namespace LongoMatch.Store.Templates
{
[Serializable]
- [JsonObject]
- public class TeamTemplate: List<Player>, ITemplate<Player>
+ public class TeamTemplate: ITemplate<Player>
{
- private byte[] thumbnailBuf;
private const int MAX_WIDTH=100;
private const int MAX_HEIGHT=100;
- Version version;
- public TeamTemplate() {
+ public TeamTemplate () {
TeamName = Catalog.GetString("Team");
if (Formation == null) {
FormationStr = "1-4-3-3";
}
+ ID = Guid.NewGuid();
+ List = new List<Player>();
}
-
+
+ public Guid ID {
+ get;
+ set;
+ }
+
+ public List<Player> List {
+ get;
+ set;
+ }
+
public String Name {
get;
set;
@@ -53,27 +62,16 @@ namespace LongoMatch.Store.Templates
set;
}
- public Version Version {
+ public Image Shield {
get;
set;
}
- public Image Shield {
+ [JsonIgnore]
+ public int PlayingPlayers {
get {
- if(thumbnailBuf != null)
- return Image.Deserialize(thumbnailBuf);
- else return null;
- } set {
- if (value == null)
- thumbnailBuf = null;
- else
- thumbnailBuf = value.Serialize();
+ return Formation.Sum();
}
- }
-
- public int PlayingPlayers {
- get;
- protected set;
}
public int[] Formation {
@@ -95,7 +93,6 @@ namespace LongoMatch.Store.Templates
throw new FormatException ();
}
}
- PlayingPlayers = tactics.Sum();
Formation = tactics;
}
get {
@@ -106,12 +103,12 @@ namespace LongoMatch.Store.Templates
[JsonIgnore]
public List<Player> PlayingPlayersList {
get {
- return this.Where(p=>p.Playing).Select(p=>p).ToList();
+ return List.Where(p=>p.Playing).Select(p=>p).ToList();
}
}
public void Save(string filePath) {
- SerializableObject.Save(this, filePath);
+ Serializer.Save(this, filePath);
}
public Player AddDefaultItem (int i) {
@@ -124,12 +121,12 @@ namespace LongoMatch.Store.Templates
Position = "",
Photo = null,
Playing = true,};
- Insert (i, p);
+ List.Insert (i, p);
return p;
}
public static TeamTemplate Load(string filePath) {
- TeamTemplate template = SerializableObject.LoadSafe<TeamTemplate>(filePath);
+ TeamTemplate template = Serializer.LoadSafe<TeamTemplate>(filePath);
if (template.Formation == null) {
template.FormationStr = "1-4-3-3";
}
@@ -142,11 +139,10 @@ namespace LongoMatch.Store.Templates
return defaultTemplate;
}
- private void FillDefaultTemplate(int playersCount) {
- Clear();
+ void FillDefaultTemplate(int playersCount) {
+ List.Clear();
for(int i=1; i<=playersCount; i++)
AddDefaultItem(i-1);
- version = new Version (Constants.DB_MAYOR_VERSION, Constants.DB_MINOR_VERSION);
}
}
}
diff --git a/LongoMatch.Core/Store/Time.cs b/LongoMatch.Core/Store/Time.cs
index 2de8962..10d17dc 100644
--- a/LongoMatch.Core/Store/Time.cs
+++ b/LongoMatch.Core/Store/Time.cs
@@ -20,6 +20,7 @@
using System;
using Newtonsoft.Json;
+using LongoMatch.Common;
namespace LongoMatch.Store
{
@@ -29,6 +30,7 @@ namespace LongoMatch.Store
/// It's expressed in miliseconds and provide some helper methods for time conversion and
representation
/// </summary>
[Serializable]
+ [JsonConverter (typeof (LongoMatchConverter))]
public class Time : IComparable
{
private const int MS = 1000000 ;
diff --git a/LongoMatch.Core/Utils.cs b/LongoMatch.Core/Utils.cs
index 5186ecd..836d436 100644
--- a/LongoMatch.Core/Utils.cs
+++ b/LongoMatch.Core/Utils.cs
@@ -47,7 +47,7 @@ namespace LongoMatch.Utils
if(!mediaFile.HasVideo || mediaFile.VideoCodec == "")
throw new Exception(Catalog.GetString("This file doesn't contain a
video stream."));
- if(mediaFile.HasVideo && mediaFile.Length == 0)
+ if(mediaFile.HasVideo && mediaFile.Duration.MSeconds == 0)
throw new Exception(Catalog.GetString("This file contains a video
stream but its length is 0."));
if (multimedia.FileNeedsRemux (mediaFile)) {
string q = Catalog.GetString("The file you are trying to load is not
properly supported. " +
diff --git a/LongoMatch.Drawing/Widgets/CategoriesLabels.cs b/LongoMatch.Drawing/Widgets/CategoriesLabels.cs
index ac96f99..535d961 100644
--- a/LongoMatch.Drawing/Widgets/CategoriesLabels.cs
+++ b/LongoMatch.Drawing/Widgets/CategoriesLabels.cs
@@ -61,7 +61,7 @@ namespace LongoMatch.Drawing.Widgets
widget.Width = Common.CATEGORY_WIDTH;
/* Start from bottom to top with categories */
- foreach (Category cat in project.Categories) {
+ foreach (Category cat in project.Categories.List) {
CategoryLabel l;
/* Add the category label */
diff --git a/LongoMatch.Drawing/Widgets/PlaysTimeline.cs b/LongoMatch.Drawing/Widgets/PlaysTimeline.cs
index 646b0a6..f8d961a 100644
--- a/LongoMatch.Drawing/Widgets/PlaysTimeline.cs
+++ b/LongoMatch.Drawing/Widgets/PlaysTimeline.cs
@@ -51,8 +51,8 @@ namespace LongoMatch.Drawing.Widgets
this.project = project;
Objects.Clear();
categories.Clear();
- duration= new Time ((int)project.Description.File.Length);
- widget.Height = project.Categories.Count * Common.CATEGORY_HEIGHT;
+ duration = project.Description.File.Duration;
+ widget.Height = project.Categories.List.Count * Common.CATEGORY_HEIGHT;
playsFilter = filter;
FillCanvas ();
filter.FilterUpdated += UpdateVisibleCategories;
@@ -97,7 +97,7 @@ namespace LongoMatch.Drawing.Widgets
}
void FillCanvas () {
- for (int i=0; i<project.Categories.Count; i++) {
+ for (int i=0; i<project.Categories.List.Count; i++) {
Category cat;
CategoryTimeline tl;
Color c;
@@ -108,7 +108,7 @@ namespace LongoMatch.Drawing.Widgets
c = Color.Grey1;
}
- cat = project.Categories[i];
+ cat = project.Categories.List[i];
tl = new CategoryTimeline (project.PlaysInCategory (cat),
duration, i * Common.CATEGORY_HEIGHT, c);
categories[cat] = tl;
diff --git a/LongoMatch.Drawing/Widgets/TeamTagger.cs b/LongoMatch.Drawing/Widgets/TeamTagger.cs
index 1fd11f2..a746017 100644
--- a/LongoMatch.Drawing/Widgets/TeamTagger.cs
+++ b/LongoMatch.Drawing/Widgets/TeamTagger.cs
@@ -170,7 +170,7 @@ namespace LongoMatch.Drawing.Widgets
for (int col=0; col < template.Formation.Length; col ++) {
double colX, rowHeight;
- if (template.Count == index)
+ if (template.List.Count == index)
break;
if (team == Team.LOCAL) {
@@ -182,18 +182,18 @@ namespace LongoMatch.Drawing.Widgets
for (int row=0; row < template.Formation[col]; row ++) {
Point p = new Point (colX, rowHeight * row + rowHeight / 2);
- PlayerObject po = new PlayerObject (template [index], p);
+ PlayerObject po = new PlayerObject (template.List [index], p);
po.IconSize = size;
po.UnSelectedColor = color;
Objects.Add (po);
index ++;
- if (template.Count == index)
+ if (template.List.Count == index)
break;
}
}
/* Substitution players */
- for (int i = index; i < template.Count; i++) {
+ for (int i = index; i < template.List.Count; i++) {
PlayerObject po;
double x, y;
int reli = i - index;
@@ -205,7 +205,7 @@ namespace LongoMatch.Drawing.Widgets
x += BenchWidth + backgroundWidth;
}
- po = new PlayerObject (template [i], new Point (x, y));
+ po = new PlayerObject (template.List [i], new Point (x, y));
po.IconSize = PlayersIconSize.Small;
po.UnSelectedColor = color;
Objects.Add (po);
@@ -232,16 +232,16 @@ namespace LongoMatch.Drawing.Widgets
if (SubstitutionsMode) {
bool subsDone = false;
if (homeTeam != null) {
- List<Player> hplayers = players.Where (p => homeTeam.Contains
(p)).ToList();
+ List<Player> hplayers = players.Where (p => homeTeam.List.Contains
(p)).ToList();
if (hplayers.Count == 2) {
- homeTeam.Swap (hplayers[0], hplayers[1]);
+ homeTeam.List.Swap (hplayers[0], hplayers[1]);
subsDone = true;
}
}
if (awayTeam != null) {
- List<Player> aplayers = players.Where (p => awayTeam.Contains
(p)).ToList();
+ List<Player> aplayers = players.Where (p => awayTeam.List.Contains
(p)).ToList();
if (aplayers.Count == 2) {
- awayTeam.Swap (aplayers[0], aplayers[1]);
+ awayTeam.List.Swap (aplayers[0], aplayers[1]);
subsDone = true;
}
}
diff --git a/LongoMatch.GUI.Multimedia/Gui/PlayerBin.cs b/LongoMatch.GUI.Multimedia/Gui/PlayerBin.cs
index fe6765c..672b7cf 100644
--- a/LongoMatch.GUI.Multimedia/Gui/PlayerBin.cs
+++ b/LongoMatch.GUI.Multimedia/Gui/PlayerBin.cs
@@ -258,7 +258,7 @@ namespace LongoMatch.Gui
public void StepBackward() {
Jump(-(int)jumpspinbutton.Value);
}
-
+
public void FramerateUp() {
vscale1.Adjustment.Value += vscale1.Adjustment.StepIncrement;
}
@@ -326,9 +326,9 @@ namespace LongoMatch.Gui
pausebutton.Clicked += OnPausebuttonClicked;
drawbutton.Clicked += OnDrawButtonClicked;
timescale.ValueChanged += OnTimescaleValueChanged;
- timescale.AdjustBounds += OnTimescaleAdjustBounds;
+ timescale.AdjustBounds += OnTimescaleAdjustBounds;
vscale1.FormatValue += OnVscale1FormatValue;
- vscale1.ValueChanged += OnVscale1ValueChanged;
+ vscale1.ValueChanged += OnVscale1ValueChanged;
drawbutton.Clicked += OnDrawButtonClicked;
volumebutton.Clicked += OnVolumebuttonClicked;
diff --git a/LongoMatch.GUI.Multimedia/gtk-gui/LongoMatch.Gui.CapturerBin.cs
b/LongoMatch.GUI.Multimedia/gtk-gui/LongoMatch.Gui.CapturerBin.cs
index 5df4fc9..37d8b05 100644
--- a/LongoMatch.GUI.Multimedia/gtk-gui/LongoMatch.Gui.CapturerBin.cs
+++ b/LongoMatch.GUI.Multimedia/gtk-gui/LongoMatch.Gui.CapturerBin.cs
@@ -12,7 +12,7 @@ namespace LongoMatch.Gui
private global::Gtk.Button pausebutton;
private global::Gtk.Button stopbutton;
private global::Gtk.Label timelabel;
-
+
protected virtual void Build ()
{
global::Stetic.Gui.Initialize (this);
diff --git a/LongoMatch.GUI.Multimedia/gtk-gui/LongoMatch.Gui.PlayerBin.cs
b/LongoMatch.GUI.Multimedia/gtk-gui/LongoMatch.Gui.PlayerBin.cs
index 0d3d932..4ceac28 100644
--- a/LongoMatch.GUI.Multimedia/gtk-gui/LongoMatch.Gui.PlayerBin.cs
+++ b/LongoMatch.GUI.Multimedia/gtk-gui/LongoMatch.Gui.PlayerBin.cs
@@ -29,7 +29,7 @@ namespace LongoMatch.Gui
private global::Gtk.Label timelabel;
private global::Gtk.Button volumebutton;
private global::Gtk.Button detachbutton;
-
+
protected virtual void Build ()
{
global::Stetic.Gui.Initialize (this);
@@ -61,6 +61,7 @@ namespace LongoMatch.Gui
this.videoeventbox.Name = "videoeventbox";
// Container child videoeventbox.Gtk.Container+ContainerChild
this.videodrawingarea = new global::Gtk.DrawingArea ();
+ this.videodrawingarea.CanFocus = true;
this.videodrawingarea.Name = "videodrawingarea";
this.videoeventbox.Add (this.videodrawingarea);
this.hbox2.Add (this.videoeventbox);
diff --git a/LongoMatch.GUI.Multimedia/gtk-gui/LongoMatch.Gui.PlayerCapturerBin.cs
b/LongoMatch.GUI.Multimedia/gtk-gui/LongoMatch.Gui.PlayerCapturerBin.cs
index 7bc09bc..80dc178 100644
--- a/LongoMatch.GUI.Multimedia/gtk-gui/LongoMatch.Gui.PlayerCapturerBin.cs
+++ b/LongoMatch.GUI.Multimedia/gtk-gui/LongoMatch.Gui.PlayerCapturerBin.cs
@@ -9,7 +9,7 @@ namespace LongoMatch.Gui
private global::LongoMatch.Gui.PlayerBin playerbin;
private global::LongoMatch.Gui.CapturerBin capturerbin;
private global::Gtk.Button backtolivebutton;
-
+
protected virtual void Build ()
{
global::Stetic.Gui.Initialize (this);
diff --git a/LongoMatch.GUI.Multimedia/gtk-gui/LongoMatch.Gui.VolumeWindow.cs
b/LongoMatch.GUI.Multimedia/gtk-gui/LongoMatch.Gui.VolumeWindow.cs
index f031c6c..efcfcfe 100644
--- a/LongoMatch.GUI.Multimedia/gtk-gui/LongoMatch.Gui.VolumeWindow.cs
+++ b/LongoMatch.GUI.Multimedia/gtk-gui/LongoMatch.Gui.VolumeWindow.cs
@@ -8,7 +8,7 @@ namespace LongoMatch.Gui
private global::Gtk.Button morebutton;
private global::Gtk.VScale volumescale;
private global::Gtk.Button lessbutton;
-
+
protected virtual void Build ()
{
global::Stetic.Gui.Initialize (this);
diff --git a/LongoMatch.GUI.Multimedia/gtk-gui/generated.cs b/LongoMatch.GUI.Multimedia/gtk-gui/generated.cs
index d23ef38..0ada9fc 100644
--- a/LongoMatch.GUI.Multimedia/gtk-gui/generated.cs
+++ b/LongoMatch.GUI.Multimedia/gtk-gui/generated.cs
@@ -5,7 +5,7 @@ namespace Stetic
internal class Gui
{
private static bool initialized;
-
+
internal static void Initialize (Gtk.Widget iconRenderer)
{
if ((Stetic.Gui.initialized == false)) {
@@ -13,12 +13,12 @@ namespace Stetic
}
}
}
-
+
internal class BinContainer
{
private Gtk.Widget child;
private Gtk.UIManager uimanager;
-
+
public static BinContainer Attach (Gtk.Bin bin)
{
BinContainer bc = new BinContainer ();
@@ -27,32 +27,32 @@ namespace Stetic
bin.Added += new Gtk.AddedHandler (bc.OnAdded);
return bc;
}
-
+
private void OnSizeRequested (object sender, Gtk.SizeRequestedArgs args)
{
if ((this.child != null)) {
args.Requisition = this.child.SizeRequest ();
}
}
-
+
private void OnSizeAllocated (object sender, Gtk.SizeAllocatedArgs args)
{
if ((this.child != null)) {
this.child.Allocation = args.Allocation;
}
}
-
+
private void OnAdded (object sender, Gtk.AddedArgs args)
{
this.child = args.Widget;
}
-
+
public void SetUiManager (Gtk.UIManager uim)
{
this.uimanager = uim;
this.child.Realized += new System.EventHandler (this.OnRealized);
}
-
+
private void OnRealized (object sender, System.EventArgs args)
{
if ((this.uimanager != null)) {
@@ -65,7 +65,7 @@ namespace Stetic
}
}
}
-
+
internal class IconLoader
{
public static Gdk.Pixbuf LoadIcon (Gtk.Widget widget, string name, Gtk.IconSize size)
@@ -99,14 +99,14 @@ namespace Stetic
}
}
}
-
+
internal class ActionGroups
{
public static Gtk.ActionGroup GetActionGroup (System.Type type)
{
return Stetic.ActionGroups.GetActionGroup (type.FullName);
}
-
+
public static Gtk.ActionGroup GetActionGroup (string name)
{
return null;
diff --git a/LongoMatch.GUI.Multimedia/gtk-gui/gui.stetic b/LongoMatch.GUI.Multimedia/gtk-gui/gui.stetic
index ba98ed3..f55494a 100644
--- a/LongoMatch.GUI.Multimedia/gtk-gui/gui.stetic
+++ b/LongoMatch.GUI.Multimedia/gtk-gui/gui.stetic
@@ -6,7 +6,6 @@
</configuration>
<import>
<widget-library name="../../bin/LongoMatch.Multimedia.dll" />
- <widget-library name="../../bin/LongoMatch.dll" />
<widget-library name="../../bin/LongoMatch.GUI.Helpers.dll" />
<widget-library name="../../bin/LongoMatch.GUI.Multimedia.dll" internal="true" />
</import>
@@ -103,6 +102,7 @@
<child>
<widget class="Gtk.DrawingArea" id="videodrawingarea">
<property name="MemberName" />
+ <property name="CanFocus">True</property>
</widget>
</child>
</widget>
diff --git a/LongoMatch.GUI/Gui/Component/ButtonsWidget.cs b/LongoMatch.GUI/Gui/Component/ButtonsWidget.cs
index 5761ce3..b322537 100644
--- a/LongoMatch.GUI/Gui/Component/ButtonsWidget.cs
+++ b/LongoMatch.GUI/Gui/Component/ButtonsWidget.cs
@@ -79,13 +79,13 @@ namespace LongoMatch.Gui.Component
return;
buttonsDic.Clear();
- int sectionsCount = categories.Count;
+ int sectionsCount = categories.List.Count;
table1.NColumns =(uint) N_COLUMNS;
table1.NRows =(uint)(sectionsCount/N_COLUMNS);
for(int i=0; i<sectionsCount; i++) {
- Category cat = categories[i];
+ Category cat = categories.List[i];
ButtonTagger b = new ButtonTagger (cat);
b.NewTag += (category) => {
Config.EventsBroker.EmitNewTag (category);
diff --git a/LongoMatch.GUI/Gui/Component/CategoryProperties.cs
b/LongoMatch.GUI/Gui/Component/CategoryProperties.cs
index 901efb6..92e3728 100644
--- a/LongoMatch.GUI/Gui/Component/CategoryProperties.cs
+++ b/LongoMatch.GUI/Gui/Component/CategoryProperties.cs
@@ -46,7 +46,6 @@ namespace LongoMatch.Gui.Component
public event HotKeyChangeHandler HotKeyChanged;
private Category cat;
- private ISubcategoriesTemplatesProvider subcategoriesProvider;
private ListStore model;
public CategoryProperties()
@@ -68,39 +67,6 @@ namespace LongoMatch.Gui.Component
}
}
- public void LoadSubcategories() {
- subcategoriesProvider = Config.SubcategoriesTemplatesProvider;
- LoadSubcategories(null);
- }
-
- private void LoadSubcategories(List<PlayerSubCategory> playerSubcategories) {
- model = new ListStore(typeof(string), typeof(ISubCategory));
-
- model.AppendValues(Catalog.GetString("Create new..."), "");
- foreach (TagSubCategory subcat in subcategoriesProvider.Templates) {
- Log.Debug("Adding tag subcategory: ", subcat.Name);
- model.AppendValues(String.Format("[{0}] {1}",
- Catalog.GetString("Tags"),
- subcat.Name),
- subcat);
- }
- if (playerSubcategories != null) {
- foreach (PlayerSubCategory subcat in playerSubcategories) {
- Log.Debug("Adding player subcategory: ", subcat.Name);
- model.AppendValues(String.Format("[{0}] {1}",
- Catalog.GetString("Players"),
- subcat.Name),
- subcat);
- }
- }
-
- subcatcombobox.Model = model;
- var cell = new CellRendererText();
- subcatcombobox.PackStart(cell, true);
- subcatcombobox.AddAttribute(cell, "text", 0);
- subcatcombobox.Active = 1;
- }
-
public Category Category {
set {
cat = value;
@@ -149,10 +115,10 @@ namespace LongoMatch.Gui.Component
fieldcoordinatestagger.Visible = cat.TagFieldPosition;
coords = new List<Coordinates>();
c = new Coordinates();
- c.Add (new Point (300, 300));
+ c.Points.Add (new Point (300, 300));
coords.Add (c);
if (cat.FieldPositionIsDistance) {
- c.Add (new Point (400, 500));
+ c.Points.Add (new Point (400, 500));
}
fieldcoordinatestagger.Coordinates = coords;
trajectorycheckbutton.Active = cat.FieldPositionIsDistance;
@@ -161,10 +127,10 @@ namespace LongoMatch.Gui.Component
halffieldcoordinatestagger.Visible = cat.TagHalfFieldPosition;
coords = new List<Coordinates>();
c = new Coordinates();
- c.Add (new Point (300, 300));
+ c.Points.Add (new Point (300, 300));
coords.Add (c);
if (cat.FieldPositionIsDistance) {
- c.Add (new Point (400, 500));
+ c.Points.Add (new Point (400, 500));
}
halffieldcoordinatestagger.Coordinates = coords;
trajectoryhalfcheckbutton.Active = cat.HalfFieldPositionIsDistance;
@@ -172,7 +138,7 @@ namespace LongoMatch.Gui.Component
taggoalcheckbutton.Active = cat.TagGoalPosition;
coords = new List<Coordinates>();
c = new Coordinates();
- c.Add (new Point (100, 100));
+ c.Points.Add (new Point (100, 100));
coords.Add (c);
goalcoordinatestagger.Coordinates = coords;
goalcoordinatestagger.Visible = cat.TagGoalPosition;
@@ -183,7 +149,7 @@ namespace LongoMatch.Gui.Component
list = subcategoriestreeview1.Model as ListStore;
list.Clear();
- foreach (ISubCategory subcat in cat.SubCategories)
+ foreach (SubCategory subcat in cat.SubCategories)
list.AppendValues(subcat);
}
@@ -192,18 +158,19 @@ namespace LongoMatch.Gui.Component
(cell as Gtk.CellRendererText).Markup =(string)model.GetValue(iter, 0);
}
- private TagSubCategory EditSubCategoryTags (TagSubCategory template, bool checkName){
- SubCategoryTagsEditor se = new SubCategoryTagsEditor(template,
subcategoriesProvider.TemplatesNames);
-
- se.CheckName = checkName;
- int ret = se.Run();
-
- var t = se.Template;
- se.Destroy();
-
- if (ret != (int)ResponseType.Ok)
- return null;
- return t;
+ private SubCategory EditSubCategoryTags (SubCategory template, bool checkName){
+ return null;
+// SubCategoryTagsEditor se = new SubCategoryTagsEditor(template,
subcategoriesProvider.TemplatesNames);
+//
+// se.CheckName = checkName;
+// int ret = se.Run();
+//
+// var t = se.Template;
+// se.Destroy();
+//
+// if (ret != (int)ResponseType.Ok)
+// return null;
+// return t;
}
protected virtual void OnChangebutonClicked(object sender, System.EventArgs e)
@@ -246,11 +213,11 @@ namespace LongoMatch.Gui.Component
cat.SortMethodString = sortmethodcombobox.ActiveText;
}
- protected virtual void OnSubcategorySelected(ISubCategory subcat) {
- EditSubCategoryTags((TagSubCategory)subcat, false);
+ protected virtual void OnSubcategorySelected(SubCategory subcat) {
+ EditSubCategoryTags((SubCategory)subcat, false);
}
- protected virtual void OnSubcategoriesDeleted (List<ISubCategory> subcats)
+ protected virtual void OnSubcategoriesDeleted (List<SubCategory> subcats)
{
if (Project != null) {
var msg = Catalog.GetString("If you delete this subcategory you will loose" +
@@ -269,7 +236,7 @@ namespace LongoMatch.Gui.Component
subcatcombobox.GetActiveIter(out iter);
ListStore list = subcategoriestreeview1.Model as ListStore;
- var subcat = Cloner.Clone((ISubCategory)model.GetValue(iter, 1));
+ var subcat = Cloner.Clone((SubCategory)model.GetValue(iter, 1));
subcat.Name = subcatnameentry.Text;
Category.SubCategories.Add(subcat);
list.AppendValues(subcat);
@@ -277,23 +244,6 @@ namespace LongoMatch.Gui.Component
protected virtual void OnSubcatcomboboxChanged (object sender, System.EventArgs e)
{
- TreeIter iter;
-
- if (subcatcombobox.Active == 0) {
- var template = EditSubCategoryTags(new SubCategoryTemplate(), true) as
SubCategoryTemplate;
- if (template == null || template.Count == 0)
- return;
-
- model.AppendValues(String.Format("[{0}] {1}",Catalog.GetString("Tags"),
template.Name),
- template);
- subcategoriesProvider.Save(template);
- subcatcombobox.Active = 1;
- return;
- }
-
- subcatcombobox.GetActiveIter(out iter);
- subcatnameentry.Text = (model.GetValue(iter, 1) as ISubCategory).Name;
- addbutton.Sensitive = true;
}
protected void OnTaggoalcheckbuttonClicked (object sender, EventArgs e)
@@ -323,10 +273,10 @@ namespace LongoMatch.Gui.Component
coords = new List<Coordinates>();
c = new Coordinates();
- c.Add (new Point (300, 300));
+ c.Points.Add (new Point (300, 300));
coords.Add (c);
if (cat.HalfFieldPositionIsDistance) {
- c.Add (new Point (400, 500));
+ c.Points.Add (new Point (400, 500));
}
halffieldcoordinatestagger.Coordinates = coords;
}
@@ -340,10 +290,10 @@ namespace LongoMatch.Gui.Component
coords = new List<Coordinates>();
c = new Coordinates();
- c.Add (new Point (300, 300));
+ c.Points.Add (new Point (300, 300));
coords.Add (c);
if (cat.FieldPositionIsDistance) {
- c.Add (new Point (400, 500));
+ c.Points.Add (new Point (400, 500));
}
fieldcoordinatestagger.Coordinates = coords;
}
diff --git a/LongoMatch.GUI/Gui/Component/CoordinatesTagger.cs
b/LongoMatch.GUI/Gui/Component/CoordinatesTagger.cs
index 2f8ea75..a5b4244 100644
--- a/LongoMatch.GUI/Gui/Component/CoordinatesTagger.cs
+++ b/LongoMatch.GUI/Gui/Component/CoordinatesTagger.cs
@@ -111,7 +111,7 @@ namespace LongoMatch.Gui.Component
TranslateToOriginCoords (cursor);
foreach (Coordinates c in Coordinates) {
- foreach (Point p in c) {
+ foreach (Point p in c.Points) {
double dist = Distance (cursor, p);
if (dist < minDistance) {
minDistance = dist;
@@ -166,16 +166,16 @@ namespace LongoMatch.Gui.Component
void DrawCoordinates (Context context, Coordinates coords) {
SetContextProperties(context, coords == selectedCoords);
- for (int i=0; i < coords.Count; i++) {
- if (i != 0 && i == coords.Count - 1) {
- DrawArrow (context, TranslateToDestCoords(coords[i -1]),
- TranslateToDestCoords (coords [i]));
+ for (int i=0; i < coords.Points.Count; i++) {
+ if (i != 0 && i == coords.Points.Count - 1) {
+ DrawArrow (context, TranslateToDestCoords(coords.Points[i -1]),
+ TranslateToDestCoords (coords.Points [i]));
} else {
- DrawPoint (context, TranslateToDestCoords (coords[i]));
+ DrawPoint (context, TranslateToDestCoords (coords.Points[i]));
}
if (i>0) {
- DrawLine (context, TranslateToDestCoords(coords[i-1]),
- TranslateToDestCoords (coords[i]));
+ DrawLine (context, TranslateToDestCoords(coords.Points[i-1]),
+ TranslateToDestCoords (coords.Points[i]));
}
}
}
diff --git a/LongoMatch.GUI/Gui/Component/PlayersListTreeWidget.cs
b/LongoMatch.GUI/Gui/Component/PlayersListTreeWidget.cs
index 610b197..4340275 100644
--- a/LongoMatch.GUI/Gui/Component/PlayersListTreeWidget.cs
+++ b/LongoMatch.GUI/Gui/Component/PlayersListTreeWidget.cs
@@ -69,7 +69,7 @@ namespace LongoMatch.Gui.Component
Log.Debug("Updating teams models with template:" + template);
team = new TreeStore(typeof(object));
- foreach(var player in template) {
+ foreach(var player in template.List) {
/* Add a root in the tree with the option name */
var iter = team.AppendValues(player);
playersDict.Add(player, iter);
@@ -77,9 +77,9 @@ namespace LongoMatch.Gui.Component
}
foreach (var play in plays) {
- foreach (var player in play.Players.AllUniqueElements) {
- if (playersDict.ContainsKey(player.Value)) {
- team.AppendValues(playersDict[player.Value], new object[1]
{play});
+ foreach (var player in play.Players) {
+ if (playersDict.ContainsKey(player)) {
+ team.AppendValues(playersDict[player], new object[1] {play});
Log.Debug("Adding new play to player: " + player);
}
}
diff --git a/LongoMatch.GUI/Gui/Component/PlaysCoordinatesTagger.cs
b/LongoMatch.GUI/Gui/Component/PlaysCoordinatesTagger.cs
index a151378..b4b4f99 100644
--- a/LongoMatch.GUI/Gui/Component/PlaysCoordinatesTagger.cs
+++ b/LongoMatch.GUI/Gui/Component/PlaysCoordinatesTagger.cs
@@ -74,7 +74,6 @@ namespace LongoMatch.Gui.Component
public void LoadPlay (Play play, bool horizontal=true) {
field.Visible = hfield.Visible = goal.Visible = false;
-
AddPlay (play, true);
}
@@ -133,10 +132,10 @@ namespace LongoMatch.Gui.Component
coords.Add (play.FieldPosition);
} else if (fill) {
Coordinates c = new Coordinates ();
- c.Add (new Point((int) (fieldPixbuf.Width * 0.25),
+ c.Points.Add (new Point((int) (fieldPixbuf.Width * 0.25),
(int) (fieldPixbuf.Height * 0.25)));
if (play.Category.FieldPositionIsDistance) {
- c.Add (new Point((int) (fieldPixbuf.Width * 0.75),
+ c.Points.Add (new Point((int) (fieldPixbuf.Width * 0.75),
(int) (fieldPixbuf.Height * 0.75)));
}
coords.Add (c);
@@ -155,10 +154,10 @@ namespace LongoMatch.Gui.Component
coords.Add (play.HalfFieldPosition);
} else if (fill) {
Coordinates c = new Coordinates ();
- c.Add (new Point((int) (hFieldPixbuf.Width * 0.25),
+ c.Points.Add (new Point((int) (hFieldPixbuf.Width * 0.25),
(int) (hFieldPixbuf.Height * 0.25)));
if (play.Category.HalfFieldPositionIsDistance) {
- c.Add (new Point((int) (hFieldPixbuf.Width * 0.75),
+ c.Points.Add (new Point((int) (hFieldPixbuf.Width * 0.75),
(int) (hFieldPixbuf.Height * 0.75)));
}
coords.Add (c);
@@ -177,7 +176,7 @@ namespace LongoMatch.Gui.Component
coords.Add (play.GoalPosition);
} else if (fill) {
Coordinates c = new Coordinates ();
- c.Add (new Point((int) (goalPixbuf.Width * 0.25),
+ c.Points.Add (new Point((int) (goalPixbuf.Width * 0.25),
(int) (goalPixbuf.Height * 0.25)));
coords.Add (c);
play.GoalPosition = c;
diff --git a/LongoMatch.GUI/Gui/Component/PlaysListTreeWidget.cs
b/LongoMatch.GUI/Gui/Component/PlaysListTreeWidget.cs
index 06bddb3..5790af7 100644
--- a/LongoMatch.GUI/Gui/Component/PlaysListTreeWidget.cs
+++ b/LongoMatch.GUI/Gui/Component/PlaysListTreeWidget.cs
@@ -133,7 +133,7 @@ namespace LongoMatch.Gui.Component
Dictionary<Category, TreeIter> itersDic = new Dictionary<Category, TreeIter>();
Gtk.TreeStore dataFileListStore = new Gtk.TreeStore(typeof(Play));
- foreach(Category cat in project.Categories) {
+ foreach(Category cat in project.Categories.List) {
Gtk.TreeIter iter = dataFileListStore.AppendValues(cat);
itersDic.Add(cat, iter);
}
@@ -151,7 +151,7 @@ namespace LongoMatch.Gui.Component
}
private string CategoryPath(Category cat) {
- return project.Categories.IndexOf(cat).ToString();
+ return project.Categories.List.IndexOf(cat).ToString();
}
protected virtual void OnEditProperties(TimeNode tNode, object val) {
diff --git a/LongoMatch.GUI/Gui/Component/PlaysSelectionWidget.cs
b/LongoMatch.GUI/Gui/Component/PlaysSelectionWidget.cs
index 3be419b..d74aaf5 100644
--- a/LongoMatch.GUI/Gui/Component/PlaysSelectionWidget.cs
+++ b/LongoMatch.GUI/Gui/Component/PlaysSelectionWidget.cs
@@ -120,8 +120,10 @@ namespace LongoMatch.Gui.Component
}
private void UpdateTeamsModels() {
- localPlayersList.SetTeam(project.LocalTeamTemplate, project.AllPlays());
- visitorPlayersList.SetTeam(project.VisitorTeamTemplate, project.AllPlays());
+ if (project == null)
+ return;
+ localPlayersList.SetTeam(project.LocalTeamTemplate, project.Timeline);
+ visitorPlayersList.SetTeam(project.VisitorTeamTemplate, project.Timeline);
}
protected void OnCategoriesFiltersbuttonClicked (object sender, System.EventArgs e)
diff --git a/LongoMatch.GUI/Gui/Component/Stats/PlayersViewer.cs
b/LongoMatch.GUI/Gui/Component/Stats/PlayersViewer.cs
index f645c05..49068c4 100644
--- a/LongoMatch.GUI/Gui/Component/Stats/PlayersViewer.cs
+++ b/LongoMatch.GUI/Gui/Component/Stats/PlayersViewer.cs
@@ -66,7 +66,7 @@ namespace LongoMatch.Gui.Component.Stats
TreeIter teamIter;
teamIter = store.AppendValues (tpl.TeamName, null);
- foreach (Player p in tpl) {
+ foreach (Player p in tpl.List) {
store.AppendValues (teamIter, p.Name, p);
filter.FilterPlayer (p);
}
diff --git a/LongoMatch.GUI/Gui/Component/TaggerWidget.cs b/LongoMatch.GUI/Gui/Component/TaggerWidget.cs
index e482b3b..24bf145 100644
--- a/LongoMatch.GUI/Gui/Component/TaggerWidget.cs
+++ b/LongoMatch.GUI/Gui/Component/TaggerWidget.cs
@@ -46,8 +46,8 @@ namespace LongoMatch.Gui.Component
SetPeriod(categories.GamePeriods);
}
- public void AddSubCategory(TagSubCategory subcat, StringTagStore tags){
- if (subcat.Count == 0)
+ public void AddSubCategory(SubCategory subcat, TagsStore tags){
+ if (subcat.Options.Count == 0)
return;
StringTaggerWidget tagger = new StringTaggerWidget(subcat, tags);
table1.Attach(tagger,0, 1, table1.NRows-1, table1.NRows);
@@ -55,15 +55,6 @@ namespace LongoMatch.Gui.Component
tagger.Show();
}
- public void AddTeamSubCategory(TeamSubCategory subcat, TeamsTagStore tags,
- string localTeam, string visitorTeam){
-// TeamTaggerWidget tagger = new TeamTaggerWidget(subcat, tags,
-// localTeam, visitorTeam);
-// table1.Attach(tagger,0, 1, table1.NRows-1, table1.NRows);
-// table1.NRows ++;
-// tagger.Show();
- }
-
void SetTeams (Play play, string localTeam, string visitorTeam) {
localcheckbutton.Label = localTeam;
visitorcheckbutton.Label = visitorTeam;
diff --git a/LongoMatch.GUI/Gui/Component/TeamTemplateEditor.cs
b/LongoMatch.GUI/Gui/Component/TeamTemplateEditor.cs
index b67d526..6aee0ca 100644
--- a/LongoMatch.GUI/Gui/Component/TeamTemplateEditor.cs
+++ b/LongoMatch.GUI/Gui/Component/TeamTemplateEditor.cs
@@ -196,7 +196,7 @@ namespace LongoMatch.Gui.Component
foreach (Player p in selectedPlayers) {
string msg = Catalog.GetString ("Do you want to delete player: ") + p.Name;
if (Config.GUIToolkit.QuestionMessage (msg, null, this)) {
- template.Remove (p);
+ template.List.Remove (p);
Edited = true;
}
}
@@ -226,7 +226,7 @@ namespace LongoMatch.Gui.Component
void HandleNewPlayerClicked (object sender, EventArgs e)
{
- Player p = template.AddDefaultItem (template.Count);
+ Player p = template.AddDefaultItem (template.List.Count);
teamtagger.Reload ();
teamtagger.Select (p);
Edited = true;
diff --git a/LongoMatch.GUI/Gui/Component/Timeline.cs b/LongoMatch.GUI/Gui/Component/Timeline.cs
index e2b0341..1431403 100644
--- a/LongoMatch.GUI/Gui/Component/Timeline.cs
+++ b/LongoMatch.GUI/Gui/Component/Timeline.cs
@@ -93,7 +93,7 @@ namespace LongoMatch.Gui.Component
}
focusscale.Value = 6;
projectFile = project.Description.File;
- timerule.Duration = new Time ((int)project.Description.File.Length);
+ timerule.Duration = project.Description.File.Duration;
timeline.ShowMenuEvent += HandleShowMenu;
QueueDraw ();
}
diff --git a/LongoMatch.GUI/Gui/Dialog/EditCategoryDialog.cs b/LongoMatch.GUI/Gui/Dialog/EditCategoryDialog.cs
index a291e28..38fe706 100644
--- a/LongoMatch.GUI/Gui/Dialog/EditCategoryDialog.cs
+++ b/LongoMatch.GUI/Gui/Dialog/EditCategoryDialog.cs
@@ -41,7 +41,7 @@ namespace LongoMatch.Gui.Dialog
{
this.Build();
timenodeproperties2.HotKeyChanged += OnHotKeyChanged;
- timenodeproperties2.LoadSubcategories();
+// timenodeproperties2.LoadSubcategories();
}
public Category Category {
diff --git a/LongoMatch.GUI/Gui/Dialog/SubCategoryTagsEditor.cs
b/LongoMatch.GUI/Gui/Dialog/SubCategoryTagsEditor.cs
index e4391d6..5416853 100644
--- a/LongoMatch.GUI/Gui/Dialog/SubCategoryTagsEditor.cs
+++ b/LongoMatch.GUI/Gui/Dialog/SubCategoryTagsEditor.cs
@@ -26,12 +26,12 @@ namespace LongoMatch.Gui.Dialog
{
public partial class SubCategoryTagsEditor : Gtk.Dialog
{
- private TagSubCategory template;
+ private SubCategory template;
private Dictionary<string, Widget> tagsDict;
private List<string> templates;
private Color templateExistsColor;
- public SubCategoryTagsEditor (TagSubCategory template, List<string> templates)
+ public SubCategoryTagsEditor (SubCategory template, List<string> templates)
{
this.Build ();
Gdk.Color.Parse("red", ref templateExistsColor);
@@ -45,7 +45,7 @@ namespace LongoMatch.Gui.Dialog
Template = template;
}
- public TagSubCategory Template {
+ public SubCategory Template {
set{
template = value;
nameentry.Text = template.Name;
diff --git a/LongoMatch.GUI/Gui/Dialog/TaggerDialog.cs b/LongoMatch.GUI/Gui/Dialog/TaggerDialog.cs
index 482c936..85400dd 100644
--- a/LongoMatch.GUI/Gui/Dialog/TaggerDialog.cs
+++ b/LongoMatch.GUI/Gui/Dialog/TaggerDialog.cs
@@ -92,34 +92,12 @@ namespace LongoMatch.Gui.Dialog
}
}
- public void AddTeamSubcategory (TeamSubCategory subcat, TeamsTagStore tags,
- string localTeam, string visitorTeam){
- /* the notebook starts invisible */
- tagsnotebook.Visible = true;
- taggerwidget1.AddTeamSubCategory(subcat, tags, localTeam, visitorTeam);
- }
-
- public void AddTagSubcategory (TagSubCategory subcat, StringTagStore tags){
+ public void AddTagSubcategory (SubCategory subcat, TagsStore tags){
/* the notebook starts invisible */
taggerwidget1.AddSubCategory(subcat, tags);
subcategoryAdded = true;
}
- public void AddPlayerSubcategory (PlayerSubCategory subcat, PlayersTagStore tags){
- TeamTemplate local=null, visitor=null;
-
- /* the notebook starts invisible */
- playersnotebook.Visible = true;
- if (subcat.Contains(Team.LOCAL))
- local = localTeamTemplate;
- if (subcat.Contains(Team.VISITOR))
- visitor = visitorTeamTemplate;
-
- PlayersTaggerWidget widget = new PlayersTaggerWidget(subcat, local, visitor, tags);
- widget.Show();
- playersbox.PackStart(widget, true, true, 0);
- }
-
protected override bool OnExposeEvent (EventExpose evnt)
{
bool ret = base.OnExposeEvent (evnt);
diff --git a/LongoMatch.GUI/Gui/GUIToolkit.cs b/LongoMatch.GUI/Gui/GUIToolkit.cs
index fbd22aa..609706e 100644
--- a/LongoMatch.GUI/Gui/GUIToolkit.cs
+++ b/LongoMatch.GUI/Gui/GUIToolkit.cs
@@ -203,11 +203,6 @@ namespace LongoMatch.Gui
}
public void TagPlay (Play play, Categories categories, TeamTemplate local, TeamTemplate
visitor, bool showAllTags) {
- TaggerDialog tg = new TaggerDialog(play, categories, local, visitor, showAllTags);
- Log.Information ("Tag play");
- tg.TransientFor = mainWindow as Gtk.Window;
- tg.Run();
- tg.Destroy();
}
public void DrawingTool (Image image, Play play, Time stopTime) {
diff --git a/LongoMatch.GUI/Gui/Panel/OpenProjectPanel.cs b/LongoMatch.GUI/Gui/Panel/OpenProjectPanel.cs
index 466f75e..705b377 100644
--- a/LongoMatch.GUI/Gui/Panel/OpenProjectPanel.cs
+++ b/LongoMatch.GUI/Gui/Panel/OpenProjectPanel.cs
@@ -53,7 +53,7 @@ namespace LongoMatch.Gui.Panel
void HandleProjectSelected (ProjectDescription project)
{
- Config.EventsBroker.EmitOpenProjectID (project.UUID);
+ Config.EventsBroker.EmitOpenProjectID (project.ID);
}
}
}
diff --git a/LongoMatch.GUI/Gui/Panel/ProjectsManagerPanel.cs
b/LongoMatch.GUI/Gui/Panel/ProjectsManagerPanel.cs
index 2608e01..f60827a 100644
--- a/LongoMatch.GUI/Gui/Panel/ProjectsManagerPanel.cs
+++ b/LongoMatch.GUI/Gui/Panel/ProjectsManagerPanel.cs
@@ -147,7 +147,7 @@ namespace LongoMatch.Gui.Panel
selectedProjects = projects;
if (projects.Count == 1) {
- LoadProject (DB.GetProject (projects[0].UUID));
+ LoadProject (DB.GetProject (projects[0].ID));
}
}
@@ -165,7 +165,7 @@ namespace LongoMatch.Gui.Panel
Catalog.GetString("Export project"),
null, Config.HomeDir, Constants.PROJECT_NAME,
new string[] {Constants.PROJECT_EXT});
- SerializableObject.Save(loadedProject, filename);
+ Serializer.Save(loadedProject, filename);
}
}
@@ -199,7 +199,7 @@ namespace LongoMatch.Gui.Panel
}
string msg = Catalog.GetString ("Do you really want to delete:") + "\n" +
selectedProject.Title;
if (MessagesHelpers.QuestionMessage (this, msg)) {
- DB.RemoveProject (selectedProject.UUID);
+ DB.RemoveProject (selectedProject.ID);
deletedProjects.Add (selectedProject);
}
}
diff --git a/LongoMatch.GUI/Gui/TreeView/CategoriesFilterTreeView.cs
b/LongoMatch.GUI/Gui/TreeView/CategoriesFilterTreeView.cs
index ae5816a..2fc3780 100644
--- a/LongoMatch.GUI/Gui/TreeView/CategoriesFilterTreeView.cs
+++ b/LongoMatch.GUI/Gui/TreeView/CategoriesFilterTreeView.cs
@@ -47,17 +47,15 @@ namespace LongoMatch.Gui.Component
protected override void FillTree () {
store = new TreeStore (typeof (object), typeof (bool));
- foreach (Category cat in categories) {
+ foreach (Category cat in categories.List) {
TreeIter catIter;
catIter = store.AppendValues(cat, filter.VisibleCategories.Contains(cat));
foreach (var subcat in cat.SubCategories) {
TreeIter subcatIter;
- if (subcat is TagSubCategory) {
- subcatIter = store.AppendValues(catIter, subcat, true);
- foreach (string desc in subcat.ElementsDesc()) {
- store.AppendValues(subcatIter, new
StringObject{Value=desc, SubCategory=subcat, Category=cat}, true);
- }
+ subcatIter = store.AppendValues(catIter, subcat, true);
+ foreach (string desc in subcat.Options) {
+ store.AppendValues(subcatIter, new StringObject{Value=desc,
SubCategory=subcat, Category=cat}, true);
}
}
}
@@ -111,8 +109,8 @@ namespace LongoMatch.Gui.Component
Category cat = obj as Category;
text = cat.Name;
}
- else if (obj is ISubCategory) {
- ISubCategory subCat = obj as ISubCategory;
+ else if (obj is SubCategory) {
+ SubCategory subCat = obj as SubCategory;
text = subCat.Name;
}
else if (obj is StringObject){
@@ -136,7 +134,7 @@ namespace LongoMatch.Gui.Component
class StringObject
{
public string Value {get;set;}
- public ISubCategory SubCategory {get;set;}
+ public SubCategory SubCategory {get;set;}
public Category Category {get;set;}
}
}
diff --git a/LongoMatch.GUI/Gui/TreeView/ListTreeViewBase.cs b/LongoMatch.GUI/Gui/TreeView/ListTreeViewBase.cs
index 0f36576..ca418a4 100644
--- a/LongoMatch.GUI/Gui/TreeView/ListTreeViewBase.cs
+++ b/LongoMatch.GUI/Gui/TreeView/ListTreeViewBase.cs
@@ -119,7 +119,7 @@ namespace LongoMatch.Gui.Component
return;
catsDict = new Dictionary<MenuItem, Category>();
catMenu = new Menu();
- foreach (Category cat in value.Categories) {
+ foreach (Category cat in value.Categories.List) {
var item = new MenuItem (cat.Name);
catMenu.Append (item);
catsDict.Add(item, cat);
diff --git a/LongoMatch.GUI/Gui/TreeView/PlayersFilterTreeView.cs
b/LongoMatch.GUI/Gui/TreeView/PlayersFilterTreeView.cs
index 9694852..c3fc78b 100644
--- a/LongoMatch.GUI/Gui/TreeView/PlayersFilterTreeView.cs
+++ b/LongoMatch.GUI/Gui/TreeView/PlayersFilterTreeView.cs
@@ -94,7 +94,7 @@ namespace LongoMatch.Gui.Component
TreeIter team;
filter.FilterPlayer(player);
/* Uncheck the team check button */
- if (local.Contains(player))
+ if (local.List.Contains(player))
team = localIter;
else
team = visitorIter;
diff --git a/LongoMatch.GUI/Gui/TreeView/SubCategoriesTreeView.cs
b/LongoMatch.GUI/Gui/TreeView/SubCategoriesTreeView.cs
index e66ca42..9440a60 100644
--- a/LongoMatch.GUI/Gui/TreeView/SubCategoriesTreeView.cs
+++ b/LongoMatch.GUI/Gui/TreeView/SubCategoriesTreeView.cs
@@ -38,13 +38,13 @@ namespace LongoMatch.Gui
private Menu menu;
private Gtk.Action edit;
private TreeIter selectedIter;
- private ISubCategory selectedSubcat;
+ private SubCategory selectedSubcat;
public SubCategoriesTreeView ()
{
this.HeadersVisible = false;
- ListStore ls = new ListStore(typeof(ISubCategory));
+ ListStore ls = new ListStore(typeof(SubCategory));
this.Model = ls;
TreeViewColumn subcatColumn = new Gtk.TreeViewColumn();
@@ -64,7 +64,7 @@ namespace LongoMatch.Gui
protected void OnRemove(object obj, EventArgs args) {
/* FIXME: Support multiselection for multideletion */
- List<ISubCategory> l = new List<ISubCategory>();
+ List<SubCategory> l = new List<SubCategory>();
if (this.SubCategoriesDeleted != null) {
l.Add(selectedSubcat);
@@ -75,7 +75,7 @@ namespace LongoMatch.Gui
private void RenderSubcat(Gtk.TreeViewColumn column, Gtk.CellRenderer cell, Gtk.TreeModel
model, Gtk.TreeIter iter)
{
- var subcat = (ISubCategory)model.GetValue(iter, 0);
+ var subcat = (SubCategory)model.GetValue(iter, 0);
(cell as Gtk.CellRendererText).Markup = GLib.Markup.EscapeText
(subcat.ToMarkupString());
}
@@ -121,8 +121,8 @@ namespace LongoMatch.Gui
GetPathAtPos((int)evnt.X,(int)evnt.Y,out path);
if(path!=null) {
Model.GetIter(out selectedIter,path);
- selectedSubcat = (ISubCategory) Model.GetValue(selectedIter, 0);
- edit.Sensitive = selectedSubcat is TagSubCategory;
+ selectedSubcat = (SubCategory) Model.GetValue(selectedIter, 0);
+ edit.Sensitive = selectedSubcat is SubCategory;
menu.Popup();
}
}
diff --git a/LongoMatch.GUI/LongoMatch.GUI.mdp b/LongoMatch.GUI/LongoMatch.GUI.mdp
index 24103aa..f55a22b 100644
--- a/LongoMatch.GUI/LongoMatch.GUI.mdp
+++ b/LongoMatch.GUI/LongoMatch.GUI.mdp
@@ -43,8 +43,6 @@
<File subtype="Code" buildaction="Compile" name="Gui/Component/PlaysListTreeWidget.cs" />
<File subtype="Code" buildaction="Compile" name="Gui/Component/DrawingWidget.cs" />
<File subtype="Code" buildaction="Compile" name="Gui/Dialog/DrawingTool.cs" />
- <File subtype="Code" buildaction="Compile" name="Gui/Component/TaggerWidget.cs" />
- <File subtype="Code" buildaction="Compile" name="Gui/Dialog/TaggerDialog.cs" />
<File subtype="Code" buildaction="Compile" name="Gui/Dialog/EndCaptureDialog.cs" />
<File subtype="Code" buildaction="Compile" name="Gui/Dialog/BusyDialog.cs" />
<File subtype="Code" buildaction="EmbedAsResource" name="gtk-gui/gui.stetic" />
@@ -68,18 +66,10 @@
<File subtype="Code" buildaction="Compile" name="gtk-gui/LongoMatch.Gui.Dialog.EditCategoryDialog.cs" />
<File subtype="Code" buildaction="Compile" name="gtk-gui/LongoMatch.Gui.Component.DrawingWidget.cs" />
<File subtype="Code" buildaction="Compile" name="gtk-gui/LongoMatch.Gui.Dialog.DrawingTool.cs" />
- <File subtype="Code" buildaction="Compile" name="gtk-gui/LongoMatch.Gui.Component.TaggerWidget.cs" />
- <File subtype="Code" buildaction="Compile" name="gtk-gui/LongoMatch.Gui.Dialog.TaggerDialog.cs" />
<File subtype="Code" buildaction="Compile" name="gtk-gui/LongoMatch.Gui.Dialog.EndCaptureDialog.cs" />
<File subtype="Code" buildaction="Compile" name="gtk-gui/LongoMatch.Gui.Dialog.BusyDialog.cs" />
<File subtype="Code" buildaction="Compile" name="Gui/TreeView/ListTreeViewBase.cs" />
<File subtype="Code" buildaction="Compile" name="Gui/TreeView/SubCategoriesTreeView.cs" />
- <File subtype="Code" buildaction="Compile" name="Gui/Dialog/SubCategoryTagsEditor.cs" />
- <File subtype="Code" buildaction="Compile" name="gtk-gui/LongoMatch.Gui.Dialog.SubCategoryTagsEditor.cs"
/>
- <File subtype="Code" buildaction="Compile" name="Gui/Component/PlayersTaggerWidget.cs" />
- <File subtype="Code" buildaction="Compile"
name="gtk-gui/LongoMatch.Gui.Component.PlayersTaggerWidget.cs" />
- <File subtype="Code" buildaction="Compile" name="Gui/Component/StringTaggerWidget.cs" />
- <File subtype="Code" buildaction="Compile" name="gtk-gui/LongoMatch.Gui.Component.StringTaggerWidget.cs"
/>
<File subtype="Code" buildaction="Compile" name="Gui/Component/RenderingStateBar.cs" />
<File subtype="Code" buildaction="Compile" name="gtk-gui/LongoMatch.Gui.Component.RenderingStateBar.cs"
/>
<File subtype="Code" buildaction="Compile" name="Gui/TreeView/RenderingJobsTreeView.cs" />
@@ -96,20 +86,12 @@
<File subtype="Code" buildaction="EmbedAsResource" name="../images/stock_draw-rectangle-unfilled.png" />
<File subtype="Code" buildaction="EmbedAsResource" name="../images/video.png" />
<File subtype="Code" buildaction="EmbedAsResource" name="../images/camera-video.png" />
- <File subtype="Code" buildaction="Compile" name="Gui/Component/GameUnitsEditor.cs" />
- <File subtype="Code" buildaction="Compile" name="gtk-gui/LongoMatch.Gui.Component.GameUnitsEditor.cs" />
- <File subtype="Code" buildaction="Compile" name="Gui/Component/GameUnitWidget.cs" />
- <File subtype="Code" buildaction="Compile" name="gtk-gui/LongoMatch.Gui.Component.GameUnitWidget.cs" />
- <File subtype="Code" buildaction="Compile" name="Gui/Component/GameUnitsTagger.cs" />
- <File subtype="Code" buildaction="Compile" name="gtk-gui/LongoMatch.Gui.Component.GameUnitsTagger.cs" />
<File subtype="Directory" buildaction="Compile" name="Gui/Component" />
<File subtype="Code" buildaction="Compile" name="Gui/GUIToolkit.cs" />
<File subtype="Directory" buildaction="Compile" name="." />
<File subtype="Directory" buildaction="Compile" name=".." />
<File subtype="Directory" buildaction="Compile" name="Gui" />
<File subtype="Code" buildaction="Compile" name="Gui/Cairo.cs" />
- <File subtype="Code" buildaction="Compile" name="Gui/Component/PlayersTagger.cs" />
- <File subtype="Code" buildaction="Compile" name="gtk-gui/LongoMatch.Gui.Component.PlayersTagger.cs" />
<File subtype="Code" buildaction="Compile"
name="gtk-gui/LongoMatch.Gui.Component.PlaysSelectionWidget.cs" />
<File subtype="Code" buildaction="Compile" name="Gui/Component/PlaysSelectionWidget.cs" />
<File subtype="Code" buildaction="Compile" name="Gui/TreeView/PlayersFilterTreeView.cs" />
diff --git a/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Panel.ProjectsManagerPanel.cs
b/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Panel.ProjectsManagerPanel.cs
index b6fbbb2..dc0a441 100644
--- a/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Panel.ProjectsManagerPanel.cs
+++ b/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Panel.ProjectsManagerPanel.cs
@@ -463,6 +463,7 @@ namespace LongoMatch.Gui.Panel
w61.Position = 0;
// Container child rbox.Gtk.Box+BoxChild
this.hbuttonbox1 = new global::Gtk.HButtonBox ();
+ this.hbuttonbox1.Name = "hbuttonbox1";
// Container child hbuttonbox1.Gtk.ButtonBox+ButtonBoxChild
this.savebutton = new global::Gtk.Button ();
this.savebutton.Sensitive = false;
diff --git a/LongoMatch.GUI/gtk-gui/gui.stetic b/LongoMatch.GUI/gtk-gui/gui.stetic
index a8965d2..2577b36 100644
--- a/LongoMatch.GUI/gtk-gui/gui.stetic
+++ b/LongoMatch.GUI/gtk-gui/gui.stetic
@@ -3093,314 +3093,6 @@ Show-><b> S</b>
</widget>
</child>
</widget>
- <widget class="Gtk.Bin" id="LongoMatch.Gui.Component.TaggerWidget" design-size="486 183">
- <property name="MemberName" />
- <property name="Visible">False</property>
- <child>
- <widget class="Gtk.VBox" id="vbox2">
- <property name="MemberName" />
- <property name="Spacing">6</property>
- <child>
- <widget class="Gtk.VBox" id="vbox3">
- <property name="MemberName" />
- <property name="Spacing">6</property>
- <child>
- <widget class="Gtk.HBox" id="hbox1">
- <property name="MemberName" />
- <property name="Spacing">6</property>
- <child>
- <widget class="Gtk.Frame" id="frame1">
- <property name="MemberName" />
- <property name="ShadowType">None</property>
- <child>
- <widget class="Gtk.Alignment" id="GtkAlignment">
- <property name="MemberName" />
- <property name="Xalign">0</property>
- <property name="Yalign">0</property>
- <property name="LeftPadding">12</property>
- <child>
- <widget class="Gtk.HBox" id="hbox2">
- <property name="MemberName" />
- <property name="Spacing">6</property>
- <child>
- <widget class="Gtk.CheckButton" id="localcheckbutton">
- <property name="MemberName" />
- <property name="CanFocus">True</property>
- <property name="Label" translatable="yes" />
- <property name="DrawIndicator">True</property>
- <property name="HasLabel">True</property>
- <property name="UseUnderline">True</property>
- </widget>
- <packing>
- <property name="Position">0</property>
- <property name="AutoSize">True</property>
- </packing>
- </child>
- <child>
- <widget class="Gtk.CheckButton" id="visitorcheckbutton">
- <property name="MemberName" />
- <property name="CanFocus">True</property>
- <property name="Label" translatable="yes" />
- <property name="DrawIndicator">True</property>
- <property name="HasLabel">True</property>
- <property name="UseUnderline">True</property>
- </widget>
- <packing>
- <property name="Position">1</property>
- <property name="AutoSize">True</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- <child>
- <widget class="Gtk.Label" id="GtkLabel2">
- <property name="MemberName" />
- <property name="LabelProp" translatable="yes"><b>Team</b></property>
- <property name="UseMarkup">True</property>
- </widget>
- <packing>
- <property name="type">label_item</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="Position">0</property>
- <property name="AutoSize">False</property>
- </packing>
- </child>
- <child>
- <widget class="Gtk.Frame" id="periodframe">
- <property name="MemberName" />
- <property name="ShadowType">None</property>
- <child>
- <widget class="Gtk.Alignment" id="GtkAlignment1">
- <property name="MemberName" />
- <property name="Xalign">0</property>
- <property name="Yalign">0</property>
- <property name="LeftPadding">12</property>
- <child>
- <widget class="Gtk.HBox" id="periodhbox">
- <property name="MemberName" />
- <property name="Spacing">6</property>
- <child>
- <placeholder />
- </child>
- <child>
- <placeholder />
- </child>
- <child>
- <placeholder />
- </child>
- </widget>
- </child>
- </widget>
- </child>
- <child>
- <widget class="Gtk.Label" id="PeriodLabel">
- <property name="MemberName" />
- <property name="LabelProp" translatable="yes"><b>Period</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">True</property>
- <property name="Expand">False</property>
- <property name="Fill">False</property>
- </packing>
- </child>
- <child>
- <widget class="Gtk.Table" id="table1">
- <property name="MemberName" />
- <property name="NRows">3</property>
- <property name="NColumns">3</property>
- <child>
- <placeholder />
- </child>
- <child>
- <placeholder />
- </child>
- <child>
- <placeholder />
- </child>
- <child>
- <placeholder />
- </child>
- <child>
- <placeholder />
- </child>
- <child>
- <placeholder />
- </child>
- <child>
- <placeholder />
- </child>
- <child>
- <placeholder />
- </child>
- <child>
- <placeholder />
- </child>
- </widget>
- <packing>
- <property name="Position">1</property>
- <property name="AutoSize">False</property>
- <property name="Expand">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="Position">0</property>
- <property name="AutoSize">True</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- <widget class="Gtk.Dialog" id="LongoMatch.Gui.Dialog.TaggerDialog" design-size="644 569">
- <property name="MemberName" />
- <property name="Title" translatable="yes">Tag play</property>
- <property name="Icon">stock:longomatch Menu</property>
- <property name="WindowPosition">CenterOnParent</property>
- <property name="Modal">True</property>
- <property name="Gravity">Center</property>
- <property name="Buttons">1</property>
- <property name="HelpButton">False</property>
- <child internal-child="VBox">
- <widget class="Gtk.VBox" id="dialog1_VBox">
- <property name="MemberName" />
- <property name="BorderWidth">2</property>
- <child>
- <widget class="Gtk.VBox" id="mainvbox">
- <property name="MemberName" />
- <child>
- <widget class="Gtk.HBox" id="hbox">
- <property name="MemberName" />
- <property name="Spacing">6</property>
- <child>
- <widget class="Gtk.Notebook" id="tagsnotebook">
- <property name="MemberName" />
- <property name="CanFocus">True</property>
- <property name="CurrentPage">0</property>
- <child>
- <widget class="LongoMatch.Gui.Component.TaggerWidget" id="taggerwidget1">
- <property name="MemberName" />
- <property name="Events">ButtonPressMask</property>
- </widget>
- </child>
- <child>
- <widget class="Gtk.Label" id="label1">
- <property name="MemberName" />
- <property name="LabelProp" translatable="yes">Tags</property>
- </widget>
- <packing>
- <property name="type">tab</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="Position">0</property>
- <property name="AutoSize">False</property>
- </packing>
- </child>
- <child>
- <widget class="Gtk.Notebook" id="playersnotebook">
- <property name="MemberName" />
- <property name="CanFocus">True</property>
- <property name="CurrentPage">0</property>
- <child>
- <widget class="Gtk.VBox" id="playersbox">
- <property name="MemberName" />
- <property name="Spacing">6</property>
- <child>
- <placeholder />
- </child>
- <child>
- <placeholder />
- </child>
- <child>
- <placeholder />
- </child>
- </widget>
- </child>
- <child>
- <widget class="Gtk.Label" id="label2">
- <property name="MemberName" />
- <property name="LabelProp" translatable="yes">Players</property>
- </widget>
- <packing>
- <property name="type">tab</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="Position">1</property>
- <property name="AutoSize">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="Position">0</property>
- <property name="AutoSize">False</property>
- <property name="Expand">False</property>
- </packing>
- </child>
- <child>
- <widget class="LongoMatch.Gui.Component.PlaysCoordinatesTagger" id="coordstagger">
- <property name="MemberName" />
- <property name="Events">ButtonPressMask</property>
- </widget>
- <packing>
- <property name="Position">1</property>
- <property name="AutoSize">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="Position">0</property>
- <property name="AutoSize">True</property>
- </packing>
- </child>
- </widget>
- </child>
- <child internal-child="ActionArea">
- <widget class="Gtk.HButtonBox" id="dialog1_ActionArea">
- <property name="MemberName" />
- <property name="Spacing">6</property>
- <property name="BorderWidth">5</property>
- <property name="Size">1</property>
- <property name="LayoutStyle">End</property>
- <child>
- <widget class="Gtk.Button" id="buttonOk">
- <property name="MemberName" />
- <property name="CanDefault">True</property>
- <property name="CanFocus">True</property>
- <property name="UseStock">True</property>
- <property name="Type">StockItem</property>
- <property name="StockId">gtk-ok</property>
- <property name="ResponseId">-5</property>
- <property name="label">gtk-ok</property>
- </widget>
- <packing>
- <property name="Expand">False</property>
- <property name="Fill">False</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
<widget class="Gtk.Dialog" id="LongoMatch.Gui.Dialog.EndCaptureDialog" design-size="566 178">
<property name="MemberName" />
<property name="Title" translatable="yes" />
@@ -3589,364 +3281,6 @@ You can continue with the current capture, cancel it or save your project.
</widget>
</child>
</widget>
- <widget class="Gtk.Dialog" id="LongoMatch.Gui.Dialog.SubCategoryTagsEditor" design-size="326 304">
- <property name="MemberName" />
- <property name="Title" translatable="yes">Edit subcategory tags</property>
- <property name="Icon">resource:logo.svg</property>
- <property name="WindowPosition">Center</property>
- <property name="Modal">True</property>
- <property name="Gravity">Center</property>
- <property name="SkipPagerHint">True</property>
- <property name="SkipTaskbarHint">True</property>
- <property name="Buttons">1</property>
- <property name="HelpButton">False</property>
- <child internal-child="VBox">
- <widget class="Gtk.VBox" id="dialog1_VBox">
- <property name="MemberName" />
- <property name="BorderWidth">2</property>
- <child>
- <widget class="Gtk.VBox" id="vbox2">
- <property name="MemberName" />
- <property name="Spacing">6</property>
- <child>
- <widget class="Gtk.Table" id="table1">
- <property name="MemberName" />
- <property name="NRows">2</property>
- <property name="NColumns">2</property>
- <property name="RowSpacing">6</property>
- <property name="ColumnSpacing">6</property>
- <child>
- <widget class="Gtk.CheckButton" id="fastcheckbutton">
- <property name="MemberName" />
- <property name="Tooltip" translatable="yes">When this option is selected, the
subcategory can be tagged right after creating a new play</property>
- <property name="CanFocus">True</property>
- <property name="Label" translatable="yes">Quick tag</property>
- <property name="Active">True</property>
- <property name="DrawIndicator">True</property>
- <property name="HasLabel">True</property>
- <property name="UseUnderline">True</property>
- </widget>
- <packing>
- <property name="TopAttach">1</property>
- <property name="BottomAttach">2</property>
- <property name="LeftAttach">1</property>
- <property name="RightAttach">2</property>
- <property name="AutoSize">True</property>
- <property name="XOptions">Fill</property>
- <property name="YOptions">Fill</property>
- <property name="XExpand">False</property>
- <property name="XFill">True</property>
- <property name="XShrink">False</property>
- <property name="YExpand">False</property>
- <property name="YFill">True</property>
- <property name="YShrink">False</property>
- </packing>
- </child>
- <child>
- <widget class="Gtk.Label" id="label1">
- <property name="MemberName" />
- <property name="LabelProp" translatable="yes">Subcategory name:</property>
- </widget>
- <packing>
- <property name="AutoSize">False</property>
- <property name="YOptions">Fill</property>
- <property name="XExpand">True</property>
- <property name="XFill">True</property>
- <property name="XShrink">False</property>
- <property name="YExpand">False</property>
- <property name="YFill">True</property>
- <property name="YShrink">False</property>
- </packing>
- </child>
- <child>
- <widget class="Gtk.CheckButton" id="multicheckbutton">
- <property name="MemberName" />
- <property name="Tooltip" translatable="yes">This options allows you to select multiple
tags instead of just one</property>
- <property name="CanFocus">True</property>
- <property name="Label" translatable="yes">Allow multiple selections</property>
- <property name="Active">True</property>
- <property name="DrawIndicator">True</property>
- <property name="HasLabel">True</property>
- <property name="UseUnderline">True</property>
- </widget>
- <packing>
- <property name="TopAttach">1</property>
- <property name="BottomAttach">2</property>
- <property name="AutoSize">True</property>
- <property name="XOptions">Fill</property>
- <property name="YOptions">Fill</property>
- <property name="XExpand">False</property>
- <property name="XFill">True</property>
- <property name="XShrink">False</property>
- <property name="YExpand">False</property>
- <property name="YFill">True</property>
- <property name="YShrink">False</property>
- </packing>
- </child>
- <child>
- <widget class="Gtk.Entry" id="nameentry">
- <property name="MemberName" />
- <property name="CanFocus">True</property>
- <property name="Text" translatable="yes">Goal type</property>
- <property name="IsEditable">True</property>
- <property name="InvisibleChar">•</property>
- </widget>
- <packing>
- <property name="LeftAttach">1</property>
- <property name="RightAttach">2</property>
- <property name="AutoSize">False</property>
- <property name="YOptions">Fill</property>
- <property name="XExpand">True</property>
- <property name="XFill">True</property>
- <property name="XShrink">False</property>
- <property name="YExpand">False</property>
- <property name="YFill">True</property>
- <property name="YShrink">False</property>
- </packing>
- </child>
- </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="Gtk.Frame" id="frame1">
- <property name="MemberName" />
- <property name="ShadowType">In</property>
- <child>
- <widget class="Gtk.Alignment" id="GtkAlignment2">
- <property name="MemberName" />
- <property name="Xalign">0</property>
- <property name="Yalign">0</property>
- <property name="LeftPadding">12</property>
- <child>
- <widget class="Gtk.VBox" id="vbox3">
- <property name="MemberName" />
- <property name="Spacing">6</property>
- <child>
- <widget class="Gtk.ScrolledWindow" id="scrolledwindow1">
- <property name="MemberName" />
- <property name="CanFocus">True</property>
- <child>
- <widget class="Gtk.Viewport" id="GtkViewport">
- <property name="MemberName" />
- <property name="ShadowType">None</property>
- <child>
- <widget class="Gtk.VBox" id="tagsbox">
- <property name="MemberName" />
- <property name="Spacing">6</property>
- <child>
- <placeholder />
- </child>
- <child>
- <placeholder />
- </child>
- <child>
- <placeholder />
- </child>
- <child>
- <placeholder />
- </child>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="Position">0</property>
- <property name="AutoSize">True</property>
- </packing>
- </child>
- <child>
- <widget class="Gtk.HBox" id="hbox1">
- <property name="MemberName" />
- <property name="Spacing">6</property>
- <child>
- <widget class="Gtk.Entry" id="tagentry">
- <property name="MemberName" />
- <property name="CanFocus">True</property>
- <property name="Text" translatable="yes">Penalty</property>
- <property name="IsEditable">True</property>
- <property name="InvisibleChar">•</property>
- </widget>
- <packing>
- <property name="Position">0</property>
- <property name="AutoSize">True</property>
- </packing>
- </child>
- <child>
- <widget class="Gtk.Button" id="addtagbutton">
- <property name="MemberName" />
- <property name="CanFocus">True</property>
- <property name="Type">TextAndIcon</property>
- <property name="Icon">stock:gtk-add Menu</property>
- <property name="Label" translatable="yes">Add tag</property>
- <property name="UseUnderline">True</property>
- </widget>
- <packing>
- <property name="Position">1</property>
- <property name="AutoSize">False</property>
- <property name="Expand">False</property>
- <property name="Fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="Position">1</property>
- <property name="AutoSize">True</property>
- <property name="Expand">False</property>
- <property name="Fill">False</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- <child>
- <widget class="Gtk.Label" id="GtkLabel4">
- <property name="MemberName" />
- <property name="LabelProp" translatable="yes"><b>Tags</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">True</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="Position">0</property>
- <property name="AutoSize">True</property>
- </packing>
- </child>
- </widget>
- </child>
- <child internal-child="ActionArea">
- <widget class="Gtk.HButtonBox" id="dialog1_ActionArea">
- <property name="MemberName" />
- <property name="Spacing">10</property>
- <property name="BorderWidth">5</property>
- <property name="Size">1</property>
- <property name="LayoutStyle">End</property>
- <child>
- <widget class="Gtk.Button" id="buttonOk">
- <property name="MemberName" />
- <property name="CanDefault">True</property>
- <property name="CanFocus">True</property>
- <property name="UseStock">True</property>
- <property name="Type">StockItem</property>
- <property name="StockId">gtk-ok</property>
- <property name="ResponseId">-5</property>
- <property name="label">gtk-ok</property>
- </widget>
- <packing>
- <property name="Expand">False</property>
- <property name="Fill">False</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- <widget class="Gtk.Bin" id="LongoMatch.Gui.Component.PlayersTaggerWidget" design-size="300 48">
- <property name="MemberName" />
- <property name="Visible">False</property>
- <child>
- <widget class="Gtk.Frame" id="frame1">
- <property name="MemberName" />
- <property name="ShadowType">Out</property>
- <child>
- <widget class="Gtk.Alignment" id="GtkAlignment">
- <property name="MemberName" />
- <property name="Xalign">0</property>
- <property name="Yalign">0</property>
- <property name="LeftPadding">12</property>
- <child>
- <placeholder />
- </child>
- </widget>
- </child>
- <child>
- <widget class="Gtk.Label" id="CategoryLabel">
- <property name="MemberName" />
- <property name="UseMarkup">True</property>
- </widget>
- <packing>
- <property name="type">label_item</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- <widget class="Gtk.Bin" id="LongoMatch.Gui.Component.StringTaggerWidget" design-size="300 61">
- <property name="MemberName" />
- <property name="Visible">False</property>
- <child>
- <widget class="Gtk.Frame" id="frame">
- <property name="MemberName" />
- <property name="ShadowType">Out</property>
- <child>
- <widget class="Gtk.Alignment" id="GtkAlignment">
- <property name="MemberName" />
- <property name="Xalign">0</property>
- <property name="Yalign">0</property>
- <property name="LeftPadding">12</property>
- <child>
- <widget class="Gtk.Table" id="table">
- <property name="MemberName" />
- <property name="NRows">3</property>
- <property name="NColumns">3</property>
- <child>
- <placeholder />
- </child>
- <child>
- <placeholder />
- </child>
- <child>
- <placeholder />
- </child>
- <child>
- <placeholder />
- </child>
- <child>
- <placeholder />
- </child>
- <child>
- <placeholder />
- </child>
- <child>
- <placeholder />
- </child>
- <child>
- <placeholder />
- </child>
- <child>
- <placeholder />
- </child>
- </widget>
- </child>
- </widget>
- </child>
- <child>
- <widget class="Gtk.Label" id="titlelabel">
- <property name="MemberName" />
- <property name="LabelProp" translatable="yes"><b>GtkFrame</b></property>
- <property name="UseMarkup">True</property>
- </widget>
- <packing>
- <property name="type">label_item</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
<widget class="Gtk.Bin" id="LongoMatch.Gui.Component.RenderingStateBar" design-size="204 28">
<property name="MemberName" />
<property name="Visible">False</property>
@@ -4127,288 +3461,6 @@ You can continue with the current capture, cancel it or save your project.
</widget>
</child>
</widget>
- <widget class="Gtk.Bin" id="LongoMatch.Gui.Component.GameUnitsEditor" design-size="561 299">
- <property name="MemberName" />
- <property name="Visible">False</property>
- <child>
- <widget class="Gtk.VBox" id="vbox2">
- <property name="MemberName" />
- <property name="Visible">False</property>
- <property name="Spacing">6</property>
- <child>
- <widget class="Gtk.Label" id="label1">
- <property name="MemberName" />
- <property name="LabelProp" translatable="yes"><b>Game Units</b>: Games are usually
divided in time by units. In sports like field hockey the game is divided in 2 halves but other sports like
tenis have several types of units that are anidated, e.g. Set->Game->Point.
-
-Defining <b> Game Units </b> will help you during the analysis to indentify the tagged plays in
the the phases of the game.</property>
- <property name="UseMarkup">True</property>
- <property name="Wrap">True</property>
- <property name="WidthChars">70</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="Gtk.ScrolledWindow" id="scrolledwindow2">
- <property name="MemberName" />
- <property name="CanFocus">True</property>
- <property name="ShadowType">In</property>
- <child>
- <widget class="Gtk.Viewport" id="GtkViewport">
- <property name="MemberName" />
- <property name="ShadowType">None</property>
- <child>
- <widget class="Gtk.VBox" id="outerbox">
- <property name="MemberName" />
- <property name="Visible">False</property>
- <property name="Spacing">6</property>
- <child>
- <widget class="Gtk.VBox" id="phasesbox">
- <property name="MemberName" />
- <property name="Spacing">6</property>
- <child>
- <placeholder />
- </child>
- <child>
- <placeholder />
- </child>
- <child>
- <placeholder />
- </child>
- </widget>
- <packing>
- <property name="Position">0</property>
- <property name="AutoSize">False</property>
- <property name="Expand">False</property>
- </packing>
- </child>
- <child>
- <widget class="Gtk.VBox" id="fillerbox">
- <property name="MemberName" />
- <property name="Spacing">6</property>
- <child>
- <placeholder />
- </child>
- <child>
- <placeholder />
- </child>
- <child>
- <placeholder />
- </child>
- </widget>
- <packing>
- <property name="Position">1</property>
- <property name="AutoSize">False</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="Position">1</property>
- <property name="AutoSize">True</property>
- </packing>
- </child>
- <child>
- <widget class="Gtk.HBox" id="hbox1">
- <property name="MemberName" />
- <property name="Spacing">6</property>
- <child>
- <widget class="Gtk.Entry" id="entry1">
- <property name="MemberName" />
- <property name="CanFocus">True</property>
- <property name="IsEditable">True</property>
- <property name="InvisibleChar">•</property>
- </widget>
- <packing>
- <property name="Position">0</property>
- <property name="AutoSize">True</property>
- </packing>
- </child>
- <child>
- <widget class="Gtk.Button" id="addbutton">
- <property name="MemberName" />
- <property name="Sensitive">False</property>
- <property name="CanFocus">True</property>
- <property name="Type">TextAndIcon</property>
- <property name="Icon">stock:gtk-add Dialog</property>
- <property name="Label" translatable="yes">Add game unit</property>
- <property name="UseUnderline">True</property>
- </widget>
- <packing>
- <property name="Position">1</property>
- <property name="AutoSize">True</property>
- <property name="Expand">False</property>
- <property name="Fill">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="PackType">End</property>
- <property name="Position">2</property>
- <property name="AutoSize">True</property>
- <property name="Expand">False</property>
- <property name="Fill">False</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- <widget class="Gtk.Bin" id="LongoMatch.Gui.Component.GameUnitWidget" design-size="644 57">
- <property name="MemberName" />
- <property name="Visible">False</property>
- <child>
- <widget class="Gtk.HBox" id="gameunitsbox">
- <property name="MemberName" />
- <property name="Spacing">6</property>
- <child>
- <placeholder />
- </child>
- <child>
- <placeholder />
- </child>
- <child>
- <widget class="Gtk.Button" id="button1">
- <property name="MemberName" />
- <property name="CanFocus">True</property>
- <property name="Type">TextAndIcon</property>
- <property name="Label" translatable="yes">GtkButton</property>
- <property name="UseUnderline">True</property>
- </widget>
- <packing>
- <property name="Position">2</property>
- <property name="AutoSize">True</property>
- <property name="Expand">False</property>
- <property name="Fill">False</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
- <widget class="Gtk.Bin" id="LongoMatch.Gui.Component.GameUnitsTagger" design-size="727 74">
- <property name="MemberName" />
- <property name="Visible">False</property>
- <child>
- <widget class="Gtk.HBox" id="gameunitsbox1">
- <property name="MemberName" />
- <property name="Spacing">6</property>
- <child>
- <placeholder />
- </child>
- <child>
- <placeholder />
- </child>
- <child>
- <placeholder />
- </child>
- </widget>
- </child>
- </widget>
- <widget class="Gtk.Bin" id="LongoMatch.Gui.Component.PlayersTagger" design-size="331 191">
- <property name="MemberName" />
- <property name="Visible">False</property>
- <child>
- <widget class="Gtk.VBox" id="vbox4">
- <property name="MemberName" />
- <property name="Spacing">6</property>
- <child>
- <widget class="Gtk.Table" id="localtable">
- <property name="MemberName" />
- <property name="NRows">3</property>
- <property name="NColumns">3</property>
- <child>
- <placeholder />
- </child>
- <child>
- <placeholder />
- </child>
- <child>
- <placeholder />
- </child>
- <child>
- <placeholder />
- </child>
- <child>
- <placeholder />
- </child>
- <child>
- <placeholder />
- </child>
- <child>
- <placeholder />
- </child>
- <child>
- <placeholder />
- </child>
- <child>
- <placeholder />
- </child>
- </widget>
- <packing>
- <property name="Position">0</property>
- <property name="AutoSize">False</property>
- <property name="Expand">False</property>
- </packing>
- </child>
- <child>
- <widget class="Gtk.HSeparator" id="hseparator1">
- <property name="MemberName" />
- </widget>
- <packing>
- <property name="Position">1</property>
- <property name="AutoSize">True</property>
- <property name="Expand">False</property>
- <property name="Fill">False</property>
- </packing>
- </child>
- <child>
- <widget class="Gtk.Table" id="visitortable">
- <property name="MemberName" />
- <property name="NRows">3</property>
- <property name="NColumns">3</property>
- <child>
- <placeholder />
- </child>
- <child>
- <placeholder />
- </child>
- <child>
- <placeholder />
- </child>
- <child>
- <placeholder />
- </child>
- <child>
- <placeholder />
- </child>
- <child>
- <placeholder />
- </child>
- <child>
- <placeholder />
- </child>
- <child>
- <placeholder />
- </child>
- <child>
- <placeholder />
- </child>
- </widget>
- <packing>
- <property name="Position">2</property>
- <property name="AutoSize">False</property>
- <property name="Expand">False</property>
- </packing>
- </child>
- </widget>
- </child>
- </widget>
<widget class="Gtk.Bin" id="LongoMatch.Gui.Component.PlaysSelectionWidget" design-size="568 495">
<property name="MemberName" />
<property name="Visible">False</property>
@@ -9749,7 +8801,7 @@ Click 2 players to swap them</property>
</widget>
</child>
</widget>
- <widget class="Gtk.Bin" id="LongoMatch.Gui.Panel.SportsTemplatesPanel" design-size="1087 501">
+ <widget class="Gtk.Bin" id="LongoMatch.Gui.Panel.SportsTemplatesPanel" design-size="1087 503">
<property name="MemberName" />
<property name="Visible">False</property>
<child>
@@ -10192,6 +9244,7 @@ Click 2 players to swap them</property>
</child>
</widget>
<widget class="Gtk.Bin" id="LongoMatch.Gui.Component.CodingWidget" design-size="673 300">
+ <action-group name="Timeline" />
<action-group name="Default">
<action id="timelineMode">
<property name="Type">Radio</property>
@@ -10219,7 +9272,6 @@ Click 2 players to swap them</property>
<property name="StockId">gtk-zoom-fit</property>
</action>
</action-group>
- <action-group name="Timeline" />
<property name="MemberName" />
<property name="Visible">False</property>
<child>
diff --git a/LongoMatch.GUI/gtk-gui/objects.xml b/LongoMatch.GUI/gtk-gui/objects.xml
index 0da491b..adc065c 100644
--- a/LongoMatch.GUI/gtk-gui/objects.xml
+++ b/LongoMatch.GUI/gtk-gui/objects.xml
@@ -99,10 +99,6 @@
<itemgroups />
<signals />
</object>
- <object type="LongoMatch.Gui.Component.TaggerWidget" palette-category="General" allow-children="false"
base-type="Gtk.Bin">
- <itemgroups />
- <signals />
- </object>
<object type="LongoMatch.Gui.Component.BackgroundWidget" palette-category="General" allow-children="false"
base-type="Gtk.Bin">
<itemgroups />
<signals />
@@ -116,14 +112,6 @@
</itemgroup>
</signals>
</object>
- <object type="LongoMatch.Gui.Component.PlayersTaggerWidget" palette-category="General"
allow-children="false" base-type="Gtk.Bin">
- <itemgroups />
- <signals />
- </object>
- <object type="LongoMatch.Gui.Component.StringTaggerWidget" palette-category="General"
allow-children="false" base-type="Gtk.Bin">
- <itemgroups />
- <signals />
- </object>
<object type="LongoMatch.Gui.Component.RenderingStateBar" palette-category="General"
allow-children="false" base-type="Gtk.Bin">
<itemgroups>
<itemgroup label="IRenderingStateBar Properties">
@@ -141,30 +129,6 @@
<itemgroups />
<signals />
</object>
- <object type="LongoMatch.Gui.Component.GameUnitsEditor" palette-category="General" allow-children="false"
base-type="Gtk.Bin">
- <itemgroups />
- <signals />
- </object>
- <object type="LongoMatch.Gui.Component.GameUnitWidget" palette-category="General" allow-children="false"
base-type="Gtk.Frame">
- <itemgroups />
- <signals>
- <itemgroup label="GameUnitWidget Signals">
- <signal name="GameUnitEvent" />
- </itemgroup>
- </signals>
- </object>
- <object type="LongoMatch.Gui.Component.GameUnitsTagger" palette-category="General" allow-children="false"
base-type="Gtk.Bin">
- <itemgroups />
- <signals>
- <itemgroup label="GameUnitsTagger Signals">
- <signal name="GameUnitEvent" />
- </itemgroup>
- </signals>
- </object>
- <object type="LongoMatch.Gui.Component.PlayersTagger" palette-category="General" allow-children="false"
base-type="Gtk.Bin">
- <itemgroups />
- <signals />
- </object>
<object type="LongoMatch.Gui.Component.PlaysSelectionWidget" palette-category="General"
allow-children="false" base-type="Gtk.Bin">
<itemgroups />
<signals />
@@ -405,4 +369,40 @@
</itemgroup>
</signals>
</object>
+ <object type="LongoMatch.Gui.Component.PlayersTaggerWidget" palette-category="General"
allow-children="false" base-type="Gtk.Bin">
+ <itemgroups />
+ <signals />
+ </object>
+ <object type="LongoMatch.Gui.Component.StringTaggerWidget" palette-category="General"
allow-children="false" base-type="Gtk.Bin">
+ <itemgroups />
+ <signals />
+ </object>
+ <object type="LongoMatch.Gui.Component.GameUnitsEditor" palette-category="General" allow-children="false"
base-type="Gtk.Bin">
+ <itemgroups />
+ <signals />
+ </object>
+ <object type="LongoMatch.Gui.Component.GameUnitsTagger" palette-category="General" allow-children="false"
base-type="Gtk.Bin">
+ <itemgroups />
+ <signals>
+ <itemgroup label="GameUnitsTagger Signals">
+ <signal name="GameUnitEvent" />
+ </itemgroup>
+ </signals>
+ </object>
+ <object type="LongoMatch.Gui.Component.GameUnitWidget" palette-category="General" allow-children="false"
base-type="Gtk.Frame">
+ <itemgroups />
+ <signals>
+ <itemgroup label="GameUnitWidget Signals">
+ <signal name="GameUnitEvent" />
+ </itemgroup>
+ </signals>
+ </object>
+ <object type="LongoMatch.Gui.Component.PlayersTagger" palette-category="General" allow-children="false"
base-type="Gtk.Bin">
+ <itemgroups />
+ <signals />
+ </object>
+ <object type="LongoMatch.Gui.Component.TaggerWidget" palette-category="General" allow-children="false"
base-type="Gtk.Bin">
+ <itemgroups />
+ <signals />
+ </object>
</objects>
\ No newline at end of file
diff --git a/LongoMatch.Migration/Common/Color.cs b/LongoMatch.Migration/Common/Color.cs
new file mode 100644
index 0000000..009cbc8
--- /dev/null
+++ b/LongoMatch.Migration/Common/Color.cs
@@ -0,0 +1,90 @@
+//
+// Copyright (C) 2011 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 Newtonsoft.Json;
+
+namespace LongoMatch.Common
+{
+
+ [JsonConverter (typeof (LongoMatchConverter))]
+ public class Color
+ {
+ public Color (byte r, byte g, byte b, byte a=byte.MaxValue)
+ {
+ R = r;
+ G = g;
+ B = b;
+ A = a;
+ }
+
+ public byte R {
+ get;
+ set;
+ }
+
+ public byte G {
+ get;
+ set;
+ }
+
+ public byte B {
+ get;
+ set;
+ }
+
+ public byte A {
+ get;
+ set;
+ }
+
+ public override bool Equals (object obj)
+ {
+ Color c = obj as Color;
+ if (c == null) {
+ return false;
+ }
+ return c.R == R && c.G == G && c.B == B && c.A == A;
+ }
+
+ public override int GetHashCode ()
+ {
+ return (Int32)R<<24 | (Int32)G<<16 | (Int32)B<<8 | (Int32)A;
+ }
+
+ static public byte UShortToByte (ushort val) {
+ return (byte) (((float)val) / ushort.MaxValue * byte.MaxValue);
+ }
+
+ static public Color ColorFromUShort (ushort r, ushort g, ushort b, ushort a =
ushort.MaxValue) {
+ return new Color (UShortToByte (r), UShortToByte (g),
+ UShortToByte (b), UShortToByte (a));
+ }
+
+ static public Color Black = new Color (0, 0, 0);
+ static public Color White = new Color (255, 255, 255);
+ static public Color Red = new Color (255, 0, 0);
+ static public Color Green = new Color (0, 255, 0);
+ static public Color Blue = new Color (0, 0, 255);
+ static public Color Grey1 = new Color (190, 190, 190);
+ static public Color Grey2 = new Color (32, 32, 32);
+ static public Color Green1 = new Color (99,192,56);
+ static public Color Red1 = new Color (255, 51, 0);
+ static public Color Blue1 = new Color (0, 153, 255);
+ }
+}
+
diff --git a/LongoMatch.Core/Store/GameUnit.cs b/LongoMatch.Migration/Common/Config.cs
similarity index 58%
copy from LongoMatch.Core/Store/GameUnit.cs
copy to LongoMatch.Migration/Common/Config.cs
index f9ce9b9..01d3805 100644
--- a/LongoMatch.Core/Store/GameUnit.cs
+++ b/LongoMatch.Migration/Common/Config.cs
@@ -1,43 +1,43 @@
-//
-// Copyright (C) 2011 andoni
-//
+//
+// Copyright (C) 2014 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 System.Collections.Generic;
-namespace LongoMatch.Store
+namespace LongoMatch.Common
{
- [Serializable]
- public class GameUnit: List<TimelineNode>
+ public class Config
{
-
- public GameUnit (string name)
- {
- Name=name;
+ static public Image FieldBackground {
+ get {
+ return new Image (Gdk.Pixbuf.LoadFromResource (Constants.FIELD_BACKGROUND));
+ }
}
- public string Name {
- get;
- set;
+ static public Image HalfFieldBackground {
+ get {
+ return new Image (Gdk.Pixbuf.LoadFromResource
(Constants.HALF_FIELD_BACKGROUND));
+ }
}
- public override string ToString ()
- {
- return string.Format ("[GameUnit: Name={0}]", Name);
- }
+ static public Image GoalBackground {
+ get {
+ return new Image (Gdk.Pixbuf.LoadFromResource (Constants.GOAL_BACKGROUND));
+ }
+ }
}
}
diff --git a/LongoMatch.Migration/Common/ConsoleCrayon.cs b/LongoMatch.Migration/Common/ConsoleCrayon.cs
new file mode 100644
index 0000000..44d06e4
--- /dev/null
+++ b/LongoMatch.Migration/Common/ConsoleCrayon.cs
@@ -0,0 +1,280 @@
+//
+// ConsoleCrayon.cs
+//
+// Author:
+// Aaron Bockover <abockover novell com>
+//
+// Copyright (C) 2008 Novell, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+
+namespace LongoMatch
+{
+ public static class ConsoleCrayon
+ {
+
+ #region Public API
+
+ private static ConsoleColor foreground_color;
+ public static ConsoleColor ForegroundColor {
+ get {
+ return foreground_color;
+ }
+ set {
+ foreground_color = value;
+ SetColor(foreground_color, true);
+ }
+ }
+
+ private static ConsoleColor background_color;
+ public static ConsoleColor BackgroundColor {
+ get {
+ return background_color;
+ }
+ set {
+ background_color = value;
+ SetColor(background_color, false);
+ }
+ }
+
+ public static void ResetColor()
+ {
+ if(XtermColors) {
+ Console.Write(GetAnsiResetControlCode());
+ } else if(Environment.OSVersion.Platform != PlatformID.Unix && !RuntimeIsMono) {
+ Console.ResetColor();
+ }
+ }
+
+ private static void SetColor(ConsoleColor color, bool isForeground)
+ {
+ if(color < ConsoleColor.Black || color > ConsoleColor.White) {
+ throw new ArgumentOutOfRangeException("color", "Not a ConsoleColor value.");
+ }
+
+ if(XtermColors) {
+ Console.Write(GetAnsiColorControlCode(color, isForeground));
+ } else if(Environment.OSVersion.Platform != PlatformID.Unix && !RuntimeIsMono) {
+ if(isForeground) {
+ Console.ForegroundColor = color;
+ } else {
+ Console.BackgroundColor = color;
+ }
+ }
+ }
+
+ #endregion
+
+ #region Ansi/VT Code Calculation
+
+ // Modified from Mono's System.TermInfoDriver
+ // License: MIT/X11
+ // Authors: Gonzalo Paniagua Javier <gonzalo ximian com>
+ // (C) 2005-2006 Novell, Inc <http://www.novell.com>
+
+ private static int TranslateColor(ConsoleColor desired, out bool light)
+ {
+ light = false;
+ switch(desired) {
+ // Dark colors
+ case ConsoleColor.Black:
+ return 0;
+ case ConsoleColor.DarkRed:
+ return 1;
+ case ConsoleColor.DarkGreen:
+ return 2;
+ case ConsoleColor.DarkYellow:
+ return 3;
+ case ConsoleColor.DarkBlue:
+ return 4;
+ case ConsoleColor.DarkMagenta:
+ return 5;
+ case ConsoleColor.DarkCyan:
+ return 6;
+ case ConsoleColor.Gray:
+ return 7;
+
+ // Light colors
+ case ConsoleColor.DarkGray:
+ light = true;
+ return 0;
+ case ConsoleColor.Red:
+ light = true;
+ return 1;
+ case ConsoleColor.Green:
+ light = true;
+ return 2;
+ case ConsoleColor.Yellow:
+ light = true;
+ return 3;
+ case ConsoleColor.Blue:
+ light = true;
+ return 4;
+ case ConsoleColor.Magenta:
+ light = true;
+ return 5;
+ case ConsoleColor.Cyan:
+ light = true;
+ return 6;
+ case ConsoleColor.White:
+ default:
+ light = true;
+ return 7;
+ }
+ }
+
+ private static string GetAnsiColorControlCode(ConsoleColor color, bool isForeground)
+ {
+ // lighter fg colours are 90 -> 97 rather than 30 -> 37
+ // lighter bg colours are 100 -> 107 rather than 40 -> 47
+ bool light;
+ int code = TranslateColor(color, out light) + (isForeground ? 30 : 40) + (light ? 60
: 0);
+ return String.Format("\x001b[{0}m", code);
+ }
+
+ private static string GetAnsiResetControlCode()
+ {
+ return "\x001b[0m";
+ }
+
+ #endregion
+
+ #region xterm Detection
+
+ private static bool? xterm_colors = null;
+ public static bool XtermColors {
+ get {
+ if(xterm_colors == null) {
+ DetectXtermColors();
+ }
+
+ return xterm_colors.Value;
+ }
+ }
+
+ [System.Runtime.InteropServices.DllImport("libc", EntryPoint="isatty")]
+ private extern static int _isatty(int fd);
+
+ private static bool isatty(int fd)
+ {
+ try {
+ return _isatty(fd) == 1;
+ } catch {
+ return false;
+ }
+ }
+
+ private static void DetectXtermColors()
+ {
+ bool _xterm_colors = false;
+
+ switch(Environment.GetEnvironmentVariable("TERM")) {
+ case "xterm":
+ case "rxvt":
+ case "rxvt-unicode":
+ if(Environment.GetEnvironmentVariable("COLORTERM") != null) {
+ _xterm_colors = true;
+ }
+ break;
+ case "xterm-color":
+ _xterm_colors = true;
+ break;
+ }
+
+ xterm_colors = _xterm_colors && isatty(1) && isatty(2);
+ }
+
+ #endregion
+
+ #region Runtime Detection
+
+ private static bool? runtime_is_mono;
+ public static bool RuntimeIsMono {
+ get {
+ if(runtime_is_mono == null) {
+ runtime_is_mono = Type.GetType("System.MonoType") != null;
+ }
+
+ return runtime_is_mono.Value;
+ }
+ }
+
+ #endregion
+
+ #region Tests
+
+ public static void Test()
+ {
+ TestSelf();
+ Console.WriteLine();
+ TestAnsi();
+ Console.WriteLine();
+ TestRuntime();
+ }
+
+ private static void TestSelf()
+ {
+ Console.WriteLine("==SELF TEST==");
+ foreach(ConsoleColor color in Enum.GetValues(typeof(ConsoleColor))) {
+ ForegroundColor = color;
+ Console.Write(color);
+ ResetColor();
+ Console.Write(" :: ");
+ BackgroundColor = color;
+ Console.Write(color);
+ ResetColor();
+ Console.WriteLine();
+ }
+ }
+
+ private static void TestAnsi()
+ {
+ Console.WriteLine("==ANSI TEST==");
+ foreach(ConsoleColor color in Enum.GetValues(typeof(ConsoleColor))) {
+ string color_code_fg = GetAnsiColorControlCode(color, true);
+ string color_code_bg = GetAnsiColorControlCode(color, false);
+ Console.Write("{0}{1}: {2}{3} :: {4}{1}: {5}{3}", color_code_fg, color,
color_code_fg.Substring(2),
+ GetAnsiResetControlCode(), color_code_bg,
color_code_bg.Substring(2));
+ Console.WriteLine();
+ }
+ }
+
+ private static void TestRuntime()
+ {
+ Console.WriteLine("==RUNTIME TEST==");
+ foreach(ConsoleColor color in Enum.GetValues(typeof(ConsoleColor))) {
+ Console.ForegroundColor = color;
+ Console.Write(color);
+ Console.ResetColor();
+ Console.Write(" :: ");
+ Console.BackgroundColor = color;
+ Console.Write(color);
+ Console.ResetColor();
+ Console.WriteLine();
+ }
+ }
+
+ #endregion
+
+ }
+}
diff --git a/LongoMatch.Migration/Common/Constants.cs b/LongoMatch.Migration/Common/Constants.cs
new file mode 100644
index 0000000..f51aa74
--- /dev/null
+++ b/LongoMatch.Migration/Common/Constants.cs
@@ -0,0 +1,114 @@
+//
+// Copyright (C) 2007-2010 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+
+using System;
+#if HAVE_GTK
+using Gdk;
+#endif
+
+
+namespace LongoMatch.Common
+{
+ public class Constants {
+ public const string SOFTWARE_NAME = "LongoMatch";
+
+ public const string PROJECT_NAME = SOFTWARE_NAME + " project";
+
+ public const string DEFAULT_DB_NAME = "longomatch";
+
+ public const string COPYRIGHT = "Copyright ©2007-2010 Andoni Morales Alastruey";
+
+ public const string FAKE_PROJECT = "@Fake Project@";
+
+ public const string PORTABLE_FILE = "longomatch.portable";
+
+ public const string LICENSE =
+ @"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.";
+
+ public const string TRANSLATORS =
+ @"Andoni Morales Alastruey (es)
+Aron Xu (cn_ZH)
+Barkın Tanmann (tr)
+Bruno Brouard (fr)
+Daniel Nylander (sv)
+G. Baylard (fr)
+Joan Charmant (fr)
+João Paulo Azevedo (pt)
+Joe Hansen (da)
+Jorge González (es)
+Kenneth Nielsen (da)
+Kjartan Maraas (nb)
+Peter Strikwerda (nl)
+Laurent Coudeur (fr)
+Marek Cernocky (cs)
+Mario Blättermann (de)
+Matej Urbančič (sl)
+Maurizio Napolitano (it)
+Pavel Bárta (cs)
+Petr Kovar (cs)
+Xavier Queralt Mateu (ca)";
+
+ public const string WEBSITE = "http://www.longomatch.ylatuya.es";
+
+ public const string MANUAL = "http://www.longomatch.ylatuya.es/documentation/manual.html";
+
+#if HAVE_GTK
+ public const int STEP = (int) Gdk.ModifierType.ShiftMask;
+
+ public const int SEEK_BACKWARD = (int) Gdk.Key.Left;
+
+ public const int SEEK_FORWARD = (int) Gdk.Key.Right;
+
+ public const int FRAMERATE_UP = (int) Gdk.Key.Up;
+
+ public const int FRAMERATE_DOWN = (int) Gdk.Key.Down;
+
+ public const int TOGGLE_PLAY = (int) Gdk.Key.space;
+#endif
+
+ public const string TEMPLATES_DIR = "templates";
+ public const string TEAMS_TEMPLATE_EXT = ".ltt";
+ public const string CAT_TEMPLATE_EXT = ".lct";
+ public const string SUBCAT_TEMPLATE_EXT = ".lst";
+ public const string PLAYLIST_EXT = ".lpl";
+ public const string PROJECT_EXT = ".lgm";
+
+ public const string BACKGROUND = "background.png";
+ public const string FIELD_BACKGROUND = "field_background.svg";
+ public const string HALF_FIELD_BACKGROUND = "half_field_background.svg";
+ public const string GOAL_BACKGROUND = "goal_background.svg";
+
+ public const int DB_MAYOR_VERSION = 3;
+ public const int DB_MINOR_VERSION = 1;
+
+ public const int MAX_PLAYER_ICON_SIZE = 100;
+ public const int MAX_SHIELD_ICON_SIZE = 100;
+ public const int MAX_THUMBNAIL_SIZE = 100;
+
+ public static Color HOME_COLOR = Color.Red1;
+ public static Color AWAY_COLOR = Color.Blue1;
+ }
+}
diff --git a/LongoMatch.Core/Store/GameUnit.cs b/LongoMatch.Migration/Common/Enums.cs
similarity index 66%
copy from LongoMatch.Core/Store/GameUnit.cs
copy to LongoMatch.Migration/Common/Enums.cs
index f9ce9b9..ae62c2b 100644
--- a/LongoMatch.Core/Store/GameUnit.cs
+++ b/LongoMatch.Migration/Common/Enums.cs
@@ -1,43 +1,48 @@
-//
-// Copyright (C) 2011 andoni
-//
+//
+// Copyright (C) 2014 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 System.Collections.Generic;
-namespace LongoMatch.Store
+namespace LongoMatch.Common
{
- [Serializable]
- public class GameUnit: List<TimelineNode>
- {
-
- public GameUnit (string name)
- {
- Name=name;
- }
-
- public string Name {
- get;
- set;
- }
-
- public override string ToString ()
- {
- return string.Format ("[GameUnit: Name={0}]", Name);
- }
+ public enum Team {
+ NONE = 0,
+ LOCAL = 1,
+ VISITOR = 2,
+ BOTH = 3,
+ }
+
+ public enum SortMethodType {
+ SortByName = 0,
+ SortByStartTime = 1,
+ SortByStopTime = 2,
+ SortByDuration = 3
+ }
+
+ public enum SerializationType {
+ Binary,
+ Xml,
+ Json
}
+
+
+
+
+
+
}
diff --git a/LongoMatch.Migration/Common/Image.cs b/LongoMatch.Migration/Common/Image.cs
new file mode 100644
index 0000000..483c2a1
--- /dev/null
+++ b/LongoMatch.Migration/Common/Image.cs
@@ -0,0 +1,191 @@
+//
+// Copyright (C) 2011 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.Runtime.Serialization;
+using Newtonsoft.Json;
+
+namespace LongoMatch.Common
+{
+ using System;
+ using System.IO;
+#if HAVE_GTK
+ using SImage = Gdk.Pixbuf;
+#else
+ using System.Drawing.Imaging;
+ using SImage = System.Drawing.Image;
+#endif
+
+ [Serializable]
+ [JsonConverter (typeof(LongoMatchConverter))]
+ public class Image: ISerializable, IDisposable
+ {
+ SImage image;
+
+ public Image (SImage image)
+ {
+ this.image = image;
+ }
+
+ public SImage Value {
+ get {
+ return image;
+ }
+ }
+
+ public void Dispose() {
+ image.Dispose();
+ }
+
+ public void Scale() {
+ Scale (Constants.MAX_THUMBNAIL_SIZE, Constants.MAX_THUMBNAIL_SIZE);
+ }
+
+ public void ScaleFactor (int destWidth, int destHeight,
+ out double scaleX, out double scaleY,
+ out Point offset) {
+ int oWidth = 0;
+ int oHeight = 0;
+
+ ComputeScale (Width, Height, destWidth, destHeight, out oWidth, out oHeight);
+ scaleX = (double) oWidth / Width;
+ scaleY = (double) oHeight / Height;
+ offset = new Point ((destWidth - oWidth) / 2, (destHeight - oHeight) / 2);
+ }
+
+ // this constructor is automatically called during deserialization
+ public Image (SerializationInfo info, StreamingContext context) {
+ try {
+ image = Deserialize ((byte[]) info.GetValue ("pngbuf", typeof
(byte[]))).Value;
+ } catch {
+ image = null;
+ }
+ }
+
+ // this method is automatically called during serialization
+ public void GetObjectData(SerializationInfo info, StreamingContext context) {
+ try {
+ info.AddValue("pngbuf", Serialize());
+ } catch {
+ info.AddValue("pngbuf", null);
+ }
+ }
+
+
+#if HAVE_GTK
+ public byte[] Serialize () {
+ if (image == null)
+ return null;
+ return image.SaveToBuffer("png");
+ }
+
+ public static Image Deserialize (byte[] ser) {
+ return new Image(new SImage(ser));
+ }
+
+ public void Scale(int maxWidth, int maxHeight) {
+ SImage scalled;
+ int width, height;
+
+ ComputeScale(image.Width, image.Height, maxWidth, maxHeight, out width, out height);
+ scalled= image.ScaleSimple(width, height, Gdk.InterpType.Bilinear);
+ image.Dispose();
+ image = scalled;
+ }
+
+ public void Save (string filename) {
+ image.Save(filename, "png");
+ }
+
+ public int Width {
+ get {
+ return image.Width;
+ }
+ }
+
+ public int Height {
+ get {
+ return image.Height;
+ }
+ }
+
+ public static Image Composite(Image image1, Image image2) {
+ SImage dest = new SImage(image1.Value.Colorspace, true, image1.Value.BitsPerSample,
+ image1.Width, image1.Height);
+ image1.Value.Composite(dest, 0, 0, image2.Width, image2.Height, 0, 0, 1, 1,
+ Gdk.InterpType.Bilinear, 255);
+ image2.Value.Composite(dest, 0, 0, image2.Width, image2.Height, 0, 0, 1, 1,
+ Gdk.InterpType.Bilinear, 255);
+ return new Image(dest);
+ }
+
+#else
+ public byte[] Serialize () {
+ if (image == null)
+ return null;
+ using (MemoryStream stream = new MemoryStream()) {
+ image.Save(stream, ImageFormat.Png);
+ byte[] buf = new byte[stream.Length - 1];
+ stream.Position = 0;
+ stream.Read(buf, 0, buf.Length);
+ return buf;
+ }
+ }
+
+ public void Scale(int maxWidth, int maxHeight) {
+ SImage scalled;
+ int width, height;
+
+ ComputeScale(image.Width, image.Height, maxWidth, maxHeight, out width, out height);
+ scalled = image.GetThumbnailImage(width, height, new
SImage.GetThumbnailImageAbort(ThumbnailAbort), IntPtr.Zero);
+ image.Dispose();
+ image = scalled;
+ }
+
+ public static Image Deserialize (byte[] ser) {
+ Image img = null;
+ using (MemoryStream stream = new MemoryStream(ser)) {
+ img = new Image(System.Drawing.Image.FromStream(stream));
+ }
+ return img;
+ }
+
+ public void Save (string filename) {
+ image.Save(filename, ImageFormat.Png);
+ }
+
+ bool ThumbnailAbort () {
+ return false;
+ }
+#endif
+
+ private void ComputeScale (int inWidth, int inHeight, int maxOutWidth, int maxOutHeight, out
int outWidth, out int outHeight)
+ {
+ outWidth = maxOutWidth;
+ outHeight = maxOutHeight;
+
+ double par = (double)inWidth /(double)inHeight;
+ double outPar = (double)maxOutWidth /(double)maxOutHeight;
+
+ if (outPar > par) {
+ outWidth = Math.Min (maxOutWidth, (int)(outHeight * par));
+ } else {
+ outHeight = Math.Min (maxOutHeight, (int)(outWidth / par));
+ }
+ }
+ }
+}
+
diff --git a/LongoMatch.Migration/Common/Log.cs b/LongoMatch.Migration/Common/Log.cs
new file mode 100644
index 0000000..0c0aadd
--- /dev/null
+++ b/LongoMatch.Migration/Common/Log.cs
@@ -0,0 +1,443 @@
+//
+// Log.cs
+//
+// Author:
+// Aaron Bockover <abockover novell com>
+//
+// Copyright (C) 2005-2007 Novell, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.Text;
+using System.Collections.Generic;
+using System.Threading;
+
+namespace LongoMatch
+{
+ public delegate void LogNotifyHandler(LogNotifyArgs args);
+
+ public class LogNotifyArgs : EventArgs
+ {
+ private LogEntry entry;
+
+ public LogNotifyArgs(LogEntry entry)
+ {
+ this.entry = entry;
+ }
+
+ public LogEntry Entry {
+ get {
+ return entry;
+ }
+ }
+ }
+
+ public enum LogEntryType
+ {
+ Debug,
+ Warning,
+ Error,
+ Information
+ }
+
+ public class LogEntry
+ {
+ private LogEntryType type;
+ private string message;
+ private string details;
+ private DateTime timestamp;
+
+ internal LogEntry(LogEntryType type, string message, string details)
+ {
+ this.type = type;
+ this.message = message;
+ this.details = details;
+ this.timestamp = DateTime.Now;
+ }
+
+ public LogEntryType Type {
+ get {
+ return type;
+ }
+ }
+
+ public string Message {
+ get {
+ return message;
+ }
+ }
+
+ public string Details {
+ get {
+ return details;
+ }
+ }
+
+ public DateTime TimeStamp {
+ get {
+ return timestamp;
+ }
+ }
+ }
+
+ public static class Log
+ {
+ public static event LogNotifyHandler Notify;
+
+ private static Dictionary<uint, DateTime> timers = new Dictionary<uint, DateTime> ();
+ private static uint next_timer_id = 1;
+
+ private static bool debugging = false;
+ public static bool Debugging {
+ get {
+ return debugging;
+ }
+ set {
+ debugging = value;
+ }
+ }
+
+ public static void Commit(LogEntryType type, string message, string details, bool showUser)
+ {
+ if(type == LogEntryType.Debug && !Debugging) {
+ return;
+ }
+
+ if(type != LogEntryType.Information || (type == LogEntryType.Information &&
!showUser)) {
+ switch(type) {
+ case LogEntryType.Error:
+ ConsoleCrayon.ForegroundColor = ConsoleColor.Red;
+ break;
+ case LogEntryType.Warning:
+ ConsoleCrayon.ForegroundColor = ConsoleColor.DarkYellow;
+ break;
+ case LogEntryType.Information:
+ ConsoleCrayon.ForegroundColor = ConsoleColor.Green;
+ break;
+ case LogEntryType.Debug:
+ ConsoleCrayon.ForegroundColor = ConsoleColor.Blue;
+ break;
+ }
+
+ var thread_name = String.Empty;
+ if(Debugging) {
+ var thread = Thread.CurrentThread;
+ thread_name = String.Format("{0} ", thread.ManagedThreadId);
+ }
+
+ Console.Write("[{5}{0} {1:00}:{2:00}:{3:00}.{4:000}]", TypeString(type),
DateTime.Now.Hour,
+ DateTime.Now.Minute, DateTime.Now.Second,
DateTime.Now.Millisecond, thread_name);
+
+ ConsoleCrayon.ResetColor();
+
+ if(details != null) {
+ Console.WriteLine(" {0} - {1}", message, details);
+ } else {
+ Console.WriteLine(" {0}", message);
+ }
+ }
+
+ if(showUser) {
+ OnNotify(new LogEntry(type, message, details));
+ }
+ }
+
+ private static string TypeString(LogEntryType type)
+ {
+ switch(type) {
+ case LogEntryType.Debug:
+ return "Debug";
+ case LogEntryType.Warning:
+ return "Warn ";
+ case LogEntryType.Error:
+ return "Error";
+ case LogEntryType.Information:
+ return "Info ";
+ }
+ return null;
+ }
+
+ private static void OnNotify(LogEntry entry)
+ {
+ LogNotifyHandler handler = Notify;
+ if(handler != null) {
+ handler(new LogNotifyArgs(entry));
+ }
+ }
+
+ #region Timer Methods
+
+ public static uint DebugTimerStart(string message)
+ {
+ return TimerStart(message, false);
+ }
+
+ public static uint InformationTimerStart(string message)
+ {
+ return TimerStart(message, true);
+ }
+
+ private static uint TimerStart(string message, bool isInfo)
+ {
+ if(!Debugging && !isInfo) {
+ return 0;
+ }
+
+ if(isInfo) {
+ Information(message);
+ } else {
+ Debug(message);
+ }
+
+ return TimerStart(isInfo);
+ }
+
+ public static uint DebugTimerStart()
+ {
+ return TimerStart(false);
+ }
+
+ public static uint InformationTimerStart()
+ {
+ return TimerStart(true);
+ }
+
+ private static uint TimerStart(bool isInfo)
+ {
+ if(!Debugging && !isInfo) {
+ return 0;
+ }
+
+ uint timer_id = next_timer_id++;
+ timers.Add(timer_id, DateTime.Now);
+ return timer_id;
+ }
+
+ public static void DebugTimerPrint(uint id)
+ {
+ if(!Debugging) {
+ return;
+ }
+
+ TimerPrint(id, "Operation duration: {0}", false);
+ }
+
+ public static void DebugTimerPrint(uint id, string message)
+ {
+ if(!Debugging) {
+ return;
+ }
+
+ TimerPrint(id, message, false);
+ }
+
+ public static void InformationTimerPrint(uint id)
+ {
+ TimerPrint(id, "Operation duration: {0}", true);
+ }
+
+ public static void InformationTimerPrint(uint id, string message)
+ {
+ TimerPrint(id, message, true);
+ }
+
+ private static void TimerPrint(uint id, string message, bool isInfo)
+ {
+ if(!Debugging && !isInfo) {
+ return;
+ }
+
+ DateTime finish = DateTime.Now;
+
+ if(!timers.ContainsKey(id)) {
+ return;
+ }
+
+ TimeSpan duration = finish - timers[id];
+ string d_message;
+ if(duration.TotalSeconds < 60) {
+ d_message = duration.TotalSeconds.ToString();
+ } else {
+ d_message = duration.ToString();
+ }
+
+ if(isInfo) {
+ InformationFormat(message, d_message);
+ } else {
+ DebugFormat(message, d_message);
+ }
+ }
+
+ #endregion
+
+ #region Public Debug Methods
+
+ public static void Debug(string message, string details)
+ {
+ if(Debugging) {
+ Commit(LogEntryType.Debug, message, details, false);
+ }
+ }
+
+ public static void Debug(string message)
+ {
+ if(Debugging) {
+ Debug(message, null);
+ }
+ }
+
+ public static void DebugFormat(string format, params object [] args)
+ {
+ if(Debugging) {
+ Debug(String.Format(format, args));
+ }
+ }
+
+ #endregion
+
+ #region Public Information Methods
+
+ public static void Information(string message)
+ {
+ Information(message, null);
+ }
+
+ public static void Information(string message, string details)
+ {
+ Information(message, details, false);
+ }
+
+ public static void Information(string message, string details, bool showUser)
+ {
+ Commit(LogEntryType.Information, message, details, showUser);
+ }
+
+ public static void Information(string message, bool showUser)
+ {
+ Information(message, null, showUser);
+ }
+
+ public static void InformationFormat(string format, params object [] args)
+ {
+ Information(String.Format(format, args));
+ }
+
+ #endregion
+
+ #region Public Warning Methods
+
+ public static void Warning(string message)
+ {
+ Warning(message, null);
+ }
+
+ public static void Warning(string message, string details)
+ {
+ Warning(message, details, false);
+ }
+
+ public static void Warning(string message, string details, bool showUser)
+ {
+ Commit(LogEntryType.Warning, message, details, showUser);
+ }
+
+ public static void Warning(string message, bool showUser)
+ {
+ Warning(message, null, showUser);
+ }
+
+ public static void WarningFormat(string format, params object [] args)
+ {
+ Warning(String.Format(format, args));
+ }
+
+ #endregion
+
+ #region Public Error Methods
+
+ public static void Error(string message)
+ {
+ Error(message, null);
+ }
+
+ public static void Error(string message, string details)
+ {
+ Error(message, details, false);
+ }
+
+ public static void Error(string message, string details, bool showUser)
+ {
+ Commit(LogEntryType.Error, message, details, showUser);
+ }
+
+ public static void Error(string message, bool showUser)
+ {
+ Error(message, null, showUser);
+ }
+
+ public static void ErrorFormat(string format, params object [] args)
+ {
+ Error(String.Format(format, args));
+ }
+
+ #endregion
+
+ #region Public Exception Methods
+
+ public static void DebugException(Exception e)
+ {
+ if(Debugging) {
+ Exception(e);
+ }
+ }
+
+ public static void Exception(Exception e)
+ {
+ Exception(null, e);
+ }
+
+ public static void Exception(string message, Exception e)
+ {
+ Stack<Exception> exception_chain = new Stack<Exception> ();
+ StringBuilder builder = new StringBuilder();
+
+ while(e != null) {
+ exception_chain.Push(e);
+ e = e.InnerException;
+ }
+
+ while(exception_chain.Count > 0) {
+ e = exception_chain.Pop();
+ builder.AppendFormat("{0}: {1} (in `{2}')", e.GetType(), e.Message,
e.Source).AppendLine();
+ builder.Append(e.StackTrace);
+ if(exception_chain.Count > 0) {
+ builder.AppendLine();
+ }
+ }
+
+ // FIXME: We should save these to an actual log file
+ Log.Warning(message ?? "Caught an exception", builder.ToString(), false);
+ }
+
+ #endregion
+ }
+}
diff --git a/LongoMatch.Core/Common/SerializableObject.cs b/LongoMatch.Migration/Common/SerializableObject.cs
similarity index 59%
rename from LongoMatch.Core/Common/SerializableObject.cs
rename to LongoMatch.Migration/Common/SerializableObject.cs
index fccb9d7..c7060be 100644
--- a/LongoMatch.Core/Common/SerializableObject.cs
+++ b/LongoMatch.Migration/Common/SerializableObject.cs
@@ -27,6 +27,8 @@ using LongoMatch.Interfaces;
using System.Reflection;
using LongoMatch.Store.Templates;
using Newtonsoft.Json.Converters;
+using LongoMatch.Store;
+using System.Globalization;
namespace LongoMatch.Common
{
@@ -106,54 +108,84 @@ namespace LongoMatch.Common
settings.Formatting = Formatting.Indented;
settings.PreserveReferencesHandling = PreserveReferencesHandling.Objects;
settings.TypeNameHandling = TypeNameHandling.Objects;
- settings.ContractResolver = new ListObjectContractResolver ();
+ //settings.ContractResolver = new ListObjectContractResolver ();
settings.Converters.Add (new VersionConverter ());
return settings;
}
}
}
- public class ListObjectContractResolver : DefaultContractResolver
+ public class LongoMatchConverter : JsonConverter
{
- /* To serialize/desarialize List objects by including private fields
- * _size and _items */
- public ListObjectContractResolver()
+ public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
+ if (value is Time) {
+ Time time = value as Time;
+ if (time != null) {
+ writer.WriteValue(time.MSeconds);
+ }
+ } else if (value is Color) {
+ Color color = value as Color;
+ if (color != null) {
+ writer.WriteValue(String.Format ("#{0}{1}{2}{3}",
+ color.R.ToString ("X2"),
+ color.G.ToString ("X2"),
+ color.B.ToString ("X2"),
+ color.A.ToString ("X2")));
+ }
+ } else if (value is Image) {
+ Image image = value as Image;
+ if (image != null) {
+ writer.WriteValue(image.Serialize());
+ }
+ } else if (value is HotKey) {
+ HotKey hotkey = value as HotKey;
+ if (hotkey != null) {
+ writer.WriteValue(String.Format ("{0} {1}", hotkey.Key,
hotkey.Modifier));
+ }
+ } else if (value is Point) {
+ Point p = value as Point;
+ if (p != null) {
+ writer.WriteValue(String.Format ("{0} {1}", p.DX, p.DY));
+ }
+ }
}
-
- protected override IList<JsonProperty> CreateProperties (Type type, MemberSerialization
memberSerialization)
+
+ public override object ReadJson(JsonReader reader, Type objectType, object existingValue,
JsonSerializer serializer)
{
- IList<JsonProperty> props = new List<JsonProperty>();
-
- props = base.CreateProperties (type, memberSerialization);
- if (typeof(ISubCategory).IsAssignableFrom (type) ||
- type == typeof(Categories) ||
- type == typeof(TeamTemplate) ||
- type == typeof(SubCategoryTemplate))
- {
- JsonProperty itprop;
- BindingFlags flags;
-
- props = props.Where (p => p.PropertyName != "Count").ToList();
- flags = base.DefaultMembersSearchFlags;
- IList<JsonProperty> allprops = new List<JsonProperty>();
- base.DefaultMembersSearchFlags = flags |
System.Reflection.BindingFlags.NonPublic;
- allprops = base.CreateProperties (type, MemberSerialization.Fields);
- base.DefaultMembersSearchFlags = flags;
- itprop = allprops.FirstOrDefault (p => p.PropertyName == "_items");
- if (itprop != null) {
- props.Add (itprop);
- }
- itprop = allprops.FirstOrDefault (p => p.PropertyName == "_size");
- if (itprop != null) {
- props.Add (itprop);
+ if (reader.Value != null) {
+ if (objectType == typeof (Time)) {
+ Int64 t = (Int64) reader.Value;
+ return new Time((int)t);
+ } else if (objectType == typeof (Color)) {
+ string rgbStr = (string) reader.Value;
+ return new Color(Byte.Parse (rgbStr.Substring(1,2),
NumberStyles.HexNumber),
+ Byte.Parse (rgbStr.Substring(3,2),
NumberStyles.HexNumber),
+ Byte.Parse (rgbStr.Substring(5,2),
NumberStyles.HexNumber),
+ Byte.Parse (rgbStr.Substring(7,2),
NumberStyles.HexNumber));
+ } else if (objectType == typeof (Image)) {
+ byte[] buf = Convert.FromBase64String ((string)reader.Value);
+ return Image.Deserialize (buf);
+ } else if (objectType == typeof (HotKey)) {
+ string[] hk = ((string)reader.Value).Split (' ');
+ return new HotKey {Key = int.Parse(hk[0]), Modifier =
int.Parse(hk[1])};
+ } else if (objectType == typeof (Point)) {
+ string[] ps = ((string)reader.Value).Split (' ');
+ return new Point (double.Parse(ps[0]), double.Parse(ps[1]));
}
}
-
- return props;
+ return null;
+ }
+
+ public override bool CanConvert(Type objectType)
+ {
+ return (
+ objectType == typeof(Time) ||
+ objectType == typeof(Color) ||
+ objectType == typeof(HotKey) ||
+ objectType == typeof(Image));
}
}
-
}
diff --git a/LongoMatch.Migration/Converter.cs b/LongoMatch.Migration/Converter.cs
new file mode 100644
index 0000000..591efb8
--- /dev/null
+++ b/LongoMatch.Migration/Converter.cs
@@ -0,0 +1,173 @@
+//
+// Copyright (C) 2014 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 System.Linq;
+using System.IO;
+using LongoMatch.Common;
+using LongoMatch.Store.Templates;
+using LongoMatch.Store;
+using System.Collections.Generic;
+using LongoMatch.DB;
+using LongoMatch.Interfaces;
+
+namespace LongoMatch.Migration
+{
+ public class Converter
+ {
+
+ public static void ConvertCategories (string inputPath, string outputPath) {
+ Categories cats = SerializableObject.Load<Categories> (inputPath,
+ SerializationType.Binary);
+ foreach (Category cat in cats) {
+ cat.UUID = Guid.NewGuid ();
+ List<SubCategory> l = new List<SubCategory>();
+ foreach (ISubCategory subcat in cat.SubCategories) {
+ if (subcat is TagSubCategory) {
+ SubCategory s = new SubCategory ();
+ s.Name = subcat.Name;
+ s.AllowMultiple = subcat.AllowMultiple;
+ s.Options = (subcat as TagSubCategory).ToList();
+ l.Add (s);
+ }
+ }
+ cat.SubCategoriesList = l;
+ }
+ cats.ID = Guid.NewGuid ();
+ SerializableObject.Save (cats, outputPath);
+ }
+
+ public static void ConvertTeamTemplate (string inputPath, string outputPath) {
+ TeamTemplate team = SerializableObject.Load<TeamTemplate> (inputPath,
+ SerializationType.Binary);
+ foreach (Player p in team) {
+ p.ID = Guid.NewGuid ();
+ }
+ team.UUID = Guid.NewGuid ();
+ team.FormationStr = "1-4-3-3";
+ SerializableObject.Save (team, outputPath);
+ }
+
+ public static void ConvertProject (Project project, string outputDir) {
+ Dictionary <TagSubCategory, SubCategory> dict = new Dictionary<TagSubCategory,
SubCategory>();
+
+ project.Timers = new List<Timer>();
+ project.Periods = new List<Period>();
+ for (int i=0; i < project.Categories.GamePeriods.Count; i++) {
+ int duration = project.Description.File.Duration.MSeconds;
+ int periodDuration = duration / project.Categories.GamePeriods.Count;
+ string period = project.Categories.GamePeriods[i];
+
+ Period p = new Period {Name = period};
+ p.Start (new Time (i * periodDuration));
+ p.Stop (new Time (i * periodDuration + periodDuration));
+ project.Periods.Add (p);
+ }
+
+ foreach (Player p in project.LocalTeamTemplate) {
+ p.ID = Guid.NewGuid ();
+ }
+ project.LocalTeamTemplate.UUID = Guid.NewGuid ();
+ foreach (Player p in project.VisitorTeamTemplate) {
+ p.ID = Guid.NewGuid ();
+ }
+ project.LocalTeamTemplate.UUID = Guid.NewGuid ();
+ foreach (Category cat in project.Categories) {
+ cat.UUID = Guid.NewGuid ();
+ List<SubCategory> l = new List<SubCategory>();
+ foreach (ISubCategory subcat in cat.SubCategories) {
+ if (subcat is TagSubCategory) {
+ SubCategory s = new SubCategory ();
+ s.Name = subcat.Name;
+ s.AllowMultiple = subcat.AllowMultiple;
+ s.Options = (subcat as TagSubCategory).ToList();
+ l.Add (s);
+ dict.Add (subcat as TagSubCategory, s);
+ }
+ }
+ cat.SubCategoriesList = l;
+ }
+ project.Categories.ID = Guid.NewGuid ();
+
+ foreach (Play play in project.AllPlays ()) {
+ Coordinates c;
+
+ List<Tag> tags = new List<Tag> ();
+ foreach (StringTag t in play.Tags.Tags) {
+ tags.Add (new Tag {SubCategory = dict[t.SubCategory as
TagSubCategory], Value = t.Value});
+ }
+ play.TagsList = tags;
+
+ play.ID = Guid.NewGuid ();
+ foreach (Player player in play.Players.GetTagsValues()) {
+ play.PlayersList.Add (player);
+ }
+
+ if (play.FieldPosition != null) {
+ c = new Coordinates ();
+ foreach (Point p in play.FieldPosition) {
+ Point newp = p.Normalize
(project.Categories.FieldBackground.Width,
+
project.Categories.FieldBackground.Height);
+ c.Add (newp);
+ }
+ play.FieldPosition = c;
+ }
+
+ if (play.HalfFieldPosition != null) {
+ c = new Coordinates ();
+ foreach (Point p in play.HalfFieldPosition) {
+ Point newp = p.Normalize
(project.Categories.HalfFieldBackground.Width,
+
project.Categories.HalfFieldBackground.Height);
+ c.Add (newp);
+ }
+ play.HalfFieldPosition = c;
+ }
+
+ if (play.GoalPosition != null) {
+ c = new Coordinates ();
+ foreach (Point p in play.GoalPosition) {
+ Point newp = p.Normalize
(project.Categories.GoalBackground.Width,
+
project.Categories.GoalBackground.Height);
+ c.Add (newp);
+ }
+ play.GoalPosition = c;
+ }
+ }
+ SerializableObject.Save (project, Path.Combine (outputDir, project.UUID.ToString()));
+ }
+
+ public static void ConvertDB (string dbfile, string outputdir) {
+ string dboutputdir;
+ string dbname;
+ DataBase db;
+
+ dbname = Path.GetFileName (dbfile).Split('.')[0] + ".ldb";
+
+ dboutputdir = Path.Combine (outputdir, Path.Combine (outputdir, dbname));
+ if (!Directory.Exists (dboutputdir)) {
+ Directory.CreateDirectory (dboutputdir);
+ }
+
+ db = new DataBase (dbfile);
+ foreach (ProjectDescription pd in db.GetAllProjects ()) {
+ Project p = db.GetProject (pd.UUID);
+ LongoMatch.Migration.Converter.ConvertProject (p, dboutputdir);
+ }
+ }
+ }
+}
+
diff --git a/LongoMatch.Migration/Core/Category.cs b/LongoMatch.Migration/Core/Category.cs
new file mode 100644
index 0000000..aeac71c
--- /dev/null
+++ b/LongoMatch.Migration/Core/Category.cs
@@ -0,0 +1,251 @@
+// SectionsTimeNode.cs
+//
+// Copyright (C) 2007-2009 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 System.Linq;
+using System.Collections.Generic;
+using System.Runtime.Serialization;
+using Mono.Unix;
+using Newtonsoft.Json;
+
+using LongoMatch.Common;
+using LongoMatch.Interfaces;
+using Image = LongoMatch.Common.Image;
+
+namespace LongoMatch.Store
+{
+
+ /// <summary>
+ /// Tag category for the analysis. Contains the default values to creates plays
+ /// tagged in this category
+ /// </summary>
+ [Serializable]
+ public class Category:TimeNode, ISerializable
+ {
+
+ [JsonProperty ("ID")]
+ private Guid _UUID;
+
+ #region Constructors
+ #endregion
+ public Category() {
+ _UUID = System.Guid.NewGuid();
+ SubCategories = new List<ISubCategory>();
+ TagGoalPosition = false;
+ TagFieldPosition = true;
+ }
+
+ #region Properties
+
+ /// <summary>
+ /// Unique ID for this category
+ /// </summary>
+ [JsonIgnore]
+ public Guid UUID {
+ get {
+ return _UUID;
+ } set {
+ _UUID = value;
+ }
+ }
+
+ /// <summary>
+ /// A key combination to create plays in this category
+ /// </summary>
+ public HotKey HotKey {
+ get;
+ set;
+ }
+
+ /// <summary>
+ /// A color to identify plays in this category
+ /// </summary>
+ [JsonProperty ("Color")]
+ public Color LColor {
+ get {
+ return new Color(this.Color.R, this.Color.G,
+ this.Color.B, this.Color.A);
+ } set {
+ }
+ }
+
+ [JsonIgnore]
+ public System.Drawing.Color Color {
+ get;
+ set;
+ }
+
+ //// <summary>
+ /// Sort method used to sort plays for this category
+ /// </summary>
+ public SortMethodType SortMethod {
+ get;
+ set;
+ }
+
+ /// <summary>
+ /// Position of the category in the list of categories
+ /// </summary>
+ public int Position {
+ get;
+ set;
+ }
+
+ public List<SubCategory> SubCategoriesList {
+ get;
+ set;
+ }
+
+ public List<ISubCategory> SubCategories {
+ get;
+ set;
+ }
+
+ public bool TagGoalPosition {
+ get;
+ set;
+ }
+
+ public bool TagFieldPosition {
+ get;
+ set;
+ }
+
+ public bool TagHalfFieldPosition {
+ get;
+ set;
+ }
+
+ public bool FieldPositionIsDistance {
+ get;
+ set;
+ }
+
+ public bool HalfFieldPositionIsDistance {
+ get;
+ set;
+ }
+
+ /// <summary>
+ /// Sort method string used for the UI
+ /// </summary>
+ [JsonIgnore]
+ public string SortMethodString {
+ get {
+ switch(SortMethod) {
+ case SortMethodType.SortByName:
+ return Catalog.GetString("Sort by name");
+ case SortMethodType.SortByStartTime:
+ return Catalog.GetString("Sort by start time");
+ case SortMethodType.SortByStopTime:
+ return Catalog.GetString("Sort by stop time");
+ case SortMethodType.SortByDuration:
+ return Catalog.GetString("Sort by duration");
+ default:
+ return Catalog.GetString("Sort by name");
+ }
+ }
+ set {
+ if(value == Catalog.GetString("Sort by start time"))
+ SortMethod = SortMethodType.SortByStartTime;
+ else if(value == Catalog.GetString("Sort by stop time"))
+ SortMethod = SortMethodType.SortByStopTime;
+ else if(value == Catalog.GetString("Sort by duration"))
+ SortMethod = SortMethodType.SortByDuration;
+ else
+ SortMethod = SortMethodType.SortByName;
+ }
+ }
+
+ // this constructor is automatically called during deserialization
+ public Category(SerializationInfo info, StreamingContext context) {
+ _UUID = (Guid)info.GetValue("uuid", typeof(Guid));
+ Name = (string) info.GetValue("name", typeof(string));
+ Start = (Time)info.GetValue("start", typeof(Time));
+ Stop = (Time)info.GetValue("stop", typeof(Time));
+ HotKey = (HotKey)info.GetValue("hotkey", typeof(HotKey));
+ SubCategories = (List<ISubCategory>)info.GetValue("subcategories",
typeof(List<ISubCategory>));
+ Position = (Int32) info.GetValue("position", typeof (Int32));
+ SortMethod = (SortMethodType)info.GetValue("sort_method", typeof(SortMethodType));
+ Color = System.Drawing.Color.FromArgb(
+ LongoMatch.Common.Color.UShortToByte((ushort)info.GetValue("red",
typeof(ushort))),
+ LongoMatch.Common.Color.UShortToByte((ushort)info.GetValue("green",
typeof(ushort))),
+ LongoMatch.Common.Color.UShortToByte((ushort)info.GetValue("blue",
typeof(ushort))));
+ LColor = LongoMatch.Common.Color.ColorFromUShort ((ushort)info.GetValue("red",
typeof(ushort)),
+ (ushort)info.GetValue("green",
typeof(ushort)),
+ (ushort)info.GetValue("blue",
typeof(ushort)));
+ try {
+ TagFieldPosition = (bool) info.GetValue("tagfieldpos", typeof (bool));
+ } catch {
+ TagFieldPosition = true;
+ }
+ try {
+ TagHalfFieldPosition =(bool) info.GetValue("taghalffieldpos", typeof (bool));
+ } catch {
+ TagHalfFieldPosition = false;
+ }
+ try {
+ TagGoalPosition = (bool) info.GetValue("taggoalpos", typeof (bool));
+ } catch {
+ TagGoalPosition = false;
+ }
+ try {
+ FieldPositionIsDistance =(bool) info.GetValue("fieldposisdist", typeof
(bool));
+ } catch {
+ FieldPositionIsDistance = false;
+ }
+ try {
+ HalfFieldPositionIsDistance =(bool) info.GetValue("halffieldposisdist",
typeof (bool));
+ } catch {
+ HalfFieldPositionIsDistance = false;
+ }
+ }
+
+ // this method is automatically called during serialization
+ public void GetObjectData(SerializationInfo info, StreamingContext context) {
+ info.AddValue("ID", UUID);
+ info.AddValue("Name", Name);
+ info.AddValue("Start", Start);
+ info.AddValue("Stop", Stop);
+ info.AddValue("Hotkey", HotKey);
+ info.AddValue("Position", Position);
+ info.AddValue("SubCategories", SubCategoriesList);
+ /* Convert to ushort for backward compatibility */
+ info.AddValue("Color", LColor);
+ info.AddValue("red", ByteToUShort(Color.R));
+ info.AddValue("green", ByteToUShort(Color.G));
+ info.AddValue("blue", ByteToUShort(Color.B));
+ info.AddValue("SortMethod", SortMethod);
+ info.AddValue("TagFieldPosition", TagFieldPosition);
+ info.AddValue("TagHalfFieldPosition", TagHalfFieldPosition);
+ info.AddValue("TagGoalPosistion", TagGoalPosition);
+ info.AddValue("FieldPositionIsDistance", FieldPositionIsDistance);
+ info.AddValue("HalfFieldPositionIsDistance", HalfFieldPositionIsDistance);
+ }
+
+ ushort ByteToUShort (Byte val) {
+ var ret = (ushort) (((float)val) / byte.MaxValue * ushort.MaxValue);
+ return ret;
+ }
+
+ #endregion
+
+ }
+}
diff --git a/LongoMatch.Core/Store/GameUnitsList.cs b/LongoMatch.Migration/Core/Coordinates.cs
similarity index 53%
copy from LongoMatch.Core/Store/GameUnitsList.cs
copy to LongoMatch.Migration/Core/Coordinates.cs
index 4cb7c4a..dfd8422 100644
--- a/LongoMatch.Core/Store/GameUnitsList.cs
+++ b/LongoMatch.Migration/Core/Coordinates.cs
@@ -1,5 +1,5 @@
//
-// Copyright (C) 2011 andoni
+// 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
@@ -16,50 +16,53 @@
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
//
using System;
+using System.Linq;
using System.Collections.Generic;
+using Newtonsoft.Json;
-using LongoMatch.Store;
-
-namespace LongoMatch.Store
+namespace LongoMatch.Common
{
[Serializable]
- public class GameUnitsList: List<GameUnit>
+ [JsonObject]
+ public class Coordinates: List<Point>
{
- public GameUnitsList ()
+ public Coordinates ()
{
}
- public int GameUnitDepth(GameUnit gameUnit) {
- return this.IndexOf(gameUnit);
+ public List<Point> Points {
+ get {
+ return this.ToList();
+ }
}
- public GameUnit GetParent(GameUnit gameUnit) {
- int index;
-
- if (!this.Contains(gameUnit))
- return null;
+ public override bool Equals (object obj)
+ {
+ Coordinates c = obj as Coordinates;
+ if (c == null)
+ return false;
+
+ if (c.Count != Count)
+ return false;
- index = this.IndexOf(gameUnit);
- if (index == 0)
- return null;
- return this[index-1];
+ for (int i=0; i<Count; i++) {
+ if (c[i] != this[i])
+ return false;
+ }
+ return true;
}
-
- public GameUnit GetChild(GameUnit gameUnit) {
- int index;
+
+ public override int GetHashCode ()
+ {
+ string s = "";
- if (!this.Contains(gameUnit))
- return null;
+ for (int i=0; i<Count; i++) {
+ s += this[i].X.ToString() + this[i].Y.ToString();
+ }
- index = this.IndexOf(gameUnit);
- if (index == this.Count - 1)
- return null;
- return this[index+1];
- }
-
- public GameUnit GetLast() {
- return this[this.Count-1];
+ return int.Parse(s);
}
}
+
}
diff --git a/LongoMatch.Migration/Core/Drawing.cs b/LongoMatch.Migration/Core/Drawing.cs
new file mode 100644
index 0000000..96bcb0d
--- /dev/null
+++ b/LongoMatch.Migration/Core/Drawing.cs
@@ -0,0 +1,89 @@
+//
+// Copyright (C) 2009 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+
+using System;
+using Newtonsoft.Json;
+
+using LongoMatch.Common;
+
+namespace LongoMatch.Store
+{
+
+ [Serializable]
+ public class Drawing
+ {
+ private byte[] drawingBuf;
+ private const int DEFAULT_PAUSE_TIME = 5000;
+
+ /// <summary>
+ /// Represent a drawing in the database using a { Gdk Pixbuf} stored
+ /// in a bytes array in PNG format for serialization. { Drawings}
+ /// are used by { MediaTimeNodes} to store the key frame drawing
+ /// which stop time is stored in a int value
+ /// </summary>
+ public Drawing() {
+ PauseTime = DEFAULT_PAUSE_TIME;
+ }
+
+ /// <summary>
+ /// Pixbuf with the drawing
+ /// </summary>
+ public Image Pixbuf {
+ get {
+ if(drawingBuf != null)
+ return Image.Deserialize(drawingBuf);
+ else return null;
+ }
+ set {
+ drawingBuf = value.Serialize();
+ }
+ }
+
+ /// <summary>
+ /// Render time of the drawing
+ /// </summary>
+ public Time Render {
+ get;
+ set;
+ }
+
+ /// <summary>
+ /// Time to pause the playback and display the drawing
+ /// </summary>
+ public Time Pause {
+ set;
+ get;
+ }
+
+ /// <summary>
+ /// Render time of the drawing
+ /// </summary>
+ public int RenderTime {
+ get;
+ set;
+ }
+
+ /// <summary>
+ /// Time to pause the playback and display the drawing
+ /// </summary>
+ public int PauseTime {
+ set;
+ get;
+ }
+ }
+}
diff --git a/LongoMatch.Core/Store/GameUnit.cs b/LongoMatch.Migration/Core/GameUnit.cs
similarity index 100%
copy from LongoMatch.Core/Store/GameUnit.cs
copy to LongoMatch.Migration/Core/GameUnit.cs
diff --git a/LongoMatch.Core/Store/GameUnitsList.cs b/LongoMatch.Migration/Core/GameUnitsList.cs
similarity index 100%
rename from LongoMatch.Core/Store/GameUnitsList.cs
rename to LongoMatch.Migration/Core/GameUnitsList.cs
diff --git a/LongoMatch.Migration/Core/HotKey.cs b/LongoMatch.Migration/Core/HotKey.cs
new file mode 100644
index 0000000..3f88f70
--- /dev/null
+++ b/LongoMatch.Migration/Core/HotKey.cs
@@ -0,0 +1,155 @@
+// HotKey.cs
+//
+// Copyright (C) 2007-2009 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 System.Collections.Generic;
+using System.Runtime.Serialization;
+using Mono.Unix;
+using LongoMatch.Common;
+using Newtonsoft.Json;
+
+
+#if HAVE_GTK
+using Gdk;
+#endif
+
+namespace LongoMatch.Store
+{
+
+ /// <summary>
+ /// A key combination used to tag plays using the keyboard. <see
cref="LongoMatch.Store.SectionsTimeNodes"/>
+ /// It can only be used with the Shith and Alt modifiers to avoid interfering with ohter shortcuts.
+ /// 'key' and 'modifier' are set to -1 when it's initialized
+ /// </summary>
+ [Serializable]
+ [JsonConverter (typeof(LongoMatchConverter))]
+ public class HotKey : IEquatable<HotKey>
+ {
+ private int key;
+ private int modifier;
+
+ #region Constructors
+ /// <summary>
+ /// Creates a new undefined HotKey
+ /// </summary>
+ public HotKey()
+ {
+ this.key = -1;
+ this.modifier = -1;
+ }
+ #endregion
+
+ #region Properties
+ /// <summary>
+ /// Gdk Key
+ /// </summary>
+ public int Key {
+ get {
+ return key;
+ }
+ set {
+ key = value;
+ }
+ }
+
+ /// <summary>
+ /// Key modifier. Only Alt and Shift can be used
+ /// </summary>
+ public int Modifier {
+ get {
+ return modifier;
+ }
+ set {
+ modifier = value;
+ }
+ }
+
+ /// <summary>
+ /// Get whether the hotkey is defined or not
+ /// </summary>
+ public Boolean Defined {
+ get {
+ return (key!=-1 && modifier != -1);
+ }
+ }
+ #endregion
+
+ #region Public Methods
+ public bool Equals (HotKey hotkeyComp) {
+ if (hotkeyComp == null)
+ return false;
+ return (this.Key == hotkeyComp.Key && this.Modifier == hotkeyComp.Modifier);
+ }
+ #endregion
+
+ static public bool operator == (HotKey a, HotKey b) {
+ // If both are null, or both are same instance, return true.
+ if (System.Object.ReferenceEquals(a, b))
+ {
+ return true;
+ }
+
+ // If one is null, but not both, return false.
+ if (((object)a == null) || ((object)b == null))
+ {
+ return false;
+ }
+ return a.Equals(b);
+ }
+
+ static public bool operator != (HotKey a, HotKey b) {
+ return !(a == b);
+ }
+ public override bool Equals(object obj)
+ {
+ if(obj is HotKey) {
+ HotKey hotkey= obj as HotKey;
+ return Equals(hotkey);
+ }
+ else
+ return false;
+ }
+
+ public override int GetHashCode()
+ {
+ return key ^ modifier;
+ }
+
+ public override string ToString()
+ {
+ string modifierS = "";
+
+ if(!Defined)
+ return Catalog.GetString("Not defined");
+
+#if HAVE_GTK
+ if(Modifier == (int)ModifierType.Mod1Mask)
+ modifierS = "<Alt>+";
+ else if(Modifier == (int)ModifierType.ShiftMask)
+ modifierS = "<Shift>+";
+ return string.Format("{0}{1}", modifierS,((Gdk.Key)Key).ToString().ToLower());
+#else
+ return string.Format("{0}{1}", modifierS,(Key.ToString()).ToLower());
+#endif
+ }
+ }
+}
diff --git a/LongoMatch.Core/Store/GameUnit.cs b/LongoMatch.Migration/Core/Interfaces/ISubCategory.cs
similarity index 71%
copy from LongoMatch.Core/Store/GameUnit.cs
copy to LongoMatch.Migration/Core/Interfaces/ISubCategory.cs
index f9ce9b9..15ffd16 100644
--- a/LongoMatch.Core/Store/GameUnit.cs
+++ b/LongoMatch.Migration/Core/Interfaces/ISubCategory.cs
@@ -1,5 +1,5 @@
//
-// Copyright (C) 2011 andoni
+// Copyright (C) 2011 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
@@ -18,26 +18,19 @@
using System;
using System.Collections.Generic;
-namespace LongoMatch.Store
+namespace LongoMatch.Interfaces
{
- [Serializable]
- public class GameUnit: List<TimelineNode>
+ public interface ISubCategory
{
+ string Name {get; set;}
- public GameUnit (string name)
- {
- Name=name;
- }
+ bool AllowMultiple {get; set;}
- public string Name {
- get;
- set;
- }
+ bool FastTag {get; set;}
- public override string ToString ()
- {
- return string.Format ("[GameUnit: Name={0}]", Name);
- }
+ string ToMarkupString();
+
+ List<string> ElementsDesc ();
}
}
diff --git a/LongoMatch.Core/Store/GameUnit.cs b/LongoMatch.Migration/Core/Interfaces/ITag.cs
similarity index 70%
copy from LongoMatch.Core/Store/GameUnit.cs
copy to LongoMatch.Migration/Core/Interfaces/ITag.cs
index f9ce9b9..90c3e0a 100644
--- a/LongoMatch.Core/Store/GameUnit.cs
+++ b/LongoMatch.Migration/Core/Interfaces/ITag.cs
@@ -16,28 +16,14 @@
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
//
using System;
-using System.Collections.Generic;
+using LongoMatch.Store;
-namespace LongoMatch.Store
+namespace LongoMatch.Interfaces
{
- [Serializable]
- public class GameUnit: List<TimelineNode>
+ public interface ITag<T>
{
-
- public GameUnit (string name)
- {
- Name=name;
- }
-
- public string Name {
- get;
- set;
- }
-
- public override string ToString ()
- {
- return string.Format ("[GameUnit: Name={0}]", Name);
- }
+ ISubCategory SubCategory {set;get;}
+ T Value {set;get;}
}
}
diff --git a/LongoMatch.Migration/Core/Interfaces/ITemplates.cs
b/LongoMatch.Migration/Core/Interfaces/ITemplates.cs
new file mode 100644
index 0000000..a6d17c9
--- /dev/null
+++ b/LongoMatch.Migration/Core/Interfaces/ITemplates.cs
@@ -0,0 +1,68 @@
+//
+// Copyright (C) 2011 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 System.Collections.Generic;
+using LongoMatch.Store;
+using LongoMatch.Store.Templates;
+
+namespace LongoMatch.Interfaces
+{
+ public interface ITemplate
+ {
+ void Save (string filename);
+ string Name {get; set;}
+ }
+
+ public interface ITemplate<T>: ITemplate, IList<T> {
+ T AddDefaultItem (int index);
+ }
+
+ public interface ITemplateProvider
+ {
+ void CheckDefaultTemplate();
+ List<string> TemplatesNames {get;}
+ bool Exists(string name);
+ void Copy (string orig, string copy);
+ void Delete (string templateName);
+ void Create (string templateName, params object [] list);
+ }
+
+ public interface ITemplateProvider<T, U>: ITemplateProvider where T: ITemplate<U>
+ {
+ List<T> Templates {get;}
+ T Load (string name);
+ void Save (ITemplate<U> template);
+ void Update (ITemplate<U> template);
+ }
+
+ public interface ITemplateWidget<T, U> where T: ITemplate<U>
+ {
+ T Template {get; set;}
+ bool Edited {get; set;}
+ bool CanExport {get; set;}
+ Project Project {get; set;}
+ }
+
+ public interface ICategoriesTemplatesProvider: ITemplateProvider<Categories, Category> {}
+ public interface ITeamTemplatesProvider: ITemplateProvider<TeamTemplate, Player> {}
+ public interface ISubcategoriesTemplatesProvider: ITemplateProvider<SubCategoryTemplate, string> {}
+
+ public interface ICategoriesTemplatesEditor: ITemplateWidget<Categories, Category> {}
+ public interface ITeamTemplatesEditor: ITemplateWidget<TeamTemplate, Player> {}
+}
+
diff --git a/LongoMatch.Core/Store/GameUnit.cs b/LongoMatch.Migration/Core/Interfaces/ITimelineNode.cs
similarity index 63%
copy from LongoMatch.Core/Store/GameUnit.cs
copy to LongoMatch.Migration/Core/Interfaces/ITimelineNode.cs
index f9ce9b9..d0ff33d 100644
--- a/LongoMatch.Core/Store/GameUnit.cs
+++ b/LongoMatch.Migration/Core/Interfaces/ITimelineNode.cs
@@ -1,5 +1,5 @@
//
-// Copyright (C) 2011 andoni
+// Copyright (C) 2011 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
@@ -16,28 +16,23 @@
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
//
using System;
-using System.Collections.Generic;
+using LongoMatch.Store;
-namespace LongoMatch.Store
+namespace LongoMatch.Interfaces
{
- [Serializable]
- public class GameUnit: List<TimelineNode>
- {
-
- public GameUnit (string name)
- {
- Name=name;
- }
-
- public string Name {
- get;
- set;
- }
-
- public override string ToString ()
- {
- return string.Format ("[GameUnit: Name={0}]", Name);
- }
+ public interface ITimelineNode
+ {
+ string Name {get;set;}
+ Time Start {get;set;}
+ Time Stop {get;set;}
+ uint StartFrame {get; set;}
+ uint StopFrame {get; set;}
+ bool Selected {get; set;}
+ uint CentralFrame {get;}
+ uint TotalFrames {get;}
+ uint KeyFrame {get;}
+ bool HasDrawings {get;}
+ bool HasFrame(int frame);
}
}
diff --git a/LongoMatch.Migration/Core/MediaFile.cs b/LongoMatch.Migration/Core/MediaFile.cs
new file mode 100644
index 0000000..0d05cef
--- /dev/null
+++ b/LongoMatch.Migration/Core/MediaFile.cs
@@ -0,0 +1,226 @@
+// MediaFile.cs
+//
+// Copyright (C) 2007-2009 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.Common;
+using Newtonsoft.Json;
+
+namespace LongoMatch.Store
+{
+
+ [Serializable]
+ public class MediaFile
+ {
+
+ string filePath;
+ long length; // In MSeconds
+ ushort fps;
+ bool hasAudio;
+ bool hasVideo;
+ string container;
+ string videoCodec;
+ string audioCodec;
+ uint videoHeight;
+ uint videoWidth;
+ double par;
+ byte[] thumbnailBuf;
+
+
+ public MediaFile() {}
+
+ public MediaFile(string filePath,
+ long length,
+ ushort fps,
+ bool hasAudio,
+ bool hasVideo,
+ string container,
+ string videoCodec,
+ string audioCodec,
+ uint videoWidth,
+ uint videoHeight,
+ double par,
+ Image preview)
+ {
+ this.filePath = filePath;
+ this.length = length;
+ this.hasAudio = hasAudio;
+ this.hasVideo = hasVideo;
+ this.container = container;
+ this.videoCodec = videoCodec;
+ this.audioCodec = audioCodec;
+ this.videoHeight = videoHeight;
+ this.videoWidth = videoWidth;
+ if(fps == 0)
+ //For audio Files
+ this.fps=25;
+ else
+ this.fps = fps;
+ this.Preview = preview;
+ Par = par;
+ }
+
+ public string FilePath {
+ get {
+ return this.filePath;
+ }
+ set {
+ this.filePath = value;
+ }
+ }
+
+ public Time Duration {
+ get {
+ return new Time ((int) length);
+ }
+ }
+
+ public long Length {
+ get {
+ return this.length;
+ }
+ set {
+ this.length = value;
+ }
+ }
+
+ public bool HasVideo {
+ get {
+ return this.hasVideo;
+ }
+ set {
+ this.hasVideo = value;
+ }
+ }
+
+ public bool HasAudio {
+ get {
+ return this.hasAudio;
+ }
+ set {
+ this.hasAudio = value;
+ }
+ }
+
+ public string Container {
+ get {
+ return this.container;
+ }
+ set {
+ this.container = value;
+ }
+ }
+
+ public string VideoCodec {
+ get {
+ return this.videoCodec;
+ }
+ set {
+ this.videoCodec = value;
+ }
+ }
+
+ public string AudioCodec {
+ get {
+ return this.audioCodec;
+ }
+ set {
+ this.audioCodec = value;
+ }
+ }
+
+ public uint VideoWidth {
+ get {
+ return this.videoWidth;
+ }
+ set {
+ this.videoWidth= value;
+ }
+ }
+
+ public uint VideoHeight {
+ get {
+ return this.videoHeight;
+ }
+ set {
+ this.videoHeight= value;
+ }
+ }
+
+ public ushort Fps {
+ get {
+ return this.fps;
+ }
+ set {
+ if(value == 0)
+ //For audio Files
+ this.fps=25;
+ else
+ this.fps = value;
+ }
+ }
+
+ public double Par {
+ get {
+ if (par == 0)
+ return 1;
+ return par;
+ }
+ set {
+ par = value;
+ }
+ }
+
+ public Image Preview {
+ get {
+ if(thumbnailBuf != null)
+ return Image.Deserialize(thumbnailBuf);
+ return null;
+ }
+ set {
+ if(value != null) {
+ thumbnailBuf = value.Serialize();
+ } else
+ thumbnailBuf = null;
+ }
+ }
+
+ [JsonIgnore]
+ public string Description {
+ get {
+ string desc = String.Format ("<b>File path</b>: {0}\n", FilePath);
+ desc += String.Format ("<b>Format</b>: {0}x{1} @ {2}fps\n", VideoWidth,
+ VideoHeight, Fps);
+ desc += String.Format ("<b>Duration</b>: {0}\n",
+ new Time {MSeconds=(int)Length}.ToSecondsString());
+ desc += String.Format ("<b>Video Codec</b>: {0}\n", VideoCodec);
+ desc += String.Format ("<b>Audio Codec</b>: {0}\n", AudioCodec);
+ desc += String.Format ("<b>Container</b>: {0}\n", Container);
+ return desc;
+ }
+ }
+
+ public uint GetFrames() {
+ return (uint)(Fps*Length/1000);
+ }
+
+ }
+}
diff --git a/LongoMatch.Core/Store/GameUnit.cs b/LongoMatch.Migration/Core/Period.cs
similarity index 60%
copy from LongoMatch.Core/Store/GameUnit.cs
copy to LongoMatch.Migration/Core/Period.cs
index f9ce9b9..215f6cf 100644
--- a/LongoMatch.Core/Store/GameUnit.cs
+++ b/LongoMatch.Migration/Core/Period.cs
@@ -1,43 +1,51 @@
-//
-// Copyright (C) 2011 andoni
-//
+//
+// Copyright (C) 2014 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 System.Linq;
using System.Collections.Generic;
namespace LongoMatch.Store
{
- [Serializable]
- public class GameUnit: List<TimelineNode>
+ public class Period: Timer
{
-
- public GameUnit (string name)
+
+ public Period ()
{
- Name=name;
}
- public string Name {
- get;
- set;
+ public TimeNode PeriodNode {
+ get {
+ return new TimeNode {Name=Name,
+ Start = new Time (Nodes.Min (tn => tn.Start.MSeconds)),
+ Stop = new Time (Nodes.Max (tn => tn.Stop.MSeconds)),
+ };
+ }
+ set {
+ foreach (TimeNode tn in Nodes) {
+ if (tn.Start < value.Start) {
+ tn.Start = value.Start;
+ }
+ if (tn.Stop > value.Stop) {
+ tn.Stop = value.Stop;
+ }
+ }
+ }
}
-
- public override string ToString ()
- {
- return string.Format ("[GameUnit: Name={0}]", Name);
- }
}
}
diff --git a/LongoMatch.Migration/Core/PixbufTimeNode.cs b/LongoMatch.Migration/Core/PixbufTimeNode.cs
new file mode 100644
index 0000000..5902f3f
--- /dev/null
+++ b/LongoMatch.Migration/Core/PixbufTimeNode.cs
@@ -0,0 +1,67 @@
+// PixbufTimeNode.cs
+//
+// Copyright (C) 2007-2009 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 System.IO;
+
+using LongoMatch.Common;
+
+namespace LongoMatch.Store
+{
+
+ /// <summary>
+ /// Base class for all the video segments containing a snapshot
+ /// It has a <see cref="Gdk.Pixbuf"/> with a thumbnail of the video segment.
+ /// </summary>
+ [Serializable]
+ public class PixbufTimeNode : TimeNode
+ {
+ private byte[] thumbnailBuf;
+
+ #region Contructors
+ public PixbufTimeNode() {
+ }
+ #endregion
+
+ #region Properties
+ /// <summary>
+ /// Segment thumbnail
+ /// </summary>
+ public Image Miniature {
+ get {
+ if(thumbnailBuf != null)
+ return Image.Deserialize(thumbnailBuf);
+ else return null;
+ } set {
+ if (value == null)
+ thumbnailBuf = null;
+ else {
+ if (value.Height > Constants.MAX_THUMBNAIL_SIZE ||
+ value.Width > Constants.MAX_THUMBNAIL_SIZE) {
+ value.Scale(Constants.MAX_THUMBNAIL_SIZE,
Constants.MAX_THUMBNAIL_SIZE);
+ }
+ thumbnailBuf = value.Serialize();
+ }
+ }
+ }
+
+ #endregion
+ }
+}
diff --git a/LongoMatch.Migration/Core/Play.cs b/LongoMatch.Migration/Core/Play.cs
new file mode 100644
index 0000000..74a603c
--- /dev/null
+++ b/LongoMatch.Migration/Core/Play.cs
@@ -0,0 +1,268 @@
+// MediaTimeNode.cs
+//
+// Copyright (C) 2007-2009 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 System.Collections.Generic;
+using System.Linq;
+using Mono.Unix;
+using LongoMatch.Common;
+using LongoMatch.Interfaces;
+using Newtonsoft.Json;
+
+namespace LongoMatch.Store
+{
+
+ /// <summary>
+ /// Represents a Play in the game.
+ /// </summary>
+
+ [Serializable]
+ public class Play : PixbufTimeNode, ITimelineNode
+ {
+
+ #region Constructors
+ public Play() {
+ Drawings = new List<Drawing>();
+ Tags = new StringTagStore();
+ Players = new PlayersTagStore();
+ Teams = new TeamsTagStore();
+ Fps = 25;
+ PlaybackRate = 1.0;
+ }
+ #endregion
+
+ #region Properties
+
+ public Guid ID {
+ get;
+ set;
+ }
+
+ /// <summary>
+ /// Category in which this play is tagged
+ /// </summary>
+ public Category Category {
+ get;
+ set;
+ }
+
+ /// <summary>
+ /// A string with the play's notes
+ /// </summary>
+ public string Notes {
+ get;
+ set;
+ }
+
+ /// <summary>
+ /// Video framerate in frames per second. This value is taken from the
+ /// video file properties and used to translate from seconds
+ /// to frames: second 100 is equivalent to frame 100*fps
+ /// </summary>
+ public uint Fps {
+ get;
+ set;
+ }
+
+ /// <summary>
+ /// Start frame number
+ /// </summary>
+ [JsonIgnore]
+ public uint StartFrame {
+ get {
+ return (uint)(Start.MSeconds * Fps / 1000);
+ }
+ set {
+ Start = new Time {MSeconds = (int)(1000 * value / Fps)};
+ }
+ }
+
+ /// <summary>
+ /// Stop frame number
+ /// </summary>
+ [JsonIgnore]
+ public uint StopFrame {
+ get {
+ return (uint)(Stop.MSeconds * Fps / 1000);
+ }
+ set {
+ Stop = new Time {MSeconds = (int)(1000 * value / Fps)};
+ }
+ }
+
+ /// <summary>
+ /// Get the key frame number if this play as key frame drawing or 0
+ /// </summary>
+ [JsonIgnore]
+ public uint KeyFrame {
+ get {
+ if(HasDrawings)
+ return (uint) KeyFrameDrawing.RenderTime * Fps / 1000;
+ else return 0;
+ }
+ }
+
+ /// <summary>
+ /// Get/Set wheter this play is actually loaded. Used in <see
cref="LongoMatch.Gui.Component.TimeScale">
+ /// </summary>
+ public bool Selected {
+ get;
+ set;
+ }
+
+ /// <summary>
+ /// List of drawings for this play
+ /// </summary>
+ public List<Drawing> Drawings {
+ get;
+ set;
+ }
+
+ /* FIXME: Keep this until we support multiple drawings */
+ [JsonIgnore]
+ public Drawing KeyFrameDrawing {
+ get {
+ if(Drawings.Count > 0)
+ return Drawings.First();
+ else
+ return null;
+ } set {
+ if (Drawings.Count == 0)
+ Drawings.Add (value);
+ else
+ Drawings[0] = value;
+ }
+ }
+
+ /// <summary>
+ /// Get wether the play has at least a frame drawing
+ /// </summary>
+ [JsonIgnore]
+ public bool HasDrawings {
+ get {
+ return Drawings.Count > 0;
+ }
+ }
+
+ /// <summary>
+ /// Central frame number using (stopFrame-startFrame)/2
+ /// </summary>
+ [JsonIgnore]
+ public uint CentralFrame {
+ get {
+ return StopFrame-((TotalFrames)/2);
+ }
+ }
+
+ /// <summary>
+ /// Number of frames inside the play's boundaries
+ /// </summary>
+ [JsonIgnore]
+ public uint TotalFrames {
+ get {
+ return StopFrame-StartFrame;
+ }
+ }
+
+ [JsonIgnore]
+ public Team Team {
+ get;
+ set;
+ }
+
+ [JsonProperty ("Players")]
+ public List<Player> PlayersList {
+ get {
+ return Players.GetTagsValues();
+ }
+ }
+
+ public string GamePeriod {
+ get;
+ set;
+ }
+
+ [JsonProperty ("Tags")]
+ public List<Tag> TagsList {
+ get;
+ set;
+ }
+
+ [JsonIgnore]
+ public StringTagStore Tags {
+ get;
+ set;
+ }
+
+ [JsonIgnore]
+ public PlayersTagStore Players {
+ get;
+ set;
+ }
+
+ [JsonIgnore]
+ public TeamsTagStore Teams {
+ get;
+ set;
+ }
+
+ public Coordinates FieldPosition {
+ get;
+ set;
+ }
+
+ public Coordinates HalfFieldPosition {
+ get;
+ set;
+ }
+
+ public Coordinates GoalPosition {
+ get;
+ set;
+ }
+
+ public double PlaybackRate {
+ get;
+ set;
+ }
+
+ #endregion
+
+ #region Public methods
+ /// <summary>
+ /// Check if the frame number is inside the play boundaries
+ /// </summary>
+ /// <param name="frame">
+ /// A <see cref="System.Int32"/> with the frame number
+ /// </param>
+ /// <returns>
+ /// A <see cref="System.Boolean"/>
+ /// </returns>
+ public bool HasFrame(int frame) {
+ return (frame>=StartFrame && frame<StopFrame);
+ }
+
+ public override string ToString()
+ {
+ return Name + "\n" + Start.ToMSecondsString() + " - " + Stop.ToMSecondsString();
+ }
+ #endregion
+ }
+}
diff --git a/LongoMatch.Migration/Core/PlayListPlay.cs b/LongoMatch.Migration/Core/PlayListPlay.cs
new file mode 100644
index 0000000..eca7f57
--- /dev/null
+++ b/LongoMatch.Migration/Core/PlayListPlay.cs
@@ -0,0 +1,78 @@
+// PlayListTimeNode.cs
+//
+// Copyright (C) 2007-2009 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 System.Collections.Generic;
+
+namespace LongoMatch.Store
+{
+ /// <summary>
+ /// Represents a video segment used by <see cref="LongoMatch.Playlist.Playlist"/>.
+ /// It stores the information of the video file so that it can be used outside a project.
+ /// </summary>
+ [Serializable]
+ public class PlayListPlay : PixbufTimeNode
+ {
+ #region Constructors
+ public PlayListPlay()
+ {
+ Valid = true;
+ }
+
+ public PlayListPlay(Play play, MediaFile mediaFile, bool valid)
+ {
+ Name = play.Name;
+ Start = play.Start;
+ Stop = play.Stop;
+ Miniature = play.Miniature;
+ Drawings = play.Drawings;
+ Rate = play.Rate;
+ MediaFile = mediaFile;
+ Valid = valid;
+ }
+ #endregion
+
+ #region Properties
+ /// <summary>
+ /// Media File
+ /// </summary>
+ public MediaFile MediaFile {
+ get;
+ set;
+ }
+
+ //// <summary>
+ /// Defines it the file exists and thus, it can be used in the playlist
+ /// </summary>
+ public bool Valid {
+ get;
+ set;
+ }
+
+ /// <summary>
+ /// List of drawings to be displayed
+ /// </summary>
+ public List<Drawing> Drawings {
+ get;
+ set;
+ }
+ #endregion
+ }
+}
diff --git a/LongoMatch.Migration/Core/Player.cs b/LongoMatch.Migration/Core/Player.cs
new file mode 100644
index 0000000..5a1704a
--- /dev/null
+++ b/LongoMatch.Migration/Core/Player.cs
@@ -0,0 +1,162 @@
+//
+// Copyright (C) 2007-2009 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.Common;
+using Newtonsoft.Json;
+
+namespace LongoMatch.Store
+{
+ /// <summary>
+ /// Player of a team
+ /// </summary>
+ [Serializable]
+ public class Player
+ {
+ private byte[] photo;
+
+ [JsonProperty ("ID")]
+ private Guid _UUID;
+
+ #region Constructors
+ public Player()
+ {
+ _UUID = Guid.NewGuid ();
+ }
+
+ public Player(Guid uuid)
+ {
+ _UUID = uuid;
+ }
+
+ #endregion
+
+ #region Properties
+
+ [JsonIgnore]
+ public Guid ID {
+ get {
+ return _UUID;
+ }
+ set {
+ _UUID = value;
+ }
+ }
+
+ /// <summary>
+ /// My name
+ /// </summary>
+ public string Name {
+ get;
+ set;
+ }
+
+ /// <summary>
+ /// My position in the field
+ /// </summary>
+ public string Position {
+ get;
+ set;
+ }
+
+ /// <summary>
+ /// My shirt number
+ /// </summary>
+ public int Number {
+ get;
+ set;
+ }
+
+ /// <summary>
+ /// My photo
+ /// </summary>
+ public Image Photo {
+ get {
+ if(photo != null)
+ return Image.Deserialize(photo);
+ else
+ return null;
+ }
+ set {
+ if(value != null)
+ photo = value.Serialize();
+ else
+ photo = null;
+ }
+ }
+
+ /// <summary>
+ /// Date of birth
+ /// </summary>
+ public DateTime Birthday {
+ get;
+ set;
+ }
+
+ /// <summary>
+ /// Nationality
+ /// </summary>
+ public String Nationality {
+ get;
+ set;
+ }
+
+ /// <summary>
+ /// Height
+ /// </summary>
+ public float Height {
+ get;
+ set;
+ }
+
+ /// <summary>
+ /// Weight
+ /// </summary>
+ public int Weight {
+ get;
+ set;
+ }
+
+ /// <summary>
+ /// Whether this player is playing or not and shouldn't be added the
+ /// list of taggable players
+ /// </summary>
+ public bool Playing {
+ get;
+ set;
+ }
+
+ /// <summary>
+ /// Gets or sets the player e-mail.
+ /// </summary>
+ /// <value>
+ /// The e-mail.
+ /// </value>
+ public string Mail {
+ get;
+ set;
+ }
+
+ public override string ToString ()
+ {
+ return String.Format("{0} - {1}", Number, Name);
+ }
+
+ #endregion
+ }
+}
diff --git a/LongoMatch.Migration/Core/Point.cs b/LongoMatch.Migration/Core/Point.cs
new file mode 100644
index 0000000..45447b6
--- /dev/null
+++ b/LongoMatch.Migration/Core/Point.cs
@@ -0,0 +1,110 @@
+//
+// Copyright (C) 2014 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 System.Collections.Generic;
+using Newtonsoft.Json;
+
+namespace LongoMatch.Common
+{
+
+ [Serializable]
+ [JsonConverter (typeof (LongoMatchConverter))]
+ public class Point {
+
+ public Point (int x, int y) {
+ X = x;
+ Y = y;
+ }
+
+ public Point (double x, double y) {
+ DX = x;
+ DY = y;
+ }
+ [JsonProperty ("X")]
+ public double DX {
+ get;
+ set;
+ }
+
+ [JsonProperty ("Y")]
+ public double DY {
+ get;
+ set;
+ }
+ [JsonIgnore]
+ public int X {
+ get;
+ set;
+ }
+
+ [JsonIgnore]
+ public int Y {
+ get;
+ set;
+ }
+
+ public double Distance (Point p) {
+ return Math.Sqrt (Math.Pow (X - p.X, 2) + Math.Pow (Y - p.Y, 2));
+ }
+
+ public Point Normalize (int width, int height) {
+ return new Point ((double) Math.Min(X, width) / width,
+ (double) Math.Min (Y, height) / height);
+ }
+
+ public Point Denormalize (int width, int height) {
+ return new Point (X * width, Y * height);
+ }
+
+ public override string ToString ()
+ {
+ return string.Format ("[Point: X={0}, Y={1}]", X, Y);
+ }
+
+ public override bool Equals (object obj)
+ {
+ Point p = obj as Point;
+ if (p == null)
+ return false;
+
+ return p.X == X && p.Y == Y;
+ }
+
+ public override int GetHashCode ()
+ {
+ return (X.ToString() + "-" + Y.ToString()).GetHashCode();
+ }
+
+ public static bool operator < (Point p1, Point p2) {
+ return p1.X < p2.X && p1.Y < p2.Y;
+ }
+
+ public static bool operator > (Point p1, Point p2) {
+ return p1.X > p2.X && p1.Y > p2.Y;
+ }
+
+ public static Point operator + (Point p1, Point p2) {
+ return new Point (p1.X + p2.X, p1.Y + p2.Y);
+ }
+
+ public static Point operator - (Point p1, Point p2) {
+ return new Point (p1.X - p2.X, p1.Y - p2.Y);
+ }
+ }
+}
diff --git a/LongoMatch.Migration/Core/Project.cs b/LongoMatch.Migration/Core/Project.cs
new file mode 100644
index 0000000..98d671b
--- /dev/null
+++ b/LongoMatch.Migration/Core/Project.cs
@@ -0,0 +1,295 @@
+// Project.cs
+//
+// Copyright (C) 2007-2009 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 System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using Newtonsoft.Json;
+using Mono.Unix;
+
+using LongoMatch.Common;
+using LongoMatch.Interfaces;
+using LongoMatch.Store;
+using LongoMatch.Store.Templates;
+
+namespace LongoMatch.Store
+{
+
+ /// <summary>
+ /// I hold the information needed by a project and provide persistency using
+ /// the db4o database.
+ /// I'm structured in the following way:
+ /// -Project Description (<see cref="LongoMatch.Utils.PreviewMediaFile"/>
+ /// -1 Categories Template
+ /// -1 Local Team Template
+ /// -1 Visitor Team Template
+ /// -1 list of <see cref="LongoMatch.Store.MediaTimeNode"/> for each category
+ /// </summary>
+ ///
+ [Serializable]
+ public class Project : IComparable
+ {
+
+ [JsonProperty ("ID")]
+ readonly Guid _UUID;
+ ProjectDescription description;
+ [JsonProperty ("Timeline")]
+ List<Play> timeline;
+
+ #region Constructors
+ public Project() {
+ _UUID = System.Guid.NewGuid();
+ timeline = new List<Play>();
+ Categories = new Categories();
+ LocalTeamTemplate = new TeamTemplate();
+ VisitorTeamTemplate = new TeamTemplate();
+ Timers = new List<Timer> ();
+ Periods = new List<Period> ();
+ }
+ #endregion
+
+ #region Properties
+
+ /// <summary>
+ /// Unique ID for the project
+ /// </summary>
+ [JsonIgnore]
+ public Guid UUID {
+ get {
+ return _UUID;
+ }
+ }
+
+ public ProjectDescription Description {
+ get{
+ return description;
+ }
+ set {
+ if (value != null) {
+ value.UUID = UUID;
+ }
+ description = value;
+ }
+ }
+
+ /// <value>
+ /// Categories template
+ /// </value>
+ [JsonProperty(Order = -10)]
+ public Categories Categories {
+ get;
+ set;
+ }
+
+ /// <value>
+ /// Local team template
+ /// </value>
+ [JsonProperty(Order = -9)]
+ public TeamTemplate LocalTeamTemplate {
+ get;
+ set;
+ }
+
+ /// <value>
+ /// Visitor team template
+ /// </value>
+ [JsonProperty(Order = -8)]
+ public TeamTemplate VisitorTeamTemplate {
+ get;
+ set;
+ }
+
+ public List<Period> Periods {
+ get;
+ set;
+ }
+
+ public List<Timer> Timers {
+ get;
+ set;
+ }
+
+ [JsonIgnore]
+ [Obsolete("Game units have been replaced with timers")]
+ public GameUnitsList GameUnits {
+ set {
+ Categories.GameUnits = value;
+ }
+ get {
+ return Categories.GameUnits;
+ }
+ }
+
+ [JsonIgnore]
+ public IEnumerable<IGrouping<Category, Play>> PlaysGroupedByCategory {
+ get {
+ return timeline.GroupBy(play => play.Category);
+ }
+ }
+ #endregion
+
+ #region Public Methods
+ /// <summary>
+ /// Frees all the project's resources helping the GC
+ /// </summary>
+ public void Clear() {
+ timeline.Clear();
+ Categories.Clear();
+ VisitorTeamTemplate.Clear();
+ LocalTeamTemplate.Clear();
+ Periods.Clear();
+ Timers.Clear();
+ }
+
+
+ /// <summary>
+ /// Adds a new play to a given category
+ /// </summary>
+ /// <param name="dataSection">
+ /// A <see cref="System.Int32"/>: category index
+ /// </param>
+ /// <param name="start">
+ /// A <see cref="Time"/>: start time of the play
+ /// </param>
+ /// <param name="stop">
+ /// A <see cref="Time"/>: stop time of the play
+ /// </param>
+ /// <param name="thumbnail">
+ /// A <see cref="Pixbuf"/>: snapshot of the play
+ /// </param>
+ /// <returns>
+ /// A <see cref="MediaTimeNode"/>: created play
+ /// </returns>
+ public Play AddPlay(Category category, Time start, Time stop, Image miniature) {
+ string count= String.Format("{0:000}", PlaysInCategory (category).Count + 1);
+ string name = String.Format("{0} {1}",category.Name, count);
+
+ var play = new Play {
+ Name = name,
+ Start = start,
+ Stop = stop,
+ Category = category,
+ Notes = "",
+ Miniature = miniature,
+ Fps = Description.File.Fps,
+ };
+ timeline.Add(play);
+ return play;
+ }
+
+ public void AddPlay (Play play) {
+ timeline.Add(play);
+ }
+
+ /// <summary>
+ /// Delete a play from the project
+ /// </summary>
+ /// <param name="tNode">
+ /// A <see cref="MediaTimeNode"/>: play to be deleted
+ /// </param>
+ /// <param name="section">
+ /// A <see cref="System.Int32"/>: category the play belongs to
+ /// </param>
+ public void RemovePlays(List<Play> plays) {
+ foreach(Play play in plays)
+ timeline.Remove(play);
+ }
+
+ /// <summary>
+ /// Delete a category
+ /// </summary>
+ /// <param name="sectionIndex">
+ /// A <see cref="System.Int32"/>: category index
+ /// </param>
+ public void RemoveCategory(Category category) {
+ if(Categories.Count == 1)
+ throw new Exception("You can't remove the last Category");
+ Categories.Remove(category);
+
+ timeline.RemoveAll(p => p.Category.UUID == category.UUID);
+ }
+
+ public void RemovePlayer(TeamTemplate template, Player player) {
+ if(template.Count == 1)
+ throw new Exception("You can't remove the last Player");
+ template.Remove(player);
+ foreach (var play in timeline) {
+ play.Players.RemoveByPlayer(player);
+ }
+ }
+
+ public void DeleteSubcategoryTags(Category cat, List<ISubCategory> subcategories) {
+ foreach (var play in timeline.Where(p => p.Category == cat)) {
+ foreach (var subcat in subcategories) {
+ Log.Error(play.Name);
+ if (subcat is TagSubCategory)
+ play.Tags.RemoveBySubcategory(subcat);
+ else if (subcat is TeamSubCategory)
+ play.Teams.RemoveBySubcategory(subcat);
+ else if (subcat is PlayerSubCategory)
+ play.Players.RemoveBySubcategory(subcat);
+ }
+ }
+ }
+
+ public List<Play> PlaysInCategory(Category category) {
+ return timeline.Where(p => p.Category.UUID == category.UUID).ToList();
+ }
+
+ public List<Play> AllPlays() {
+ return timeline;
+ }
+
+
+ public bool Equals(Project project) {
+ if(project == null)
+ return false;
+ else
+ return UUID == project.UUID;
+ }
+
+ public int CompareTo(object obj) {
+ if(obj is Project) {
+ Project project = (Project) obj;
+ return UUID.CompareTo(project.UUID);
+ }
+ else
+ throw new ArgumentException("object is not a Project and cannot be compared");
+ }
+
+ public static void Export(Project project, string file) {
+ file = Path.ChangeExtension(file, Constants.PROJECT_EXT);
+ SerializableObject.Save(project, file);
+ }
+
+ public static Project Import(string file) {
+ try {
+ return SerializableObject.Load<Project>(file);
+ }
+ catch (Exception e){
+ Log.Exception (e);
+ throw new Exception(Catalog.GetString("The file you are trying to load " +
+ "is not a valid project"));
+ }
+ }
+ #endregion
+ }
+}
diff --git a/LongoMatch.Migration/Core/ProjectDescription.cs b/LongoMatch.Migration/Core/ProjectDescription.cs
new file mode 100644
index 0000000..1a6dd9f
--- /dev/null
+++ b/LongoMatch.Migration/Core/ProjectDescription.cs
@@ -0,0 +1,162 @@
+//
+// Copyright (C) 2009 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+
+using System;
+using Newtonsoft.Json;
+using LongoMatch.Store;
+
+namespace LongoMatch.Store
+{
+
+ /// <summary>
+ /// Describes a project in LongoMatch.
+ /// </summary>
+ [Serializable]
+ public class ProjectDescription : IComparable
+ {
+ /// <summary>
+ /// Unique ID of the parent project
+ /// </summary>
+ public Guid UUID {
+ get;
+ set;
+ }
+
+ /// <summary>
+ /// Title of the project
+ /// </summary>
+ [JsonIgnore]
+ public String Title {
+ get {
+ if (File == null)
+ return "";
+ return System.IO.Path.GetFileNameWithoutExtension(File.FilePath);
+ }
+ }
+
+ /// <summary>
+ /// Media file asigned to this project
+ /// </summary>
+ public MediaFile File {
+ get;
+ set;
+ }
+
+ /// <summary>
+ /// Season of the game
+ /// </summary>
+ public String Season {
+ get;
+ set;
+ }
+
+ /// <summary>
+ /// Comptetition of the game
+ /// </summary>
+ public String Competition {
+ get;
+ set;
+ }
+
+ /// <summary>
+ /// Name of the local team
+ /// </summary>
+ public String LocalName {
+ get;
+ set;
+ }
+
+
+ /// <summary>
+ /// Name of the visitor team
+ /// </summary>
+ public String VisitorName {
+ get;
+ set;
+ }
+
+ /// <summary>
+ /// Goals of the local team
+ /// </summary>
+ public int LocalGoals {
+ get;
+ set;
+ }
+
+ /// <summary>
+ /// Goals of the visitor team
+ /// </summary>
+ public int VisitorGoals {
+ get;
+ set;
+ }
+
+ /// <summary>
+ /// Date of the game
+ /// </summary>
+ public DateTime MatchDate {
+ get;
+ set;
+ }
+
+ public string Category {
+ get;
+ set;
+ }
+
+ public string Group {
+ get;
+ set;
+ }
+
+ public string Phase {
+ get;
+ set;
+ }
+
+ /// <summary>
+ /// String representing the video format like "widhtxheight fps"
+ /// </summary>
+ [JsonIgnore]
+ public String Format {
+ get {
+ if (File == null)
+ return "";
+ return String.Format("{0}x{1} {2}fps",
+ File.VideoWidth, File.VideoHeight, File.Fps);
+ }
+ }
+
+ public DateTime LastModified {
+ get;
+ set;
+ }
+
+ public int CompareTo(object obj) {
+ if(obj is ProjectDescription) {
+ ProjectDescription project = (ProjectDescription) obj;
+
+ if (File == null || project.File == null)
+ return UUID.CompareTo(project.UUID);
+ return this.File.FilePath.CompareTo(project.File.FilePath);
+ }
+ else
+ throw new ArgumentException("object is not a ProjectDescription and cannot be
compared");
+ }
+ }
+}
diff --git a/LongoMatch.Migration/Core/SubCategory.cs b/LongoMatch.Migration/Core/SubCategory.cs
new file mode 100644
index 0000000..2a712c3
--- /dev/null
+++ b/LongoMatch.Migration/Core/SubCategory.cs
@@ -0,0 +1,195 @@
+//
+// Copyright (C) 2011 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 System.Collections.Generic;
+using System.Linq;
+using Mono.Unix;
+using Newtonsoft.Json;
+
+using LongoMatch.Common;
+using LongoMatch.Interfaces;
+
+namespace LongoMatch.Store
+{
+ /// <summary>
+ /// A sub category is used to extend the tags of a category.
+ /// In a complex analysis scenario, a category is not enough to tag
+ /// a play and we need to use subcategories. For example we might want to
+ /// tag the type of goal, who scored, who did the passs and for which team.
+ /// * Goal
+ /// - Type: [Short Corner, Corner, Penalty, Penalty Corner, Field Goal]
+ /// - Scorer: Players List
+ /// - Assister: Players List
+ /// - Team: [Local Team, Visitor Team]
+ ///
+ /// A sub category with name Type and a list of options will be added to the
+ /// Goal category to extends its tags.
+ /// </summary>
+ [Serializable]
+ public class SubCategory<T>: List<T>, ISubCategory
+ {
+
+ public SubCategory() {
+ Name = "";
+ AllowMultiple = true;
+ FastTag = true;
+ }
+
+ public SubCategory(IEnumerable<T> list): base(list) {}
+
+ /// <summary>
+ /// Name of the subcategory
+ /// </summary>
+ public String Name {
+ get;
+ set;
+ }
+
+ /// <summary>
+ /// Wheter this subcategory allow multiple options.
+ /// eg: Team will only allow one option, because a goal can't be scored by 2 teams
+ /// </summary>
+ public bool AllowMultiple {
+ get;
+ set;
+ }
+
+ /// <summary>
+ /// Whether this SubCategory should be added to the tagging widget shown after
+ /// creating a new play.
+ /// </summary>
+ public bool FastTag {
+ get;
+ set;
+ }
+
+ protected string RenderDesc(string type, string values) {
+ string str;
+
+ str = String.Format("{0}: {1} [{2}]\n",
+ Catalog.GetString("Name"), Name, type);
+ str += values;
+ return str;
+ }
+
+ public virtual string ToMarkupString(){
+ return this.ToString();
+ }
+
+ public List<string> ElementsDesc () {
+ return this.Select(e => e.ToString()).ToList();
+ }
+ }
+
+ [Serializable]
+ public class SubCategory {
+ public SubCategory() {
+ }
+
+ public String Name {get;set;}
+ public List<string> Options {get;set;}
+ public bool AllowMultiple {get;set;}
+ }
+
+ [Serializable]
+ public class TagSubCategory: SubCategory<string> {
+
+ public TagSubCategory () {}
+
+ public TagSubCategory (IEnumerable<string> tags): base(tags) {}
+
+ public override string ToMarkupString(){
+ string tags = "";
+
+ foreach (string tag in this) {
+ if (tags == "")
+ tags += tag;
+ else
+ tags += " - " + tag;
+ }
+ return RenderDesc (Catalog.GetString("Tags list"),
+ Catalog.GetString("Tags:" +
+ String.Format(" <b>{0}</b>", tags)));
+ }
+
+ }
+
+ /// <summary>
+ /// SubCategory to tag Players
+ /// Stores a list of teams to be shown in the options.
+ /// The teams LOCAL, VISITOR will be then mapped to a list of players
+ /// for this team, so that a change in the team's templates will not
+ /// affect the list of available players.
+ /// </summary>
+ [Serializable]
+ public class PlayerSubCategory: SubCategory<Team> {
+
+ public bool PositionFilter {get; set;}
+
+ public override string ToMarkupString(){
+ string teams = "";
+ if (this.Contains(Team.LOCAL))
+ teams += Catalog.GetString("Local ");
+ if (this.Contains(Team.VISITOR))
+ teams += Catalog.GetString("Visitor");
+
+ return RenderDesc(Catalog.GetString("List of players"),
+ Catalog.GetString("Teams:" +
+ String.Format(" <b>{0}</b>", teams)));
+ }
+ }
+
+ /// <summary>
+ /// SubCategory to tag teams
+ /// A list of options containing the teams to be shown in the options.
+ /// The teams LOCAL, VISITOR and NONE are then mapped to real team names
+ /// so that a change in the name doesn't affect the category.
+ /// </summary>
+ [Serializable]
+ public class TeamSubCategory: SubCategory<Team> {
+
+ public TeamSubCategory() {
+ Name = Catalog.GetString("Team");
+ AllowMultiple=true;
+ FastTag=true;
+ Add(Team.LOCAL);
+ Add(Team.VISITOR);
+ }
+
+ public override string ToMarkupString(){
+ return RenderDesc(Catalog.GetString("Team selection"), "");
+ }
+ }
+
+ /// <summary>
+ /// SubCategory to tag locations or trajectories in the game field
+ /// </summary>
+ [Serializable]
+ public class CoordinatesSubCategory: SubCategory<Coordinates> {
+
+ /* Use 1 for locations or 2 for trajectories */
+ public int NumCoordinates {
+ get;
+ set;
+ }
+
+ public override string ToMarkupString(){
+ return RenderDesc(Catalog.GetString("Coordinates"), "");
+ }
+ }
+}
\ No newline at end of file
diff --git a/LongoMatch.Migration/Core/Tag.cs b/LongoMatch.Migration/Core/Tag.cs
new file mode 100644
index 0000000..e33f344
--- /dev/null
+++ b/LongoMatch.Migration/Core/Tag.cs
@@ -0,0 +1,140 @@
+//
+// Copyright (C) 2007-2009 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 System.Linq;
+using System.Collections.Generic;
+
+using LongoMatch.Common;
+using LongoMatch.Interfaces;
+
+namespace LongoMatch.Store
+{
+[Serializable]
+
+
+ public class Tag
+ {
+ public Tag() {
+ }
+
+ public SubCategory SubCategory {
+ set;
+ get;
+ }
+
+ public string Value {
+ get;
+ set;
+ }
+ }
+
+ [Serializable]
+ public class Tag<T>: ITag<T>
+ {
+ public Tag() {
+ }
+
+ public ISubCategory SubCategory {
+ set;
+ get;
+ }
+
+ public T Value {
+ get;
+ set;
+ }
+
+ }
+
+ [Serializable]
+ public class StringTag: Tag<string>
+ {
+ public StringTag() {}
+
+ public override bool Equals (object obj)
+ {
+ StringTag tag = obj as StringTag;
+ if (tag == null)
+ return false;
+ return Value.Equals (tag.Value) && SubCategory.Equals(tag.SubCategory);
+ }
+
+ public override int GetHashCode ()
+ {
+ return Value.GetHashCode ();
+ }
+ }
+
+ [Serializable]
+ public class PlayerTag: Tag<Player>
+ {
+ public PlayerTag() {}
+
+ public override bool Equals (object obj)
+ {
+ PlayerTag tag = obj as PlayerTag;
+ if (tag == null)
+ return false;
+ return Value.Equals (tag.Value) && SubCategory.Equals(tag.SubCategory) ;
+ }
+
+ public override int GetHashCode ()
+ {
+ return Value.GetHashCode ();
+ }
+ }
+
+ [Serializable]
+ public class TeamTag: Tag<Team>
+ {
+ public TeamTag() {}
+
+ public override bool Equals (object obj)
+ {
+ TeamTag tag = obj as TeamTag;
+ if (tag == null)
+ return false;
+ return Value.Equals (tag.Value) && SubCategory.Equals(tag.SubCategory);
+ }
+
+ public override int GetHashCode ()
+ {
+ return Value.GetHashCode ();
+ }
+ }
+
+ [Serializable]
+ public class CoordinatesTag: Tag<Coordinates>
+ {
+ public CoordinatesTag() {}
+
+ public override bool Equals (object obj)
+ {
+ CoordinatesTag tag = obj as CoordinatesTag;
+ if (tag == null)
+ return false;
+ return Value.Equals (tag.Value) && SubCategory.Equals(tag.SubCategory);
+ }
+
+ public override int GetHashCode ()
+ {
+ return Value.GetHashCode ();
+ }
+ }
+}
diff --git a/LongoMatch.Migration/Core/TagStore.cs b/LongoMatch.Migration/Core/TagStore.cs
new file mode 100644
index 0000000..92d8323
--- /dev/null
+++ b/LongoMatch.Migration/Core/TagStore.cs
@@ -0,0 +1,109 @@
+//
+// Copyright (C) 2011 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 System.Collections.Generic;
+using System.Linq;
+using Newtonsoft.Json;
+
+using LongoMatch.Common;
+using LongoMatch.Interfaces;
+using LongoMatch.Store;
+
+namespace LongoMatch.Store
+{
+ [Serializable]
+ [JsonObject (MemberSerialization = MemberSerialization.OptIn)]
+ public class TagsStore<T, W> where T:ITag<W>
+ {
+ protected List<T> tagsList;
+
+ public TagsStore(){
+ tagsList = new List<T>();
+ }
+
+ [JsonProperty ("Tags")]
+ public List<T> Tags {
+ get{
+ return tagsList;
+ }
+ set {
+ tagsList = value;
+ }
+ }
+
+ public void Add(T tag) {
+ Log.Debug(String.Format("Adding tag {0} with subcategory{1}", tag, tag.SubCategory));
+ tagsList.Add(tag);
+ }
+
+ public void Remove(T tag) {
+ try {
+ tagsList.Remove (tag);
+ } catch (Exception e) {
+ Log.Warning("Error removing tag " + tag.ToString());
+ Log.Exception(e);
+ }
+ }
+
+ public bool Contains(T tag) {
+ return tagsList.Contains(tag);
+ }
+
+ public void RemoveBySubcategory(ISubCategory subcat) {
+ tagsList.RemoveAll(t => t.SubCategory == subcat);
+ }
+
+ public List<T> AllUniqueElements {
+ get {
+ return (from tag in tagsList
+ group tag by tag into g
+ select g.Key).ToList();
+ }
+ }
+
+ public List<T> GetTags(ISubCategory subCategory) {
+ return (from tag in tagsList
+ where tag.SubCategory.Equals(subCategory)
+ select tag).ToList();
+ }
+
+ public List<W> GetTagsValues() {
+ return (from tag in tagsList
+ select tag.Value).ToList();
+ }
+ }
+
+ [Serializable]
+ public class StringTagStore: TagsStore<StringTag, string> {}
+
+ [Serializable]
+ public class PlayersTagStore: TagsStore<PlayerTag, Player> {
+
+ public void RemoveByPlayer(Player player) {
+ tagsList.RemoveAll(t => t.Value == player);
+ }
+
+ }
+
+ [Serializable]
+ public class TeamsTagStore: TagsStore<TeamTag, Team> {}
+
+ [Serializable]
+ public class CoordinatesTagStore: TagsStore<CoordinatesTag, Coordinates> {}
+}
+
diff --git a/LongoMatch.Migration/Core/Templates/CategoriesTemplate.cs
b/LongoMatch.Migration/Core/Templates/CategoriesTemplate.cs
new file mode 100644
index 0000000..682e5d5
--- /dev/null
+++ b/LongoMatch.Migration/Core/Templates/CategoriesTemplate.cs
@@ -0,0 +1,231 @@
+// Sections.cs
+//
+// Copyright (C) 2007-2009 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 System.Collections.Generic;
+using System.Linq;
+using Newtonsoft.Json;
+
+using Mono.Unix;
+using LongoMatch.Common;
+using LongoMatch.Interfaces;
+
+using Image = LongoMatch.Common.Image;
+
+namespace LongoMatch.Store.Templates
+{
+
+ /// <summary>
+ /// I am a template for the analysis categories used in a project.
+ /// I describe each one of the categories and provide the default values
+ /// to use to create plys in a specific category.
+ /// The position of the category in the index is very important and should
+ /// respect the same index used in the plays list inside a project.
+ /// The <see cref="LongoMatch.DB.Project"/> must handle all the changes
+ /// </summary>
+ [Serializable]
+ [JsonObject]
+ public class Categories: List<Category>, ITemplate, ITemplate<Category>
+ {
+ /* Database additions */
+ GameUnitsList gameUnits;
+ Version version;
+ byte[] fieldImage, halfFieldImage, goalImage ;
+
+ /// <summary>
+ /// Creates a new template
+ /// </summary>
+ public Categories() {
+ }
+
+ public Guid ID {
+ get;
+ set;
+ }
+
+ public string Name {
+ get;
+ set;
+ }
+
+ [JsonIgnore]
+ public Version Version {
+ get;
+ set;
+ }
+
+ [JsonIgnore]
+ public GameUnitsList GameUnits {
+ set {
+ gameUnits = value;
+ }
+ get {
+ if (gameUnits == null) {
+ gameUnits = new GameUnitsList();
+ }
+ return gameUnits;
+ }
+ }
+
+ public List<string> GamePeriods {
+ get;
+ set;
+ }
+
+ public Image Image {
+ get;
+ set;
+ }
+
+ public List<Category> List {
+ get {
+ return this.ToList();
+ }
+ }
+
+
+
+ /* Keep this for backwards compatiblity with 0.18.11 */
+ [JsonIgnore]
+ [Obsolete]
+ public Image FieldBackgroundImage {get; set;}
+ [JsonIgnore]
+ [Obsolete]
+ public Image HalfFieldBackgroundImage {get; set;}
+ [JsonIgnore]
+ [Obsolete]
+ public Image GoalBackgroundImage {get; set;}
+
+ public Image FieldBackground {
+ get {
+ if(fieldImage != null)
+ return Image.Deserialize(fieldImage);
+ else return null;
+ }
+ set {
+ if (value != null) {
+ if (value.Width > 500) {
+ value.Scale (500, 500);
+ }
+ fieldImage = value.Serialize();
+ }
+ else
+ fieldImage = null;
+ }
+ }
+
+ public Image HalfFieldBackground {
+ get {
+ if(halfFieldImage != null)
+ return Image.Deserialize(halfFieldImage);
+ else return null;
+ }
+ set {
+ if (value != null) {
+ if (value.Width > 500) {
+ value.Scale (500, 500);
+ }
+ halfFieldImage = value.Serialize();
+ }
+ else
+ halfFieldImage = null;
+ }
+ }
+
+ public Image GoalBackground {
+ get {
+ if(goalImage != null)
+ return Image.Deserialize(goalImage);
+ else return null;
+ }
+ set {
+ if (value != null) {
+ if (value.Width > 500) {
+ value.Scale (500, 500);
+ }
+ goalImage = value.Serialize();
+ }
+ else
+ goalImage = null;
+ }
+ }
+
+ public void Save(string filePath) {
+ SerializableObject.Save(this, filePath);
+ }
+
+ public void AddDefaultSubcategories (Category cat) {
+ TagSubCategory resultsubcat;
+
+ resultsubcat = new TagSubCategory {
+ Name = Catalog.GetString ("Outcome"),
+ AllowMultiple = false,
+ };
+ resultsubcat.Add (Catalog.GetString ("Success"));
+ resultsubcat.Add (Catalog.GetString ("Failure"));
+ cat.SubCategories.Add(resultsubcat);
+ }
+
+ public Category AddDefaultItem (int index) {
+ Color c = Color.Red;
+ HotKey h = new HotKey();
+
+
+ Category cat = new Category {
+ Name = "Category " + index,
+ LColor = c,
+ Start = new Time{Seconds = 10},
+ Stop = new Time {Seconds = 10},
+ SortMethod = SortMethodType.SortByStartTime,
+ HotKey = h,
+ Position = index-1,
+ };
+ AddDefaultSubcategories(cat);
+ Insert(index, cat);
+ return cat;
+ }
+
+ public static Categories Load(string filePath) {
+ Categories cat = SerializableObject.LoadSafe<Categories>(filePath);
+ if (cat.GamePeriods == null) {
+ cat.GamePeriods = new List<string>();
+ cat.GamePeriods.Add ("1");
+ cat.GamePeriods.Add ("2");
+ }
+ return cat;
+ }
+
+ public static Categories DefaultTemplate(int count) {
+ List<string> periods = new List<string>();
+ Categories defaultTemplate = new Categories();
+
+ defaultTemplate.FillDefaultTemplate(count);
+ periods.Add ("1");
+ periods.Add ("2");
+ defaultTemplate.GamePeriods = periods;
+ defaultTemplate.Version = new Version (Constants.DB_MAYOR_VERSION,
Constants.DB_MINOR_VERSION);
+ return defaultTemplate;
+ }
+
+ private void FillDefaultTemplate(int count) {
+ for(int i=1; i<=count; i++)
+ AddDefaultItem(i-1);
+ }
+ }
+}
diff --git a/LongoMatch.Core/Store/Templates/SubCategoryTemplate.cs
b/LongoMatch.Migration/Core/Templates/SubCategoryTemplate.cs
similarity index 97%
rename from LongoMatch.Core/Store/Templates/SubCategoryTemplate.cs
rename to LongoMatch.Migration/Core/Templates/SubCategoryTemplate.cs
index 9f65bbe..4b0fef4 100644
--- a/LongoMatch.Core/Store/Templates/SubCategoryTemplate.cs
+++ b/LongoMatch.Migration/Core/Templates/SubCategoryTemplate.cs
@@ -21,11 +21,13 @@ using System.Collections.Generic;
using LongoMatch.Common;
using LongoMatch.Interfaces;
using LongoMatch.Store;
+using Newtonsoft.Json;
namespace LongoMatch.Store.Templates
{
[Serializable]
+ [JsonObject]
public class SubCategoryTemplate: TagSubCategory, ITemplate<string>
{
diff --git a/LongoMatch.Migration/Core/Templates/TeamTemplate.cs
b/LongoMatch.Migration/Core/Templates/TeamTemplate.cs
new file mode 100644
index 0000000..8904ab3
--- /dev/null
+++ b/LongoMatch.Migration/Core/Templates/TeamTemplate.cs
@@ -0,0 +1,180 @@
+//
+// Copyright (C) 2007-2009 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 System.Collections.Generic;
+using System.Linq;
+using Mono.Unix;
+using Newtonsoft.Json;
+
+using LongoMatch.Common;
+using LongoMatch.Interfaces;
+
+namespace LongoMatch.Store.Templates
+{
+ [Serializable]
+ [JsonObject]
+ public class TeamTemplate: List<Player>, ITemplate<Player>
+ {
+ [JsonProperty ("ID")]
+ private Guid _UUID;
+
+ private byte[] thumbnailBuf;
+ private const int MAX_WIDTH=100;
+ private const int MAX_HEIGHT=100;
+ Version version;
+
+ public TeamTemplate () {
+ init (Guid.NewGuid ());
+ }
+
+ public TeamTemplate (Guid uuid) {
+ init (uuid);
+ }
+
+ [JsonIgnore]
+ public Guid UUID {
+ get {
+ return _UUID;
+ } set {
+ _UUID = value;
+ }
+ }
+
+ public String Name {
+ get;
+ set;
+ }
+
+ public String TeamName {
+ get;
+ set;
+ }
+
+ public Version Version {
+ get;
+ set;
+ }
+
+ public List<Player> List {
+ get {
+ return this.ToList();
+ }
+ }
+
+ public Image Shield {
+ get {
+ if(thumbnailBuf != null)
+ return Image.Deserialize(thumbnailBuf);
+ else return null;
+ } set {
+ if (value == null)
+ thumbnailBuf = null;
+ else
+ thumbnailBuf = value.Serialize();
+ }
+ }
+
+ [JsonIgnore]
+ public int PlayingPlayers {
+ get;
+ protected set;
+ }
+
+ public int[] Formation {
+ get;
+ set;
+ }
+
+ [JsonIgnore]
+ public string FormationStr {
+ set {
+ string[] elements = value.Split('-');
+ int[] tactics = new int[elements.Length];
+ int index = 0;
+ foreach (string s in elements) {
+ try {
+ tactics[index] = int.Parse (s);
+ index ++;
+ } catch {
+ throw new FormatException ();
+ }
+ }
+ PlayingPlayers = tactics.Sum();
+ Formation = tactics;
+ }
+ get {
+ return String.Join ("-", Formation);
+ }
+ }
+
+ [JsonIgnore]
+ public List<Player> PlayingPlayersList {
+ get {
+ return this.Where(p=>p.Playing).Select(p=>p).ToList();
+ }
+ }
+
+ public void Save(string filePath) {
+ SerializableObject.Save(this, filePath);
+ }
+
+ public Player AddDefaultItem (int i) {
+ Player p = new Player {
+ Name = "Player " + (i+1).ToString(),
+ Birthday = new DateTime(),
+ Height = 1.80f,
+ Weight = 80,
+ Number = i+1,
+ Position = "",
+ Photo = null,
+ Playing = true,};
+ Insert (i, p);
+ return p;
+ }
+
+ public static TeamTemplate Load(string filePath) {
+ TeamTemplate template = SerializableObject.LoadSafe<TeamTemplate>(filePath);
+ if (template.Formation == null) {
+ template.FormationStr = "1-4-3-3";
+ }
+ return template;
+ }
+
+ public static TeamTemplate DefaultTemplate(int playersCount) {
+ TeamTemplate defaultTemplate = new TeamTemplate();
+ defaultTemplate.FillDefaultTemplate(playersCount);
+ return defaultTemplate;
+ }
+
+ private void FillDefaultTemplate(int playersCount) {
+ Clear();
+ for(int i=1; i<=playersCount; i++)
+ AddDefaultItem(i-1);
+ version = new Version (Constants.DB_MAYOR_VERSION, Constants.DB_MINOR_VERSION);
+ }
+
+ void init (Guid uuid) {
+ _UUID = uuid;
+ TeamName = Catalog.GetString("Team");
+ if (Formation == null) {
+ FormationStr = "1-4-3-3";
+ }
+ }
+ }
+}
diff --git a/LongoMatch.Migration/Core/Time.cs b/LongoMatch.Migration/Core/Time.cs
new file mode 100644
index 0000000..10d17dc
--- /dev/null
+++ b/LongoMatch.Migration/Core/Time.cs
@@ -0,0 +1,187 @@
+// Time.cs
+//
+// Copyright (C) 2007-2009 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 Newtonsoft.Json;
+using LongoMatch.Common;
+
+namespace LongoMatch.Store
+{
+
+ /// <summary>
+ /// Represents a time instant. Other objects uses it to keep consistency in the time units consitency.
+ /// It's expressed in miliseconds and provide some helper methods for time conversion and
representation
+ /// </summary>
+ [Serializable]
+ [JsonConverter (typeof (LongoMatchConverter))]
+ public class Time : IComparable
+ {
+ private const int MS = 1000000 ;
+ public const int SECONDS_TO_TIME = 1000;
+ public const int TIME_TO_NSECONDS = 1000000;
+
+ #region Constructors
+ public Time() {
+ }
+
+ public Time(int mSeconds) {
+ MSeconds = mSeconds;
+ }
+ #endregion
+
+ //// <summary>
+ /// Time in miliseconds
+ /// </summary>
+ #region Properties
+ public int MSeconds {
+ get;
+ set;
+ }
+
+ /// <summary>
+ /// Time in seconds
+ /// </summary>
+ [JsonIgnore]
+ public int Seconds {
+ get {
+ return MSeconds/SECONDS_TO_TIME;
+ }
+ set {
+ MSeconds = value * SECONDS_TO_TIME;
+ }
+ }
+
+ /// <summary>
+ /// Time in nano seconds
+ /// </summary>
+ [JsonIgnore]
+ public long NSeconds {
+ get {
+ return (long)MSeconds * TIME_TO_NSECONDS;
+ }
+ set {
+ MSeconds = (int) (value / TIME_TO_NSECONDS);
+ }
+ }
+ #endregion
+
+ #region Public methods
+ /// <summary>
+ /// String representation in seconds
+ /// </summary>
+ /// <returns>
+ /// A <see cref="System.String"/>
+ /// </returns>
+ public string ToSecondsString()
+ {
+ int _h, _m, _s, _time;
+
+ _time = MSeconds / 1000;
+ _h = (_time / 3600);
+ _m = ((_time % 3600) / 60);
+ _s = ((_time % 3600) % 60);
+
+ if(_h > 0)
+ return String.Format("{0}:{1}:{2}", _h, _m.ToString("d2"),
+ _s.ToString("d2"));
+
+ return String.Format("{0}:{1}", _m, _s.ToString("d2"));
+ }
+
+ /// <summary>
+ /// String representation including the milisenconds information
+ /// </summary>
+ /// <returns>
+ /// A <see cref="System.String"/>
+ /// </returns>
+ public string ToMSecondsString()
+ {
+ int _ms ;
+ _ms = ((MSeconds % 3600000)%60000)%1000;
+
+ return String.Format("{0},{1}", ToSecondsString(), _ms.ToString("d3"));
+ }
+
+ public override bool Equals(object o)
+ {
+ if(o is Time) {
+ return ((Time)o).MSeconds == MSeconds;
+ }
+ else return false;
+ }
+
+ public override int GetHashCode()
+ {
+ return base.GetHashCode();
+ }
+
+ public int CompareTo(object obj) {
+ if(obj is Time)
+ {
+ Time otherTime = (Time) obj;
+ return MSeconds.CompareTo(otherTime.MSeconds);
+ }
+ else throw new ArgumentException("Object is not a Temperature");
+ }
+ #endregion
+
+ #region Operators
+ public static bool operator < (Time t1,Time t2) {
+ return t1.MSeconds < t2.MSeconds;
+ }
+
+ public static bool operator > (Time t1,Time t2) {
+ return t1.MSeconds > t2.MSeconds;
+ }
+
+ public static bool operator <= (Time t1,Time t2) {
+ return t1.MSeconds <= t2.MSeconds;
+ }
+
+ public static bool operator >= (Time t1,Time t2) {
+ return t1.MSeconds >= t2.MSeconds;
+ }
+
+ public static Time operator +(Time t1,int t2) {
+ return new Time {MSeconds = t1.MSeconds+t2};
+ }
+
+ public static Time operator +(Time t1,Time t2) {
+ return new Time {MSeconds = t1.MSeconds+t2.MSeconds};
+ }
+
+ public static Time operator -(Time t1,Time t2) {
+ return new Time {MSeconds = t1.MSeconds-t2.MSeconds};
+ }
+
+ public static Time operator -(Time t1,int t2) {
+ return new Time {MSeconds = t1.MSeconds-t2};
+ }
+
+ public static Time operator *(Time t1, double t2) {
+ return new Time {MSeconds = (int) (t1.MSeconds * t2)};
+ }
+
+ public static Time operator /(Time t1, int t2) {
+ return new Time {MSeconds = (int) (t1.MSeconds / t2)};
+ }
+ #endregion
+ }
+}
\ No newline at end of file
diff --git a/LongoMatch.Migration/Core/TimeNode.cs b/LongoMatch.Migration/Core/TimeNode.cs
new file mode 100644
index 0000000..36267f9
--- /dev/null
+++ b/LongoMatch.Migration/Core/TimeNode.cs
@@ -0,0 +1,88 @@
+// TimeNode.cs
+//
+// Copyright (C) 2007-2009 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 System.Collections.Generic;
+using Newtonsoft.Json;
+using LongoMatch.Store;
+
+namespace LongoMatch.Store
+{
+
+ /// <summary>
+ /// Base class for all the time span related objects in the database.
+ /// It has a name that describe it and a start and stop <see cref="LongoMatch.Store.Time"/>
+ /// </summary>
+ [Serializable]
+ public class TimeNode
+ {
+ #region Constructors
+ public TimeNode() {
+ Rate = 1;
+ }
+ #endregion
+
+ #region Properties
+ /// <summary>
+ /// A short description of the time node
+ /// </summary>
+ public string Name {
+ get;
+ set;
+ }
+
+ /// <summary>
+ /// Start Time
+ /// </summary>
+ public Time Start {
+ get;
+ set;
+ }
+
+ /// <summary>
+ /// Stop time
+ /// </summary>
+ public Time Stop {
+ get;
+ set;
+ }
+
+ /// <summary>
+ /// Duration (stop_time - start_time)
+ /// </summary>
+ [JsonIgnore]
+ public Time Duration {
+ get {
+ return Stop-Start;
+ }
+ }
+
+ /// <summary>
+ /// Play rate
+ /// </summary>
+ public float Rate {
+ get;
+ set;
+ }
+
+ #endregion
+
+ }
+}
diff --git a/LongoMatch.Migration/Core/TimelineNode.cs b/LongoMatch.Migration/Core/TimelineNode.cs
new file mode 100644
index 0000000..e85e7c5
--- /dev/null
+++ b/LongoMatch.Migration/Core/TimelineNode.cs
@@ -0,0 +1,127 @@
+//
+// Copyright (C) 2011 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 Newtonsoft.Json;
+using LongoMatch.Interfaces;
+
+namespace LongoMatch.Store
+{
+ /* FIXME: Code duplicated from Play, unfortunately we can't
+ * modify the class hierachy */
+ [Serializable]
+ public class TimelineNode: TimeNode, ITimelineNode
+ {
+ public TimelineNode ()
+ {
+ }
+
+ /// <summary>
+ /// Video framerate in frames per second. This value is taken from the
+ /// video file properties and used to translate from seconds
+ /// to frames: second 100 is equivalent to frame 100*fps
+ /// </summary>
+ [JsonIgnore]
+ public uint Fps {
+ get;
+ set;
+ }
+
+ /// <summary>
+ /// Start frame number
+ /// </summary>
+ [JsonIgnore]
+ public uint StartFrame {
+ get {
+ return (uint)(Start.MSeconds * Fps / 1000);
+ }
+ set {
+ Start = new Time {MSeconds = (int)(1000 * value / Fps)};
+ }
+ }
+
+ /// <summary>
+ /// Stop frame number
+ /// </summary>
+ [JsonIgnore]
+ public uint StopFrame {
+ get {
+ return (uint)(Stop.MSeconds * Fps / 1000);
+ }
+ set {
+ Stop = new Time {MSeconds = (int)(1000 * value / Fps)};
+ }
+ }
+
+ /// <summary>
+ /// Get/Set wheter this play is actually loaded. Used in <see
cref="LongoMatch.Gui.Component.TimeScale">
+ /// </summary>
+ [JsonIgnore]
+ public bool Selected {
+ get;
+ set;
+ }
+
+ /// <summary>
+ /// Central frame number using (stopFrame-startFrame)/2
+ /// </summary>
+ [JsonIgnore]
+ public uint CentralFrame {
+ get {
+ return StopFrame-((TotalFrames)/2);
+ }
+ }
+
+ /// <summary>
+ /// Number of frames inside the play's boundaries
+ /// </summary>
+ [JsonIgnore]
+ public uint TotalFrames {
+ get {
+ return StopFrame-StartFrame;
+ }
+ }
+
+ /// <summary>
+ /// Get the key frame number if this play as key frame drawing or 0
+ /// </summary>
+ public uint KeyFrame {
+ get {
+ return 0;
+ }
+ }
+
+ public bool HasDrawings {
+ get;
+ set;
+ }
+
+ /// <summary>
+ /// Check if the frame number is inside the play boundaries
+ /// </summary>
+ /// <param name="frame">
+ /// A <see cref="System.Int32"/> with the frame number
+ /// </param>
+ /// <returns>
+ /// A <see cref="System.Boolean"/>
+ /// </returns>
+ public bool HasFrame(int frame) {
+ return (frame>=StartFrame && frame<StopFrame);
+ }
+ }
+}
+
diff --git a/LongoMatch.Core/Store/GameUnit.cs b/LongoMatch.Migration/Core/Timer.cs
similarity index 54%
copy from LongoMatch.Core/Store/GameUnit.cs
copy to LongoMatch.Migration/Core/Timer.cs
index f9ce9b9..ee28aac 100644
--- a/LongoMatch.Core/Store/GameUnit.cs
+++ b/LongoMatch.Migration/Core/Timer.cs
@@ -1,32 +1,33 @@
-//
-// Copyright (C) 2011 andoni
-//
+//
+// Copyright (C) 2014 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 System.Linq;
+using LongoMatch.Store;
using System.Collections.Generic;
+using Newtonsoft.Json;
namespace LongoMatch.Store
{
- [Serializable]
- public class GameUnit: List<TimelineNode>
+ public class Timer
{
-
- public GameUnit (string name)
+ public Timer ()
{
- Name=name;
+ Nodes = new List<TimeNode>();
}
public string Name {
@@ -34,10 +35,34 @@ namespace LongoMatch.Store
set;
}
- public override string ToString ()
- {
- return string.Format ("[GameUnit: Name={0}]", Name);
- }
+ public List<TimeNode> Nodes {
+ get;
+ set;
+ }
+
+ [JsonIgnore]
+ public Time TotalTime {
+ get {
+ return new Time (Nodes.Sum (tn => tn.Duration.MSeconds));
+ }
+ }
+
+ public void Start (Time start, string name = null) {
+ if (name == null)
+ name = Name;
+ Stop (start);
+ TimeNode tn = new TimeNode {Name = name, Start = start};
+ Nodes.Add (tn);
+ }
+
+ public void Stop (Time stop) {
+ if (Nodes.Count > 0) {
+ TimeNode last = Nodes.Last ();
+ if (last.Stop == null) {
+ last.Stop = stop;
+ }
+ }
+ }
}
}
diff --git a/LongoMatch.Migration/Data/default.lct b/LongoMatch.Migration/Data/default.lct
new file mode 100644
index 0000000..d22200e
Binary files /dev/null and b/LongoMatch.Migration/Data/default.lct differ
diff --git a/LongoMatch.Migration/Data/default.ltt b/LongoMatch.Migration/Data/default.ltt
new file mode 100644
index 0000000..6231134
Binary files /dev/null and b/LongoMatch.Migration/Data/default.ltt differ
diff --git a/LongoMatch.Migration/Data/project.lgm b/LongoMatch.Migration/Data/project.lgm
new file mode 100644
index 0000000..0568b19
Binary files /dev/null and b/LongoMatch.Migration/Data/project.lgm differ
diff --git a/LongoMatch.Migration/DataBase.cs b/LongoMatch.Migration/DataBase.cs
new file mode 100644
index 0000000..fe25686
--- /dev/null
+++ b/LongoMatch.Migration/DataBase.cs
@@ -0,0 +1,554 @@
+// DB.cs
+//
+// Copyright (C) 2007-2009 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 System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using Db4objects.Db4o;
+using Db4objects.Db4o.Query;
+using Db4objects.Db4o.Ext;
+
+using LongoMatch.Common;
+using LongoMatch.Interfaces;
+using LongoMatch.Store;
+using LongoMatch.Store.Templates;
+
+namespace LongoMatch.DB
+{
+
+ /// <summary>
+ /// I am a proxy for the db4o database. I can store,retrieve, update and search
+ /// <see cref="LongoMatch.DB.Projects"/>.
+ /// Projects are uniquely indentified by their filename, assuming that you can't
+ /// create two projects for the same video file.
+ /// </summary>
+ public sealed class DataBase
+ {
+ string DBFile;
+ string DBName;
+ Version dbVersion;
+ BackupDate lastBackup;
+ int count;
+ TimeSpan maxDaysWithoutBackup = new TimeSpan(5, 0, 0, 0);
+
+
+ /// <summary>
+ /// Creates a proxy for the database
+ /// </summary>
+ /// <param name="file">
+ /// A <see cref="System.String"/> with the database file path
+ /// </param>
+ public DataBase(string file)
+ {
+ DBFile = file;
+ DBName = Path.GetFileNameWithoutExtension(DBFile);
+ DBName = Path.GetFileNameWithoutExtension(DBName);
+ Load ();
+ }
+
+ /// <value>
+ /// The database version
+ /// </value>
+ public Version Version {
+ get {
+ return dbVersion;
+ }
+ set {
+ UpdateVersion (value);
+ }
+ }
+
+ public string Name {
+ get {
+ return DBName;
+ }
+ }
+
+ public DateTime LastBackup {
+ get {
+ return lastBackup.Date;
+ }
+ }
+
+ public int Count {
+ get {
+ return count;
+ }
+ }
+
+ public bool Backup () {
+ return BackupDB (true);
+ }
+
+ public bool Delete () {
+ try {
+ File.Delete (DBFile);
+ return true;
+ } catch (Exception ex) {
+ Log.Exception (ex);
+ return false;
+ }
+ }
+
+ public void ListObjects() {
+ Dictionary<Type, int> dict = new Dictionary<Type, int>();
+ IObjectContainer db = Db4oFactory.OpenFile(DBFile);
+
+ IQuery query = db.Query();
+ query.Constrain(typeof(object));
+ IObjectSet result = query.Execute();
+ while(result.HasNext()) {
+ var res = result.Next();
+ Type type = res.GetType();
+
+ if (dict.ContainsKey(type))
+ dict[type]++;
+ else
+ dict.Add(type, 1);
+
+ }
+ foreach (Type t in dict.Keys) {
+ Log.Information(t.ToString()+":" + dict[t]);
+ }
+ CloseDB(db);
+
+ }
+
+ /// <summary>
+ /// Initialize the Database
+ /// </summary>
+ public bool Load() {
+ bool ret = false;
+
+ try {
+ Log.Debug ("Loading database file: " + DBFile);
+ /* Create a new DB if it doesn't exists yet */
+ if(!System.IO.File.Exists(DBFile)) {
+ Log.Debug ("File doesn't exists, creating a new one");
+ CreateNewDB();
+ ret = true;
+ }
+
+ GetDBVersion();
+ GetBackupDate();
+ CheckDB();
+ count = GetAllProjects().Count;
+ try {
+ BackupDB();
+ } catch (Exception e) {
+ Log.Error("Error creating database backup");
+ Log.Exception(e);
+ }
+ } catch (Exception ex) {
+ throw ex;
+ }
+ return ret;
+ }
+
+ /// <summary>
+ /// Retrieve all the projects from the database. This method don't return the
+ /// the whole <see cref="LongoMatch.DB.Project"/> but the projects fields to
+ /// create a <see cref="LongoMatch.DB.ProjectDescription"/> to make the seek
+ /// faster.
+ /// </summary>
+ /// <returns>
+ /// A <see cref="List"/>
+ /// </returns>
+ public List<ProjectDescription> GetAllProjects() {
+ List<ProjectDescription> list = new List<ProjectDescription>();
+ IObjectContainer db = Db4oFactory.OpenFile(DBFile);
+
+ Log.Debug("Getting all projects");
+ try {
+ IQuery query = db.Query();
+ query.Constrain(typeof(ProjectDescription));
+ IObjectSet result = query.Execute();
+ Log.Debug(String.Format("Found {0} projects", result.Count));
+ while(result.HasNext()) {
+ try {
+ ProjectDescription desc = (ProjectDescription)result.Next();
+ list.Add(desc);
+ } catch (Exception e) {
+ Log.Warning("Error retreiving project. Skip");
+ Log.Exception(e);
+ }
+ }
+ } catch (Exception ex) {
+ Log.Exception (ex);
+ }
+ finally
+ {
+ CloseDB(db);
+ }
+ return list;
+ }
+
+ /// <summary>
+ /// Search and return a project in the database. Returns null if the
+ /// project is not found
+ /// </summary>
+ /// <param name="filename">
+ /// A <see cref="System.String"/> with the project's video file name
+ /// </param>
+ /// <returns>
+ /// A <see cref="LongoMatch.DB.Project"/>
+ /// </returns>
+ public Project GetProject(Guid id) {
+ Project ret = null;
+ IObjectContainer db = Db4oFactory.OpenFile(DBFile);
+
+ Log.Debug("Getting project with ID: " + id);
+ try {
+ IQuery query = GetQueryProjectById (db, id);
+ IObjectSet result = query.Execute();
+ ret = (Project) db.Ext().PeekPersisted(result.Next(),10,true);
+ } finally {
+ CloseDB(db);
+ }
+ if (ret != null && FixProjectCoordinates (ret)) {
+ UpdateProject (ret);
+ }
+ return ret;
+ }
+
+ /// <summary>
+ /// Add a project to the databse
+ /// </summary>
+ /// <param name="project">
+ /// A <see cref="Project"/> to add
+ /// </param>
+ public void AddProject(Project project) {
+ IObjectContainer db = Db4oFactory.OpenFile(DBFile);
+
+ project.Description.LastModified = DateTime.Now;
+ Log.Debug("Adding new project: " + project);
+ try {
+ db.Store(project);
+ db.Commit();
+ count ++;
+ } catch (Exception e) {
+ Log.Error("Could not add project");
+ Log.Exception(e);
+ }
+ finally {
+ CloseDB(db);
+ }
+ }
+
+ /// <summary>
+ /// Delete a project from the database
+ /// </summary>
+ /// <param name="filePath">
+ /// A <see cref="System.String"/> with the project's video file path
+ /// </param>
+ public void RemoveProject(Guid id) {
+ SetDeleteCascadeOptions();
+ IObjectContainer db = Db4oFactory.OpenFile(DBFile);
+
+ Log.Debug("Removing project with ID: " + id);
+ try {
+ IQuery query = GetQueryProjectById(db, id);
+ IObjectSet result = query.Execute();
+ Project project = (Project)result.Next();
+ db.Delete(project);
+ db.Commit();
+ count --;
+ } catch (Exception e) {
+ Log.Error("Could not delete project");
+ Log.Exception(e);
+ } finally {
+ CloseDB(db);
+ }
+ }
+
+ /// <summary>
+ /// Updates a project in the database. Because a <see cref="LongoMatch.DB.Project"/> has
+ /// many objects associated, a simple update would leave in the databse many orphaned objects.
+ /// Therefore we need to delete the old project a replace it with the changed one.
+ /// </summary>
+ /// <param name="project">
+ /// A <see cref="Project"/> to update
+ /// </param>
+ /// <param name="previousFileName">
+ /// A <see cref="System.String"/> with the old file path
+ /// </param>
+ public void UpdateProject(Project project) {
+ // Configure db4o to cascade on delete for each one of the objects stored in a Project
+ SetDeleteCascadeOptions();
+ IObjectContainer db = Db4oFactory.OpenFile(DBFile);
+
+ project.Description.LastModified = DateTime.Now;
+ Log.Debug("Updating project " + project);
+ try {
+ IQuery query = GetQueryProjectById(db, project.UUID);
+ IObjectSet result = query.Execute();
+ //Get the stored project and replace it with the new one
+ if(result.Count == 1) {
+ Project fd = (Project)result.Next();
+ db.Delete(fd);
+ db.Store(project);
+ db.Commit();
+ } else {
+ Log.Warning("Project with ID " + project.UUID + "not found");
+ }
+ } catch (Exception e) {
+ Log.Error("Could not update project");
+ Log.Exception(e);
+ } finally {
+ CloseDB(db);
+ }
+ }
+
+ /// <summary>
+ /// Checks if a project already exists in the DataBase with the same file
+ /// </summary>
+ /// <param name="project">
+ /// A <see cref="Project"/> to compare
+ /// </param>
+ /// <returns>
+ /// A <see cref="System.Boolean"/>
+ /// </returns>
+ public bool Exists(Project project) {
+ bool ret;
+ IObjectContainer db = Db4oFactory.OpenFile(DBFile);
+
+ try {
+ IQuery query = GetQueryProjectById(db, project.UUID);
+ IObjectSet result = query.Execute();
+ ret = result.HasNext();
+ } catch {
+ ret = false;
+ } finally {
+ CloseDB(db);
+ }
+
+ return ret;
+ }
+
+ private void CreateNewDB () {
+ // Create new DB and add version and last backup date
+ IObjectContainer db = Db4oFactory.OpenFile(DBFile);
+ try {
+ dbVersion= new Version(Constants.DB_MAYOR_VERSION,
Constants.DB_MINOR_VERSION);
+ lastBackup = new BackupDate { Date = DateTime.UtcNow};
+ db.Store(dbVersion);
+ db.Store(lastBackup);
+ Log.Information("Created new database:" + DBFile);
+ }
+ finally {
+ db.Close();
+ }
+ }
+
+ private void GetDBVersion () {
+ dbVersion = GetObject<Version>();
+ if (dbVersion == null)
+ dbVersion = new Version(Constants.DB_MAYOR_VERSION,
Constants.DB_MINOR_VERSION);
+ Log.Information("DB version: "+ dbVersion.ToString());
+ }
+
+ private void GetBackupDate () {
+ lastBackup = GetObject<BackupDate> ();
+ if (lastBackup == null) {
+ lastBackup = new BackupDate {Date = DateTime.UtcNow};
+ UpdateBackupDate(true);
+ }
+ Log.Information("DB last backup: "+ lastBackup.Date.ToShortDateString());
+ }
+
+ private void UpdateBackupDate (bool create) {
+ IObjectContainer db = Db4oFactory.OpenFile(DBFile);
+ try {
+ IQuery query = db.Query();
+ query.Constrain(typeof(BackupDate));
+ IObjectSet result = query.Execute();
+ while (result.HasNext()) {
+ BackupDate date = result.Next() as BackupDate;
+ db.Delete (date);
+ }
+ db.Store(lastBackup);
+ } finally {
+ db.Close();
+ }
+ }
+
+ private void UpdateVersion (Version version) {
+ IObjectContainer db = Db4oFactory.OpenFile(DBFile);
+ try {
+ IQuery query = db.Query();
+ query.Constrain(typeof(Version));
+ IObjectSet result = query.Execute();
+ while (result.HasNext()) {
+ Version v = result.Next() as Version;
+ db.Delete (v);
+ }
+ db.Store(version);
+ dbVersion = version;
+ } finally {
+ db.Close();
+ }
+ }
+
+ private T GetObject<T>() {
+ T ret = default(T);
+ IObjectContainer db = Db4oFactory.OpenFile(DBFile);
+ try {
+ IQuery query = db.Query();
+ query.Constrain(typeof(T));
+ IObjectSet result = query.Execute();
+ if(result.HasNext())
+ ret = (T) result.Next();
+ } finally {
+ db.Close();
+ }
+ return ret;
+ }
+
+ private void CheckDB() {
+ /* FIXME: Check for migrations here */
+ }
+
+ private bool BackupDB (bool force=false) {
+ string backupFilepath;
+ DateTime now = DateTime.UtcNow;
+ if (!force && lastBackup.Date + maxDaysWithoutBackup >= now)
+ return true;
+
+ backupFilepath = DBFile + ".backup";
+ try {
+ if (File.Exists(backupFilepath))
+ File.Delete(backupFilepath);
+
+ File.Copy(DBFile, backupFilepath);
+ Log.Debug ("Created backup for database at ", backupFilepath);
+ lastBackup = new BackupDate {Date = now};
+ UpdateBackupDate(false);
+ return true;
+ } catch (Exception ex) {
+ Log.Error("Could not create backup");
+ Log.Exception(ex);
+ return false;
+ }
+
+ }
+
+ private IQuery GetQueryProjectById(IObjectContainer db, Guid id) {
+ IQuery query = db.Query();
+ query.Constrain(typeof(Project));
+ query.Descend("_UUID").Constrain(id);
+ return query;
+ }
+
+ private void CloseDB(IObjectContainer db) {
+ db.Ext().Purge();
+ db.Close();
+ }
+
+ private List<Type> GetTypes() {
+ List<Type> types = new List<Type>();
+ types.Add(typeof(Project));
+ types.Add(typeof(ProjectDescription));
+ types.Add(typeof(Categories));
+ types.Add(typeof(TeamTemplate));
+ types.Add(typeof(Play));
+ types.Add(typeof(TimeNode));
+ types.Add(typeof(TeamTag));
+ types.Add(typeof(PlayerTag));
+ types.Add(typeof(StringTag));
+ types.Add(typeof(PlayersTagStore));
+ types.Add(typeof(TeamsTagStore));
+ types.Add(typeof(StringTagStore));
+
+ return types;
+ }
+
+ private void SetDeleteCascadeOptions() {
+ foreach (Type type in GetTypes()) {
+ Db4oFactory.Configure().ObjectClass(type).CascadeOnDelete(true);
+ }
+ }
+
+ void FixCoordinates (Project project, int old_width, string backgroundName)
+ {
+ List<Coordinates> coords = null;
+ Image image = null;
+
+ if (backgroundName == Constants.FIELD_BACKGROUND) {
+ image = Config.FieldBackground;
+ project.Categories.FieldBackground = image;
+ coords = project.AllPlays().Select(p => p.FieldPosition).ToList();
+ } else if (backgroundName == Constants.HALF_FIELD_BACKGROUND) {
+ image = Config.HalfFieldBackground;
+ project.Categories.HalfFieldBackground = image;
+ coords = project.AllPlays().Select(p => p.HalfFieldPosition).ToList();
+ } else if (backgroundName == Constants.GOAL_BACKGROUND) {
+ image = Config.GoalBackground;
+ project.Categories.GoalBackground = image;
+ }
+
+ if (coords != null) {
+ int new_width;
+
+ new_width = image.Width;
+ foreach (Coordinates c in coords) {
+ float scale = (float) new_width / old_width;
+ if (c == null)
+ continue;
+ foreach (Point p in c) {
+ p.X = (int) (p.X * scale);
+ p.Y = (int) (p.Y * scale);
+ }
+ }
+ }
+ }
+
+ bool FixProjectCoordinates (Project project) {
+ bool save = false;
+
+ if (project.Categories.FieldBackground == null) {
+ FixCoordinates (project, 2078, Constants.FIELD_BACKGROUND);
+ save = true;
+ }
+ if (project.Categories.HalfFieldBackground == null) {
+ FixCoordinates (project, 2078, Constants.HALF_FIELD_BACKGROUND);
+ save = true;
+ }
+ if (project.Categories.GoalBackground == null) {
+ FixCoordinates (project, 400, Constants.GOAL_BACKGROUND);
+ save = true;
+ }
+ return save;
+ }
+
+ /* Dummy class to allow having a single instance of BackupDateTime in the DB and make it
+ * easIer to query */
+ protected class BackupDate
+ {
+ public DateTime Date {
+ get;
+ set;
+ }
+ }
+
+ }
+
+
+}
diff --git a/LongoMatch.Migration/LongoMatch.Migration.csproj
b/LongoMatch.Migration/LongoMatch.Migration.csproj
new file mode 100644
index 0000000..edeb3b3
--- /dev/null
+++ b/LongoMatch.Migration/LongoMatch.Migration.csproj
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <ProductVersion>10.0.0</ProductVersion>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{5177E0D5-38FE-475F-B13A-16C9EEF00EA8}</ProjectGuid>
+ <OutputType>WinExe</OutputType>
+ <RootNamespace>LongoMatch.Migration</RootNamespace>
+ <AssemblyName>LongoMatch.Migration</AssemblyName>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ <DebugSymbols>true</DebugSymbols>
+ <DebugType>full</DebugType>
+ <Optimize>false</Optimize>
+ <OutputPath>bin\Debug</OutputPath>
+ <DefineConstants>DEBUG;</DefineConstants>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ <ConsolePause>false</ConsolePause>
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ <DebugType>full</DebugType>
+ <Optimize>true</Optimize>
+ <OutputPath>bin\Release</OutputPath>
+ <ErrorReport>prompt</ErrorReport>
+ <WarningLevel>4</WarningLevel>
+ <ConsolePause>false</ConsolePause>
+ </PropertyGroup>
+ <ItemGroup>
+ <Reference Include="System" />
+ <Reference Include="gtk-sharp, Version=2.12.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f">
+ <SpecificVersion>False</SpecificVersion>
+ <Package>gtk-sharp-2.0</Package>
+ </Reference>
+ <Reference Include="gdk-sharp, Version=2.12.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f">
+ <SpecificVersion>False</SpecificVersion>
+ <Package>gtk-sharp-2.0</Package>
+ </Reference>
+ <Reference Include="glib-sharp, Version=2.12.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f">
+ <SpecificVersion>False</SpecificVersion>
+ <Package>glib-sharp-2.0</Package>
+ </Reference>
+ <Reference Include="glade-sharp, Version=2.12.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f">
+ <SpecificVersion>False</SpecificVersion>
+ <Package>glade-sharp-2.0</Package>
+ </Reference>
+ <Reference Include="pango-sharp, Version=2.12.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f">
+ <SpecificVersion>False</SpecificVersion>
+ <Package>gtk-sharp-2.0</Package>
+ </Reference>
+ <Reference Include="atk-sharp, Version=2.12.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f">
+ <SpecificVersion>False</SpecificVersion>
+ <Package>gtk-sharp-2.0</Package>
+ </Reference>
+ <Reference Include="Mono.Posix" />
+ </ItemGroup>
+ <ItemGroup>
+ <EmbeddedResource Include="gtk-gui\gui.stetic">
+ <LogicalName>gui.stetic</LogicalName>
+ </EmbeddedResource>
+ </ItemGroup>
+ <ItemGroup>
+ <Compile Include="gtk-gui\generated.cs" />
+ <Compile Include="MainWindow.cs" />
+ <Compile Include="gtk-gui\MainWindow.cs" />
+ </ItemGroup>
+ <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+</Project>
\ No newline at end of file
diff --git a/LongoMatch.Migration/LongoMatch.Migration.mdp b/LongoMatch.Migration/LongoMatch.Migration.mdp
new file mode 100644
index 0000000..dc28526
--- /dev/null
+++ b/LongoMatch.Migration/LongoMatch.Migration.mdp
@@ -0,0 +1,89 @@
+<Project name="LongoMatch.Migration" fileversion="2.0" DefaultNamespace="LongoMatch.Migration" language="C#"
targetFramework="4.0" ctype="DotNetProject">
+ <Configurations active="Release">
+ <Configuration name="Debug" ctype="DotNetProjectConfiguration">
+ <Output directory="bin/Debug" assembly="LongoMatch" />
+ <Build debugmode="True" target="WinExe" />
+ <Execution consolepause="False" runwithwarnings="True" runtime="MsNet" />
+ <CodeGeneration compiler="Mcs" warninglevel="4" optimize="False" unsafecodeallowed="False"
generateoverflowchecks="False" definesymbols="DEBUG;HAVE_GTK" generatexmldocumentation="False"
ctype="CSharpCompilerParameters" />
+ </Configuration>
+ <Configuration name="Release" ctype="DotNetProjectConfiguration">
+ <Output directory="bin/Release" assembly="LongoMatch" />
+ <Build debugmode="True" target="WinExe" />
+ <Execution consolepause="False" runwithwarnings="True" runtime="MsNet" />
+ <CodeGeneration compiler="Mcs" warninglevel="4" optimize="False" unsafecodeallowed="False"
generateoverflowchecks="False" definesymbols="HAVE_GTK" generatexmldocumentation="False"
ctype="CSharpCompilerParameters" />
+ </Configuration>
+ </Configurations>
+ <Contents>
+ <File subtype="Code" buildaction="EmbedAsResource" name="gtk-gui/gui.stetic" />
+ <File subtype="Code" buildaction="Compile" name="gtk-gui/generated.cs" />
+ <File subtype="Code" buildaction="Compile" name="MainWindow.cs" />
+ <File subtype="Code" buildaction="Compile" name="gtk-gui/MainWindow.cs" />
+ <File subtype="Code" buildaction="Compile" name="Program.cs" />
+ <File subtype="Code" buildaction="Compile" name="Properties/AssemblyInfo.cs" />
+ <File subtype="Directory" buildaction="Compile" name="Core" />
+ <File subtype="Code" buildaction="Compile" name="Core/Category.cs" />
+ <File subtype="Code" buildaction="Compile" name="Core/Player.cs" />
+ <File subtype="Code" buildaction="Compile" name="Core/ProjectDescription.cs" />
+ <File subtype="Code" buildaction="Compile" name="Core/Timer.cs" />
+ <File subtype="Code" buildaction="Compile" name="Core/MediaFile.cs" />
+ <File subtype="Code" buildaction="Compile" name="Core/Project.cs" />
+ <File subtype="Code" buildaction="Compile" name="Core/Period.cs" />
+ <File subtype="Code" buildaction="Compile" name="Core/TimelineNode.cs" />
+ <File subtype="Code" buildaction="Compile" name="Core/GameUnit.cs" />
+ <File subtype="Code" buildaction="Compile" name="Core/Drawing.cs" />
+ <File subtype="Code" buildaction="Compile" name="Core/Point.cs" />
+ <File subtype="Code" buildaction="Compile" name="Core/Coordinates.cs" />
+ <File subtype="Code" buildaction="Compile" name="Core/Time.cs" />
+ <File subtype="Code" buildaction="Compile" name="Core/TimeNode.cs" />
+ <File subtype="Code" buildaction="Compile" name="Core/PixbufTimeNode.cs" />
+ <File subtype="Code" buildaction="Compile" name="Core/TagStore.cs" />
+ <File subtype="Code" buildaction="Compile" name="Core/SubCategory.cs" />
+ <File subtype="Code" buildaction="Compile" name="Core/Play.cs" />
+ <File subtype="Code" buildaction="Compile" name="Core/HotKey.cs" />
+ <File subtype="Code" buildaction="Compile" name="Core/PlayListPlay.cs" />
+ <File subtype="Code" buildaction="Compile" name="Core/Tag.cs" />
+ <File subtype="Code" buildaction="Compile" name="Core/GameUnitsList.cs" />
+ <File subtype="Directory" buildaction="Compile" name="Core/Templates" />
+ <File subtype="Code" buildaction="Compile" name="Core/Templates/TeamTemplate.cs" />
+ <File subtype="Code" buildaction="Compile" name="Core/Templates/CategoriesTemplate.cs" />
+ <File subtype="Directory" buildaction="Compile" name="Core/Interfaces" />
+ <File subtype="Code" buildaction="Compile" name="Core/Interfaces/ITemplates.cs" />
+ <File subtype="Code" buildaction="Compile" name="Core/Interfaces/ISubCategory.cs" />
+ <File subtype="Code" buildaction="Compile" name="Core/Interfaces/ITag.cs" />
+ <File subtype="Directory" buildaction="Compile" name="Common" />
+ <File subtype="Code" buildaction="Compile" name="Common/Color.cs" />
+ <File subtype="Code" buildaction="Compile" name="Common/Image.cs" />
+ <File subtype="Code" buildaction="Compile" name="Core/Interfaces/ITimelineNode.cs" />
+ <File subtype="Code" buildaction="Compile" name="Common/Enums.cs" />
+ <File subtype="Code" buildaction="Compile" name="Common/Log.cs" />
+ <File subtype="Code" buildaction="Compile" name="Common/Constants.cs" />
+ <File subtype="Code" buildaction="Compile" name="Common/SerializableObject.cs" />
+ <File subtype="Code" buildaction="Compile" name="Common/ConsoleCrayon.cs" />
+ <File subtype="Code" buildaction="Compile" name="Common/Config.cs" />
+ <File subtype="Directory" buildaction="Compile" name="Tests" />
+ <File subtype="Code" buildaction="Compile" name="Tests/CateogiresTest.cs" />
+ <File subtype="Code" buildaction="EmbedAsResource" name="Data/default.lct" />
+ <File subtype="Code" buildaction="EmbedAsResource" name="Data/default.ltt" />
+ <File subtype="Code" buildaction="Compile" name="Core/Templates/SubCategoryTemplate.cs" />
+ <File subtype="Code" buildaction="Compile" name="Tests/TestTeam.cs" />
+ <File subtype="Code" buildaction="EmbedAsResource" name="Data/project.lgm" />
+ <File subtype="Code" buildaction="Compile" name="Converter.cs" />
+ <File subtype="Code" buildaction="Compile" name="Tests/TestProject.cs" />
+ <File subtype="Code" buildaction="Compile" name="DataBase.cs" />
+ </Contents>
+ <References>
+ <ProjectReference type="Package" localcopy="True" refto="System, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089" />
+ <ProjectReference type="Package" specificVersion="False" localcopy="True" refto="gtk-sharp,
Version=2.12.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f" />
+ <ProjectReference type="Package" specificVersion="False" localcopy="True" refto="gdk-sharp,
Version=2.12.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f" />
+ <ProjectReference type="Package" specificVersion="False" localcopy="True" refto="glib-sharp,
Version=2.12.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f" />
+ <ProjectReference type="Package" specificVersion="False" localcopy="True" refto="pango-sharp,
Version=2.12.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f" />
+ <ProjectReference type="Package" specificVersion="False" localcopy="True" refto="atk-sharp,
Version=2.12.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f" />
+ <ProjectReference type="Package" localcopy="True" refto="Mono.Posix, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=0738eb9f132ed756" />
+ <ProjectReference type="Package" localcopy="False" refto="Newtonsoft.Json, Version=5.0.0.0,
Culture=neutral, PublicKeyToken=b9a188c8922137c6" />
+ <ProjectReference type="Package" specificVersion="False" localcopy="False" refto="System.Core,
Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+ <ProjectReference type="Package" specificVersion="False" localcopy="False" refto="System.Xml,
Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+ <ProjectReference type="Package" localcopy="False" refto="Db4objects.Db4o, Version=8.0.184.15484,
Culture=neutral, PublicKeyToken=6199cd4f203aa8eb" />
+ <ProjectReference type="Package" specificVersion="False" localcopy="False" refto="System.Drawing,
Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+ <ProjectReference type="Package" localcopy="False" refto="nunit.framework, Version=2.6.0.0,
Culture=neutral, PublicKeyToken=96d09a1eb7f44a77" />
+ </References>
+</Project>
\ No newline at end of file
diff --git a/LongoMatch.Migration/MainWindow.cs b/LongoMatch.Migration/MainWindow.cs
new file mode 100644
index 0000000..b760de7
--- /dev/null
+++ b/LongoMatch.Migration/MainWindow.cs
@@ -0,0 +1,182 @@
+//
+// Copyright (C) 2014 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 System.IO;
+using Gtk;
+using System.Collections.Generic;
+using LongoMatch.DB;
+using LongoMatch.Store;
+
+public partial class MainWindow: Gtk.Window
+{
+
+ string baseDirectory;
+ string homeDirectory;
+ string configDirectory;
+ string buf;
+ List<string> teams, categories, dbs;
+
+
+ public MainWindow (): base (Gtk.WindowType.Toplevel)
+ {
+ Build ();
+ SetupBasedir ();
+ FindFiles ();
+ UpdateLabel ();
+ buf = "";
+ }
+
+ void SetupBasedir () {
+ string home;
+
+ baseDirectory = System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory,"../");
+ if (!System.IO.Directory.Exists(System.IO.Path.Combine(baseDirectory, "share",
"longomatch"))) {
+ baseDirectory = System.IO.Path.Combine(baseDirectory, "../");
+ }
+
+ home = System.Environment.GetFolderPath(Environment.SpecialFolder.Personal);
+ homeDirectory = System.IO.Path.Combine(home, "LongoMatch");
+ if (Environment.OSVersion.Platform == PlatformID.Win32NT)
+ configDirectory = homeDirectory;
+ else
+ configDirectory = System.IO.Path.Combine(home,"." + "longomatch");
+ }
+
+ void FindFiles () {
+ string dbdir, templatesdir;
+
+ dbs = new List<string>();
+ teams = new List<string>();
+ categories = new List<string>();
+
+ dbdir = System.IO.Path.Combine (configDirectory, "db");
+ if (Directory.Exists (dbdir)) {
+ foreach (string file in Directory.GetFiles (dbdir)) {
+ if (file.EndsWith ("1.db")) {
+ dbs.Add (file);
+ }
+ }
+ }
+
+ templatesdir = System.IO.Path.Combine (homeDirectory, "templates");
+ if (Directory.Exists (templatesdir)) {
+ foreach (string file in Directory.GetFiles (templatesdir)) {
+ if (file.EndsWith (".lct")) {
+ categories.Add (file);
+ }
+ if (file.EndsWith (".ltt")) {
+ teams.Add (file);
+ }
+ }
+ }
+ }
+
+ void UpdateLabel () {
+ label3.Markup = " <b> Databases </b>: " + dbs.Count + "\n\n" +
+ " <b> Analysis templates </b>: " + categories.Count + "\n\n" +
+ " <b> Teams templates: </b>: " + teams.Count + "\n\n";
+ }
+
+ protected void OnDeleteEvent (object sender, DeleteEventArgs a)
+ {
+ Application.Quit ();
+ a.RetVal = true;
+ }
+
+ protected void OnButton2Clicked (object sender, EventArgs e)
+ {
+ Application.Quit();
+ }
+
+ void UpdateText (string t) {
+ buf += t;
+ textview1.Buffer.Text = buf;
+ }
+
+ protected void OnButton1Clicked (object sender, EventArgs e)
+ {
+ string dbdir = System.IO.Path.Combine (homeDirectory, "db");
+ string teamdir = System.IO.Path.Combine (homeDirectory, "db", "teams");
+ string analysisdir = System.IO.Path.Combine (homeDirectory, "db", "analysis");
+ bool withError;
+ MessageDialog d;
+
+ scrolledwindow1.Visible = true ;
+ label2.Visible = false;
+ label3.Visible = false;
+ withError = false;
+
+ textview1.Buffer.Text = buf;
+ if (!Directory.Exists (teamdir)) {
+ UpdateText ("Creating directory " + teamdir + "\n");
+ Directory.CreateDirectory (teamdir);
+ }
+ if (!Directory.Exists (analysisdir)) {
+ UpdateText ("Creating directory " + analysisdir + "\n");
+ Directory.CreateDirectory (analysisdir);
+ }
+
+ foreach (string f in dbs) {
+ UpdateText ("Converting dabase " + f + "...");
+ try {
+ LongoMatch.Migration.Converter.ConvertDB (f, dbdir);
+ UpdateText ("OK\n");
+ } catch (Exception ex) {
+ UpdateText ("ERROR\n");
+ UpdateText (ex.ToString ());
+ withError = true;
+ }
+ }
+ foreach (string f in teams) {
+ UpdateText ("Converting team template " + f + "...");
+ try {
+ string p = System.IO.Path.Combine (teamdir, System.IO.Path.GetFileName (f));
+ LongoMatch.Migration.Converter.ConvertTeamTemplate (f, p);
+ UpdateText ("OK\n");
+ } catch (Exception ex) {
+ UpdateText ("ERROR\n");
+ UpdateText (ex.ToString ());
+ withError = true;
+ }
+ }
+ foreach (string f in categories) {
+ UpdateText ("Converting analysis template " + f + "...");
+ try {
+ string p = System.IO.Path.Combine (analysisdir, System.IO.Path.GetFileName
(f));
+ LongoMatch.Migration.Converter.ConvertCategories (f, p);
+ UpdateText ("OK\n");
+ } catch (Exception ex) {
+ UpdateText ("ERROR\n");
+ UpdateText (ex.ToString ());
+ withError = true;
+ }
+ }
+
+ if (!withError) {
+ d = new MessageDialog (this, DialogFlags.Modal, MessageType.Info,
+ ButtonsType.Ok, "Everything migrated correctly!");
+ d.Run();
+ Application.Quit();
+ } else {
+ button1.Visible = false;
+ d = new MessageDialog (this, DialogFlags.DestroyWithParent, MessageType.Error,
+ ButtonsType.Ok, "Some errors where found migrating the old
content.");
+ d.Run();
+ }
+ }
+}
diff --git a/LongoMatch.Core/Store/GameUnit.cs b/LongoMatch.Migration/Program.cs
similarity index 66%
copy from LongoMatch.Core/Store/GameUnit.cs
copy to LongoMatch.Migration/Program.cs
index f9ce9b9..8b3a1bd 100644
--- a/LongoMatch.Core/Store/GameUnit.cs
+++ b/LongoMatch.Migration/Program.cs
@@ -1,43 +1,33 @@
-//
-// Copyright (C) 2011 andoni
-//
+//
+// Copyright (C) 2014 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 System.Collections.Generic;
+using Gtk;
-namespace LongoMatch.Store
+namespace LongoMatch.Migration
{
- [Serializable]
- public class GameUnit: List<TimelineNode>
+ class MainClass
{
-
- public GameUnit (string name)
+ public static void Main (string[] args)
{
- Name=name;
+ Application.Init ();
+ MainWindow win = new MainWindow ();
+ win.Show ();
+ Application.Run ();
}
-
- public string Name {
- get;
- set;
- }
-
- public override string ToString ()
- {
- return string.Format ("[GameUnit: Name={0}]", Name);
- }
}
}
-
diff --git a/LongoMatch.Migration/Properties/AssemblyInfo.cs b/LongoMatch.Migration/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..a53d252
--- /dev/null
+++ b/LongoMatch.Migration/Properties/AssemblyInfo.cs
@@ -0,0 +1,51 @@
+//
+// Copyright (C) 2007-2009 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.Reflection;
+using System.Runtime.CompilerServices;
+
+// Information about this assembly is defined by the following
+// attributes.
+//
+// change them to the information which is associated with the assembly
+// you compile.
+
+[assembly: AssemblyTitle("LongoMatch")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("Andoni Morales Alastruey")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+// The assembly version has following format :
+//
+// Major.Minor.Build.Revision
+//
+// You can specify all values by your own or you can build default build and revision
+// numbers with the '*' character (the default):
+
+[assembly: AssemblyVersion("0.20.7")]
+
+// The following attributes specify the key for the sign of your assembly. See the
+// .NET Framework documentation for more information about signing.
+// This is not required, if you don't want signing let these attributes like they're.
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyKeyFile("")]
diff --git a/Tests/Core/TestSubcategoriesTemplate.cs b/LongoMatch.Migration/Tests/CateogiresTest.cs
similarity index 55%
copy from Tests/Core/TestSubcategoriesTemplate.cs
copy to LongoMatch.Migration/Tests/CateogiresTest.cs
index 769a25c..cc65853 100644
--- a/Tests/Core/TestSubcategoriesTemplate.cs
+++ b/LongoMatch.Migration/Tests/CateogiresTest.cs
@@ -15,40 +15,32 @@
// 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 NUnit.Framework;
-using LongoMatch.Common;
-using LongoMatch.Store;
+using System;
+using System.Reflection;
using LongoMatch.Store.Templates;
-using System.Collections.Generic;
+using LongoMatch.Common;
+using System.IO;
-namespace Tests.Core
+namespace LongoMatch.Migration.Tests
{
[TestFixture()]
- public class TestSubcategoriesTemplate
+ public class CateogiresTest
{
[Test()]
- public void TestSerialization ()
+ public void TestCategoriesMigration ()
{
- string tag1="tag1", tag2="tag2";
- SubCategoryTemplate t = new SubCategoryTemplate {Name="Test",
- AllowMultiple = true, FastTag = true};
-
- Utils.CheckSerialization (t);
- t.Add (tag1);
- t.Add (tag2);
- Utils.CheckSerialization (t);
+ var assembly = Assembly.GetExecutingAssembly();
+ var resourceName = "default.lct";
- SubCategoryTemplate newt = Utils.SerializeDeserialize (t);
- Assert.AreEqual (t.Name, newt.Name);
- Assert.AreEqual (t.AllowMultiple, newt.AllowMultiple);
- Assert.AreEqual (t.Count, newt.Count);
- Assert.AreEqual (t.FastTag, newt.FastTag);
- Assert.AreEqual (t.Count, 2);
- Assert.AreEqual (t[0], tag1);
- Assert.AreEqual (t[1], tag2);
-
+ using (Stream stream = assembly.GetManifestResourceStream(resourceName)) {
+ Categories cats = SerializableObject.Load<Categories> (stream,
SerializationType.Binary);
+ var cstream = new MemoryStream ();
+ SerializableObject.Save (cats, cstream, SerializationType.Json);
+ cstream.Seek (0, SeekOrigin.Begin);
+ var jsonString = new StreamReader(cstream).ReadToEnd();
+ Console.WriteLine (jsonString);
+ }
}
}
-}
-
+}
\ No newline at end of file
diff --git a/Tests/Core/TestSubcategoriesTemplate.cs b/LongoMatch.Migration/Tests/TestProject.cs
similarity index 53%
copy from Tests/Core/TestSubcategoriesTemplate.cs
copy to LongoMatch.Migration/Tests/TestProject.cs
index 769a25c..c4a7d88 100644
--- a/Tests/Core/TestSubcategoriesTemplate.cs
+++ b/LongoMatch.Migration/Tests/TestProject.cs
@@ -15,39 +15,32 @@
// 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 NUnit.Framework;
-using LongoMatch.Common;
+using System;
+using System.Reflection;
+using System.IO;
using LongoMatch.Store;
-using LongoMatch.Store.Templates;
-using System.Collections.Generic;
+using LongoMatch.Common;
-namespace Tests.Core
+namespace LongoMatch.Migration.Tests
{
- [TestFixture()]
- public class TestSubcategoriesTemplate
+ [TestFixture()]
+ public class TestProject
{
[Test()]
- public void TestSerialization ()
+ public void TestCase ()
{
- string tag1="tag1", tag2="tag2";
- SubCategoryTemplate t = new SubCategoryTemplate {Name="Test",
- AllowMultiple = true, FastTag = true};
-
- Utils.CheckSerialization (t);
- t.Add (tag1);
- t.Add (tag2);
- Utils.CheckSerialization (t);
+ var assembly = Assembly.GetExecutingAssembly();
+ var resourceName = "project.lgm";
- SubCategoryTemplate newt = Utils.SerializeDeserialize (t);
- Assert.AreEqual (t.Name, newt.Name);
- Assert.AreEqual (t.AllowMultiple, newt.AllowMultiple);
- Assert.AreEqual (t.Count, newt.Count);
- Assert.AreEqual (t.FastTag, newt.FastTag);
- Assert.AreEqual (t.Count, 2);
- Assert.AreEqual (t[0], tag1);
- Assert.AreEqual (t[1], tag2);
-
+ using (Stream stream = assembly.GetManifestResourceStream(resourceName)) {
+ Project project = SerializableObject.Load<Project> (stream,
SerializationType.Binary);
+ var cstream = new MemoryStream ();
+ SerializableObject.Save (project, cstream, SerializationType.Json);
+ cstream.Seek (0, SeekOrigin.Begin);
+ var jsonString = new StreamReader(cstream).ReadToEnd();
+ Console.WriteLine (jsonString);
+ }
}
}
}
diff --git a/Tests/Core/TestSubcategoriesTemplate.cs b/LongoMatch.Migration/Tests/TestTeam.cs
similarity index 55%
rename from Tests/Core/TestSubcategoriesTemplate.cs
rename to LongoMatch.Migration/Tests/TestTeam.cs
index 769a25c..0829d55 100644
--- a/Tests/Core/TestSubcategoriesTemplate.cs
+++ b/LongoMatch.Migration/Tests/TestTeam.cs
@@ -15,39 +15,32 @@
// 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 NUnit.Framework;
-using LongoMatch.Common;
-using LongoMatch.Store;
+using System;
+using System.Reflection;
+using System.IO;
using LongoMatch.Store.Templates;
-using System.Collections.Generic;
+using LongoMatch.Common;
-namespace Tests.Core
+namespace LongoMatch.Migration.Tests
{
[TestFixture()]
- public class TestSubcategoriesTemplate
+ public class TestTeam
{
[Test()]
- public void TestSerialization ()
+ public void TestCase ()
{
- string tag1="tag1", tag2="tag2";
- SubCategoryTemplate t = new SubCategoryTemplate {Name="Test",
- AllowMultiple = true, FastTag = true};
-
- Utils.CheckSerialization (t);
- t.Add (tag1);
- t.Add (tag2);
- Utils.CheckSerialization (t);
+ var assembly = Assembly.GetExecutingAssembly();
+ var resourceName = "default.ltt";
- SubCategoryTemplate newt = Utils.SerializeDeserialize (t);
- Assert.AreEqual (t.Name, newt.Name);
- Assert.AreEqual (t.AllowMultiple, newt.AllowMultiple);
- Assert.AreEqual (t.Count, newt.Count);
- Assert.AreEqual (t.FastTag, newt.FastTag);
- Assert.AreEqual (t.Count, 2);
- Assert.AreEqual (t[0], tag1);
- Assert.AreEqual (t[1], tag2);
-
+ using (Stream stream = assembly.GetManifestResourceStream(resourceName)) {
+ TeamTemplate template = SerializableObject.Load<TeamTemplate> (stream,
SerializationType.Binary);
+ var cstream = new MemoryStream ();
+ SerializableObject.Save (template, cstream, SerializationType.Json);
+ cstream.Seek (0, SeekOrigin.Begin);
+ var jsonString = new StreamReader(cstream).ReadToEnd();
+ Console.WriteLine (jsonString);
+ }
}
}
}
diff --git a/LongoMatch.Migration/gtk-gui/MainWindow.cs b/LongoMatch.Migration/gtk-gui/MainWindow.cs
new file mode 100644
index 0000000..471392c
--- /dev/null
+++ b/LongoMatch.Migration/gtk-gui/MainWindow.cs
@@ -0,0 +1,120 @@
+
+// This file has been generated by the GUI designer. Do not modify.
+public partial class MainWindow
+{
+ private global::Gtk.VBox vbox1;
+ private global::Gtk.VBox vbox2;
+ private global::Gtk.Label label2;
+ private global::Gtk.Label label3;
+ private global::Gtk.ScrolledWindow scrolledwindow1;
+ private global::Gtk.TextView textview1;
+ private global::Gtk.HBox hbox1;
+ private global::Gtk.Button button2;
+ private global::Gtk.Button button1;
+
+ protected virtual void Build ()
+ {
+ global::Stetic.Gui.Initialize (this);
+ // Widget MainWindow
+ this.Name = "MainWindow";
+ this.Title = global::Mono.Unix.Catalog.GetString ("Migration tool");
+ this.WindowPosition = ((global::Gtk.WindowPosition)(4));
+ // Container child MainWindow.Gtk.Container+ContainerChild
+ this.vbox1 = new global::Gtk.VBox ();
+ this.vbox1.Name = "vbox1";
+ this.vbox1.Spacing = 6;
+ // Container child vbox1.Gtk.Box+BoxChild
+ this.vbox2 = new global::Gtk.VBox ();
+ this.vbox2.Name = "vbox2";
+ this.vbox2.Spacing = 6;
+ // Container child vbox2.Gtk.Box+BoxChild
+ this.label2 = new global::Gtk.Label ();
+ this.label2.Name = "label2";
+ this.label2.LabelProp = global::Mono.Unix.Catalog.GetString ("<b> We have found the following
elements from the old version: </b>");
+ this.label2.UseMarkup = true;
+ this.vbox2.Add (this.label2);
+ global::Gtk.Box.BoxChild w1 = ((global::Gtk.Box.BoxChild)(this.vbox2 [this.label2]));
+ w1.Position = 0;
+ w1.Expand = false;
+ w1.Padding = ((uint)(23));
+ // Container child vbox2.Gtk.Box+BoxChild
+ this.label3 = new global::Gtk.Label ();
+ this.label3.Name = "label3";
+ this.vbox2.Add (this.label3);
+ global::Gtk.Box.BoxChild w2 = ((global::Gtk.Box.BoxChild)(this.vbox2 [this.label3]));
+ w2.Position = 1;
+ w2.Expand = false;
+ // Container child vbox2.Gtk.Box+BoxChild
+ this.scrolledwindow1 = new global::Gtk.ScrolledWindow ();
+ this.scrolledwindow1.CanFocus = true;
+ this.scrolledwindow1.Name = "scrolledwindow1";
+ this.scrolledwindow1.ShadowType = ((global::Gtk.ShadowType)(1));
+ // Container child scrolledwindow1.Gtk.Container+ContainerChild
+ this.textview1 = new global::Gtk.TextView ();
+ this.textview1.CanFocus = true;
+ this.textview1.Name = "textview1";
+ this.scrolledwindow1.Add (this.textview1);
+ this.vbox2.Add (this.scrolledwindow1);
+ global::Gtk.Box.BoxChild w4 = ((global::Gtk.Box.BoxChild)(this.vbox2 [this.scrolledwindow1]));
+ w4.Position = 2;
+ this.vbox1.Add (this.vbox2);
+ global::Gtk.Box.BoxChild w5 = ((global::Gtk.Box.BoxChild)(this.vbox1 [this.vbox2]));
+ w5.Position = 0;
+ // Container child vbox1.Gtk.Box+BoxChild
+ this.hbox1 = new global::Gtk.HBox ();
+ this.hbox1.Name = "hbox1";
+ this.hbox1.Spacing = 6;
+ // Container child hbox1.Gtk.Box+BoxChild
+ this.button2 = new global::Gtk.Button ();
+ this.button2.CanFocus = true;
+ this.button2.Name = "button2";
+ this.button2.UseStock = true;
+ this.button2.UseUnderline = true;
+ this.button2.Label = "gtk-close";
+ this.hbox1.Add (this.button2);
+ global::Gtk.Box.BoxChild w6 = ((global::Gtk.Box.BoxChild)(this.hbox1 [this.button2]));
+ w6.Position = 0;
+ w6.Fill = false;
+ // Container child hbox1.Gtk.Box+BoxChild
+ this.button1 = new global::Gtk.Button ();
+ this.button1.CanFocus = true;
+ this.button1.Name = "button1";
+ this.button1.UseUnderline = true;
+ // Container child button1.Gtk.Container+ContainerChild
+ global::Gtk.Alignment w7 = new global::Gtk.Alignment (0.5F, 0.5F, 0F, 0F);
+ // Container child GtkAlignment.Gtk.Container+ContainerChild
+ global::Gtk.HBox w8 = new global::Gtk.HBox ();
+ w8.Spacing = 2;
+ // Container child GtkHBox.Gtk.Container+ContainerChild
+ global::Gtk.Image w9 = new global::Gtk.Image ();
+ w9.Pixbuf = global::Stetic.IconLoader.LoadIcon (this, "gtk-refresh",
global::Gtk.IconSize.Menu);
+ w8.Add (w9);
+ // Container child GtkHBox.Gtk.Container+ContainerChild
+ global::Gtk.Label w11 = new global::Gtk.Label ();
+ w11.LabelProp = global::Mono.Unix.Catalog.GetString ("Convert");
+ w11.UseUnderline = true;
+ w8.Add (w11);
+ w7.Add (w8);
+ this.button1.Add (w7);
+ this.hbox1.Add (this.button1);
+ global::Gtk.Box.BoxChild w15 = ((global::Gtk.Box.BoxChild)(this.hbox1 [this.button1]));
+ w15.Position = 1;
+ w15.Fill = false;
+ this.vbox1.Add (this.hbox1);
+ global::Gtk.Box.BoxChild w16 = ((global::Gtk.Box.BoxChild)(this.vbox1 [this.hbox1]));
+ w16.Position = 1;
+ w16.Expand = false;
+ w16.Fill = false;
+ this.Add (this.vbox1);
+ if ((this.Child != null)) {
+ this.Child.ShowAll ();
+ }
+ this.DefaultWidth = 664;
+ this.DefaultHeight = 285;
+ this.scrolledwindow1.Hide ();
+ this.Show ();
+ this.DeleteEvent += new global::Gtk.DeleteEventHandler (this.OnDeleteEvent);
+ this.button2.Clicked += new global::System.EventHandler (this.OnButton2Clicked);
+ this.button1.Clicked += new global::System.EventHandler (this.OnButton1Clicked);
+ }
+}
diff --git a/LongoMatch.Migration/gtk-gui/generated.cs b/LongoMatch.Migration/gtk-gui/generated.cs
new file mode 100644
index 0000000..d608548
--- /dev/null
+++ b/LongoMatch.Migration/gtk-gui/generated.cs
@@ -0,0 +1,63 @@
+
+// This file has been generated by the GUI designer. Do not modify.
+namespace Stetic
+{
+ internal class Gui
+ {
+ private static bool initialized;
+
+ internal static void Initialize (Gtk.Widget iconRenderer)
+ {
+ if ((Stetic.Gui.initialized == false)) {
+ Stetic.Gui.initialized = true;
+ }
+ }
+ }
+
+ internal class IconLoader
+ {
+ public static Gdk.Pixbuf LoadIcon (Gtk.Widget widget, string name, Gtk.IconSize size)
+ {
+ Gdk.Pixbuf res = widget.RenderIcon (name, size, null);
+ if ((res != null)) {
+ return res;
+ } else {
+ int sz;
+ int sy;
+ global::Gtk.Icon.SizeLookup (size, out sz, out sy);
+ try {
+ return Gtk.IconTheme.Default.LoadIcon (name, sz, 0);
+ } catch (System.Exception) {
+ if ((name != "gtk-missing-image")) {
+ return Stetic.IconLoader.LoadIcon (widget,
"gtk-missing-image", size);
+ } else {
+ Gdk.Pixmap pmap = new Gdk.Pixmap
(Gdk.Screen.Default.RootWindow, sz, sz);
+ Gdk.GC gc = new Gdk.GC (pmap);
+ gc.RgbFgColor = new Gdk.Color (255, 255, 255);
+ pmap.DrawRectangle (gc, true, 0, 0, sz, sz);
+ gc.RgbFgColor = new Gdk.Color (0, 0, 0);
+ pmap.DrawRectangle (gc, false, 0, 0, (sz - 1), (sz - 1));
+ gc.SetLineAttributes (3, Gdk.LineStyle.Solid,
Gdk.CapStyle.Round, Gdk.JoinStyle.Round);
+ gc.RgbFgColor = new Gdk.Color (255, 0, 0);
+ pmap.DrawLine (gc, (sz / 4), (sz / 4), ((sz - 1) - (sz / 4)),
((sz - 1) - (sz / 4)));
+ pmap.DrawLine (gc, ((sz - 1) - (sz / 4)), (sz / 4), (sz / 4),
((sz - 1) - (sz / 4)));
+ return Gdk.Pixbuf.FromDrawable (pmap, pmap.Colormap, 0, 0, 0,
0, sz, sz);
+ }
+ }
+ }
+ }
+ }
+
+ internal class ActionGroups
+ {
+ public static Gtk.ActionGroup GetActionGroup (System.Type type)
+ {
+ return Stetic.ActionGroups.GetActionGroup (type.FullName);
+ }
+
+ public static Gtk.ActionGroup GetActionGroup (string name)
+ {
+ return null;
+ }
+ }
+}
diff --git a/LongoMatch.Migration/gtk-gui/gui.stetic b/LongoMatch.Migration/gtk-gui/gui.stetic
new file mode 100644
index 0000000..94900c8
--- /dev/null
+++ b/LongoMatch.Migration/gtk-gui/gui.stetic
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="utf-8"?>
+<stetic-interface>
+ <configuration>
+ <images-root-path>..</images-root-path>
+ <target-gtk-version>2.12</target-gtk-version>
+ </configuration>
+ <import>
+ <widget-library name="../bin/Debug/LongoMatch.exe" internal="true" />
+ </import>
+ <widget class="Gtk.Window" id="MainWindow" design-size="664 285">
+ <property name="MemberName" />
+ <property name="Title" translatable="yes">Migration tool</property>
+ <property name="WindowPosition">CenterOnParent</property>
+ <signal name="DeleteEvent" handler="OnDeleteEvent" />
+ <child>
+ <widget class="Gtk.VBox" id="vbox1">
+ <property name="MemberName" />
+ <property name="Spacing">6</property>
+ <child>
+ <widget class="Gtk.VBox" id="vbox2">
+ <property name="MemberName" />
+ <property name="Spacing">6</property>
+ <child>
+ <widget class="Gtk.Label" id="label2">
+ <property name="MemberName" />
+ <property name="LabelProp" translatable="yes"><b> We have found the following elements
from the old version: </b></property>
+ <property name="UseMarkup">True</property>
+ </widget>
+ <packing>
+ <property name="Position">0</property>
+ <property name="AutoSize">False</property>
+ <property name="Expand">False</property>
+ <property name="Padding">23</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Label" id="label3">
+ <property name="MemberName" />
+ </widget>
+ <packing>
+ <property name="Position">1</property>
+ <property name="AutoSize">False</property>
+ <property name="Expand">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.ScrolledWindow" id="scrolledwindow1">
+ <property name="MemberName" />
+ <property name="Visible">False</property>
+ <property name="CanFocus">True</property>
+ <property name="ShadowType">In</property>
+ <child>
+ <widget class="Gtk.TextView" id="textview1">
+ <property name="MemberName" />
+ <property name="CanFocus">True</property>
+ <property name="Text" translatable="yes" />
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="Position">2</property>
+ <property name="AutoSize">True</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="Position">0</property>
+ <property name="AutoSize">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.HBox" id="hbox1">
+ <property name="MemberName" />
+ <property name="Spacing">6</property>
+ <child>
+ <widget class="Gtk.Button" id="button2">
+ <property name="MemberName" />
+ <property name="CanFocus">True</property>
+ <property name="UseStock">True</property>
+ <property name="Type">StockItem</property>
+ <property name="StockId">gtk-close</property>
+ <signal name="Clicked" handler="OnButton2Clicked" />
+ <property name="label">gtk-close</property>
+ </widget>
+ <packing>
+ <property name="Position">0</property>
+ <property name="AutoSize">False</property>
+ <property name="Fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Button" id="button1">
+ <property name="MemberName" />
+ <property name="CanFocus">True</property>
+ <property name="Type">TextAndIcon</property>
+ <property name="Icon">stock:gtk-refresh Menu</property>
+ <property name="Label" translatable="yes">Convert</property>
+ <property name="UseUnderline">True</property>
+ <signal name="Clicked" handler="OnButton1Clicked" />
+ </widget>
+ <packing>
+ <property name="Position">1</property>
+ <property name="AutoSize">False</property>
+ <property name="Fill">False</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="Position">1</property>
+ <property name="AutoSize">True</property>
+ <property name="Expand">False</property>
+ <property name="Fill">False</property>
+ </packing>
+ </child>
+ </widget>
+ </child>
+ </widget>
+</stetic-interface>
\ No newline at end of file
diff --git a/LongoMatch.Migration/test-results/LongoMatch.Migration.mdp-Release-2014-06-06.xml
b/LongoMatch.Migration/test-results/LongoMatch.Migration.mdp-Release-2014-06-06.xml
new file mode 100644
index 0000000..ddca803
--- /dev/null
+++ b/LongoMatch.Migration/test-results/LongoMatch.Migration.mdp-Release-2014-06-06.xml
@@ -0,0 +1,6219 @@
+<?xml version="1.0" encoding="utf-8"?>
+<TestRecord xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+ <Tests>
+ <TestRecord Name="LongoMatch">
+ <Results>
+ <UnitTestResult>
+ <TestDate>2014-06-06T20:08:00</TestDate>
+ <Status />
+ <Passed>0</Passed>
+ <Errors>1</Errors>
+ <Failures>0</Failures>
+ <Inconclusive>0</Inconclusive>
+ <NotRunnable>0</NotRunnable>
+ <Skipped>0</Skipped>
+ <Ignored>0</Ignored>
+ <Time />
+ <Message>One or more child tests had errors</Message>
+ </UnitTestResult>
+ <UnitTestResult>
+ <TestDate>2014-06-06T20:09:48</TestDate>
+ <Status />
+ <Passed>0</Passed>
+ <Errors>1</Errors>
+ <Failures>0</Failures>
+ <Inconclusive>0</Inconclusive>
+ <NotRunnable>0</NotRunnable>
+ <Skipped>0</Skipped>
+ <Ignored>0</Ignored>
+ <Time />
+ <Message>One or more child tests had errors</Message>
+ </UnitTestResult>
+ <UnitTestResult>
+ <TestDate>2014-06-06T20:10:11</TestDate>
+ <Status />
+ <Passed>0</Passed>
+ <Errors>1</Errors>
+ <Failures>0</Failures>
+ <Inconclusive>0</Inconclusive>
+ <NotRunnable>0</NotRunnable>
+ <Skipped>0</Skipped>
+ <Ignored>0</Ignored>
+ <Time />
+ <Message>One or more child tests had errors</Message>
+ </UnitTestResult>
+ <UnitTestResult>
+ <TestDate>2014-06-06T20:12:31</TestDate>
+ <Status />
+ <Passed>0</Passed>
+ <Errors>1</Errors>
+ <Failures>0</Failures>
+ <Inconclusive>0</Inconclusive>
+ <NotRunnable>0</NotRunnable>
+ <Skipped>0</Skipped>
+ <Ignored>0</Ignored>
+ <Time />
+ <Message>One or more child tests had errors</Message>
+ </UnitTestResult>
+ </Results>
+ <Tests>
+ <TestRecord Name="Migration">
+ <Results>
+ <UnitTestResult>
+ <TestDate>2014-06-06T20:08:00</TestDate>
+ <Status />
+ <Passed>0</Passed>
+ <Errors>1</Errors>
+ <Failures>0</Failures>
+ <Inconclusive>0</Inconclusive>
+ <NotRunnable>0</NotRunnable>
+ <Skipped>0</Skipped>
+ <Ignored>0</Ignored>
+ <Time />
+ <Message>One or more child tests had errors</Message>
+ </UnitTestResult>
+ <UnitTestResult>
+ <TestDate>2014-06-06T20:09:48</TestDate>
+ <Status />
+ <Passed>0</Passed>
+ <Errors>1</Errors>
+ <Failures>0</Failures>
+ <Inconclusive>0</Inconclusive>
+ <NotRunnable>0</NotRunnable>
+ <Skipped>0</Skipped>
+ <Ignored>0</Ignored>
+ <Time />
+ <Message>One or more child tests had errors</Message>
+ </UnitTestResult>
+ <UnitTestResult>
+ <TestDate>2014-06-06T20:10:11</TestDate>
+ <Status />
+ <Passed>0</Passed>
+ <Errors>1</Errors>
+ <Failures>0</Failures>
+ <Inconclusive>0</Inconclusive>
+ <NotRunnable>0</NotRunnable>
+ <Skipped>0</Skipped>
+ <Ignored>0</Ignored>
+ <Time />
+ <Message>One or more child tests had errors</Message>
+ </UnitTestResult>
+ <UnitTestResult>
+ <TestDate>2014-06-06T20:12:31</TestDate>
+ <Status />
+ <Passed>0</Passed>
+ <Errors>1</Errors>
+ <Failures>0</Failures>
+ <Inconclusive>0</Inconclusive>
+ <NotRunnable>0</NotRunnable>
+ <Skipped>0</Skipped>
+ <Ignored>0</Ignored>
+ <Time />
+ <Message>One or more child tests had errors</Message>
+ </UnitTestResult>
+ <UnitTestResult>
+ <TestDate>2014-06-06T20:12:36</TestDate>
+ <Status />
+ <Passed>0</Passed>
+ <Errors>1</Errors>
+ <Failures>0</Failures>
+ <Inconclusive>0</Inconclusive>
+ <NotRunnable>0</NotRunnable>
+ <Skipped>0</Skipped>
+ <Ignored>0</Ignored>
+ <Time />
+ <Message>One or more child tests had errors</Message>
+ </UnitTestResult>
+ </Results>
+ <Tests>
+ <TestRecord Name="Tests">
+ <Results>
+ <UnitTestResult>
+ <TestDate>2014-06-06T20:08:00</TestDate>
+ <Status />
+ <Passed>0</Passed>
+ <Errors>1</Errors>
+ <Failures>0</Failures>
+ <Inconclusive>0</Inconclusive>
+ <NotRunnable>0</NotRunnable>
+ <Skipped>0</Skipped>
+ <Ignored>0</Ignored>
+ <Time />
+ <Message>One or more child tests had errors</Message>
+ </UnitTestResult>
+ <UnitTestResult>
+ <TestDate>2014-06-06T20:09:48</TestDate>
+ <Status />
+ <Passed>0</Passed>
+ <Errors>1</Errors>
+ <Failures>0</Failures>
+ <Inconclusive>0</Inconclusive>
+ <NotRunnable>0</NotRunnable>
+ <Skipped>0</Skipped>
+ <Ignored>0</Ignored>
+ <Time />
+ <Message>One or more child tests had errors</Message>
+ </UnitTestResult>
+ <UnitTestResult>
+ <TestDate>2014-06-06T20:10:11</TestDate>
+ <Status />
+ <Passed>0</Passed>
+ <Errors>1</Errors>
+ <Failures>0</Failures>
+ <Inconclusive>0</Inconclusive>
+ <NotRunnable>0</NotRunnable>
+ <Skipped>0</Skipped>
+ <Ignored>0</Ignored>
+ <Time />
+ <Message>One or more child tests had errors</Message>
+ </UnitTestResult>
+ <UnitTestResult>
+ <TestDate>2014-06-06T20:12:31</TestDate>
+ <Status />
+ <Passed>0</Passed>
+ <Errors>1</Errors>
+ <Failures>0</Failures>
+ <Inconclusive>0</Inconclusive>
+ <NotRunnable>0</NotRunnable>
+ <Skipped>0</Skipped>
+ <Ignored>0</Ignored>
+ <Time />
+ <Message>One or more child tests had errors</Message>
+ </UnitTestResult>
+ <UnitTestResult>
+ <TestDate>2014-06-06T20:12:36</TestDate>
+ <Status />
+ <Passed>0</Passed>
+ <Errors>1</Errors>
+ <Failures>0</Failures>
+ <Inconclusive>0</Inconclusive>
+ <NotRunnable>0</NotRunnable>
+ <Skipped>0</Skipped>
+ <Ignored>0</Ignored>
+ <Time />
+ <Message>One or more child tests had errors</Message>
+ </UnitTestResult>
+ </Results>
+ <Tests>
+ <TestRecord Name="CateogiresTest">
+ <Results>
+ <UnitTestResult>
+ <TestDate>2014-06-06T20:08:00</TestDate>
+ <Status />
+ <Passed>0</Passed>
+ <Errors>1</Errors>
+ <Failures>0</Failures>
+ <Inconclusive>0</Inconclusive>
+ <NotRunnable>0</NotRunnable>
+ <Skipped>0</Skipped>
+ <Ignored>0</Ignored>
+ <Time />
+ <Message>One or more child tests had errors</Message>
+ </UnitTestResult>
+ <UnitTestResult>
+ <TestDate>2014-06-06T20:09:48</TestDate>
+ <Status />
+ <Passed>0</Passed>
+ <Errors>1</Errors>
+ <Failures>0</Failures>
+ <Inconclusive>0</Inconclusive>
+ <NotRunnable>0</NotRunnable>
+ <Skipped>0</Skipped>
+ <Ignored>0</Ignored>
+ <Time />
+ <Message>One or more child tests had errors</Message>
+ </UnitTestResult>
+ <UnitTestResult>
+ <TestDate>2014-06-06T20:10:11</TestDate>
+ <Status />
+ <Passed>0</Passed>
+ <Errors>1</Errors>
+ <Failures>0</Failures>
+ <Inconclusive>0</Inconclusive>
+ <NotRunnable>0</NotRunnable>
+ <Skipped>0</Skipped>
+ <Ignored>0</Ignored>
+ <Time />
+ <Message>One or more child tests had errors</Message>
+ </UnitTestResult>
+ <UnitTestResult>
+ <TestDate>2014-06-06T20:12:31</TestDate>
+ <Status />
+ <Passed>0</Passed>
+ <Errors>1</Errors>
+ <Failures>0</Failures>
+ <Inconclusive>0</Inconclusive>
+ <NotRunnable>0</NotRunnable>
+ <Skipped>0</Skipped>
+ <Ignored>0</Ignored>
+ <Time />
+ <Message>One or more child tests had errors</Message>
+ </UnitTestResult>
+ <UnitTestResult>
+ <TestDate>2014-06-06T20:12:36</TestDate>
+ <Status />
+ <Passed>0</Passed>
+ <Errors>1</Errors>
+ <Failures>0</Failures>
+ <Inconclusive>0</Inconclusive>
+ <NotRunnable>0</NotRunnable>
+ <Skipped>0</Skipped>
+ <Ignored>0</Ignored>
+ <Time />
+ <Message>One or more child tests had errors</Message>
+ </UnitTestResult>
+ </Results>
+ <Tests>
+ <TestRecord Name="TestCategoriesMigration">
+ <Results>
+ <UnitTestResult>
+ <TestDate>2014-06-06T20:08:00</TestDate>
+ <Status />
+ <Passed>0</Passed>
+ <Errors>1</Errors>
+ <Failures>0</Failures>
+ <Inconclusive>0</Inconclusive>
+ <NotRunnable>0</NotRunnable>
+ <Skipped>0</Skipped>
+ <Ignored>0</Ignored>
+ <Time />
+ <Message>System.Runtime.Serialization.SerializationException : Couldn't find
assembly 'LongoMatch'
+ ----> System.IO.FileNotFoundException : Could not load file or assembly 'LongoMatch' or one of its
dependencies. The system cannot find the file specified.</Message>
+ <StackTrace> at
System.Runtime.Serialization.Formatters.Binary.ObjectReader.GetDeserializationType (Int64 assemblyId,
System.String className, Boolean throwOnError) [0x00059] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:866
+ at System.Runtime.Serialization.Formatters.Binary.ObjectReader.GetDeserializationType (Int64 assemblyId,
System.String className) [0x00000] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:846
+ at System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadTypeMetadata (System.IO.BinaryReader
reader, Boolean isRuntimeObject, Boolean hasTypeInfo) [0x000bd] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:643
+ at System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadObjectInstance (System.IO.BinaryReader
reader, Boolean isRuntimeObject, Boolean hasTypeInfo, System.Int64& objectId, System.Object& value,
System.Runtime.Serialization.SerializationInfo& info) [0x0000a] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:265
+ at System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadObject (BinaryElement element,
System.IO.BinaryReader reader, System.Int64& objectId, System.Object& value,
System.Runtime.Serialization.SerializationInfo& info) [0x0009b] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:191
+ at System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadObject (BinaryElement element,
System.IO.BinaryReader reader, System.Int64& objectId, System.Object& value,
System.Runtime.Serialization.SerializationInfo& info) [0x00103] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:219
+ at System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadNextObject (BinaryElement element,
System.IO.BinaryReader reader) [0x00020] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:126
+ at System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadObjectGraph (BinaryElement elem,
System.IO.BinaryReader reader, Boolean readHeaders, System.Object& result,
System.Runtime.Remoting.Messaging.Header[]& headers) [0x00004] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:100
+ at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.NoCheckDeserialize (System.IO.Stream
serializationStream, System.Runtime.Remoting.Messaging.HeaderHandler handler) [0x0007a] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/BinaryFormatter.cs:177
+ at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize (System.IO.Stream
serializationStream) [0x00000] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/BinaryFormatter.cs:134
+ at LongoMatch.Common.SerializableObject.Load[Categories] (System.IO.Stream stream, SerializationType type)
[0x00020] in /home/andoni/git/longomatch-rework/LongoMatch.Migration/Common/SerializableObject.cs:68
+ at LongoMatch.Migration.Tests.CateogiresTest.TestCategoriesMigration () [0x00018] in
/home/andoni/git/longomatch-rework/LongoMatch.Migration/Tests/CateogiresTest.cs:37
+ at (wrapper managed-to-native) System.Reflection.MonoMethod:InternalInvoke
(System.Reflection.MonoMethod,object,object[],System.Exception&)
+ at System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr,
System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture)
[0x00054] in /build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Reflection/MonoMethod.cs:230
+--FileNotFoundException
+ at System.AppDomain.Load (System.String assemblyString, System.Security.Policy.Evidence assemblySecurity,
Boolean refonly) [0x00045] in /build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System/AppDomain.cs:803
+ at System.AppDomain.Load (System.String assemblyString) [0x00000] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System/AppDomain.cs:781
+ at (wrapper remoting-invoke-with-check) System.AppDomain:Load (string)
+ at System.Reflection.Assembly.Load (System.String assemblyString) [0x00000] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Reflection/Assembly.cs:541
+ at System.Runtime.Serialization.Formatters.Binary.ObjectReader.GetDeserializationType (Int64 assemblyId,
System.String className, Boolean throwOnError) [0x0003e] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:862
</StackTrace>
+ <ConsoleOutput />
+ <ConsoleError />
+ </UnitTestResult>
+ <UnitTestResult>
+ <TestDate>2014-06-06T20:09:48</TestDate>
+ <Status />
+ <Passed>0</Passed>
+ <Errors>1</Errors>
+ <Failures>0</Failures>
+ <Inconclusive>0</Inconclusive>
+ <NotRunnable>0</NotRunnable>
+ <Skipped>0</Skipped>
+ <Ignored>0</Ignored>
+ <Time />
+ <Message>System.Runtime.Serialization.SerializationException : Couldn't find
assembly 'LongoMatch'
+ ----> System.IO.FileNotFoundException : Could not load file or assembly 'LongoMatch' or one of its
dependencies. The system cannot find the file specified.</Message>
+ <StackTrace> at
System.Runtime.Serialization.Formatters.Binary.ObjectReader.GetDeserializationType (Int64 assemblyId,
System.String className, Boolean throwOnError) [0x00059] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:866
+ at System.Runtime.Serialization.Formatters.Binary.ObjectReader.GetDeserializationType (Int64 assemblyId,
System.String className) [0x00000] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:846
+ at System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadTypeMetadata (System.IO.BinaryReader
reader, Boolean isRuntimeObject, Boolean hasTypeInfo) [0x000bd] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:643
+ at System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadObjectInstance (System.IO.BinaryReader
reader, Boolean isRuntimeObject, Boolean hasTypeInfo, System.Int64& objectId, System.Object& value,
System.Runtime.Serialization.SerializationInfo& info) [0x0000a] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:265
+ at System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadObject (BinaryElement element,
System.IO.BinaryReader reader, System.Int64& objectId, System.Object& value,
System.Runtime.Serialization.SerializationInfo& info) [0x0009b] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:191
+ at System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadObject (BinaryElement element,
System.IO.BinaryReader reader, System.Int64& objectId, System.Object& value,
System.Runtime.Serialization.SerializationInfo& info) [0x00103] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:219
+ at System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadNextObject (BinaryElement element,
System.IO.BinaryReader reader) [0x00020] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:126
+ at System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadObjectGraph (BinaryElement elem,
System.IO.BinaryReader reader, Boolean readHeaders, System.Object& result,
System.Runtime.Remoting.Messaging.Header[]& headers) [0x00004] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:100
+ at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.NoCheckDeserialize (System.IO.Stream
serializationStream, System.Runtime.Remoting.Messaging.HeaderHandler handler) [0x0007a] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/BinaryFormatter.cs:177
+ at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize (System.IO.Stream
serializationStream) [0x00000] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/BinaryFormatter.cs:134
+ at LongoMatch.Common.SerializableObject.Load[Categories] (System.IO.Stream stream, SerializationType type)
[0x00020] in /home/andoni/git/longomatch-rework/LongoMatch.Migration/Common/SerializableObject.cs:68
+ at LongoMatch.Migration.Tests.CateogiresTest.TestCategoriesMigration () [0x00018] in
/home/andoni/git/longomatch-rework/LongoMatch.Migration/Tests/CateogiresTest.cs:37
+ at (wrapper managed-to-native) System.Reflection.MonoMethod:InternalInvoke
(System.Reflection.MonoMethod,object,object[],System.Exception&)
+ at System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr,
System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture)
[0x00054] in /build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Reflection/MonoMethod.cs:230
+--FileNotFoundException
+ at System.AppDomain.Load (System.String assemblyString, System.Security.Policy.Evidence assemblySecurity,
Boolean refonly) [0x00045] in /build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System/AppDomain.cs:803
+ at System.AppDomain.Load (System.String assemblyString) [0x00000] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System/AppDomain.cs:781
+ at (wrapper remoting-invoke-with-check) System.AppDomain:Load (string)
+ at System.Reflection.Assembly.Load (System.String assemblyString) [0x00000] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Reflection/Assembly.cs:541
+ at System.Runtime.Serialization.Formatters.Binary.ObjectReader.GetDeserializationType (Int64 assemblyId,
System.String className, Boolean throwOnError) [0x0003e] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:862
</StackTrace>
+ <ConsoleOutput />
+ <ConsoleError />
+ </UnitTestResult>
+ <UnitTestResult>
+ <TestDate>2014-06-06T20:10:11</TestDate>
+ <Status />
+ <Passed>0</Passed>
+ <Errors>1</Errors>
+ <Failures>0</Failures>
+ <Inconclusive>0</Inconclusive>
+ <NotRunnable>0</NotRunnable>
+ <Skipped>0</Skipped>
+ <Ignored>0</Ignored>
+ <Time />
+ <Message>System.Runtime.Serialization.SerializationException : Couldn't find
assembly 'LongoMatch'
+ ----> System.IO.FileNotFoundException : Could not load file or assembly 'LongoMatch' or one of its
dependencies. The system cannot find the file specified.</Message>
+ <StackTrace> at
System.Runtime.Serialization.Formatters.Binary.ObjectReader.GetDeserializationType (Int64 assemblyId,
System.String className, Boolean throwOnError) [0x00059] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:866
+ at System.Runtime.Serialization.Formatters.Binary.ObjectReader.GetDeserializationType (Int64 assemblyId,
System.String className) [0x00000] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:846
+ at System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadTypeMetadata (System.IO.BinaryReader
reader, Boolean isRuntimeObject, Boolean hasTypeInfo) [0x000bd] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:643
+ at System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadObjectInstance (System.IO.BinaryReader
reader, Boolean isRuntimeObject, Boolean hasTypeInfo, System.Int64& objectId, System.Object& value,
System.Runtime.Serialization.SerializationInfo& info) [0x0000a] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:265
+ at System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadObject (BinaryElement element,
System.IO.BinaryReader reader, System.Int64& objectId, System.Object& value,
System.Runtime.Serialization.SerializationInfo& info) [0x0009b] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:191
+ at System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadObject (BinaryElement element,
System.IO.BinaryReader reader, System.Int64& objectId, System.Object& value,
System.Runtime.Serialization.SerializationInfo& info) [0x00103] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:219
+ at System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadNextObject (BinaryElement element,
System.IO.BinaryReader reader) [0x00020] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:126
+ at System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadObjectGraph (BinaryElement elem,
System.IO.BinaryReader reader, Boolean readHeaders, System.Object& result,
System.Runtime.Remoting.Messaging.Header[]& headers) [0x00004] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:100
+ at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.NoCheckDeserialize (System.IO.Stream
serializationStream, System.Runtime.Remoting.Messaging.HeaderHandler handler) [0x0007a] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/BinaryFormatter.cs:177
+ at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize (System.IO.Stream
serializationStream) [0x00000] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/BinaryFormatter.cs:134
+ at LongoMatch.Common.SerializableObject.Load[Categories] (System.IO.Stream stream, SerializationType type)
[0x00020] in /home/andoni/git/longomatch-rework/LongoMatch.Migration/Common/SerializableObject.cs:68
+ at LongoMatch.Migration.Tests.CateogiresTest.TestCategoriesMigration () [0x00018] in
/home/andoni/git/longomatch-rework/LongoMatch.Migration/Tests/CateogiresTest.cs:37
+ at (wrapper managed-to-native) System.Reflection.MonoMethod:InternalInvoke
(System.Reflection.MonoMethod,object,object[],System.Exception&)
+ at System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr,
System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture)
[0x00054] in /build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Reflection/MonoMethod.cs:230
+--FileNotFoundException
+ at System.AppDomain.Load (System.String assemblyString, System.Security.Policy.Evidence assemblySecurity,
Boolean refonly) [0x00045] in /build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System/AppDomain.cs:803
+ at System.AppDomain.Load (System.String assemblyString) [0x00000] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System/AppDomain.cs:781
+ at (wrapper remoting-invoke-with-check) System.AppDomain:Load (string)
+ at System.Reflection.Assembly.Load (System.String assemblyString) [0x00000] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Reflection/Assembly.cs:541
+ at System.Runtime.Serialization.Formatters.Binary.ObjectReader.GetDeserializationType (Int64 assemblyId,
System.String className, Boolean throwOnError) [0x0003e] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:862
</StackTrace>
+ <ConsoleOutput />
+ <ConsoleError />
+ </UnitTestResult>
+ <UnitTestResult>
+ <TestDate>2014-06-06T20:12:31</TestDate>
+ <Status />
+ <Passed>0</Passed>
+ <Errors>1</Errors>
+ <Failures>0</Failures>
+ <Inconclusive>0</Inconclusive>
+ <NotRunnable>0</NotRunnable>
+ <Skipped>0</Skipped>
+ <Ignored>0</Ignored>
+ <Time />
+ <Message>System.Runtime.Serialization.SerializationException : Couldn't find
assembly 'LongoMatch'
+ ----> System.IO.FileNotFoundException : Could not load file or assembly 'LongoMatch' or one of its
dependencies. The system cannot find the file specified.</Message>
+ <StackTrace> at
System.Runtime.Serialization.Formatters.Binary.ObjectReader.GetDeserializationType (Int64 assemblyId,
System.String className, Boolean throwOnError) [0x00059] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:866
+ at System.Runtime.Serialization.Formatters.Binary.ObjectReader.GetDeserializationType (Int64 assemblyId,
System.String className) [0x00000] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:846
+ at System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadTypeMetadata (System.IO.BinaryReader
reader, Boolean isRuntimeObject, Boolean hasTypeInfo) [0x000bd] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:643
+ at System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadObjectInstance (System.IO.BinaryReader
reader, Boolean isRuntimeObject, Boolean hasTypeInfo, System.Int64& objectId, System.Object& value,
System.Runtime.Serialization.SerializationInfo& info) [0x0000a] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:265
+ at System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadObject (BinaryElement element,
System.IO.BinaryReader reader, System.Int64& objectId, System.Object& value,
System.Runtime.Serialization.SerializationInfo& info) [0x0009b] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:191
+ at System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadObject (BinaryElement element,
System.IO.BinaryReader reader, System.Int64& objectId, System.Object& value,
System.Runtime.Serialization.SerializationInfo& info) [0x00103] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:219
+ at System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadNextObject (BinaryElement element,
System.IO.BinaryReader reader) [0x00020] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:126
+ at System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadObjectGraph (BinaryElement elem,
System.IO.BinaryReader reader, Boolean readHeaders, System.Object& result,
System.Runtime.Remoting.Messaging.Header[]& headers) [0x00004] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:100
+ at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.NoCheckDeserialize (System.IO.Stream
serializationStream, System.Runtime.Remoting.Messaging.HeaderHandler handler) [0x0007a] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/BinaryFormatter.cs:177
+ at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize (System.IO.Stream
serializationStream) [0x00000] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/BinaryFormatter.cs:134
+ at LongoMatch.Common.SerializableObject.Load[Categories] (System.IO.Stream stream, SerializationType type)
[0x00020] in /home/andoni/git/longomatch-rework/LongoMatch.Migration/Common/SerializableObject.cs:68
+ at LongoMatch.Migration.Tests.CateogiresTest.TestCategoriesMigration () [0x00018] in
/home/andoni/git/longomatch-rework/LongoMatch.Migration/Tests/CateogiresTest.cs:37
+ at (wrapper managed-to-native) System.Reflection.MonoMethod:InternalInvoke
(System.Reflection.MonoMethod,object,object[],System.Exception&)
+ at System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr,
System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture)
[0x00054] in /build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Reflection/MonoMethod.cs:230
+--FileNotFoundException
+ at System.AppDomain.Load (System.String assemblyString, System.Security.Policy.Evidence assemblySecurity,
Boolean refonly) [0x00045] in /build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System/AppDomain.cs:803
+ at System.AppDomain.Load (System.String assemblyString) [0x00000] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System/AppDomain.cs:781
+ at (wrapper remoting-invoke-with-check) System.AppDomain:Load (string)
+ at System.Reflection.Assembly.Load (System.String assemblyString) [0x00000] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Reflection/Assembly.cs:541
+ at System.Runtime.Serialization.Formatters.Binary.ObjectReader.GetDeserializationType (Int64 assemblyId,
System.String className, Boolean throwOnError) [0x0003e] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:862
</StackTrace>
+ <ConsoleOutput />
+ <ConsoleError />
+ </UnitTestResult>
+ <UnitTestResult>
+ <TestDate>2014-06-06T20:12:36</TestDate>
+ <Status />
+ <Passed>0</Passed>
+ <Errors>1</Errors>
+ <Failures>0</Failures>
+ <Inconclusive>0</Inconclusive>
+ <NotRunnable>0</NotRunnable>
+ <Skipped>0</Skipped>
+ <Ignored>0</Ignored>
+ <Time />
+ <Message>System.Runtime.Serialization.SerializationException : Couldn't find
assembly 'LongoMatch'
+ ----> System.IO.FileNotFoundException : Could not load file or assembly 'LongoMatch' or one of its
dependencies. The system cannot find the file specified.</Message>
+ <StackTrace> at
System.Runtime.Serialization.Formatters.Binary.ObjectReader.GetDeserializationType (Int64 assemblyId,
System.String className, Boolean throwOnError) [0x00059] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:866
+ at System.Runtime.Serialization.Formatters.Binary.ObjectReader.GetDeserializationType (Int64 assemblyId,
System.String className) [0x00000] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:846
+ at System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadTypeMetadata (System.IO.BinaryReader
reader, Boolean isRuntimeObject, Boolean hasTypeInfo) [0x000bd] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:643
+ at System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadObjectInstance (System.IO.BinaryReader
reader, Boolean isRuntimeObject, Boolean hasTypeInfo, System.Int64& objectId, System.Object& value,
System.Runtime.Serialization.SerializationInfo& info) [0x0000a] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:265
+ at System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadObject (BinaryElement element,
System.IO.BinaryReader reader, System.Int64& objectId, System.Object& value,
System.Runtime.Serialization.SerializationInfo& info) [0x0009b] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:191
+ at System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadObject (BinaryElement element,
System.IO.BinaryReader reader, System.Int64& objectId, System.Object& value,
System.Runtime.Serialization.SerializationInfo& info) [0x00103] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:219
+ at System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadNextObject (BinaryElement element,
System.IO.BinaryReader reader) [0x00020] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:126
+ at System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadObjectGraph (BinaryElement elem,
System.IO.BinaryReader reader, Boolean readHeaders, System.Object& result,
System.Runtime.Remoting.Messaging.Header[]& headers) [0x00004] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:100
+ at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.NoCheckDeserialize (System.IO.Stream
serializationStream, System.Runtime.Remoting.Messaging.HeaderHandler handler) [0x0007a] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/BinaryFormatter.cs:177
+ at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize (System.IO.Stream
serializationStream) [0x00000] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/BinaryFormatter.cs:134
+ at LongoMatch.Common.SerializableObject.Load[Categories] (System.IO.Stream stream, SerializationType type)
[0x00020] in /home/andoni/git/longomatch-rework/LongoMatch.Migration/Common/SerializableObject.cs:68
+ at LongoMatch.Migration.Tests.CateogiresTest.TestCategoriesMigration () [0x00018] in
/home/andoni/git/longomatch-rework/LongoMatch.Migration/Tests/CateogiresTest.cs:37
+ at (wrapper managed-to-native) System.Reflection.MonoMethod:InternalInvoke
(System.Reflection.MonoMethod,object,object[],System.Exception&)
+ at System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr,
System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture)
[0x00054] in /build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Reflection/MonoMethod.cs:230
+--FileNotFoundException
+ at System.AppDomain.Load (System.String assemblyString, System.Security.Policy.Evidence assemblySecurity,
Boolean refonly) [0x00045] in /build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System/AppDomain.cs:803
+ at System.AppDomain.Load (System.String assemblyString) [0x00000] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System/AppDomain.cs:781
+ at (wrapper remoting-invoke-with-check) System.AppDomain:Load (string)
+ at System.Reflection.Assembly.Load (System.String assemblyString) [0x00000] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Reflection/Assembly.cs:541
+ at System.Runtime.Serialization.Formatters.Binary.ObjectReader.GetDeserializationType (Int64 assemblyId,
System.String className, Boolean throwOnError) [0x0003e] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:862
</StackTrace>
+ <ConsoleOutput />
+ <ConsoleError />
+ </UnitTestResult>
+ <UnitTestResult>
+ <TestDate>2014-06-06T20:12:43</TestDate>
+ <Status />
+ <Passed>0</Passed>
+ <Errors>1</Errors>
+ <Failures>0</Failures>
+ <Inconclusive>0</Inconclusive>
+ <NotRunnable>0</NotRunnable>
+ <Skipped>0</Skipped>
+ <Ignored>0</Ignored>
+ <Time />
+ <Message>System.Runtime.Serialization.SerializationException : Couldn't find
assembly 'LongoMatch'
+ ----> System.IO.FileNotFoundException : Could not load file or assembly 'LongoMatch' or one of its
dependencies. The system cannot find the file specified.</Message>
+ <StackTrace> at
System.Runtime.Serialization.Formatters.Binary.ObjectReader.GetDeserializationType (Int64 assemblyId,
System.String className, Boolean throwOnError) [0x00059] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:866
+ at System.Runtime.Serialization.Formatters.Binary.ObjectReader.GetDeserializationType (Int64 assemblyId,
System.String className) [0x00000] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:846
+ at System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadTypeMetadata (System.IO.BinaryReader
reader, Boolean isRuntimeObject, Boolean hasTypeInfo) [0x000bd] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:643
+ at System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadObjectInstance (System.IO.BinaryReader
reader, Boolean isRuntimeObject, Boolean hasTypeInfo, System.Int64& objectId, System.Object& value,
System.Runtime.Serialization.SerializationInfo& info) [0x0000a] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:265
+ at System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadObject (BinaryElement element,
System.IO.BinaryReader reader, System.Int64& objectId, System.Object& value,
System.Runtime.Serialization.SerializationInfo& info) [0x0009b] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:191
+ at System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadObject (BinaryElement element,
System.IO.BinaryReader reader, System.Int64& objectId, System.Object& value,
System.Runtime.Serialization.SerializationInfo& info) [0x00103] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:219
+ at System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadNextObject (BinaryElement element,
System.IO.BinaryReader reader) [0x00020] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:126
+ at System.Runtime.Serialization.Formatters.Binary.ObjectReader.ReadObjectGraph (BinaryElement elem,
System.IO.BinaryReader reader, Boolean readHeaders, System.Object& result,
System.Runtime.Remoting.Messaging.Header[]& headers) [0x00004] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:100
+ at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.NoCheckDeserialize (System.IO.Stream
serializationStream, System.Runtime.Remoting.Messaging.HeaderHandler handler) [0x0007a] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/BinaryFormatter.cs:177
+ at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize (System.IO.Stream
serializationStream) [0x00000] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/BinaryFormatter.cs:134
+ at LongoMatch.Common.SerializableObject.Load[Categories] (System.IO.Stream stream, SerializationType type)
[0x00020] in /home/andoni/git/longomatch-rework/LongoMatch.Migration/Common/SerializableObject.cs:68
+ at LongoMatch.Migration.Tests.CateogiresTest.TestCategoriesMigration () [0x00018] in
/home/andoni/git/longomatch-rework/LongoMatch.Migration/Tests/CateogiresTest.cs:37
+ at (wrapper managed-to-native) System.Reflection.MonoMethod:InternalInvoke
(System.Reflection.MonoMethod,object,object[],System.Exception&)
+ at System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr,
System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture)
[0x00054] in /build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Reflection/MonoMethod.cs:230
+--FileNotFoundException
+ at System.AppDomain.Load (System.String assemblyString, System.Security.Policy.Evidence assemblySecurity,
Boolean refonly) [0x00045] in /build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System/AppDomain.cs:803
+ at System.AppDomain.Load (System.String assemblyString) [0x00000] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System/AppDomain.cs:781
+ at (wrapper remoting-invoke-with-check) System.AppDomain:Load (string)
+ at System.Reflection.Assembly.Load (System.String assemblyString) [0x00000] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Reflection/Assembly.cs:541
+ at System.Runtime.Serialization.Formatters.Binary.ObjectReader.GetDeserializationType (Int64 assemblyId,
System.String className, Boolean throwOnError) [0x0003e] in
/build/buildd/mono-3.2.8+dfsg/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs:862
</StackTrace>
+ <ConsoleOutput />
+ <ConsoleError />
+ </UnitTestResult>
+ <UnitTestResult>
+ <TestDate>2014-06-06T20:15:14</TestDate>
+ <Status />
+ <Passed>1</Passed>
+ <Errors>0</Errors>
+ <Failures>0</Failures>
+ <Inconclusive>0</Inconclusive>
+ <NotRunnable>0</NotRunnable>
+ <Skipped>0</Skipped>
+ <Ignored>0</Ignored>
+ <Time />
+ <Message>Prueba satisfactoria
+
+Tiempo de ejecución: 0,20 ms</Message>
+ <ConsoleOutput>{
+ "$id": "1",
+ "$type": "LongoMatch.Store.Templates.Categories, LongoMatch",
+ "Name": "default",
+ "Version": "2.1",
+ "GameUnits": [],
+ "GamePeriods": [
+ "1",
+ "2"
+ ],
+ "Image": null,
+ "FieldBackground": {
+ "$id": "2",
+ "$type": "LongoMatch.Common.Image, LongoMatch",
+ "pngbuf": {
+ "$type": "System.Byte[], mscorlib",
+ "$value":
"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
U5ErkJggg=="
+ }
+ },
+ "HalfFieldBackground": {
+ "$id": "3",
+ "$type": "LongoMatch.Common.Image, LongoMatch",
+ "pngbuf": {
+ "$type": "System.Byte[], mscorlib",
+ "$value":
"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"
+ }
+ },
+ "GoalBackground": {
+ "$id": "4",
+ "$type": "LongoMatch.Common.Image, LongoMatch",
+ "pngbuf": {
+ "$type": "System.Byte[], mscorlib",
+ "$value":
"iVBORw0KGgoAAAANSUhEUgAAAZAAAAEsCAYAAADtt+XCAAAABHNCSVQICAgIfAhkiAAACZpJREFUeJzt2r+rJWcdx/FnZp459+wuqOgfYBEEA4KNlShooyn2DxAEIUm1fYpYioUWAcutoo2Ff0AKtVCLkMpGEBUkXcqkkWT33jPPzFhcVxJ2l/B89ro3V16vZmE5X+Y7v/Z9z+4O5ZO+cutzt14ajsOL2/n2uW3ZbhWeq+k4zKWUsp7vy3XvgvvxWeN+XI9xHh+Ox/Ff+/n+t4f/evi7Uso/SyllKKWUvZT9WrcD4MYZSym3r3sJAG6esZTy7eteAoCbZyylfPG6lwDg5hnLf/4dBAB6jNe9AAA3k4AAEBEQACICAkBEQACICAgAEQEBICIgAEQEBIBIfZbhn+8/e+uqFuHS/VfeuFtKKfd++Zpr+xlw/9X/3I833Y/PAvfjf+f14cd3e2d8AwEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIAJF63QvA/5uLj87r1rahZ6ad2ni6OE09M1vbhtOD8+53+PzDh3PvzOn8VNfWus5pW7ZxOS1d57Tv+3B6cPH0c9ovf3nnN3964RP7PbyY97L3XvNpXdauH6L3
tg2tta5rvm97OZ1fdF/zdrHUfe87p3XZxq21vudo24e2LPX1vvVKKc8YkA/ee/92z+fb+Wlqp9Z1w9pp6Z4ppZTlYpnasvQda1mntfNY66lNbek8p6VN66fc5D/+6rcvPn6sdWxL58PR1nFta9dMOy3dM2vrf3BLyR741tZpW/te/LWt09a2+Bv3/VfeuJvOcvX+8vs/P/Z+8PwNpZQf7qX8Ohn+8stfuuJ14Oar89SGadx7ZsZp2mqd1p6ZYRz2eja3vu1KmY+HpXemHmqbau06p2EatjrPXec0DsM+3z489Zz+8fZfXyillK9+62vvfvz3D8ezZRiGrv3qoa7TXLeu/eZxnw9913wcxnJ259h9zQ93zto49D1H9axu9ezQd83ruB9vHdtPvvDT7/dtePkNpGvBj7vz+TsPej4/1rpO89h3w2pdp9o3U0opU53Wepi75qY6rWOdumbqXNfp0Dcz1brWuT7xJj/6yerr3/vG359wrG06PHnuqcc61K3OfX8w1Xne5rO+F78e6lYPfTP/nTv2PfD1ULdD50tSz+ZtPvbvd//Vy28e99587a3eWa7eo4B89+WXHns/eP6e6a+wfvSLe3+4qkW49Cgg3/zBd979tM8CXCf/CwuAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAE
BEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASBSr3sB+H9z8dF53do29My0UxtPF6epZ2Zr23B6cN79Dp9/+HDunTmdn+raWtc5bcs2Lqel65z2fR9ODy6efk775S/v/OZPL3xiv4cX81723ms+rcva9UP03rahtdZ1zfdtL6fzi+5r3i6Wuu9957Qu27i11vccbfvQlqW+3rdeKeUZA/LBe+/f7vl8Oz9N7dS6blg7Ld0zpZSyXCxTW5a+Yy3rtHYeaz21qS2d57S0af2Um/zHX/32xcePtY5t6Xw42jqube2aaaele2Zt/Q9uKdkD39o6bWvfi7+2ddraFn/jvv/KG3fTWa7eX37/58feD56/oZTyw72UXyfDX375S1e8Dtx8dZ7aMI17z8w4TVut09ozM4zDXs/m1rddKfPxsPTO1ENtU61d5zRMw1bnueucxmHY59uHp57TP97+6wullPLVb33t3Y///uF4tgzD0LVfPdR1muvWtd887vOh75qPw1jO7hy7r/nhzlkbh77nqJ7VrZ4d+q55HffjrWP7yRd++v2+DS+/gXQt+HF3Pn/nQc/nx1rXaR77blit61T7ZkopZarTWg9z19xUp3WsU9dMnes6HfpmplrXOtcn3uRHP1l9/Xvf+PsTjrVNhyfPPfVYh7rVue8PpjrP23zW9+LXQ93qoW/mv3PHvge+Hup26HxJ6tm8zcf+/e6/evnN496br73VO8vVexSQ77780mPvB8/fM/0V1o9+ce8PV7UIlx4F5Js/+M67n/ZZgOvkf2EBEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICA
gAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAyllL2614CgJtnLKV8cN1LAHDzjKWUt697CQBunrGU8uC6lwDg5hlKKWUP/x1kKOWtq10HgOuwl3K3d+bf5QExFK9CmrIAAAAASUVORK5CYII="
+ }
+ },
+ "Capacity": 32,
+ "_items": [
+ {
+ "$id": "5",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "uuid": "5845f457-2ddc-44d5-b161-601e363e9140",
+ "ID": "5845f457-2ddc-44d5-b161-601e363e9140",
+ "name": "Category 0",
+ "Name": "Category 0",
+ "start": {
+ "$id": "6",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Start": {
+ "$id": "6",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "stop": {
+ "$id": "7",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "7",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "hotkey": {
+ "$id": "8",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Hotkey": {
+ "$id": "8",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "position": -1,
+ "Position": -1,
+ "subcategories": [
+ {
+ "$id": "9",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "_items": [
+ 1,
+ 0,
+ 0,
+ 0
+ ],
+ "_size": 1
+ },
+ {
+ "$id": "10",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "_items": [
+ 2,
+ 0,
+ 0,
+ 0
+ ],
+ "_size": 1
+ }
+ ],
+ "SubCategories": [
+ {
+ "$ref": "9"
+ },
+ {
+ "$ref": "10"
+ }
+ ],
+ "Color": {
+ "$id": "11",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "red": 65535,
+ "green": 0,
+ "blue": 0,
+ "sort_method": 1,
+ "SortMethod": 1,
+ "tagfieldpos": true,
+ "TagFieldPosition": true,
+ "taghalffieldpos": false,
+ "TagHalfFieldPosition": false,
+ "taggoalpos": false,
+ "TagGoalPosistion": false,
+ "fieldposisdist": false,
+ "FieldPositionIsDistance": false,
+ "halffieldposisdist": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "12",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "uuid": "7f49ecac-5441-4dec-b3dd-4b66e804125c",
+ "ID": "7f49ecac-5441-4dec-b3dd-4b66e804125c",
+ "name": "Category 1",
+ "Name": "Category 1",
+ "start": {
+ "$id": "13",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Start": {
+ "$id": "13",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "stop": {
+ "$id": "14",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "14",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "hotkey": {
+ "$id": "15",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": 100,
+ "Modifier": 0,
+ "Defined": true
+ },
+ "Hotkey": {
+ "$id": "15",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": 100,
+ "Modifier": 0,
+ "Defined": true
+ },
+ "position": 0,
+ "Position": 0,
+ "subcategories": [
+ {
+ "$id": "16",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "_items": [
+ 1,
+ 0,
+ 0,
+ 0
+ ],
+ "_size": 1
+ },
+ {
+ "$id": "17",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "_items": [
+ 2,
+ 0,
+ 0,
+ 0
+ ],
+ "_size": 1
+ }
+ ],
+ "SubCategories": [
+ {
+ "$ref": "16"
+ },
+ {
+ "$ref": "17"
+ }
+ ],
+ "Color": {
+ "$id": "18",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "red": 65535,
+ "green": 0,
+ "blue": 0,
+ "sort_method": 1,
+ "SortMethod": 1,
+ "tagfieldpos": true,
+ "TagFieldPosition": true,
+ "taghalffieldpos": false,
+ "TagHalfFieldPosition": false,
+ "taggoalpos": false,
+ "TagGoalPosistion": false,
+ "fieldposisdist": false,
+ "FieldPositionIsDistance": false,
+ "halffieldposisdist": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "19",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "uuid": "1755d18a-2e91-4fc3-af2f-2b4b778a9812",
+ "ID": "1755d18a-2e91-4fc3-af2f-2b4b778a9812",
+ "name": "Category 2",
+ "Name": "Category 2",
+ "start": {
+ "$id": "20",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Start": {
+ "$id": "20",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "stop": {
+ "$id": "21",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "21",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "hotkey": {
+ "$id": "22",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Hotkey": {
+ "$id": "22",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "position": 1,
+ "Position": 1,
+ "subcategories": [
+ {
+ "$id": "23",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "_items": [
+ 1,
+ 0,
+ 0,
+ 0
+ ],
+ "_size": 1
+ },
+ {
+ "$id": "24",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "_items": [
+ 2,
+ 0,
+ 0,
+ 0
+ ],
+ "_size": 1
+ }
+ ],
+ "SubCategories": [
+ {
+ "$ref": "23"
+ },
+ {
+ "$ref": "24"
+ }
+ ],
+ "Color": {
+ "$id": "25",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "red": 65535,
+ "green": 0,
+ "blue": 0,
+ "sort_method": 1,
+ "SortMethod": 1,
+ "tagfieldpos": true,
+ "TagFieldPosition": true,
+ "taghalffieldpos": false,
+ "TagHalfFieldPosition": false,
+ "taggoalpos": false,
+ "TagGoalPosistion": false,
+ "fieldposisdist": false,
+ "FieldPositionIsDistance": false,
+ "halffieldposisdist": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "26",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "uuid": "368b23a6-c022-4afc-aebf-cabac0395e31",
+ "ID": "368b23a6-c022-4afc-aebf-cabac0395e31",
+ "name": "Category 3",
+ "Name": "Category 3",
+ "start": {
+ "$id": "27",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Start": {
+ "$id": "27",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "stop": {
+ "$id": "28",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "28",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "hotkey": {
+ "$id": "29",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Hotkey": {
+ "$id": "29",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "position": 2,
+ "Position": 2,
+ "subcategories": [
+ {
+ "$id": "30",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "_items": [
+ 1,
+ 0,
+ 0,
+ 0
+ ],
+ "_size": 1
+ },
+ {
+ "$id": "31",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "_items": [
+ 2,
+ 0,
+ 0,
+ 0
+ ],
+ "_size": 1
+ }
+ ],
+ "SubCategories": [
+ {
+ "$ref": "30"
+ },
+ {
+ "$ref": "31"
+ }
+ ],
+ "Color": {
+ "$id": "32",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "red": 65535,
+ "green": 0,
+ "blue": 0,
+ "sort_method": 1,
+ "SortMethod": 1,
+ "tagfieldpos": true,
+ "TagFieldPosition": true,
+ "taghalffieldpos": false,
+ "TagHalfFieldPosition": false,
+ "taggoalpos": false,
+ "TagGoalPosistion": false,
+ "fieldposisdist": false,
+ "FieldPositionIsDistance": false,
+ "halffieldposisdist": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "33",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "uuid": "fd11e6a6-4889-465f-b4a7-cb16f5104bbf",
+ "ID": "fd11e6a6-4889-465f-b4a7-cb16f5104bbf",
+ "name": "Category 4",
+ "Name": "Category 4",
+ "start": {
+ "$id": "34",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Start": {
+ "$id": "34",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "stop": {
+ "$id": "35",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "35",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "hotkey": {
+ "$id": "36",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Hotkey": {
+ "$id": "36",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "position": 3,
+ "Position": 3,
+ "subcategories": [
+ {
+ "$id": "37",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "_items": [
+ 1,
+ 0,
+ 0,
+ 0
+ ],
+ "_size": 1
+ },
+ {
+ "$id": "38",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "_items": [
+ 2,
+ 0,
+ 0,
+ 0
+ ],
+ "_size": 1
+ }
+ ],
+ "SubCategories": [
+ {
+ "$ref": "37"
+ },
+ {
+ "$ref": "38"
+ }
+ ],
+ "Color": {
+ "$id": "39",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "red": 65535,
+ "green": 0,
+ "blue": 0,
+ "sort_method": 1,
+ "SortMethod": 1,
+ "tagfieldpos": true,
+ "TagFieldPosition": true,
+ "taghalffieldpos": false,
+ "TagHalfFieldPosition": false,
+ "taggoalpos": false,
+ "TagGoalPosistion": false,
+ "fieldposisdist": false,
+ "FieldPositionIsDistance": false,
+ "halffieldposisdist": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "40",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "uuid": "d570ccc9-5132-4985-a57c-6127444ae6b9",
+ "ID": "d570ccc9-5132-4985-a57c-6127444ae6b9",
+ "name": "Category 5",
+ "Name": "Category 5",
+ "start": {
+ "$id": "41",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Start": {
+ "$id": "41",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "stop": {
+ "$id": "42",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "42",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "hotkey": {
+ "$id": "43",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Hotkey": {
+ "$id": "43",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "position": 4,
+ "Position": 4,
+ "subcategories": [
+ {
+ "$id": "44",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "_items": [
+ 1,
+ 0,
+ 0,
+ 0
+ ],
+ "_size": 1
+ },
+ {
+ "$id": "45",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "_items": [
+ 2,
+ 0,
+ 0,
+ 0
+ ],
+ "_size": 1
+ }
+ ],
+ "SubCategories": [
+ {
+ "$ref": "44"
+ },
+ {
+ "$ref": "45"
+ }
+ ],
+ "Color": {
+ "$id": "46",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "red": 65535,
+ "green": 0,
+ "blue": 0,
+ "sort_method": 1,
+ "SortMethod": 1,
+ "tagfieldpos": true,
+ "TagFieldPosition": true,
+ "taghalffieldpos": false,
+ "TagHalfFieldPosition": false,
+ "taggoalpos": false,
+ "TagGoalPosistion": false,
+ "fieldposisdist": false,
+ "FieldPositionIsDistance": false,
+ "halffieldposisdist": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "47",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "uuid": "663c2efa-e035-40d5-8016-275830ab337d",
+ "ID": "663c2efa-e035-40d5-8016-275830ab337d",
+ "name": "Category 6",
+ "Name": "Category 6",
+ "start": {
+ "$id": "48",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Start": {
+ "$id": "48",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "stop": {
+ "$id": "49",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "49",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "hotkey": {
+ "$id": "50",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Hotkey": {
+ "$id": "50",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "position": 5,
+ "Position": 5,
+ "subcategories": [
+ {
+ "$id": "51",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "_items": [
+ 1,
+ 0,
+ 0,
+ 0
+ ],
+ "_size": 1
+ },
+ {
+ "$id": "52",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "_items": [
+ 2,
+ 0,
+ 0,
+ 0
+ ],
+ "_size": 1
+ }
+ ],
+ "SubCategories": [
+ {
+ "$ref": "51"
+ },
+ {
+ "$ref": "52"
+ }
+ ],
+ "Color": {
+ "$id": "53",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "red": 65535,
+ "green": 0,
+ "blue": 0,
+ "sort_method": 1,
+ "SortMethod": 1,
+ "tagfieldpos": true,
+ "TagFieldPosition": true,
+ "taghalffieldpos": false,
+ "TagHalfFieldPosition": false,
+ "taggoalpos": false,
+ "TagGoalPosistion": false,
+ "fieldposisdist": false,
+ "FieldPositionIsDistance": false,
+ "halffieldposisdist": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "54",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "uuid": "0bbb95e4-aa55-4a4e-8b03-7b20d19da8ee",
+ "ID": "0bbb95e4-aa55-4a4e-8b03-7b20d19da8ee",
+ "name": "Category 7",
+ "Name": "Category 7",
+ "start": {
+ "$id": "55",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Start": {
+ "$id": "55",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "stop": {
+ "$id": "56",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "56",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "hotkey": {
+ "$id": "57",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Hotkey": {
+ "$id": "57",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "position": 6,
+ "Position": 6,
+ "subcategories": [
+ {
+ "$id": "58",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "_items": [
+ 1,
+ 0,
+ 0,
+ 0
+ ],
+ "_size": 1
+ },
+ {
+ "$id": "59",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "_items": [
+ 2,
+ 0,
+ 0,
+ 0
+ ],
+ "_size": 1
+ }
+ ],
+ "SubCategories": [
+ {
+ "$ref": "58"
+ },
+ {
+ "$ref": "59"
+ }
+ ],
+ "Color": {
+ "$id": "60",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "red": 65535,
+ "green": 0,
+ "blue": 0,
+ "sort_method": 1,
+ "SortMethod": 1,
+ "tagfieldpos": true,
+ "TagFieldPosition": true,
+ "taghalffieldpos": false,
+ "TagHalfFieldPosition": false,
+ "taggoalpos": false,
+ "TagGoalPosistion": false,
+ "fieldposisdist": false,
+ "FieldPositionIsDistance": false,
+ "halffieldposisdist": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "61",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "uuid": "a1b2cb44-3f88-4bbf-9734-8c2711a90ae6",
+ "ID": "a1b2cb44-3f88-4bbf-9734-8c2711a90ae6",
+ "name": "Category 8",
+ "Name": "Category 8",
+ "start": {
+ "$id": "62",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Start": {
+ "$id": "62",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "stop": {
+ "$id": "63",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "63",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "hotkey": {
+ "$id": "64",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Hotkey": {
+ "$id": "64",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "position": 7,
+ "Position": 7,
+ "subcategories": [
+ {
+ "$id": "65",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "_items": [
+ 1,
+ 0,
+ 0,
+ 0
+ ],
+ "_size": 1
+ },
+ {
+ "$id": "66",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "_items": [
+ 2,
+ 0,
+ 0,
+ 0
+ ],
+ "_size": 1
+ }
+ ],
+ "SubCategories": [
+ {
+ "$ref": "65"
+ },
+ {
+ "$ref": "66"
+ }
+ ],
+ "Color": {
+ "$id": "67",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "red": 65535,
+ "green": 0,
+ "blue": 0,
+ "sort_method": 1,
+ "SortMethod": 1,
+ "tagfieldpos": true,
+ "TagFieldPosition": true,
+ "taghalffieldpos": false,
+ "TagHalfFieldPosition": false,
+ "taggoalpos": false,
+ "TagGoalPosistion": false,
+ "fieldposisdist": false,
+ "FieldPositionIsDistance": false,
+ "halffieldposisdist": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "68",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "uuid": "1ce743c8-8912-42ad-8e75-cbb0f338ef2e",
+ "ID": "1ce743c8-8912-42ad-8e75-cbb0f338ef2e",
+ "name": "Category 9",
+ "Name": "Category 9",
+ "start": {
+ "$id": "69",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Start": {
+ "$id": "69",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "stop": {
+ "$id": "70",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "70",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "hotkey": {
+ "$id": "71",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Hotkey": {
+ "$id": "71",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "position": 8,
+ "Position": 8,
+ "subcategories": [
+ {
+ "$id": "72",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "_items": [
+ 1,
+ 0,
+ 0,
+ 0
+ ],
+ "_size": 1
+ },
+ {
+ "$id": "73",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "_items": [
+ 2,
+ 0,
+ 0,
+ 0
+ ],
+ "_size": 1
+ }
+ ],
+ "SubCategories": [
+ {
+ "$ref": "72"
+ },
+ {
+ "$ref": "73"
+ }
+ ],
+ "Color": {
+ "$id": "74",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "red": 65535,
+ "green": 0,
+ "blue": 0,
+ "sort_method": 1,
+ "SortMethod": 1,
+ "tagfieldpos": true,
+ "TagFieldPosition": true,
+ "taghalffieldpos": false,
+ "TagHalfFieldPosition": false,
+ "taggoalpos": false,
+ "TagGoalPosistion": false,
+ "fieldposisdist": false,
+ "FieldPositionIsDistance": false,
+ "halffieldposisdist": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "75",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "uuid": "309cf7f9-2948-4281-9821-6752370e9276",
+ "ID": "309cf7f9-2948-4281-9821-6752370e9276",
+ "name": "Category 10",
+ "Name": "Category 10",
+ "start": {
+ "$id": "76",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Start": {
+ "$id": "76",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "stop": {
+ "$id": "77",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "77",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "hotkey": {
+ "$id": "78",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Hotkey": {
+ "$id": "78",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "position": 9,
+ "Position": 9,
+ "subcategories": [
+ {
+ "$id": "79",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "_items": [
+ 1,
+ 0,
+ 0,
+ 0
+ ],
+ "_size": 1
+ },
+ {
+ "$id": "80",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "_items": [
+ 2,
+ 0,
+ 0,
+ 0
+ ],
+ "_size": 1
+ }
+ ],
+ "SubCategories": [
+ {
+ "$ref": "79"
+ },
+ {
+ "$ref": "80"
+ }
+ ],
+ "Color": {
+ "$id": "81",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "red": 65535,
+ "green": 0,
+ "blue": 0,
+ "sort_method": 1,
+ "SortMethod": 1,
+ "tagfieldpos": true,
+ "TagFieldPosition": true,
+ "taghalffieldpos": false,
+ "TagHalfFieldPosition": false,
+ "taggoalpos": false,
+ "TagGoalPosistion": false,
+ "fieldposisdist": false,
+ "FieldPositionIsDistance": false,
+ "halffieldposisdist": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "82",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "uuid": "da3e873d-3cfe-409d-a28b-306397a08535",
+ "ID": "da3e873d-3cfe-409d-a28b-306397a08535",
+ "name": "Category 11",
+ "Name": "Category 11",
+ "start": {
+ "$id": "83",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Start": {
+ "$id": "83",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "stop": {
+ "$id": "84",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "84",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "hotkey": {
+ "$id": "85",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Hotkey": {
+ "$id": "85",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "position": 10,
+ "Position": 10,
+ "subcategories": [
+ {
+ "$id": "86",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "_items": [
+ 1,
+ 0,
+ 0,
+ 0
+ ],
+ "_size": 1
+ },
+ {
+ "$id": "87",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "_items": [
+ 2,
+ 0,
+ 0,
+ 0
+ ],
+ "_size": 1
+ }
+ ],
+ "SubCategories": [
+ {
+ "$ref": "86"
+ },
+ {
+ "$ref": "87"
+ }
+ ],
+ "Color": {
+ "$id": "88",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "red": 65535,
+ "green": 0,
+ "blue": 0,
+ "sort_method": 1,
+ "SortMethod": 1,
+ "tagfieldpos": true,
+ "TagFieldPosition": true,
+ "taghalffieldpos": false,
+ "TagHalfFieldPosition": false,
+ "taggoalpos": false,
+ "TagGoalPosistion": false,
+ "fieldposisdist": false,
+ "FieldPositionIsDistance": false,
+ "halffieldposisdist": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "89",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "uuid": "e35989cc-42f4-43b6-8cc5-9213f1524ec0",
+ "ID": "e35989cc-42f4-43b6-8cc5-9213f1524ec0",
+ "name": "Category 12",
+ "Name": "Category 12",
+ "start": {
+ "$id": "90",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Start": {
+ "$id": "90",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "stop": {
+ "$id": "91",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "91",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "hotkey": {
+ "$id": "92",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Hotkey": {
+ "$id": "92",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "position": 11,
+ "Position": 11,
+ "subcategories": [
+ {
+ "$id": "93",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "_items": [
+ 1,
+ 0,
+ 0,
+ 0
+ ],
+ "_size": 1
+ },
+ {
+ "$id": "94",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "_items": [
+ 2,
+ 0,
+ 0,
+ 0
+ ],
+ "_size": 1
+ }
+ ],
+ "SubCategories": [
+ {
+ "$ref": "93"
+ },
+ {
+ "$ref": "94"
+ }
+ ],
+ "Color": {
+ "$id": "95",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "red": 65535,
+ "green": 0,
+ "blue": 0,
+ "sort_method": 1,
+ "SortMethod": 1,
+ "tagfieldpos": true,
+ "TagFieldPosition": true,
+ "taghalffieldpos": false,
+ "TagHalfFieldPosition": false,
+ "taggoalpos": false,
+ "TagGoalPosistion": false,
+ "fieldposisdist": false,
+ "FieldPositionIsDistance": false,
+ "halffieldposisdist": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "96",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "uuid": "f7aeab6a-8f86-4425-88a3-7d25a8d729f8",
+ "ID": "f7aeab6a-8f86-4425-88a3-7d25a8d729f8",
+ "name": "Category 13",
+ "Name": "Category 13",
+ "start": {
+ "$id": "97",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Start": {
+ "$id": "97",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "stop": {
+ "$id": "98",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "98",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "hotkey": {
+ "$id": "99",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Hotkey": {
+ "$id": "99",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "position": 12,
+ "Position": 12,
+ "subcategories": [
+ {
+ "$id": "100",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "_items": [
+ 1,
+ 0,
+ 0,
+ 0
+ ],
+ "_size": 1
+ },
+ {
+ "$id": "101",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "_items": [
+ 2,
+ 0,
+ 0,
+ 0
+ ],
+ "_size": 1
+ }
+ ],
+ "SubCategories": [
+ {
+ "$ref": "100"
+ },
+ {
+ "$ref": "101"
+ }
+ ],
+ "Color": {
+ "$id": "102",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "red": 65535,
+ "green": 0,
+ "blue": 0,
+ "sort_method": 1,
+ "SortMethod": 1,
+ "tagfieldpos": true,
+ "TagFieldPosition": true,
+ "taghalffieldpos": false,
+ "TagHalfFieldPosition": false,
+ "taggoalpos": false,
+ "TagGoalPosistion": false,
+ "fieldposisdist": false,
+ "FieldPositionIsDistance": false,
+ "halffieldposisdist": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "103",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "uuid": "8e079dab-bd4e-4c63-b553-3b6b1f6fe1e1",
+ "ID": "8e079dab-bd4e-4c63-b553-3b6b1f6fe1e1",
+ "name": "Category 14",
+ "Name": "Category 14",
+ "start": {
+ "$id": "104",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Start": {
+ "$id": "104",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "stop": {
+ "$id": "105",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "105",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "hotkey": {
+ "$id": "106",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Hotkey": {
+ "$id": "106",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "position": 13,
+ "Position": 13,
+ "subcategories": [
+ {
+ "$id": "107",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "_items": [
+ 1,
+ 0,
+ 0,
+ 0
+ ],
+ "_size": 1
+ },
+ {
+ "$id": "108",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "_items": [
+ 2,
+ 0,
+ 0,
+ 0
+ ],
+ "_size": 1
+ }
+ ],
+ "SubCategories": [
+ {
+ "$ref": "107"
+ },
+ {
+ "$ref": "108"
+ }
+ ],
+ "Color": {
+ "$id": "109",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "red": 65535,
+ "green": 0,
+ "blue": 0,
+ "sort_method": 1,
+ "SortMethod": 1,
+ "tagfieldpos": true,
+ "TagFieldPosition": true,
+ "taghalffieldpos": false,
+ "TagHalfFieldPosition": false,
+ "taggoalpos": false,
+ "TagGoalPosistion": false,
+ "fieldposisdist": false,
+ "FieldPositionIsDistance": false,
+ "halffieldposisdist": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "110",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "uuid": "2e5df4f8-f17f-4337-bcb6-ec630e2f986f",
+ "ID": "2e5df4f8-f17f-4337-bcb6-ec630e2f986f",
+ "name": "Category 15",
+ "Name": "Category 15",
+ "start": {
+ "$id": "111",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Start": {
+ "$id": "111",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "stop": {
+ "$id": "112",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "112",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "hotkey": {
+ "$id": "113",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Hotkey": {
+ "$id": "113",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "position": 14,
+ "Position": 14,
+ "subcategories": [
+ {
+ "$id": "114",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "_items": [
+ 1,
+ 0,
+ 0,
+ 0
+ ],
+ "_size": 1
+ },
+ {
+ "$id": "115",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "_items": [
+ 2,
+ 0,
+ 0,
+ 0
+ ],
+ "_size": 1
+ }
+ ],
+ "SubCategories": [
+ {
+ "$ref": "114"
+ },
+ {
+ "$ref": "115"
+ }
+ ],
+ "Color": {
+ "$id": "116",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "red": 65535,
+ "green": 0,
+ "blue": 0,
+ "sort_method": 1,
+ "SortMethod": 1,
+ "tagfieldpos": true,
+ "TagFieldPosition": true,
+ "taghalffieldpos": false,
+ "TagHalfFieldPosition": false,
+ "taggoalpos": false,
+ "TagGoalPosistion": false,
+ "fieldposisdist": false,
+ "FieldPositionIsDistance": false,
+ "halffieldposisdist": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "117",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "uuid": "90dd1b63-0678-412e-a0fc-a6409e6caf24",
+ "ID": "90dd1b63-0678-412e-a0fc-a6409e6caf24",
+ "name": "Category 16",
+ "Name": "Category 16",
+ "start": {
+ "$id": "118",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Start": {
+ "$id": "118",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "stop": {
+ "$id": "119",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "119",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "hotkey": {
+ "$id": "120",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Hotkey": {
+ "$id": "120",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "position": 15,
+ "Position": 15,
+ "subcategories": [
+ {
+ "$id": "121",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "_items": [
+ 1,
+ 0,
+ 0,
+ 0
+ ],
+ "_size": 1
+ },
+ {
+ "$id": "122",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "_items": [
+ 2,
+ 0,
+ 0,
+ 0
+ ],
+ "_size": 1
+ }
+ ],
+ "SubCategories": [
+ {
+ "$ref": "121"
+ },
+ {
+ "$ref": "122"
+ }
+ ],
+ "Color": {
+ "$id": "123",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "red": 65535,
+ "green": 0,
+ "blue": 0,
+ "sort_method": 1,
+ "SortMethod": 1,
+ "tagfieldpos": true,
+ "TagFieldPosition": true,
+ "taghalffieldpos": false,
+ "TagHalfFieldPosition": false,
+ "taggoalpos": false,
+ "TagGoalPosistion": false,
+ "fieldposisdist": false,
+ "FieldPositionIsDistance": false,
+ "halffieldposisdist": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "124",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "uuid": "63a37c3c-99e1-45ea-906c-3bdc5798ec0d",
+ "ID": "63a37c3c-99e1-45ea-906c-3bdc5798ec0d",
+ "name": "Category 17",
+ "Name": "Category 17",
+ "start": {
+ "$id": "125",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Start": {
+ "$id": "125",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "stop": {
+ "$id": "126",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "126",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "hotkey": {
+ "$id": "127",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Hotkey": {
+ "$id": "127",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "position": 16,
+ "Position": 16,
+ "subcategories": [
+ {
+ "$id": "128",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "_items": [
+ 1,
+ 0,
+ 0,
+ 0
+ ],
+ "_size": 1
+ },
+ {
+ "$id": "129",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "_items": [
+ 2,
+ 0,
+ 0,
+ 0
+ ],
+ "_size": 1
+ }
+ ],
+ "SubCategories": [
+ {
+ "$ref": "128"
+ },
+ {
+ "$ref": "129"
+ }
+ ],
+ "Color": {
+ "$id": "130",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "red": 65535,
+ "green": 0,
+ "blue": 0,
+ "sort_method": 1,
+ "SortMethod": 1,
+ "tagfieldpos": true,
+ "TagFieldPosition": true,
+ "taghalffieldpos": false,
+ "TagHalfFieldPosition": false,
+ "taggoalpos": false,
+ "TagGoalPosistion": false,
+ "fieldposisdist": false,
+ "FieldPositionIsDistance": false,
+ "halffieldposisdist": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "131",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "uuid": "ddf63750-94f6-4cf6-9803-f4aa54e72a50",
+ "ID": "ddf63750-94f6-4cf6-9803-f4aa54e72a50",
+ "name": "Category 18",
+ "Name": "Category 18",
+ "start": {
+ "$id": "132",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Start": {
+ "$id": "132",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "stop": {
+ "$id": "133",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "133",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "hotkey": {
+ "$id": "134",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Hotkey": {
+ "$id": "134",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "position": 17,
+ "Position": 17,
+ "subcategories": [
+ {
+ "$id": "135",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "_items": [
+ 1,
+ 0,
+ 0,
+ 0
+ ],
+ "_size": 1
+ },
+ {
+ "$id": "136",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "_items": [
+ 2,
+ 0,
+ 0,
+ 0
+ ],
+ "_size": 1
+ }
+ ],
+ "SubCategories": [
+ {
+ "$ref": "135"
+ },
+ {
+ "$ref": "136"
+ }
+ ],
+ "Color": {
+ "$id": "137",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "red": 65535,
+ "green": 0,
+ "blue": 0,
+ "sort_method": 1,
+ "SortMethod": 1,
+ "tagfieldpos": true,
+ "TagFieldPosition": true,
+ "taghalffieldpos": false,
+ "TagHalfFieldPosition": false,
+ "taggoalpos": false,
+ "TagGoalPosistion": false,
+ "fieldposisdist": false,
+ "FieldPositionIsDistance": false,
+ "halffieldposisdist": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "138",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "uuid": "eb8e5d7d-fbfb-4c9c-b5d0-4bc9dcd41347",
+ "ID": "eb8e5d7d-fbfb-4c9c-b5d0-4bc9dcd41347",
+ "name": "Category 19",
+ "Name": "Category 19",
+ "start": {
+ "$id": "139",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Start": {
+ "$id": "139",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "stop": {
+ "$id": "140",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "140",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "hotkey": {
+ "$id": "141",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Hotkey": {
+ "$id": "141",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "position": 18,
+ "Position": 18,
+ "subcategories": [
+ {
+ "$id": "142",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "_items": [
+ 1,
+ 0,
+ 0,
+ 0
+ ],
+ "_size": 1
+ },
+ {
+ "$id": "143",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "_items": [
+ 2,
+ 0,
+ 0,
+ 0
+ ],
+ "_size": 1
+ }
+ ],
+ "SubCategories": [
+ {
+ "$ref": "142"
+ },
+ {
+ "$ref": "143"
+ }
+ ],
+ "Color": {
+ "$id": "144",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "red": 65535,
+ "green": 0,
+ "blue": 0,
+ "sort_method": 1,
+ "SortMethod": 1,
+ "tagfieldpos": true,
+ "TagFieldPosition": true,
+ "taghalffieldpos": false,
+ "TagHalfFieldPosition": false,
+ "taggoalpos": false,
+ "TagGoalPosistion": false,
+ "fieldposisdist": false,
+ "FieldPositionIsDistance": false,
+ "halffieldposisdist": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null
+ ],
+ "_size": 20
+}
+</ConsoleOutput>
+ <ConsoleError />
+ </UnitTestResult>
+ <UnitTestResult>
+ <TestDate>2014-06-06T20:24:04</TestDate>
+ <Status />
+ <Passed>1</Passed>
+ <Errors>0</Errors>
+ <Failures>0</Failures>
+ <Inconclusive>0</Inconclusive>
+ <NotRunnable>0</NotRunnable>
+ <Skipped>0</Skipped>
+ <Ignored>0</Ignored>
+ <Time />
+ <Message>Prueba satisfactoria
+
+Tiempo de ejecución: 0,19 ms</Message>
+ <ConsoleOutput>{
+ "$id": "1",
+ "$type": "LongoMatch.Store.Templates.Categories, LongoMatch",
+ "Name": "default",
+ "Version": "2.1",
+ "GameUnits": [],
+ "GamePeriods": [
+ "1",
+ "2"
+ ],
+ "Image": null,
+ "FieldBackground": {
+ "$id": "2",
+ "$type": "LongoMatch.Common.Image, LongoMatch",
+ "pngbuf": {
+ "$type": "System.Byte[], mscorlib",
+ "$value":
"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
U5ErkJggg=="
+ }
+ },
+ "HalfFieldBackground": {
+ "$id": "3",
+ "$type": "LongoMatch.Common.Image, LongoMatch",
+ "pngbuf": {
+ "$type": "System.Byte[], mscorlib",
+ "$value":
"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"
+ }
+ },
+ "GoalBackground": {
+ "$id": "4",
+ "$type": "LongoMatch.Common.Image, LongoMatch",
+ "pngbuf": {
+ "$type": "System.Byte[], mscorlib",
+ "$value":
"iVBORw0KGgoAAAANSUhEUgAAAZAAAAEsCAYAAADtt+XCAAAABHNCSVQICAgIfAhkiAAACZpJREFUeJzt2r+rJWcdx/FnZp459+wuqOgfYBEEA4KNlShooyn2DxAEIUm1fYpYioUWAcutoo2Ff0AKtVCLkMpGEBUkXcqkkWT33jPPzFhcVxJ2l/B89ro3V16vZmE5X+Y7v/Z9z+4O5ZO+cutzt14ajsOL2/n2uW3ZbhWeq+k4zKWUsp7vy3XvgvvxWeN+XI9xHh+Ox/Ff+/n+t4f/evi7Uso/SyllKKWUvZT9WrcD4MYZSym3r3sJAG6esZTy7eteAoCbZyylfPG6lwDg5hnLf/4dBAB6jNe9AAA3k4AAEBEQACICAkBEQACICAgAEQEBICIgAEQEBIBIfZbhn+8/e+uqFuHS/VfeuFtKKfd++Zpr+xlw/9X/3I833Y/PAvfjf+f14cd3e2d8AwEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIAJF63QvA/5uLj87r1rahZ6ad2ni6OE09M1vbhtOD8+53+PzDh3PvzOn8VNfWus5pW7ZxOS1d57Tv+3B6cPH0c9ovf3nnN3964RP7PbyY97L3XvNpXdauH6L3
tg2tta5rvm97OZ1fdF/zdrHUfe87p3XZxq21vudo24e2LPX1vvVKKc8YkA/ee/92z+fb+Wlqp9Z1w9pp6Z4ppZTlYpnasvQda1mntfNY66lNbek8p6VN66fc5D/+6rcvPn6sdWxL58PR1nFta9dMOy3dM2vrf3BLyR741tZpW/te/LWt09a2+Bv3/VfeuJvOcvX+8vs/P/Z+8PwNpZQf7qX8Ohn+8stfuuJ14Oar89SGadx7ZsZp2mqd1p6ZYRz2eja3vu1KmY+HpXemHmqbau06p2EatjrPXec0DsM+3z489Zz+8fZfXyillK9+62vvfvz3D8ezZRiGrv3qoa7TXLeu/eZxnw9913wcxnJ259h9zQ93zto49D1H9axu9ezQd83ruB9vHdtPvvDT7/dtePkNpGvBj7vz+TsPej4/1rpO89h3w2pdp9o3U0opU53Wepi75qY6rWOdumbqXNfp0Dcz1brWuT7xJj/6yerr3/vG359wrG06PHnuqcc61K3OfX8w1Xne5rO+F78e6lYPfTP/nTv2PfD1ULdD50tSz+ZtPvbvd//Vy28e99587a3eWa7eo4B89+WXHns/eP6e6a+wfvSLe3+4qkW49Cgg3/zBd979tM8CXCf/CwuAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAE
BEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASBSr3sB+H9z8dF53do29My0UxtPF6epZ2Zr23B6cN79Dp9/+HDunTmdn+raWtc5bcs2Lqel65z2fR9ODy6efk775S/v/OZPL3xiv4cX81723ms+rcva9UP03rahtdZ1zfdtL6fzi+5r3i6Wuu9957Qu27i11vccbfvQlqW+3rdeKeUZA/LBe+/f7vl8Oz9N7dS6blg7Ld0zpZSyXCxTW5a+Yy3rtHYeaz21qS2d57S0af2Um/zHX/32xcePtY5t6Xw42jqube2aaaele2Zt/Q9uKdkD39o6bWvfi7+2ddraFn/jvv/KG3fTWa7eX37/58feD56/oZTyw72UXyfDX375S1e8Dtx8dZ7aMI17z8w4TVut09ozM4zDXs/m1rddKfPxsPTO1ENtU61d5zRMw1bnueucxmHY59uHp57TP97+6wullPLVb33t3Y///uF4tgzD0LVfPdR1muvWtd887vOh75qPw1jO7hy7r/nhzlkbh77nqJ7VrZ4d+q55HffjrWP7yRd++v2+DS+/gXQt+HF3Pn/nQc/nx1rXaR77blit61T7ZkopZarTWg9z19xUp3WsU9dMnes6HfpmplrXOtcn3uRHP1l9/Xvf+PsTjrVNhyfPPfVYh7rVue8PpjrP23zW9+LXQ93qoW/mv3PHvge+Hup26HxJ6tm8zcf+/e6/evnN496br73VO8vVexSQ77780mPvB8/fM/0V1o9+ce8PV7UIlx4F5Js/+M67n/ZZgOvkf2EBEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICA
gAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAyllL2614CgJtnLKV8cN1LAHDzjKWUt697CQBunrGU8uC6lwDg5hlKKWUP/x1kKOWtq10HgOuwl3K3d+bf5QExFK9CmrIAAAAASUVORK5CYII="
+ }
+ },
+ "Capacity": 32,
+ "Count": 20
+}
+</ConsoleOutput>
+ <ConsoleError />
+ </UnitTestResult>
+ <UnitTestResult>
+ <TestDate>2014-06-06T20:25:32</TestDate>
+ <Status />
+ <Passed>1</Passed>
+ <Errors>0</Errors>
+ <Failures>0</Failures>
+ <Inconclusive>0</Inconclusive>
+ <NotRunnable>0</NotRunnable>
+ <Skipped>0</Skipped>
+ <Ignored>0</Ignored>
+ <Time />
+ <Message>Prueba satisfactoria
+
+Tiempo de ejecución: 0,19 ms</Message>
+ <ConsoleOutput>{
+ "$id": "1",
+ "$type": "LongoMatch.Store.Templates.Categories, LongoMatch",
+ "Name": "default",
+ "Version": "2.1",
+ "GamePeriods": [
+ "1",
+ "2"
+ ],
+ "Image": null,
+ "Categorires": null,
+ "FieldBackground": {
+ "$id": "2",
+ "$type": "LongoMatch.Common.Image, LongoMatch",
+ "pngbuf": {
+ "$type": "System.Byte[], mscorlib",
+ "$value":
"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
U5ErkJggg=="
+ }
+ },
+ "HalfFieldBackground": {
+ "$id": "3",
+ "$type": "LongoMatch.Common.Image, LongoMatch",
+ "pngbuf": {
+ "$type": "System.Byte[], mscorlib",
+ "$value":
"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"
+ }
+ },
+ "GoalBackground": {
+ "$id": "4",
+ "$type": "LongoMatch.Common.Image, LongoMatch",
+ "pngbuf": {
+ "$type": "System.Byte[], mscorlib",
+ "$value":
"iVBORw0KGgoAAAANSUhEUgAAAZAAAAEsCAYAAADtt+XCAAAABHNCSVQICAgIfAhkiAAACZpJREFUeJzt2r+rJWcdx/FnZp459+wuqOgfYBEEA4KNlShooyn2DxAEIUm1fYpYioUWAcutoo2Ff0AKtVCLkMpGEBUkXcqkkWT33jPPzFhcVxJ2l/B89ro3V16vZmE5X+Y7v/Z9z+4O5ZO+cutzt14ajsOL2/n2uW3ZbhWeq+k4zKWUsp7vy3XvgvvxWeN+XI9xHh+Ox/Ff+/n+t4f/evi7Uso/SyllKKWUvZT9WrcD4MYZSym3r3sJAG6esZTy7eteAoCbZyylfPG6lwDg5hnLf/4dBAB6jNe9AAA3k4AAEBEQACICAkBEQACICAgAEQEBICIgAEQEBIBIfZbhn+8/e+uqFuHS/VfeuFtKKfd++Zpr+xlw/9X/3I833Y/PAvfjf+f14cd3e2d8AwEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIAJF63QvA/5uLj87r1rahZ6ad2ni6OE09M1vbhtOD8+53+PzDh3PvzOn8VNfWus5pW7ZxOS1d57Tv+3B6cPH0c9ovf3nnN3964RP7PbyY97L3XvNpXdauH6L3
tg2tta5rvm97OZ1fdF/zdrHUfe87p3XZxq21vudo24e2LPX1vvVKKc8YkA/ee/92z+fb+Wlqp9Z1w9pp6Z4ppZTlYpnasvQda1mntfNY66lNbek8p6VN66fc5D/+6rcvPn6sdWxL58PR1nFta9dMOy3dM2vrf3BLyR741tZpW/te/LWt09a2+Bv3/VfeuJvOcvX+8vs/P/Z+8PwNpZQf7qX8Ohn+8stfuuJ14Oar89SGadx7ZsZp2mqd1p6ZYRz2eja3vu1KmY+HpXemHmqbau06p2EatjrPXec0DsM+3z489Zz+8fZfXyillK9+62vvfvz3D8ezZRiGrv3qoa7TXLeu/eZxnw9913wcxnJ259h9zQ93zto49D1H9axu9ezQd83ruB9vHdtPvvDT7/dtePkNpGvBj7vz+TsPej4/1rpO89h3w2pdp9o3U0opU53Wepi75qY6rWOdumbqXNfp0Dcz1brWuT7xJj/6yerr3/vG359wrG06PHnuqcc61K3OfX8w1Xne5rO+F78e6lYPfTP/nTv2PfD1ULdD50tSz+ZtPvbvd//Vy28e99587a3eWa7eo4B89+WXHns/eP6e6a+wfvSLe3+4qkW49Cgg3/zBd979tM8CXCf/CwuAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAE
BEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASBSr3sB+H9z8dF53do29My0UxtPF6epZ2Zr23B6cN79Dp9/+HDunTmdn+raWtc5bcs2Lqel65z2fR9ODy6efk775S/v/OZPL3xiv4cX81723ms+rcva9UP03rahtdZ1zfdtL6fzi+5r3i6Wuu9957Qu27i11vccbfvQlqW+3rdeKeUZA/LBe+/f7vl8Oz9N7dS6blg7Ld0zpZSyXCxTW5a+Yy3rtHYeaz21qS2d57S0af2Um/zHX/32xcePtY5t6Xw42jqube2aaaele2Zt/Q9uKdkD39o6bWvfi7+2ddraFn/jvv/KG3fTWa7eX37/58feD56/oZTyw72UXyfDX375S1e8Dtx8dZ7aMI17z8w4TVut09ozM4zDXs/m1rddKfPxsPTO1ENtU61d5zRMw1bnueucxmHY59uHp57TP97+6wullPLVb33t3Y///uF4tgzD0LVfPdR1muvWtd887vOh75qPw1jO7hy7r/nhzlkbh77nqJ7VrZ4d+q55HffjrWP7yRd++v2+DS+/gXQt+HF3Pn/nQc/nx1rXaR77blit61T7ZkopZarTWg9z19xUp3WsU9dMnes6HfpmplrXOtcn3uRHP1l9/Xvf+PsTjrVNhyfPPfVYh7rVue8PpjrP23zW9+LXQ93qoW/mv3PHvge+Hup26HxJ6tm8zcf+/e6/evnN496br73VO8vVexSQ77780mPvB8/fM/0V1o9+ce8PV7UIlx4F5Js/+M67n/ZZgOvkf2EBEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICA
gAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAyllL2614CgJtnLKV8cN1LAHDzjKWUt697CQBunrGU8uC6lwDg5hlKKWUP/x1kKOWtq10HgOuwl3K3d+bf5QExFK9CmrIAAAAASUVORK5CYII="
+ }
+ },
+ "Capacity": 32,
+ "Count": 20
+}
+</ConsoleOutput>
+ <ConsoleError />
+ </UnitTestResult>
+ <UnitTestResult>
+ <TestDate>2014-06-06T20:25:58</TestDate>
+ <Status />
+ <Passed>1</Passed>
+ <Errors>0</Errors>
+ <Failures>0</Failures>
+ <Inconclusive>0</Inconclusive>
+ <NotRunnable>0</NotRunnable>
+ <Skipped>0</Skipped>
+ <Ignored>0</Ignored>
+ <Time />
+ <Message>Prueba satisfactoria
+
+Tiempo de ejecución: 0,18 ms</Message>
+ <ConsoleOutput>{
+ "$id": "1",
+ "$type": "LongoMatch.Store.Templates.Categories, LongoMatch",
+ "Name": "default",
+ "Version": "2.1",
+ "GamePeriods": [
+ "1",
+ "2"
+ ],
+ "Image": null,
+ "Categories": null,
+ "FieldBackground": {
+ "$id": "2",
+ "$type": "LongoMatch.Common.Image, LongoMatch",
+ "pngbuf": {
+ "$type": "System.Byte[], mscorlib",
+ "$value":
"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
U5ErkJggg=="
+ }
+ },
+ "HalfFieldBackground": {
+ "$id": "3",
+ "$type": "LongoMatch.Common.Image, LongoMatch",
+ "pngbuf": {
+ "$type": "System.Byte[], mscorlib",
+ "$value":
"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"
+ }
+ },
+ "GoalBackground": {
+ "$id": "4",
+ "$type": "LongoMatch.Common.Image, LongoMatch",
+ "pngbuf": {
+ "$type": "System.Byte[], mscorlib",
+ "$value":
"iVBORw0KGgoAAAANSUhEUgAAAZAAAAEsCAYAAADtt+XCAAAABHNCSVQICAgIfAhkiAAACZpJREFUeJzt2r+rJWcdx/FnZp459+wuqOgfYBEEA4KNlShooyn2DxAEIUm1fYpYioUWAcutoo2Ff0AKtVCLkMpGEBUkXcqkkWT33jPPzFhcVxJ2l/B89ro3V16vZmE5X+Y7v/Z9z+4O5ZO+cutzt14ajsOL2/n2uW3ZbhWeq+k4zKWUsp7vy3XvgvvxWeN+XI9xHh+Ox/Ff+/n+t4f/evi7Uso/SyllKKWUvZT9WrcD4MYZSym3r3sJAG6esZTy7eteAoCbZyylfPG6lwDg5hnLf/4dBAB6jNe9AAA3k4AAEBEQACICAkBEQACICAgAEQEBICIgAEQEBIBIfZbhn+8/e+uqFuHS/VfeuFtKKfd++Zpr+xlw/9X/3I833Y/PAvfjf+f14cd3e2d8AwEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIAJF63QvA/5uLj87r1rahZ6ad2ni6OE09M1vbhtOD8+53+PzDh3PvzOn8VNfWus5pW7ZxOS1d57Tv+3B6cPH0c9ovf3nnN3964RP7PbyY97L3XvNpXdauH6L3
tg2tta5rvm97OZ1fdF/zdrHUfe87p3XZxq21vudo24e2LPX1vvVKKc8YkA/ee/92z+fb+Wlqp9Z1w9pp6Z4ppZTlYpnasvQda1mntfNY66lNbek8p6VN66fc5D/+6rcvPn6sdWxL58PR1nFta9dMOy3dM2vrf3BLyR741tZpW/te/LWt09a2+Bv3/VfeuJvOcvX+8vs/P/Z+8PwNpZQf7qX8Ohn+8stfuuJ14Oar89SGadx7ZsZp2mqd1p6ZYRz2eja3vu1KmY+HpXemHmqbau06p2EatjrPXec0DsM+3z489Zz+8fZfXyillK9+62vvfvz3D8ezZRiGrv3qoa7TXLeu/eZxnw9913wcxnJ259h9zQ93zto49D1H9axu9ezQd83ruB9vHdtPvvDT7/dtePkNpGvBj7vz+TsPej4/1rpO89h3w2pdp9o3U0opU53Wepi75qY6rWOdumbqXNfp0Dcz1brWuT7xJj/6yerr3/vG359wrG06PHnuqcc61K3OfX8w1Xne5rO+F78e6lYPfTP/nTv2PfD1ULdD50tSz+ZtPvbvd//Vy28e99587a3eWa7eo4B89+WXHns/eP6e6a+wfvSLe3+4qkW49Cgg3/zBd979tM8CXCf/CwuAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAE
BEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASBSr3sB+H9z8dF53do29My0UxtPF6epZ2Zr23B6cN79Dp9/+HDunTmdn+raWtc5bcs2Lqel65z2fR9ODy6efk775S/v/OZPL3xiv4cX81723ms+rcva9UP03rahtdZ1zfdtL6fzi+5r3i6Wuu9957Qu27i11vccbfvQlqW+3rdeKeUZA/LBe+/f7vl8Oz9N7dS6blg7Ld0zpZSyXCxTW5a+Yy3rtHYeaz21qS2d57S0af2Um/zHX/32xcePtY5t6Xw42jqube2aaaele2Zt/Q9uKdkD39o6bWvfi7+2ddraFn/jvv/KG3fTWa7eX37/58feD56/oZTyw72UXyfDX375S1e8Dtx8dZ7aMI17z8w4TVut09ozM4zDXs/m1rddKfPxsPTO1ENtU61d5zRMw1bnueucxmHY59uHp57TP97+6wullPLVb33t3Y///uF4tgzD0LVfPdR1muvWtd887vOh75qPw1jO7hy7r/nhzlkbh77nqJ7VrZ4d+q55HffjrWP7yRd++v2+DS+/gXQt+HF3Pn/nQc/nx1rXaR77blit61T7ZkopZarTWg9z19xUp3WsU9dMnes6HfpmplrXOtcn3uRHP1l9/Xvf+PsTjrVNhyfPPfVYh7rVue8PpjrP23zW9+LXQ93qoW/mv3PHvge+Hup26HxJ6tm8zcf+/e6/evnN496br73VO8vVexSQ77780mPvB8/fM/0V1o9+ce8PV7UIlx4F5Js/+M67n/ZZgOvkf2EBEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICA
gAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAyllL2614CgJtnLKV8cN1LAHDzjKWUt697CQBunrGU8uC6lwDg5hlKKWUP/x1kKOWtq10HgOuwl3K3d+bf5QExFK9CmrIAAAAASUVORK5CYII="
+ }
+ },
+ "Capacity": 32,
+ "Count": 20
+}
+</ConsoleOutput>
+ <ConsoleError />
+ </UnitTestResult>
+ <UnitTestResult>
+ <TestDate>2014-06-06T20:26:24</TestDate>
+ <Status />
+ <Passed>1</Passed>
+ <Errors>0</Errors>
+ <Failures>0</Failures>
+ <Inconclusive>0</Inconclusive>
+ <NotRunnable>0</NotRunnable>
+ <Skipped>0</Skipped>
+ <Ignored>0</Ignored>
+ <Time />
+ <Message>Prueba satisfactoria
+
+Tiempo de ejecución: 0,20 ms</Message>
+ <ConsoleOutput>{
+ "$id": "1",
+ "$type": "LongoMatch.Store.Templates.Categories, LongoMatch",
+ "Name": "default",
+ "Version": "2.1",
+ "GamePeriods": [
+ "1",
+ "2"
+ ],
+ "Image": null,
+ "Categories": {
+ "$ref": "1"
+ },
+ "FieldBackground": {
+ "$id": "2",
+ "$type": "LongoMatch.Common.Image, LongoMatch",
+ "pngbuf": {
+ "$type": "System.Byte[], mscorlib",
+ "$value":
"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
U5ErkJggg=="
+ }
+ },
+ "HalfFieldBackground": {
+ "$id": "3",
+ "$type": "LongoMatch.Common.Image, LongoMatch",
+ "pngbuf": {
+ "$type": "System.Byte[], mscorlib",
+ "$value":
"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"
+ }
+ },
+ "GoalBackground": {
+ "$id": "4",
+ "$type": "LongoMatch.Common.Image, LongoMatch",
+ "pngbuf": {
+ "$type": "System.Byte[], mscorlib",
+ "$value":
"iVBORw0KGgoAAAANSUhEUgAAAZAAAAEsCAYAAADtt+XCAAAABHNCSVQICAgIfAhkiAAACZpJREFUeJzt2r+rJWcdx/FnZp459+wuqOgfYBEEA4KNlShooyn2DxAEIUm1fYpYioUWAcutoo2Ff0AKtVCLkMpGEBUkXcqkkWT33jPPzFhcVxJ2l/B89ro3V16vZmE5X+Y7v/Z9z+4O5ZO+cutzt14ajsOL2/n2uW3ZbhWeq+k4zKWUsp7vy3XvgvvxWeN+XI9xHh+Ox/Ff+/n+t4f/evi7Uso/SyllKKWUvZT9WrcD4MYZSym3r3sJAG6esZTy7eteAoCbZyylfPG6lwDg5hnLf/4dBAB6jNe9AAA3k4AAEBEQACICAkBEQACICAgAEQEBICIgAEQEBIBIfZbhn+8/e+uqFuHS/VfeuFtKKfd++Zpr+xlw/9X/3I833Y/PAvfjf+f14cd3e2d8AwEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIAJF63QvA/5uLj87r1rahZ6ad2ni6OE09M1vbhtOD8+53+PzDh3PvzOn8VNfWus5pW7ZxOS1d57Tv+3B6cPH0c9ovf3nnN3964RP7PbyY97L3XvNpXdauH6L3
tg2tta5rvm97OZ1fdF/zdrHUfe87p3XZxq21vudo24e2LPX1vvVKKc8YkA/ee/92z+fb+Wlqp9Z1w9pp6Z4ppZTlYpnasvQda1mntfNY66lNbek8p6VN66fc5D/+6rcvPn6sdWxL58PR1nFta9dMOy3dM2vrf3BLyR741tZpW/te/LWt09a2+Bv3/VfeuJvOcvX+8vs/P/Z+8PwNpZQf7qX8Ohn+8stfuuJ14Oar89SGadx7ZsZp2mqd1p6ZYRz2eja3vu1KmY+HpXemHmqbau06p2EatjrPXec0DsM+3z489Zz+8fZfXyillK9+62vvfvz3D8ezZRiGrv3qoa7TXLeu/eZxnw9913wcxnJ259h9zQ93zto49D1H9axu9ezQd83ruB9vHdtPvvDT7/dtePkNpGvBj7vz+TsPej4/1rpO89h3w2pdp9o3U0opU53Wepi75qY6rWOdumbqXNfp0Dcz1brWuT7xJj/6yerr3/vG359wrG06PHnuqcc61K3OfX8w1Xne5rO+F78e6lYPfTP/nTv2PfD1ULdD50tSz+ZtPvbvd//Vy28e99587a3eWa7eo4B89+WXHns/eP6e6a+wfvSLe3+4qkW49Cgg3/zBd979tM8CXCf/CwuAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAE
BEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASBSr3sB+H9z8dF53do29My0UxtPF6epZ2Zr23B6cN79Dp9/+HDunTmdn+raWtc5bcs2Lqel65z2fR9ODy6efk775S/v/OZPL3xiv4cX81723ms+rcva9UP03rahtdZ1zfdtL6fzi+5r3i6Wuu9957Qu27i11vccbfvQlqW+3rdeKeUZA/LBe+/f7vl8Oz9N7dS6blg7Ld0zpZSyXCxTW5a+Yy3rtHYeaz21qS2d57S0af2Um/zHX/32xcePtY5t6Xw42jqube2aaaele2Zt/Q9uKdkD39o6bWvfi7+2ddraFn/jvv/KG3fTWa7eX37/58feD56/oZTyw72UXyfDX375S1e8Dtx8dZ7aMI17z8w4TVut09ozM4zDXs/m1rddKfPxsPTO1ENtU61d5zRMw1bnueucxmHY59uHp57TP97+6wullPLVb33t3Y///uF4tgzD0LVfPdR1muvWtd887vOh75qPw1jO7hy7r/nhzlkbh77nqJ7VrZ4d+q55HffjrWP7yRd++v2+DS+/gXQt+HF3Pn/nQc/nx1rXaR77blit61T7ZkopZarTWg9z19xUp3WsU9dMnes6HfpmplrXOtcn3uRHP1l9/Xvf+PsTjrVNhyfPPfVYh7rVue8PpjrP23zW9+LXQ93qoW/mv3PHvge+Hup26HxJ6tm8zcf+/e6/evnN496br73VO8vVexSQ77780mPvB8/fM/0V1o9+ce8PV7UIlx4F5Js/+M67n/ZZgOvkf2EBEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICA
gAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAyllL2614CgJtnLKV8cN1LAHDzjKWUt697CQBunrGU8uC6lwDg5hlKKWUP/x1kKOWtq10HgOuwl3K3d+bf5QExFK9CmrIAAAAASUVORK5CYII="
+ }
+ },
+ "Capacity": 32,
+ "Count": 20
+}
+</ConsoleOutput>
+ <ConsoleError />
+ </UnitTestResult>
+ <UnitTestResult>
+ <TestDate>2014-06-06T20:26:39</TestDate>
+ <Status />
+ <Passed>1</Passed>
+ <Errors>0</Errors>
+ <Failures>0</Failures>
+ <Inconclusive>0</Inconclusive>
+ <NotRunnable>0</NotRunnable>
+ <Skipped>0</Skipped>
+ <Ignored>0</Ignored>
+ <Time />
+ <Message>Prueba satisfactoria
+
+Tiempo de ejecución: 0,19 ms</Message>
+ <ConsoleOutput>{
+ "$id": "1",
+ "$type": "LongoMatch.Store.Templates.Categories, LongoMatch",
+ "Name": "default",
+ "Version": "2.1",
+ "GamePeriods": [
+ "1",
+ "2"
+ ],
+ "Image": null,
+ "Categories": [
+ {
+ "$id": "2",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "uuid": "5845f457-2ddc-44d5-b161-601e363e9140",
+ "ID": "5845f457-2ddc-44d5-b161-601e363e9140",
+ "name": "Category 0",
+ "Name": "Category 0",
+ "start": {
+ "$id": "3",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Start": {
+ "$id": "3",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "stop": {
+ "$id": "4",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "4",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "hotkey": {
+ "$id": "5",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Hotkey": {
+ "$id": "5",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "position": -1,
+ "Position": -1,
+ "subcategories": [
+ {
+ "$id": "6",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ },
+ {
+ "$id": "7",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ }
+ ],
+ "SubCategories": [
+ {
+ "$ref": "6"
+ },
+ {
+ "$ref": "7"
+ }
+ ],
+ "Color": {
+ "$id": "8",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "red": 65535,
+ "green": 0,
+ "blue": 0,
+ "sort_method": 1,
+ "SortMethod": 1,
+ "tagfieldpos": true,
+ "TagFieldPosition": true,
+ "taghalffieldpos": false,
+ "TagHalfFieldPosition": false,
+ "taggoalpos": false,
+ "TagGoalPosistion": false,
+ "fieldposisdist": false,
+ "FieldPositionIsDistance": false,
+ "halffieldposisdist": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "9",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "uuid": "7f49ecac-5441-4dec-b3dd-4b66e804125c",
+ "ID": "7f49ecac-5441-4dec-b3dd-4b66e804125c",
+ "name": "Category 1",
+ "Name": "Category 1",
+ "start": {
+ "$id": "10",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Start": {
+ "$id": "10",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "stop": {
+ "$id": "11",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "11",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "hotkey": {
+ "$id": "12",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": 100,
+ "Modifier": 0,
+ "Defined": true
+ },
+ "Hotkey": {
+ "$id": "12",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": 100,
+ "Modifier": 0,
+ "Defined": true
+ },
+ "position": 0,
+ "Position": 0,
+ "subcategories": [
+ {
+ "$id": "13",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ },
+ {
+ "$id": "14",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ }
+ ],
+ "SubCategories": [
+ {
+ "$ref": "13"
+ },
+ {
+ "$ref": "14"
+ }
+ ],
+ "Color": {
+ "$id": "15",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "red": 65535,
+ "green": 0,
+ "blue": 0,
+ "sort_method": 1,
+ "SortMethod": 1,
+ "tagfieldpos": true,
+ "TagFieldPosition": true,
+ "taghalffieldpos": false,
+ "TagHalfFieldPosition": false,
+ "taggoalpos": false,
+ "TagGoalPosistion": false,
+ "fieldposisdist": false,
+ "FieldPositionIsDistance": false,
+ "halffieldposisdist": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "16",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "uuid": "1755d18a-2e91-4fc3-af2f-2b4b778a9812",
+ "ID": "1755d18a-2e91-4fc3-af2f-2b4b778a9812",
+ "name": "Category 2",
+ "Name": "Category 2",
+ "start": {
+ "$id": "17",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Start": {
+ "$id": "17",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "stop": {
+ "$id": "18",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "18",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "hotkey": {
+ "$id": "19",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Hotkey": {
+ "$id": "19",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "position": 1,
+ "Position": 1,
+ "subcategories": [
+ {
+ "$id": "20",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ },
+ {
+ "$id": "21",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ }
+ ],
+ "SubCategories": [
+ {
+ "$ref": "20"
+ },
+ {
+ "$ref": "21"
+ }
+ ],
+ "Color": {
+ "$id": "22",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "red": 65535,
+ "green": 0,
+ "blue": 0,
+ "sort_method": 1,
+ "SortMethod": 1,
+ "tagfieldpos": true,
+ "TagFieldPosition": true,
+ "taghalffieldpos": false,
+ "TagHalfFieldPosition": false,
+ "taggoalpos": false,
+ "TagGoalPosistion": false,
+ "fieldposisdist": false,
+ "FieldPositionIsDistance": false,
+ "halffieldposisdist": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "23",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "uuid": "368b23a6-c022-4afc-aebf-cabac0395e31",
+ "ID": "368b23a6-c022-4afc-aebf-cabac0395e31",
+ "name": "Category 3",
+ "Name": "Category 3",
+ "start": {
+ "$id": "24",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Start": {
+ "$id": "24",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "stop": {
+ "$id": "25",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "25",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "hotkey": {
+ "$id": "26",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Hotkey": {
+ "$id": "26",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "position": 2,
+ "Position": 2,
+ "subcategories": [
+ {
+ "$id": "27",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ },
+ {
+ "$id": "28",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ }
+ ],
+ "SubCategories": [
+ {
+ "$ref": "27"
+ },
+ {
+ "$ref": "28"
+ }
+ ],
+ "Color": {
+ "$id": "29",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "red": 65535,
+ "green": 0,
+ "blue": 0,
+ "sort_method": 1,
+ "SortMethod": 1,
+ "tagfieldpos": true,
+ "TagFieldPosition": true,
+ "taghalffieldpos": false,
+ "TagHalfFieldPosition": false,
+ "taggoalpos": false,
+ "TagGoalPosistion": false,
+ "fieldposisdist": false,
+ "FieldPositionIsDistance": false,
+ "halffieldposisdist": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "30",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "uuid": "fd11e6a6-4889-465f-b4a7-cb16f5104bbf",
+ "ID": "fd11e6a6-4889-465f-b4a7-cb16f5104bbf",
+ "name": "Category 4",
+ "Name": "Category 4",
+ "start": {
+ "$id": "31",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Start": {
+ "$id": "31",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "stop": {
+ "$id": "32",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "32",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "hotkey": {
+ "$id": "33",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Hotkey": {
+ "$id": "33",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "position": 3,
+ "Position": 3,
+ "subcategories": [
+ {
+ "$id": "34",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ },
+ {
+ "$id": "35",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ }
+ ],
+ "SubCategories": [
+ {
+ "$ref": "34"
+ },
+ {
+ "$ref": "35"
+ }
+ ],
+ "Color": {
+ "$id": "36",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "red": 65535,
+ "green": 0,
+ "blue": 0,
+ "sort_method": 1,
+ "SortMethod": 1,
+ "tagfieldpos": true,
+ "TagFieldPosition": true,
+ "taghalffieldpos": false,
+ "TagHalfFieldPosition": false,
+ "taggoalpos": false,
+ "TagGoalPosistion": false,
+ "fieldposisdist": false,
+ "FieldPositionIsDistance": false,
+ "halffieldposisdist": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "37",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "uuid": "d570ccc9-5132-4985-a57c-6127444ae6b9",
+ "ID": "d570ccc9-5132-4985-a57c-6127444ae6b9",
+ "name": "Category 5",
+ "Name": "Category 5",
+ "start": {
+ "$id": "38",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Start": {
+ "$id": "38",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "stop": {
+ "$id": "39",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "39",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "hotkey": {
+ "$id": "40",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Hotkey": {
+ "$id": "40",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "position": 4,
+ "Position": 4,
+ "subcategories": [
+ {
+ "$id": "41",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ },
+ {
+ "$id": "42",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ }
+ ],
+ "SubCategories": [
+ {
+ "$ref": "41"
+ },
+ {
+ "$ref": "42"
+ }
+ ],
+ "Color": {
+ "$id": "43",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "red": 65535,
+ "green": 0,
+ "blue": 0,
+ "sort_method": 1,
+ "SortMethod": 1,
+ "tagfieldpos": true,
+ "TagFieldPosition": true,
+ "taghalffieldpos": false,
+ "TagHalfFieldPosition": false,
+ "taggoalpos": false,
+ "TagGoalPosistion": false,
+ "fieldposisdist": false,
+ "FieldPositionIsDistance": false,
+ "halffieldposisdist": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "44",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "uuid": "663c2efa-e035-40d5-8016-275830ab337d",
+ "ID": "663c2efa-e035-40d5-8016-275830ab337d",
+ "name": "Category 6",
+ "Name": "Category 6",
+ "start": {
+ "$id": "45",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Start": {
+ "$id": "45",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "stop": {
+ "$id": "46",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "46",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "hotkey": {
+ "$id": "47",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Hotkey": {
+ "$id": "47",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "position": 5,
+ "Position": 5,
+ "subcategories": [
+ {
+ "$id": "48",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ },
+ {
+ "$id": "49",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ }
+ ],
+ "SubCategories": [
+ {
+ "$ref": "48"
+ },
+ {
+ "$ref": "49"
+ }
+ ],
+ "Color": {
+ "$id": "50",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "red": 65535,
+ "green": 0,
+ "blue": 0,
+ "sort_method": 1,
+ "SortMethod": 1,
+ "tagfieldpos": true,
+ "TagFieldPosition": true,
+ "taghalffieldpos": false,
+ "TagHalfFieldPosition": false,
+ "taggoalpos": false,
+ "TagGoalPosistion": false,
+ "fieldposisdist": false,
+ "FieldPositionIsDistance": false,
+ "halffieldposisdist": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "51",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "uuid": "0bbb95e4-aa55-4a4e-8b03-7b20d19da8ee",
+ "ID": "0bbb95e4-aa55-4a4e-8b03-7b20d19da8ee",
+ "name": "Category 7",
+ "Name": "Category 7",
+ "start": {
+ "$id": "52",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Start": {
+ "$id": "52",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "stop": {
+ "$id": "53",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "53",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "hotkey": {
+ "$id": "54",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Hotkey": {
+ "$id": "54",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "position": 6,
+ "Position": 6,
+ "subcategories": [
+ {
+ "$id": "55",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ },
+ {
+ "$id": "56",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ }
+ ],
+ "SubCategories": [
+ {
+ "$ref": "55"
+ },
+ {
+ "$ref": "56"
+ }
+ ],
+ "Color": {
+ "$id": "57",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "red": 65535,
+ "green": 0,
+ "blue": 0,
+ "sort_method": 1,
+ "SortMethod": 1,
+ "tagfieldpos": true,
+ "TagFieldPosition": true,
+ "taghalffieldpos": false,
+ "TagHalfFieldPosition": false,
+ "taggoalpos": false,
+ "TagGoalPosistion": false,
+ "fieldposisdist": false,
+ "FieldPositionIsDistance": false,
+ "halffieldposisdist": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "58",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "uuid": "a1b2cb44-3f88-4bbf-9734-8c2711a90ae6",
+ "ID": "a1b2cb44-3f88-4bbf-9734-8c2711a90ae6",
+ "name": "Category 8",
+ "Name": "Category 8",
+ "start": {
+ "$id": "59",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Start": {
+ "$id": "59",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "stop": {
+ "$id": "60",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "60",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "hotkey": {
+ "$id": "61",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Hotkey": {
+ "$id": "61",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "position": 7,
+ "Position": 7,
+ "subcategories": [
+ {
+ "$id": "62",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ },
+ {
+ "$id": "63",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ }
+ ],
+ "SubCategories": [
+ {
+ "$ref": "62"
+ },
+ {
+ "$ref": "63"
+ }
+ ],
+ "Color": {
+ "$id": "64",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "red": 65535,
+ "green": 0,
+ "blue": 0,
+ "sort_method": 1,
+ "SortMethod": 1,
+ "tagfieldpos": true,
+ "TagFieldPosition": true,
+ "taghalffieldpos": false,
+ "TagHalfFieldPosition": false,
+ "taggoalpos": false,
+ "TagGoalPosistion": false,
+ "fieldposisdist": false,
+ "FieldPositionIsDistance": false,
+ "halffieldposisdist": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "65",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "uuid": "1ce743c8-8912-42ad-8e75-cbb0f338ef2e",
+ "ID": "1ce743c8-8912-42ad-8e75-cbb0f338ef2e",
+ "name": "Category 9",
+ "Name": "Category 9",
+ "start": {
+ "$id": "66",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Start": {
+ "$id": "66",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "stop": {
+ "$id": "67",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "67",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "hotkey": {
+ "$id": "68",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Hotkey": {
+ "$id": "68",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "position": 8,
+ "Position": 8,
+ "subcategories": [
+ {
+ "$id": "69",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ },
+ {
+ "$id": "70",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ }
+ ],
+ "SubCategories": [
+ {
+ "$ref": "69"
+ },
+ {
+ "$ref": "70"
+ }
+ ],
+ "Color": {
+ "$id": "71",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "red": 65535,
+ "green": 0,
+ "blue": 0,
+ "sort_method": 1,
+ "SortMethod": 1,
+ "tagfieldpos": true,
+ "TagFieldPosition": true,
+ "taghalffieldpos": false,
+ "TagHalfFieldPosition": false,
+ "taggoalpos": false,
+ "TagGoalPosistion": false,
+ "fieldposisdist": false,
+ "FieldPositionIsDistance": false,
+ "halffieldposisdist": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "72",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "uuid": "309cf7f9-2948-4281-9821-6752370e9276",
+ "ID": "309cf7f9-2948-4281-9821-6752370e9276",
+ "name": "Category 10",
+ "Name": "Category 10",
+ "start": {
+ "$id": "73",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Start": {
+ "$id": "73",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "stop": {
+ "$id": "74",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "74",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "hotkey": {
+ "$id": "75",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Hotkey": {
+ "$id": "75",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "position": 9,
+ "Position": 9,
+ "subcategories": [
+ {
+ "$id": "76",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ },
+ {
+ "$id": "77",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ }
+ ],
+ "SubCategories": [
+ {
+ "$ref": "76"
+ },
+ {
+ "$ref": "77"
+ }
+ ],
+ "Color": {
+ "$id": "78",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "red": 65535,
+ "green": 0,
+ "blue": 0,
+ "sort_method": 1,
+ "SortMethod": 1,
+ "tagfieldpos": true,
+ "TagFieldPosition": true,
+ "taghalffieldpos": false,
+ "TagHalfFieldPosition": false,
+ "taggoalpos": false,
+ "TagGoalPosistion": false,
+ "fieldposisdist": false,
+ "FieldPositionIsDistance": false,
+ "halffieldposisdist": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "79",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "uuid": "da3e873d-3cfe-409d-a28b-306397a08535",
+ "ID": "da3e873d-3cfe-409d-a28b-306397a08535",
+ "name": "Category 11",
+ "Name": "Category 11",
+ "start": {
+ "$id": "80",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Start": {
+ "$id": "80",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "stop": {
+ "$id": "81",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "81",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "hotkey": {
+ "$id": "82",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Hotkey": {
+ "$id": "82",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "position": 10,
+ "Position": 10,
+ "subcategories": [
+ {
+ "$id": "83",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ },
+ {
+ "$id": "84",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ }
+ ],
+ "SubCategories": [
+ {
+ "$ref": "83"
+ },
+ {
+ "$ref": "84"
+ }
+ ],
+ "Color": {
+ "$id": "85",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "red": 65535,
+ "green": 0,
+ "blue": 0,
+ "sort_method": 1,
+ "SortMethod": 1,
+ "tagfieldpos": true,
+ "TagFieldPosition": true,
+ "taghalffieldpos": false,
+ "TagHalfFieldPosition": false,
+ "taggoalpos": false,
+ "TagGoalPosistion": false,
+ "fieldposisdist": false,
+ "FieldPositionIsDistance": false,
+ "halffieldposisdist": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "86",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "uuid": "e35989cc-42f4-43b6-8cc5-9213f1524ec0",
+ "ID": "e35989cc-42f4-43b6-8cc5-9213f1524ec0",
+ "name": "Category 12",
+ "Name": "Category 12",
+ "start": {
+ "$id": "87",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Start": {
+ "$id": "87",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "stop": {
+ "$id": "88",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "88",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "hotkey": {
+ "$id": "89",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Hotkey": {
+ "$id": "89",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "position": 11,
+ "Position": 11,
+ "subcategories": [
+ {
+ "$id": "90",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ },
+ {
+ "$id": "91",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ }
+ ],
+ "SubCategories": [
+ {
+ "$ref": "90"
+ },
+ {
+ "$ref": "91"
+ }
+ ],
+ "Color": {
+ "$id": "92",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "red": 65535,
+ "green": 0,
+ "blue": 0,
+ "sort_method": 1,
+ "SortMethod": 1,
+ "tagfieldpos": true,
+ "TagFieldPosition": true,
+ "taghalffieldpos": false,
+ "TagHalfFieldPosition": false,
+ "taggoalpos": false,
+ "TagGoalPosistion": false,
+ "fieldposisdist": false,
+ "FieldPositionIsDistance": false,
+ "halffieldposisdist": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "93",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "uuid": "f7aeab6a-8f86-4425-88a3-7d25a8d729f8",
+ "ID": "f7aeab6a-8f86-4425-88a3-7d25a8d729f8",
+ "name": "Category 13",
+ "Name": "Category 13",
+ "start": {
+ "$id": "94",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Start": {
+ "$id": "94",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "stop": {
+ "$id": "95",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "95",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "hotkey": {
+ "$id": "96",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Hotkey": {
+ "$id": "96",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "position": 12,
+ "Position": 12,
+ "subcategories": [
+ {
+ "$id": "97",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ },
+ {
+ "$id": "98",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ }
+ ],
+ "SubCategories": [
+ {
+ "$ref": "97"
+ },
+ {
+ "$ref": "98"
+ }
+ ],
+ "Color": {
+ "$id": "99",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "red": 65535,
+ "green": 0,
+ "blue": 0,
+ "sort_method": 1,
+ "SortMethod": 1,
+ "tagfieldpos": true,
+ "TagFieldPosition": true,
+ "taghalffieldpos": false,
+ "TagHalfFieldPosition": false,
+ "taggoalpos": false,
+ "TagGoalPosistion": false,
+ "fieldposisdist": false,
+ "FieldPositionIsDistance": false,
+ "halffieldposisdist": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "100",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "uuid": "8e079dab-bd4e-4c63-b553-3b6b1f6fe1e1",
+ "ID": "8e079dab-bd4e-4c63-b553-3b6b1f6fe1e1",
+ "name": "Category 14",
+ "Name": "Category 14",
+ "start": {
+ "$id": "101",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Start": {
+ "$id": "101",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "stop": {
+ "$id": "102",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "102",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "hotkey": {
+ "$id": "103",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Hotkey": {
+ "$id": "103",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "position": 13,
+ "Position": 13,
+ "subcategories": [
+ {
+ "$id": "104",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ },
+ {
+ "$id": "105",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ }
+ ],
+ "SubCategories": [
+ {
+ "$ref": "104"
+ },
+ {
+ "$ref": "105"
+ }
+ ],
+ "Color": {
+ "$id": "106",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "red": 65535,
+ "green": 0,
+ "blue": 0,
+ "sort_method": 1,
+ "SortMethod": 1,
+ "tagfieldpos": true,
+ "TagFieldPosition": true,
+ "taghalffieldpos": false,
+ "TagHalfFieldPosition": false,
+ "taggoalpos": false,
+ "TagGoalPosistion": false,
+ "fieldposisdist": false,
+ "FieldPositionIsDistance": false,
+ "halffieldposisdist": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "107",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "uuid": "2e5df4f8-f17f-4337-bcb6-ec630e2f986f",
+ "ID": "2e5df4f8-f17f-4337-bcb6-ec630e2f986f",
+ "name": "Category 15",
+ "Name": "Category 15",
+ "start": {
+ "$id": "108",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Start": {
+ "$id": "108",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "stop": {
+ "$id": "109",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "109",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "hotkey": {
+ "$id": "110",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Hotkey": {
+ "$id": "110",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "position": 14,
+ "Position": 14,
+ "subcategories": [
+ {
+ "$id": "111",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ },
+ {
+ "$id": "112",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ }
+ ],
+ "SubCategories": [
+ {
+ "$ref": "111"
+ },
+ {
+ "$ref": "112"
+ }
+ ],
+ "Color": {
+ "$id": "113",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "red": 65535,
+ "green": 0,
+ "blue": 0,
+ "sort_method": 1,
+ "SortMethod": 1,
+ "tagfieldpos": true,
+ "TagFieldPosition": true,
+ "taghalffieldpos": false,
+ "TagHalfFieldPosition": false,
+ "taggoalpos": false,
+ "TagGoalPosistion": false,
+ "fieldposisdist": false,
+ "FieldPositionIsDistance": false,
+ "halffieldposisdist": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "114",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "uuid": "90dd1b63-0678-412e-a0fc-a6409e6caf24",
+ "ID": "90dd1b63-0678-412e-a0fc-a6409e6caf24",
+ "name": "Category 16",
+ "Name": "Category 16",
+ "start": {
+ "$id": "115",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Start": {
+ "$id": "115",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "stop": {
+ "$id": "116",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "116",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "hotkey": {
+ "$id": "117",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Hotkey": {
+ "$id": "117",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "position": 15,
+ "Position": 15,
+ "subcategories": [
+ {
+ "$id": "118",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ },
+ {
+ "$id": "119",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ }
+ ],
+ "SubCategories": [
+ {
+ "$ref": "118"
+ },
+ {
+ "$ref": "119"
+ }
+ ],
+ "Color": {
+ "$id": "120",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "red": 65535,
+ "green": 0,
+ "blue": 0,
+ "sort_method": 1,
+ "SortMethod": 1,
+ "tagfieldpos": true,
+ "TagFieldPosition": true,
+ "taghalffieldpos": false,
+ "TagHalfFieldPosition": false,
+ "taggoalpos": false,
+ "TagGoalPosistion": false,
+ "fieldposisdist": false,
+ "FieldPositionIsDistance": false,
+ "halffieldposisdist": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "121",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "uuid": "63a37c3c-99e1-45ea-906c-3bdc5798ec0d",
+ "ID": "63a37c3c-99e1-45ea-906c-3bdc5798ec0d",
+ "name": "Category 17",
+ "Name": "Category 17",
+ "start": {
+ "$id": "122",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Start": {
+ "$id": "122",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "stop": {
+ "$id": "123",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "123",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "hotkey": {
+ "$id": "124",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Hotkey": {
+ "$id": "124",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "position": 16,
+ "Position": 16,
+ "subcategories": [
+ {
+ "$id": "125",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ },
+ {
+ "$id": "126",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ }
+ ],
+ "SubCategories": [
+ {
+ "$ref": "125"
+ },
+ {
+ "$ref": "126"
+ }
+ ],
+ "Color": {
+ "$id": "127",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "red": 65535,
+ "green": 0,
+ "blue": 0,
+ "sort_method": 1,
+ "SortMethod": 1,
+ "tagfieldpos": true,
+ "TagFieldPosition": true,
+ "taghalffieldpos": false,
+ "TagHalfFieldPosition": false,
+ "taggoalpos": false,
+ "TagGoalPosistion": false,
+ "fieldposisdist": false,
+ "FieldPositionIsDistance": false,
+ "halffieldposisdist": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "128",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "uuid": "ddf63750-94f6-4cf6-9803-f4aa54e72a50",
+ "ID": "ddf63750-94f6-4cf6-9803-f4aa54e72a50",
+ "name": "Category 18",
+ "Name": "Category 18",
+ "start": {
+ "$id": "129",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Start": {
+ "$id": "129",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "stop": {
+ "$id": "130",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "130",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "hotkey": {
+ "$id": "131",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Hotkey": {
+ "$id": "131",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "position": 17,
+ "Position": 17,
+ "subcategories": [
+ {
+ "$id": "132",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ },
+ {
+ "$id": "133",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ }
+ ],
+ "SubCategories": [
+ {
+ "$ref": "132"
+ },
+ {
+ "$ref": "133"
+ }
+ ],
+ "Color": {
+ "$id": "134",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "red": 65535,
+ "green": 0,
+ "blue": 0,
+ "sort_method": 1,
+ "SortMethod": 1,
+ "tagfieldpos": true,
+ "TagFieldPosition": true,
+ "taghalffieldpos": false,
+ "TagHalfFieldPosition": false,
+ "taggoalpos": false,
+ "TagGoalPosistion": false,
+ "fieldposisdist": false,
+ "FieldPositionIsDistance": false,
+ "halffieldposisdist": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "135",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "uuid": "eb8e5d7d-fbfb-4c9c-b5d0-4bc9dcd41347",
+ "ID": "eb8e5d7d-fbfb-4c9c-b5d0-4bc9dcd41347",
+ "name": "Category 19",
+ "Name": "Category 19",
+ "start": {
+ "$id": "136",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Start": {
+ "$id": "136",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "stop": {
+ "$id": "137",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "137",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "hotkey": {
+ "$id": "138",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Hotkey": {
+ "$id": "138",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "position": 18,
+ "Position": 18,
+ "subcategories": [
+ {
+ "$id": "139",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ },
+ {
+ "$id": "140",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ }
+ ],
+ "SubCategories": [
+ {
+ "$ref": "139"
+ },
+ {
+ "$ref": "140"
+ }
+ ],
+ "Color": {
+ "$id": "141",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "red": 65535,
+ "green": 0,
+ "blue": 0,
+ "sort_method": 1,
+ "SortMethod": 1,
+ "tagfieldpos": true,
+ "TagFieldPosition": true,
+ "taghalffieldpos": false,
+ "TagHalfFieldPosition": false,
+ "taggoalpos": false,
+ "TagGoalPosistion": false,
+ "fieldposisdist": false,
+ "FieldPositionIsDistance": false,
+ "halffieldposisdist": false,
+ "HalfFieldPositionIsDistance": false
+ }
+ ],
+ "FieldBackground": {
+ "$id": "142",
+ "$type": "LongoMatch.Common.Image, LongoMatch",
+ "pngbuf": {
+ "$type": "System.Byte[], mscorlib",
+ "$value":
"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
U5ErkJggg=="
+ }
+ },
+ "HalfFieldBackground": {
+ "$id": "143",
+ "$type": "LongoMatch.Common.Image, LongoMatch",
+ "pngbuf": {
+ "$type": "System.Byte[], mscorlib",
+ "$value":
"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"
+ }
+ },
+ "GoalBackground": {
+ "$id": "144",
+ "$type": "LongoMatch.Common.Image, LongoMatch",
+ "pngbuf": {
+ "$type": "System.Byte[], mscorlib",
+ "$value":
"iVBORw0KGgoAAAANSUhEUgAAAZAAAAEsCAYAAADtt+XCAAAABHNCSVQICAgIfAhkiAAACZpJREFUeJzt2r+rJWcdx/FnZp459+wuqOgfYBEEA4KNlShooyn2DxAEIUm1fYpYioUWAcutoo2Ff0AKtVCLkMpGEBUkXcqkkWT33jPPzFhcVxJ2l/B89ro3V16vZmE5X+Y7v/Z9z+4O5ZO+cutzt14ajsOL2/n2uW3ZbhWeq+k4zKWUsp7vy3XvgvvxWeN+XI9xHh+Ox/Ff+/n+t4f/evi7Uso/SyllKKWUvZT9WrcD4MYZSym3r3sJAG6esZTy7eteAoCbZyylfPG6lwDg5hnLf/4dBAB6jNe9AAA3k4AAEBEQACICAkBEQACICAgAEQEBICIgAEQEBIBIfZbhn+8/e+uqFuHS/VfeuFtKKfd++Zpr+xlw/9X/3I833Y/PAvfjf+f14cd3e2d8AwEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIAJF63QvA/5uLj87r1rahZ6ad2ni6OE09M1vbhtOD8+53+PzDh3PvzOn8VNfWus5pW7ZxOS1d57Tv+3B6cPH0c9ovf3nnN3964RP7PbyY97L3XvNpXdauH6L3
tg2tta5rvm97OZ1fdF/zdrHUfe87p3XZxq21vudo24e2LPX1vvVKKc8YkA/ee/92z+fb+Wlqp9Z1w9pp6Z4ppZTlYpnasvQda1mntfNY66lNbek8p6VN66fc5D/+6rcvPn6sdWxL58PR1nFta9dMOy3dM2vrf3BLyR741tZpW/te/LWt09a2+Bv3/VfeuJvOcvX+8vs/P/Z+8PwNpZQf7qX8Ohn+8stfuuJ14Oar89SGadx7ZsZp2mqd1p6ZYRz2eja3vu1KmY+HpXemHmqbau06p2EatjrPXec0DsM+3z489Zz+8fZfXyillK9+62vvfvz3D8ezZRiGrv3qoa7TXLeu/eZxnw9913wcxnJ259h9zQ93zto49D1H9axu9ezQd83ruB9vHdtPvvDT7/dtePkNpGvBj7vz+TsPej4/1rpO89h3w2pdp9o3U0opU53Wepi75qY6rWOdumbqXNfp0Dcz1brWuT7xJj/6yerr3/vG359wrG06PHnuqcc61K3OfX8w1Xne5rO+F78e6lYPfTP/nTv2PfD1ULdD50tSz+ZtPvbvd//Vy28e99587a3eWa7eo4B89+WXHns/eP6e6a+wfvSLe3+4qkW49Cgg3/zBd979tM8CXCf/CwuAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAE
BEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASBSr3sB+H9z8dF53do29My0UxtPF6epZ2Zr23B6cN79Dp9/+HDunTmdn+raWtc5bcs2Lqel65z2fR9ODy6efk775S/v/OZPL3xiv4cX81723ms+rcva9UP03rahtdZ1zfdtL6fzi+5r3i6Wuu9957Qu27i11vccbfvQlqW+3rdeKeUZA/LBe+/f7vl8Oz9N7dS6blg7Ld0zpZSyXCxTW5a+Yy3rtHYeaz21qS2d57S0af2Um/zHX/32xcePtY5t6Xw42jqube2aaaele2Zt/Q9uKdkD39o6bWvfi7+2ddraFn/jvv/KG3fTWa7eX37/58feD56/oZTyw72UXyfDX375S1e8Dtx8dZ7aMI17z8w4TVut09ozM4zDXs/m1rddKfPxsPTO1ENtU61d5zRMw1bnueucxmHY59uHp57TP97+6wullPLVb33t3Y///uF4tgzD0LVfPdR1muvWtd887vOh75qPw1jO7hy7r/nhzlkbh77nqJ7VrZ4d+q55HffjrWP7yRd++v2+DS+/gXQt+HF3Pn/nQc/nx1rXaR77blit61T7ZkopZarTWg9z19xUp3WsU9dMnes6HfpmplrXOtcn3uRHP1l9/Xvf+PsTjrVNhyfPPfVYh7rVue8PpjrP23zW9+LXQ93qoW/mv3PHvge+Hup26HxJ6tm8zcf+/e6/evnN496br73VO8vVexSQ77780mPvB8/fM/0V1o9+ce8PV7UIlx4F5Js/+M67n/ZZgOvkf2EBEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICA
gAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAyllL2614CgJtnLKV8cN1LAHDzjKWUt697CQBunrGU8uC6lwDg5hlKKWUP/x1kKOWtq10HgOuwl3K3d+bf5QExFK9CmrIAAAAASUVORK5CYII="
+ }
+ },
+ "Capacity": 32,
+ "Count": 20
+}
+</ConsoleOutput>
+ <ConsoleError />
+ </UnitTestResult>
+ <UnitTestResult>
+ <TestDate>2014-06-06T20:28:43</TestDate>
+ <Status />
+ <Passed>1</Passed>
+ <Errors>0</Errors>
+ <Failures>0</Failures>
+ <Inconclusive>0</Inconclusive>
+ <NotRunnable>0</NotRunnable>
+ <Skipped>0</Skipped>
+ <Ignored>0</Ignored>
+ <Time />
+ <Message>Prueba satisfactoria
+
+Tiempo de ejecución: 0,19 ms</Message>
+ <ConsoleOutput>{
+ "$id": "1",
+ "$type": "LongoMatch.Store.Templates.Categories, LongoMatch",
+ "Name": "default",
+ "Version": "2.1",
+ "GamePeriods": [
+ "1",
+ "2"
+ ],
+ "Image": null,
+ "Categories": [
+ {
+ "$id": "2",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "ID": "5845f457-2ddc-44d5-b161-601e363e9140",
+ "Name": "Category 0",
+ "Start": {
+ "$id": "3",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "4",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Hotkey": {
+ "$id": "5",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Position": -1,
+ "SubCategories": [
+ {
+ "$id": "6",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ },
+ {
+ "$id": "7",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ }
+ ],
+ "Color": {
+ "$id": "8",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "SortMethod": 1,
+ "TagFieldPosition": true,
+ "TagHalfFieldPosition": false,
+ "TagGoalPosistion": false,
+ "FieldPositionIsDistance": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "9",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "ID": "7f49ecac-5441-4dec-b3dd-4b66e804125c",
+ "Name": "Category 1",
+ "Start": {
+ "$id": "10",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "11",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Hotkey": {
+ "$id": "12",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": 100,
+ "Modifier": 0,
+ "Defined": true
+ },
+ "Position": 0,
+ "SubCategories": [
+ {
+ "$id": "13",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ },
+ {
+ "$id": "14",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ }
+ ],
+ "Color": {
+ "$id": "15",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "SortMethod": 1,
+ "TagFieldPosition": true,
+ "TagHalfFieldPosition": false,
+ "TagGoalPosistion": false,
+ "FieldPositionIsDistance": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "16",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "ID": "1755d18a-2e91-4fc3-af2f-2b4b778a9812",
+ "Name": "Category 2",
+ "Start": {
+ "$id": "17",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "18",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Hotkey": {
+ "$id": "19",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Position": 1,
+ "SubCategories": [
+ {
+ "$id": "20",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ },
+ {
+ "$id": "21",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ }
+ ],
+ "Color": {
+ "$id": "22",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "SortMethod": 1,
+ "TagFieldPosition": true,
+ "TagHalfFieldPosition": false,
+ "TagGoalPosistion": false,
+ "FieldPositionIsDistance": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "23",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "ID": "368b23a6-c022-4afc-aebf-cabac0395e31",
+ "Name": "Category 3",
+ "Start": {
+ "$id": "24",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "25",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Hotkey": {
+ "$id": "26",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Position": 2,
+ "SubCategories": [
+ {
+ "$id": "27",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ },
+ {
+ "$id": "28",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ }
+ ],
+ "Color": {
+ "$id": "29",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "SortMethod": 1,
+ "TagFieldPosition": true,
+ "TagHalfFieldPosition": false,
+ "TagGoalPosistion": false,
+ "FieldPositionIsDistance": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "30",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "ID": "fd11e6a6-4889-465f-b4a7-cb16f5104bbf",
+ "Name": "Category 4",
+ "Start": {
+ "$id": "31",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "32",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Hotkey": {
+ "$id": "33",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Position": 3,
+ "SubCategories": [
+ {
+ "$id": "34",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ },
+ {
+ "$id": "35",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ }
+ ],
+ "Color": {
+ "$id": "36",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "SortMethod": 1,
+ "TagFieldPosition": true,
+ "TagHalfFieldPosition": false,
+ "TagGoalPosistion": false,
+ "FieldPositionIsDistance": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "37",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "ID": "d570ccc9-5132-4985-a57c-6127444ae6b9",
+ "Name": "Category 5",
+ "Start": {
+ "$id": "38",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "39",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Hotkey": {
+ "$id": "40",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Position": 4,
+ "SubCategories": [
+ {
+ "$id": "41",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ },
+ {
+ "$id": "42",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ }
+ ],
+ "Color": {
+ "$id": "43",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "SortMethod": 1,
+ "TagFieldPosition": true,
+ "TagHalfFieldPosition": false,
+ "TagGoalPosistion": false,
+ "FieldPositionIsDistance": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "44",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "ID": "663c2efa-e035-40d5-8016-275830ab337d",
+ "Name": "Category 6",
+ "Start": {
+ "$id": "45",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "46",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Hotkey": {
+ "$id": "47",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Position": 5,
+ "SubCategories": [
+ {
+ "$id": "48",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ },
+ {
+ "$id": "49",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ }
+ ],
+ "Color": {
+ "$id": "50",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "SortMethod": 1,
+ "TagFieldPosition": true,
+ "TagHalfFieldPosition": false,
+ "TagGoalPosistion": false,
+ "FieldPositionIsDistance": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "51",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "ID": "0bbb95e4-aa55-4a4e-8b03-7b20d19da8ee",
+ "Name": "Category 7",
+ "Start": {
+ "$id": "52",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "53",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Hotkey": {
+ "$id": "54",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Position": 6,
+ "SubCategories": [
+ {
+ "$id": "55",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ },
+ {
+ "$id": "56",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ }
+ ],
+ "Color": {
+ "$id": "57",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "SortMethod": 1,
+ "TagFieldPosition": true,
+ "TagHalfFieldPosition": false,
+ "TagGoalPosistion": false,
+ "FieldPositionIsDistance": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "58",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "ID": "a1b2cb44-3f88-4bbf-9734-8c2711a90ae6",
+ "Name": "Category 8",
+ "Start": {
+ "$id": "59",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "60",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Hotkey": {
+ "$id": "61",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Position": 7,
+ "SubCategories": [
+ {
+ "$id": "62",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ },
+ {
+ "$id": "63",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ }
+ ],
+ "Color": {
+ "$id": "64",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "SortMethod": 1,
+ "TagFieldPosition": true,
+ "TagHalfFieldPosition": false,
+ "TagGoalPosistion": false,
+ "FieldPositionIsDistance": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "65",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "ID": "1ce743c8-8912-42ad-8e75-cbb0f338ef2e",
+ "Name": "Category 9",
+ "Start": {
+ "$id": "66",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "67",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Hotkey": {
+ "$id": "68",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Position": 8,
+ "SubCategories": [
+ {
+ "$id": "69",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ },
+ {
+ "$id": "70",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ }
+ ],
+ "Color": {
+ "$id": "71",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "SortMethod": 1,
+ "TagFieldPosition": true,
+ "TagHalfFieldPosition": false,
+ "TagGoalPosistion": false,
+ "FieldPositionIsDistance": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "72",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "ID": "309cf7f9-2948-4281-9821-6752370e9276",
+ "Name": "Category 10",
+ "Start": {
+ "$id": "73",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "74",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Hotkey": {
+ "$id": "75",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Position": 9,
+ "SubCategories": [
+ {
+ "$id": "76",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ },
+ {
+ "$id": "77",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ }
+ ],
+ "Color": {
+ "$id": "78",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "SortMethod": 1,
+ "TagFieldPosition": true,
+ "TagHalfFieldPosition": false,
+ "TagGoalPosistion": false,
+ "FieldPositionIsDistance": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "79",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "ID": "da3e873d-3cfe-409d-a28b-306397a08535",
+ "Name": "Category 11",
+ "Start": {
+ "$id": "80",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "81",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Hotkey": {
+ "$id": "82",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Position": 10,
+ "SubCategories": [
+ {
+ "$id": "83",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ },
+ {
+ "$id": "84",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ }
+ ],
+ "Color": {
+ "$id": "85",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "SortMethod": 1,
+ "TagFieldPosition": true,
+ "TagHalfFieldPosition": false,
+ "TagGoalPosistion": false,
+ "FieldPositionIsDistance": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "86",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "ID": "e35989cc-42f4-43b6-8cc5-9213f1524ec0",
+ "Name": "Category 12",
+ "Start": {
+ "$id": "87",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "88",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Hotkey": {
+ "$id": "89",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Position": 11,
+ "SubCategories": [
+ {
+ "$id": "90",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ },
+ {
+ "$id": "91",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ }
+ ],
+ "Color": {
+ "$id": "92",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "SortMethod": 1,
+ "TagFieldPosition": true,
+ "TagHalfFieldPosition": false,
+ "TagGoalPosistion": false,
+ "FieldPositionIsDistance": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "93",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "ID": "f7aeab6a-8f86-4425-88a3-7d25a8d729f8",
+ "Name": "Category 13",
+ "Start": {
+ "$id": "94",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "95",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Hotkey": {
+ "$id": "96",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Position": 12,
+ "SubCategories": [
+ {
+ "$id": "97",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ },
+ {
+ "$id": "98",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ }
+ ],
+ "Color": {
+ "$id": "99",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "SortMethod": 1,
+ "TagFieldPosition": true,
+ "TagHalfFieldPosition": false,
+ "TagGoalPosistion": false,
+ "FieldPositionIsDistance": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "100",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "ID": "8e079dab-bd4e-4c63-b553-3b6b1f6fe1e1",
+ "Name": "Category 14",
+ "Start": {
+ "$id": "101",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "102",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Hotkey": {
+ "$id": "103",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Position": 13,
+ "SubCategories": [
+ {
+ "$id": "104",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ },
+ {
+ "$id": "105",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ }
+ ],
+ "Color": {
+ "$id": "106",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "SortMethod": 1,
+ "TagFieldPosition": true,
+ "TagHalfFieldPosition": false,
+ "TagGoalPosistion": false,
+ "FieldPositionIsDistance": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "107",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "ID": "2e5df4f8-f17f-4337-bcb6-ec630e2f986f",
+ "Name": "Category 15",
+ "Start": {
+ "$id": "108",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "109",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Hotkey": {
+ "$id": "110",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Position": 14,
+ "SubCategories": [
+ {
+ "$id": "111",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ },
+ {
+ "$id": "112",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ }
+ ],
+ "Color": {
+ "$id": "113",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "SortMethod": 1,
+ "TagFieldPosition": true,
+ "TagHalfFieldPosition": false,
+ "TagGoalPosistion": false,
+ "FieldPositionIsDistance": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "114",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "ID": "90dd1b63-0678-412e-a0fc-a6409e6caf24",
+ "Name": "Category 16",
+ "Start": {
+ "$id": "115",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "116",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Hotkey": {
+ "$id": "117",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Position": 15,
+ "SubCategories": [
+ {
+ "$id": "118",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ },
+ {
+ "$id": "119",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ }
+ ],
+ "Color": {
+ "$id": "120",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "SortMethod": 1,
+ "TagFieldPosition": true,
+ "TagHalfFieldPosition": false,
+ "TagGoalPosistion": false,
+ "FieldPositionIsDistance": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "121",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "ID": "63a37c3c-99e1-45ea-906c-3bdc5798ec0d",
+ "Name": "Category 17",
+ "Start": {
+ "$id": "122",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "123",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Hotkey": {
+ "$id": "124",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Position": 16,
+ "SubCategories": [
+ {
+ "$id": "125",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ },
+ {
+ "$id": "126",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ }
+ ],
+ "Color": {
+ "$id": "127",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "SortMethod": 1,
+ "TagFieldPosition": true,
+ "TagHalfFieldPosition": false,
+ "TagGoalPosistion": false,
+ "FieldPositionIsDistance": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "128",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "ID": "ddf63750-94f6-4cf6-9803-f4aa54e72a50",
+ "Name": "Category 18",
+ "Start": {
+ "$id": "129",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "130",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Hotkey": {
+ "$id": "131",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Position": 17,
+ "SubCategories": [
+ {
+ "$id": "132",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ },
+ {
+ "$id": "133",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ }
+ ],
+ "Color": {
+ "$id": "134",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "SortMethod": 1,
+ "TagFieldPosition": true,
+ "TagHalfFieldPosition": false,
+ "TagGoalPosistion": false,
+ "FieldPositionIsDistance": false,
+ "HalfFieldPositionIsDistance": false
+ },
+ {
+ "$id": "135",
+ "$type": "LongoMatch.Store.Category, LongoMatch",
+ "ID": "eb8e5d7d-fbfb-4c9c-b5d0-4bc9dcd41347",
+ "Name": "Category 19",
+ "Start": {
+ "$id": "136",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Stop": {
+ "$id": "137",
+ "$type": "LongoMatch.Store.Time, LongoMatch",
+ "MSeconds": 10000
+ },
+ "Hotkey": {
+ "$id": "138",
+ "$type": "LongoMatch.Store.HotKey, LongoMatch",
+ "Key": -1,
+ "Modifier": -1,
+ "Defined": false
+ },
+ "Position": 18,
+ "SubCategories": [
+ {
+ "$id": "139",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo local",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ },
+ {
+ "$id": "140",
+ "$type": "LongoMatch.Store.PlayerSubCategory, LongoMatch",
+ "PositionFilter": false,
+ "Name": "Plantilla del equipo visitante",
+ "AllowMultiple": true,
+ "FastTag": true,
+ "Capacity": 4,
+ "Count": 1
+ }
+ ],
+ "Color": {
+ "$id": "141",
+ "$type": "LongoMatch.Common.Color, LongoMatch",
+ "R": 255,
+ "G": 0,
+ "B": 0,
+ "A": 255
+ },
+ "SortMethod": 1,
+ "TagFieldPosition": true,
+ "TagHalfFieldPosition": false,
+ "TagGoalPosistion": false,
+ "FieldPositionIsDistance": false,
+ "HalfFieldPositionIsDistance": false
+ }
+ ],
+ "FieldBackground": {
+ "$id": "142",
+ "$type": "LongoMatch.Common.Image, LongoMatch",
+ "pngbuf": {
+ "$type": "System.Byte[], mscorlib",
+ "$value":
"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
U5ErkJggg=="
+ }
+ },
+ "HalfFieldBackground": {
+ "$id": "143",
+ "$type": "LongoMatch.Common.Image, LongoMatch",
+ "pngbuf": {
+ "$type": "System.Byte[], mscorlib",
+ "$value":
"iVBORw0KGgoAAAANSUhEUgAAAfQAAAEFCAYAAAAVGBU2AAAABHNCSVQICAgIfAhkiAAAIABJREFUeJzt3Vlwned93/Hv854NGwFCIkVStDY7kWJLihXJkuJFdhI7TpM6qaeTTptpe5WbTGcybSfT9LbTq1x1m6bNtJlJnCa2E1nWYlP7RlIiKW4iSHADse845+Dg7Nu7PL0AQJEUKQAkgPcsv4+GQ4J4cfgXDoDfeZb3/xiu8e/tvwHgv5r/RVhUQ2PV0Sg1BNbw350/Byy7fq9G4EQSDvYLDsG/tMY8Z+BLQD/gbF0lduV3s3X/hGrYgC2powbMgD2O4VXggPXJWkuQfqXjUxc3yvdH2DU0Sh3tXoP5Y/vHGAIiBBEwDsvfHWF/p4pcx6787C4u9PPqn/zJHrfS9W8N5o/Adl29SF+1shlWXycsf0Gdt9b+6S9+98jBr/zhS14k7oVXl8j1rAVrwDeY4L+YPycawTMWpw/4V8DvAp8H7g63TpFPWHvNGxGcXQ9Pd80PPBwDi4lYYt01OneVcGIeTjQIrU5pdobAdagXElQXu/HdKFgejca9n+95dLRkrXGtBaMXjhK+AJgHrgB/Z7EH/tj+USVq4CmDfR7Mg2FWJ3IrxiyHejW7g8F/+C7zAw9jIgFdu4vseXKGnv1ZTMSu/UAi61Qvxslc3MPixT145bj56H//s56OnQX2PDYMRl9r0hDuNvAo8H3gbQfzrx0wfwY8GG5dIp/NBg6LI/cx9v5XMBFLz/4c93/7CjvuX1KYy6aL99TZ+/QUe5+eItZdx6slOP/Cd/Bq8etnjEQaw3cczB86wJNhVyKyFr8eY+LDX8H6EeK9VfY8NUV8Ry3ssqTF3f1LC/Q9tIiJBMwP/gKFhbuWVy1FGo79FQeIhF2GyFoCL0Jm5HMYx9LRV6H7nmLYJUk7MND7UAYnFoA1LF55ABts4Y0UIrfNRPWVKU3B
BoZavgccS6ynph3tsi2shfiOKsZZnmevZHo15S4NS4EuTSPwzXKOK8xlGxljWb2XzXoRTblLw1Kgi4jcwvW3qCnIpbEp0EVERFqAAl1ERKQFKNBFRERagAJdRESkBSjQRUREWoACXUREpLlZUKCLiIi0BAW6NDx15hIRWZsCXUREpAUo0KXhGTXokoagqSJpWAYU6CIiIi1BgS4isi6aKpLGpkAXERFpAQp0ERGRFqBAFxERaQEKdBERkRagQBcREWkBCnQREZHmpl7uIiIirUKBLiJyCzpHQJqJAl1ERKQFKNBFRG5B5whIk1AvdxERkVahQJeGp3VMEZG1KdBFRERagAJdGp7WMUVE1qZAFxERaQEKdBGRddFmDmlsCnQREZEWoEAXEbkF3WEhzUSBLiIi0gIU6CIit3D9HRa63UIamwJdRESkBSjQRUREWoACXUREpAUo0KVpGMcu3wmsnceyjaz9ZO3cRAItpUvDUqBLUzDGEu+uQGDwalHdTiTbxq/GYCXU4z0V9IpSGlV0ox8QIcJO+tnNbrrZQZw4MWI4em0gW8hPxHnwdxKUF6PE+/q4+4H7NFKSbVHd0UX2d+IEnsODX3yI/kgCQxB2WQLLr61a9OeAxeLhUadGlSoZFkmSxKV+88vZQKBHiLCbe3iIL/AAD7KXe+mllwQJ4iSIENms/4+GYq3F8zxisVjYpbS3BPC91Td2rPwS2SZfXf3DM2FWITewWNy6SzweD7uUTWcJqONSo0qFMkkWmGSSCUaZYOKmwb6uQI8R4wEe5Dl+jYf4BXro2fTiG5XneWQyGfbs2RN2KSIicoNUKsX+/fvDLmPTGRwSK//10sce9vFLPMos0xznGGc4RYXKdR+zrkDfxW6+yW/wJR7b0NS6vWah09ziDMzVa1bff+Pba12/kTpup4YgCCgWi58K9I3Wsd4ablXH7Tzmev6NtR6z0Z6P233M261hI3Xo+bj9OvR8rP9j9
Hxcf02hUNhw3c32fKxaHlw/RBfdFMhzkfP4+Fffv2agx4nzEF/gEb54XZjXgzqpepJUbYGCV8C17oYKaxaBG2AqEfrqvWGXIiIi16jXXQZKp5lNT4VdyqZzjENXpJu7Yndxb8fn6Ix0YlY2DOzmHp7iGUYZpkwZVnYSrCPQE+xlLzE+WUO+UrzMyws/5XzhLEtuhopfwbfe1vxfhSzuJ3jG/xrdpc6wSxERkWuUSmX+avb/4NVvulGsqRnj0OF00BPdwYOdD/G9Pd/nqb5n6Ih0AHAfDxDl+r1dawZ6BIcOrg+zwcJZ/mLif7BQm9/E8htTZ9DFvsh+su5S2KWIiMgKay35Sp6B0scUo/mwy9lSHU4nnZEuHun54tVA76IL54Yt/utYEDdXh/mrin6BxXp604ptZBaLb/21LxQRkW1jjKFWr+E7rTk7fK1qUCFTX8QNPlnaXg7zDQd6m7Nct+lAREQaQ82tEUTUE2CVAn0NFosXKNBFRBpNpV6hRVug3BYF+ppsy274ExFpZpVaBSJqxbtKgb6GAEvdtt4OShGRZleoFbAaoV+lQF+DtQEVvxx2GSIicoOSV8TqsJyrFOifxS6P0Ct+5bquRSIiEr6yV0Kn3wErnwQF+mewLDfILzslqtVq2OWIiMg1SkFZI/RrbDjQ22mkagwEjqUcKZMtZsMuR0RErlH2S20Z57d6EaMR+loMuNE6SwV1ihMRaSQlr4im3D+x4UDf6Okwzc4AvvEp1gtrXisiItunEpTbatZ41Y3dW1lpGacR+loMBNan4lfWvlZERLZNyWvPKfdbUaCvg299Sn4x7DJERGRFEAQUggKacv+EAn0dPOuR93JhlyEiIitSmRTZRAZrFOirFOjr4FmPrKtd7iIijWI8OY7fo7bc11Kgr4MXeOTdXFtuvhARaURL9QyW4MYTRNua7kNfB9/xWDIZCkXtdBcRCZu1diXQ2y+PPotG6OtgHUspXmQmPR
N2KSIiAmTdJQX6DXQf+no4UDd10uVU2JWIiLS11VniJXepLWeMQZ3i7pivne4iIg3B8z1y/hKBRujXUaCvkxu4ZOtq/yoiEiZjDMnFBXKJLLTpLWs36RQHKNDXzbUuaTfdtlM8IiKNYnhhmFqHunfeSIG+Tq5xSdkFCiXtdBcRCdNcdRbP+rpl7QYK9HUKnIBsbInp9HTYpYiItLVkbQHf+mGX0XAU6OtkHKibGvOlubBLERFpW57nseDN46MucTdSoG9APXDJuIthlyEi0rZS2RSZaJrABGGX0nAU6Bvg2jqLdW2MExEJy1hqlGpHRevn17OgQN8Q17ikg6Q2xomIhCRZWcDDU6DfhHq5b4B1AjKRRSbTk2GXIiLSlhZq89oQdwsaoW+EA2VbZraonu4iItutVC4x589oQ9wtqJf7Rlio+GXmqrNhVyIi0nZGF0ZIxZIEjjbE3cCARugbY6BqqswFM1pHFxHZZmNLo1ScstbPb0GBvkF+xCNlFpha1Dq6iMh2mq5OUQ/qYZfRsBToG2WgZIvMlTTtLiKyXfLFPLN2GhcF+q1Ewy6g6Rio+BWStYWwKxERaRtjyVEWY2mtn38GjdBvQ9WpMuvPkM1nwy5FRKQtTBUmqZmq1s8/gwL9NgQRn6SdZ2JxIuxSRERanrWW2eoMtaAWdikNTYF+m3JejumSNsaJiGy1mdQME4zhGq2ffxYF+u0wUAjyTNYmqNf1BSYislWstVxJD5Exi1infTuVrkG93O9EPVZj2k4ykRoPuxQRkZa02mp8ojRGOShp/XwN6uV+uwwseRmmi1NhVyIi0pKMMSxmFxkNhqmaStjlNAzLzXNYI/Q7UPDzzNZm8H0dFCAishVG0sNknDRBRLerrUW93G+XgWq8wqh7hYmF8bCrERFpSZPlcYpBUdPt1zCf/mSol/sdM7DoZZgpTYddiYhIyymVS0zUx6lYTbevhwL9ThhYcjNMV6cJAk0HiYh
spvPTg8wwRRDVsuZ6KNDvUDlR5HL9AuOadhcR2TTWWkZKw+S8nKbb10mBfqccSNWTTJUmdAeAiMgmmc/Mc8W/RNHRUdXrpUDfBEtBhonKOJWa1nlERO6UtZYLC+dZCOaxUS1nrpfuQ98EbqLOUOUSw8krYZciItL0XM9luDxE3suFXUpT0Qh9MxhIuUmmK1P4gTZviIjcifGFcUaCK1SjmvXcCAX6Jsk6GUYrw2SLOlJVROR2WWsZyQ2TDZYgEnY1zUWNZTZJEA8Yr44xkR3XsoSIyG0qVYqMVK9QsJpuvxW1ft0GaT/JVGWSuqsze0VEbsfFuYtM+KN4MS/sUpqOAn0TleJFzubPMJ4eD7sUEZGmU61XuVg8T8pL6t7zz3CT1q+AAn1zOTBdm2S8NIbruWFXIyLSVCbTkwzVLlGKFsMupSkp0DfZUjTDhcIgqXwq7FJERJqG67lczl1k3p/TZrjbpEDfZDYWMFYZYao4of7uIiLrlMonuVK9TMHkwy6laSnQt0DKSTJUuEy2pFvYRETWYq3lYvoCo9Vhgph6edwuBfoW8OIuF3Pnmc5P6RY2EZE15Eo5hstDZOxi2KU0NQX6Fpm2k1zOX6RU1eYOEZGbWR3wjCwOM1S9jBuvh1xR07KgQN8ylXiZs9kzzObnNEoXEbnB6s/FbCnLhcIgSTuvW9XukA5n2SoOTARjXFwapFjR8X8iItda7Tp6JTXEucKA+rZvAo3Qt1AlXubjxVPMFTRKFxG5Ua6c40L+HHN2Rmm0CdTLfSs5MGqHObd4lqLW0kVErrLWMp4Z43zxHNWYRud3yIBeE225SqLMwOJp0qWURukiIiuypSwXcoPMMask2iT6NG41B8acEc4lz2otXUSET0bnZ3NnqMY1Ot8sCvRtUI1X+Dh9klQprVG6iLS9XCnHYPYsM0xpZ/smUqBvBweGo0OcnD+uUbqItLUgCJjIjnMmd1qj802mQN8m1XiFE+lj
JEtJ9XgXkbaVzCU5kfyIuah2tm82fTq3i4Hpzgk+mDhEtqwe7yLSfjzfYyQ7zJnCKdyYusJtNgX6NvKiHicKx5jKTuL5XtjliIhsi9W9Q8ncAsdTx0h3JLV2vgUU6NvJQKp7gfcn36VQ1RGBItIejDFU61WGli4zWBvAj+pEtU2mXu5hCCIBA95prqSuUHc15SQi7WEuN8fR+Q8pdOTCLqVlqZd7CAqdOd4ef5NcVV/YItK6VvOiVClxNnWGC8E5rKMMuVOWm38ONUIPgwODsTMcHfuQar0adjUiIlvGWst8cY4Pk4eodug2ta2kXu4hcRN13px/jXQxpdvYRKQlGWNI5ZK8OfI6410jGkJuEvPpHYXq5R4qA8n+OV4afJFyvRR2NSIim67u1bmSHeJk7SNNtW8DBXqIrGM5Yg9yYuwEnu9pf4KItAxrLalCkp8Pv0K+J6vb1LaBAj1kbk+dAxMvU6pplC4ircFaS76S59D4QUZ6hsIup20o0BvAxN2j/PTj56m5NY3SRaTp+YHPWGaE9xbfxsa0R2i7KNAbgQMfVA8ymhwhsPriF5HmZa0lW17i9ZFXWdqZDructqL70BtEfmeW/3fhr1ksLoZdiojIbbHWUqqVODx6kAHnlNbNt5lG6A1kuO8SL537qTrIiUhTCmzA2OIob6Zfw+vSeRXbTfehN5IoHPbf5cToCc2EiEhTCWxAqpDk+Ss/Jr0zGXY5LU2d4ppEtbvCS1PPk8wuhF2KiMi6WGsp10q8NfQmlzrOh11O21KgN6CJvlF+eO5vKZR1IpuINDZrLdZaBqYHeK/8lna1b4ObdIoDFOgNyRrLycgxjo4ewQ90zKCINLaF3Dwvj71AoUcHToVJgd6IDNQTNV7PHGBo9rLW00WkYS0Vl3jx4guM9Q6HXUrbU6A3KgOznVM8P/Jj5rNzYVcjIvIpdbfOobH3OeIfhmjY1YgCvYH5xudS5yA/G3mZpUIm7HJER
K6y1vLxxGkOLL1MrUvHojYCBXojM+A6LifcY3wwcUhnp4tIwxhLjvHyzAtkezTYaBQK9EZnIBfN8lbudU5PntLZ6SISurnMLC+M/D0jnVfCLkWWWVCgNwXrBCRj87yZfI2RBW08EZHwFMtF3hh9jQFzmsDRXTiNRL3cm4Tv+IxEL3Ng6hXml+bDLkdE2lAQBHw4dpjD1feoxarq1d5gNEJvFgaqpsq54AzvTb9NpqBDXERk+1hrOTl+nLeyr1PoyCvMG5B6uTcTB/KRPIeK7/HuxDsUyoWwKxKRNnF2aoAX5v6BqfjELXuJS2gMaITefBxLJpLmcP59js98pJPZRGTLDc1e5sDcK0zExgiMr9F5g1KgN6EgEjAfm+Wt9GucmDiune8ismWm09O8Mv0iFziH73gK8wamQG9SgeMzGRnj7cXXuTh3IexyRKQFLeYXeXvmdQaDAWoRbYJrdAr0JuY6LkPmEq/N/ZzhOd0PKiKbp1Kt8M7YmxytfEgpWlKYNwEFejMzUHdqDHoDvDZ7gMn0RNgViUgLqLk13h97l8Pl98lGMmC0Ca4ZKNCbnYFSpMjH7gnemnmD6cx02BWJSBNzPZeDI+/xdvZ1ktF5Akd7dJqFAr0VOFCI5jlSPsQbk6+ykFXjGRHZON/3OTx6iNeWfsZ0dEph3mQU6K3CQD6a41jlQ96ffpd0Ph12RSLSRIIg4Mjoh7yxeIC56IzaujYhBXorcSAbXeLd4lu8O/M22VI27IpEpAlYazk1cZIDiy8xER3FNwrzJqPDWVqSY1mKLPJ+7m2OzH6gbnIisqaPJ07z84WXmHDGlsNcO9qbkg5naUHWsaSjSV5NvcLhqYOUqqWwSxKRBmSt5fzUIC/PvcCQcxFPjWOawq1a70a3uQ7ZJtZYkrF5fpZ+kcAPeO6Bb9HX3Rd2WSLSIKy1nJn8mJdmf8JQRGHeCjYc6DqcpXlYx5JOJHlx8XkqXpnvfuG3FeoiQh
AEnBo/yY+n/paprgmsCRTmTcR8+snS4SxtwUC+M8uruVd488prLBUzYVckIiEKgoBTEyf5yfSPmeoaV5i3EE25twMDxa4CLxdeoHSpzO/84j9md+89mm0RaSPWWjzf48T4cX44+Tcs9M4qyFuMRuhtpNZV5c3yAV65/BKLxUVtcBRpE9ZavMDjo/Fj/N34DxTmLUoj9Dbjdtd5p/wG9UGX3334n7C/fz/GGI3WRVrQ6ov2YrXIicnjPD/9I9I7FxTmLUoj9Dbkdbm8x5v81Zm/ZCozRWADjdZFWpDFki1neXv4TX44+wOFeYvTfejtKm45t+M0f376v3Fx/gKe7+m5FWkhfuAzl53l50Mv8+LS8+R6l8IuSbaYRujtLAJjdw3z11f+kkvJi9TcmkJdpAX4gc9cbpaXhn7Ka8WfUelWc6l2sOFA11prizEw0TPKX1z5nxybOkq5XlaoizQpay2u7zKaHuEfhn7EoeBd3K562GXJJlOnOPlMyZ45fjT9N7jW5cm9T3J3z66wSxKRDbDWUvNqXFkc4pXRFxmInMbGdfxpO1Ggy1WZnjQ/WPi/DGe/xfce+j32938Ox9GqjEijC2zAUmmJM8nTvDL7IrMdU9r81sJu0ikOUKDLDWodVd5z32JxcJF//qU/4IGdDxKPxcMuS0RuIQgC5nNzHJx5n3eX3iDbpc1v7UqBLp9iYwED0ZNkL2X4/n2/z+O7f1k94EUajLWWIAi4OHeBt2bf4IR3VOvlbU7zqXJzBiY6R/nR1N/w7vhbLOQWwq5IRK5Rc2sMzJzhby//gKPBIdyEwrzdaYQut2Yg2TnPS5mfsFBZ4Nf3f5sv3PMLRCP6shEJUyqX4uTccX4++zLJ3jkNzQRQoMtaDJQ7Sxyuv0dqNMl33d/m4bseob+nP+zKRNqO7/tcmR/iWPoIhzLvUejLhV2SNBAFuqzNQD1RYzA4Q2pygWezX+Nre77BA7sf1C54kS1krb3
a+yNbyDKYPMvrswcYiQ7h9XohVycNxIICXTYgcALmEjO8VXiNVDXJr9W+zcP3PEJXR1fYpYm0nNUGT9ZaJlMTHE0e4WjmA+Y6p7FGzZ/k0zYc6Ooi1uYcKCWKHPePMj81xzeK3+KpfU+zr39f2JWJtIzVkXmtvrzx7WDyXQb9AcpdJd1fLrekEbpsnAE3WmfUDJPP5FmozfNc9dd4aNdDxGKxsKsTaWqrg6b5zDzn0gO8k3qTicgYXtxVmMtn2nCgq5e7rLKRgFRinoPVd5mdmuGppaf5lT1Pse9ujdZFble1VuX83CBHlj7gUnWQxXiawFELV/lMBjRClzvlQCVe4rx3lrmlGSYr43yt8hy/uPthOhOdYVcn0vBWR+TGGCaTE5xYOM6pwnEmnFHq8bpG5bJuCnTZFH7UI+Us8IF7kKmZSZ7KPsOv3vs19vXv06yOyGcwxlCulhmYPcMH6YNccs9TiBWwEY3KZWMU6LJ5HKg5VYb9IdL5FHPVWZ7b8y0e2fNLJOKJsKsTaUgzizMcnz3GseKHTJtJ6omaRuVyWxTosumCiE/GpDnqHWZiZozH00/w9f3f4IFdDxJxImGXJ9IQMoUMA3MfczT3IWP+MPlIjkCjcrkDCnTZGiuj9XF/hHQ1yfj4KE+nnuUr9z3Drl6dtS7tq1qvMpS8zOGFg1x2L5AySbyodrDLnVOgy5ayEUvByXPeH2CqMM65SwN8a/dv8Oi+x+ju6A67PJFtEwQBYwujHJp6n/P+WeadWWqRmvqwy6ZRoMvWM+BHfZZshjP+KWbmp/jSwuN896Hf5nO7PqfDXqQlXdu2dbGwyMmp4xzJfcCEGaUcKWvTm2w6/SSV7WOgHq0xE0yRDlKMDY3w9Myz/MYjv0lfV592w0tLWd29fmH2PO8tvM1lLlKI5AkcX9PrstnUy11CsrK+PmqGWfDmOPPxxzzR9SS/9aV/RFeiW8EuTenaEXm1XmVo7jLvzb3D
EBfJRjLUTV3T67Kl1MtdQhNEfAo2z+X4ecb8YQZOnubpjq/y3S//FrFoTMEuTcUYQ92tM7YwxpuTr3OeAXKxLJ7RhjfZXJab57BG6BIuA0EkoGorXE5cYNwf5czRU3yz/9d57rFvKtSlKfi+z1xmjjdHXuOMf4p0PIWLRuSyvdTLXRqDAd/4lE2Js50fc7lwkdOHTvLNfb/Okw8/GXZ1IjcVBAGLuUVev/QqJ2vHWOiZw49qjVy2lvn0F5h6uUsDMmBNQDVe5ljsMKezH/HYh0/w1b5v8LUvfp1IRI1pJHzWWsbnxzkw9AqDDJDrXsKP+TqnXEKlQJfGtDJir1DhhHOUU8WPOPD2K3x91zf5zuO/STwaxzGOZoxk2wQ2IAgCrsxd4WcTLzHgnqK+oxZ2WSJXKdCl8RkIYgEjd19m3Bvm0Pvv8tWdz/HtR79DT2ePgl22jLUWay0BAWfHBzgw/DMuxs7h9tahI+zqRK6nQJfmsdKgZvyuEaa8CQ4efYdn+7/Gs/d/lb19e4k7caKRqMJdbsu1d/AENsD1XWp+jZOjxzm68CGXnPPU7qpqfVwalgJdmo8BP+Yx2z/Fi/7f89aF1/iSeYxn932VJ+57kkQkQSwSw3G0xVg2xgs8XL/OzNIsx+eOcnzpKAtdc/g7tNFNGp/uQ5fmFoFiT57j9ggfp0+yf+p+nup/mmfue5Zd3bvpjHVq1C6fyQ98am6Nslfm/Mw5js0d5WIwSKmrCL36eSfNQyN0aQ0G3Hid8fgwU5Uxjp47zKNdv8xX9j/Dff330+F00BnrJBKJKNzb1OpgxBhDEARU3SpVr0KmkmFw/hyn0icYj45Q7aro/nFpSroPXVqOn/CZTUwza6c5NP4u+67s55GuL/LlvU+wf+d99MR76E5062z2NlStVynUCmRrS5ydHWBw6SwTZoxSRwG7Q6NxaQ7qFCftx0Cts8p45wjj3ggfjh7ifh7k8bu+zON7f5n+z
rvYkdhBIpa4+kJVL1hbi7UW13Mp1UoUagWG01c4tXCCcW+ExY7U8tq4SItQoEt7iEKxN88FznKpcJ730+9wX+x+Ht39OA/sfIDeWB89sR3s7NmJ4+g2uGYWBAGVWoVsJUvZLzFTmOFS8gKjpRHmIzNUusuaUpemdpNOcYACXdpQ0Omz0DnLArOczhynd6qfe6P7eajnCzyx/wl2dvTTE+lh545+Io7W3JtBEASUKiVy1Rx5N8dEdpxzqbPMubMknTnq3TXYGXaVIltLgS5tLegIyHYskmWRC/WzfHDxfe6N7ef+2IM8+bmv0N/VT1e0m96OXjo7OsMuV1ZYa/EDn3wpT8krUaznuZy8zKWlC8x406SjSbxuF7rCrlRk+yjQRVbFIRdfIscSF91Bjlw+zD3RPeztvJfP3/UF7t9xP93RHnrjffR19NGRUKuw7RQEAdlilnw9R8EtsFTPMJS+zEx5mlR9gXQ0hd/jhV2mSGgU6CI3E4PCXTkK5BixQxxJH6R/6m72dOzjvp77eaj78+zv3U93tIeuaDc9iR4F/CbzfZ9CuUDZK1HySuTqOS6nLzJRGWehMkfapKj31JZH4RqJiyjQRdZkwCYsmUSaDGku1gfpyHewe/4ediV2c3d8N/t69nFP5166nC66TBfd0R76e/pJxBNag18H31+ePs9VsxTdAiW/RMEWmClOs1hLk6qlSNUXyHdksTELsbArFmk8CnSRjXIs1a4KU0wwxQS4EE3G6PX72Bnpp9f0cXd0F/f3PMDurnvoinbRGemkO9ZDb1cvHYmOtg55z/MolPMUagXKXpmqXyFfLzBVmGS2Os1ifZGsmyEfzeN21pZ3pMdXfonILSnQRe6UAS/ukmF5BI8F4xkS853sYAc7Yr30RHroi/ezp3MPd8XvpjvaQ3e0i85INz3xHvq7lkfzN/afv7a7WTO4tjW053vky3ny1Txlr0jJL1P2SuTdHAvVeTK1RfJugZ
JXIO/nKcWLBHFf0+ciG2dBgS6y+QzYmKUaK1OlTIoFAKwH0XSUzqCLnkgPPdFeeqI99MX7uDtxNz3RHXRGupbb1Ea6iDtxEk6CDqeDvo6ddHd2E43e/Fv2VsF/bcDe6n2rf7/WY1yPa5PlAAAEOklEQVR7nbWWSq1CrpKj4pWp+lXqtkYtqFHxK1T9CmW/zFI9w1J9iYKbp+gVKHoFSrZEPVFb/umTWPklIndMh7OIbBMTAb/Lo0ieInlgdvkdNbAFiPgROp1OOpxOuiJdxJ0ECSdBZ6STndG76I/10xnpJGZixEycmBNb/rMTJ+7EiDkxIkRZfkUBERNZft1u7cqfzXUtIx3HwQ88LBYn4uD6LhiDMeBbH9e6eNalHiz/XgtqeIFL3brUgxoFL8+im6bkl6gGVepBjapfpRKUqfgVXONi4xYTBSIrvxTeIltGI3SRsDlgOiDAp0SREkUWr32/D9QMMS9GNIgRM1FiTpzoyu/Lob4a6BFuGeiY616QO46Db1cC3bk+0AMC3MDFte4nwe7X8VbednHxIh5B1F9e4zZ8EtrXaI6FApHWoMNZRJpB1OJG67jUqdzqmhsnz1bfvvZb1tzk/QDBNe+79uOuvV4v/0UalQF1NBYREWkJCnQREZEWoEAXERFpAQp0ERGRFqBAFxERaQEKdBERkRagQBcREWkBCnQREZHmZkGBLiIi0hI2HOjq5S4iIhIe+6m2kMs0QhcREWkBGw509XIXEREJj/n0sUfq5S4iItIqFOgiIiItQIEuIiLSAhToIiIiLUCBLiIi0gJ0H7qIiEgL0AhdRESkBeg+dBERkSaiTnEiIiItTIEuIiLSRG7SKQ5QoIuIiLQEBbqIiEgLUKCLiIi0AAW6iIhIC1Cgi4iItAAFuoiISHOzoEAXERFpCerlLiIi0gI0QhcREWkB6uUuIiLS3AxohC4iItISFOgiIiItQIEuIiLSAhToIiIiLUCBLiIi0gI
U6CIiIi1AgS4iItIC1gz0gAAX77q/e2zHl/n9ff+CXfHdW1aYiIhIu0s4Hfxq/9f59u7v0hfbefXv67hYrnZutQDRtR7MxSVD+rq/+1LPo/znR/6Mf/f5PyXrLlHyitc+sIiIiNyhRKSDndGd7Iz1syt+Dx1Ox9X3pUni4193fRQoAL23esAaVcYZI02KXey++o/si+xnb+JefHwCG4ACXUREZNMYHCImgmOun0y3WD7mJDWqK28DkI8CPwT+w60e0GKZZILX+Tnf4/vspP+Tf8wYokRXms6JiIjIVvLxeZ93GOAMLi4ABrwAfhL5yn964nQEJwLmcSBx/YcuH63m45s0aaaZsjGi7KDPxIl/ctXKdYa1G73feO1aH7uR69dbx+3WsJ6PudMa1lPHZtWwkce8nev1fGysho085u1cr+djYzVs5DFv53o9HxurYSOPeTvXN/rz4eExzhhv8Con+ciWKC5fClPAf7TwivkD+0/Zxz0JA3sCzHNg7gcbv/HBDBAhQoIO9nFv1yN88XN7uXdvNz29ceIdrOPJEBERkfXx8NwKpcISmcxlLoxPMJ4tUbIeLhaKFjvqY49EcDIG4/5/jtcO8KozHA0AAAAASUVORK5CYII="
+ }
+ },
+ "GoalBackground": {
+ "$id": "144",
+ "$type": "LongoMatch.Common.Image, LongoMatch",
+ "pngbuf": {
+ "$type": "System.Byte[], mscorlib",
+ "$value":
"iVBORw0KGgoAAAANSUhEUgAAAZAAAAEsCAYAAADtt+XCAAAABHNCSVQICAgIfAhkiAAACZpJREFUeJzt2r+rJWcdx/FnZp459+wuqOgfYBEEA4KNlShooyn2DxAEIUm1fYpYioUWAcutoo2Ff0AKtVCLkMpGEBUkXcqkkWT33jPPzFhcVxJ2l/B89ro3V16vZmE5X+Y7v/Z9z+4O5ZO+cutzt14ajsOL2/n2uW3ZbhWeq+k4zKWUsp7vy3XvgvvxWeN+XI9xHh+Ox/Ff+/n+t4f/evi7Uso/SyllKKWUvZT9WrcD4MYZSym3r3sJAG6esZTy7eteAoCbZyylfPG6lwDg5hnLf/4dBAB6jNe9AAA3k4AAEBEQACICAkBEQACICAgAEQEBICIgAEQEBIBIfZbhn+8/e+uqFuHS/VfeuFtKKfd++Zpr+xlw/9X/3I833Y/PAvfjf+f14cd3e2d8AwEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIAJF63QvA/5uLj87r1rahZ6ad2ni6OE09M1vbhtOD8+53+PzDh3PvzOn8VNfWus5pW7ZxOS1d57Tv+3B6cPH0c9ovf3nnN3964RP7PbyY97L3XvNpXdauH6L3
tg2tta5rvm97OZ1fdF/zdrHUfe87p3XZxq21vudo24e2LPX1vvVKKc8YkA/ee/92z+fb+Wlqp9Z1w9pp6Z4ppZTlYpnasvQda1mntfNY66lNbek8p6VN66fc5D/+6rcvPn6sdWxL58PR1nFta9dMOy3dM2vrf3BLyR741tZpW/te/LWt09a2+Bv3/VfeuJvOcvX+8vs/P/Z+8PwNpZQf7qX8Ohn+8stfuuJ14Oar89SGadx7ZsZp2mqd1p6ZYRz2eja3vu1KmY+HpXemHmqbau06p2EatjrPXec0DsM+3z489Zz+8fZfXyillK9+62vvfvz3D8ezZRiGrv3qoa7TXLeu/eZxnw9913wcxnJ259h9zQ93zto49D1H9axu9ezQd83ruB9vHdtPvvDT7/dtePkNpGvBj7vz+TsPej4/1rpO89h3w2pdp9o3U0opU53Wepi75qY6rWOdumbqXNfp0Dcz1brWuT7xJj/6yerr3/vG359wrG06PHnuqcc61K3OfX8w1Xne5rO+F78e6lYPfTP/nTv2PfD1ULdD50tSz+ZtPvbvd//Vy28e99587a3eWa7eo4B89+WXHns/eP6e6a+wfvSLe3+4qkW49Cgg3/zBd979tM8CXCf/CwuAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAE
BEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASBSr3sB+H9z8dF53do29My0UxtPF6epZ2Zr23B6cN79Dp9/+HDunTmdn+raWtc5bcs2Lqel65z2fR9ODy6efk775S/v/OZPL3xiv4cX81723ms+rcva9UP03rahtdZ1zfdtL6fzi+5r3i6Wuu9957Qu27i11vccbfvQlqW+3rdeKeUZA/LBe+/f7vl8Oz9N7dS6blg7Ld0zpZSyXCxTW5a+Yy3rtHYeaz21qS2d57S0af2Um/zHX/32xcePtY5t6Xw42jqube2aaaele2Zt/Q9uKdkD39o6bWvfi7+2ddraFn/jvv/KG3fTWa7eX37/58feD56/oZTyw72UXyfDX375S1e8Dtx8dZ7aMI17z8w4TVut09ozM4zDXs/m1rddKfPxsPTO1ENtU61d5zRMw1bnueucxmHY59uHp57TP97+6wullPLVb33t3Y///uF4tgzD0LVfPdR1muvWtd887vOh75qPw1jO7hy7r/nhzlkbh77nqJ7VrZ4d+q55HffjrWP7yRd++v2+DS+/gXQt+HF3Pn/nQc/nx1rXaR77blit61T7ZkopZarTWg9z19xUp3WsU9dMnes6HfpmplrXOtcn3uRHP1l9/Xvf+PsTjrVNhyfPPfVYh7rVue8PpjrP23zW9+LXQ93qoW/mv3PHvge+Hup26HxJ6tm8zcf+/e6/evnN496br73VO8vVexSQ77780mPvB8/fM/0V1o9+ce8PV7UIlx4F5Js/+M67n/ZZgOvkf2EBEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICA
gAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAiIABEBASAiIAAEBEQACICAkBEQACICAgAEQEBICIgAEQEBICIgAAQERAAIgICQERAAIgICAARAQEgIiAARAQEgIiAABAREAAiAgJAREAAiAgIABEBASAyllL2614CgJtnLKV8cN1LAHDzjKWUt697CQBunrGU8uC6lwDg5hlKKWUP/x1kKOWtq10HgOuwl3K3d+bf5QExFK9CmrIAAAAASUVORK5CYII="
+ }
+ },
+ "Capacity": 32,
+ "Count": 20
+}
+</ConsoleOutput>
+ <ConsoleError />
+ </UnitTestResult>
+ </Results>
+ </TestRecord>
+ </Tests>
+ </TestRecord>
+ </Tests>
+ </TestRecord>
+ </Tests>
+ </TestRecord>
+ </Tests>
+ </TestRecord>
+ </Tests>
+</TestRecord>
\ No newline at end of file
diff --git a/LongoMatch.Multimedia/LongoMatch.Multimedia.mdp b/LongoMatch.Multimedia/LongoMatch.Multimedia.mdp
index 0c532ba..af237a0 100644
--- a/LongoMatch.Multimedia/LongoMatch.Multimedia.mdp
+++ b/LongoMatch.Multimedia/LongoMatch.Multimedia.mdp
@@ -59,12 +59,12 @@
</Contents>
<References>
<ProjectReference type="Project" localcopy="True" refto="libcesarplayer" />
- <ProjectReference type="Gac" localcopy="True" refto="glib-sharp, Version=2.12.0.0, Culture=neutral,
PublicKeyToken=35e10195dab3c99f" />
+ <ProjectReference type="Package" localcopy="True" refto="glib-sharp, Version=2.12.0.0, Culture=neutral,
PublicKeyToken=35e10195dab3c99f" />
<ProjectReference type="Project" localcopy="True" refto="LongoMatch.Core" />
- <ProjectReference type="Gac" localcopy="True" refto="Mono.Posix, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=0738eb9f132ed756" />
- <ProjectReference type="Gac" localcopy="True" refto="System, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089" />
- <ProjectReference type="Gac" localcopy="False" refto="gdk-sharp, Version=2.12.0.0, Culture=neutral,
PublicKeyToken=35e10195dab3c99f" />
- <ProjectReference type="Gac" localcopy="True" refto="gtk-sharp, Version=2.12.0.0, Culture=neutral,
PublicKeyToken=35e10195dab3c99f" />
- <ProjectReference specificVersion="False" type="Gac" localcopy="False" refto="System.Core,
Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+ <ProjectReference type="Package" localcopy="True" refto="Mono.Posix, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=0738eb9f132ed756" />
+ <ProjectReference type="Package" localcopy="True" refto="System, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089" />
+ <ProjectReference type="Package" localcopy="False" refto="gdk-sharp, Version=2.12.0.0, Culture=neutral,
PublicKeyToken=35e10195dab3c99f" />
+ <ProjectReference type="Package" localcopy="True" refto="gtk-sharp, Version=2.12.0.0, Culture=neutral,
PublicKeyToken=35e10195dab3c99f" />
+ <ProjectReference type="Package" specificVersion="False" localcopy="False" refto="System.Core,
Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</References>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/LongoMatch.Plugins/CSVExporter.cs b/LongoMatch.Plugins/CSVExporter.cs
index 4a89d18..d1e8878 100644
--- a/LongoMatch.Plugins/CSVExporter.cs
+++ b/LongoMatch.Plugins/CSVExporter.cs
@@ -76,7 +76,7 @@ namespace LongoMatch.Plugins
}
public void Export() {
- foreach (Category cat in project.Categories) {
+ foreach (Category cat in project.Categories.List) {
ExportCategory (cat);
}
File.WriteAllLines(filename, output);
@@ -91,25 +91,15 @@ namespace LongoMatch.Plugins
/* Write Headers for this category */
headers = "Name;Start;Stop;Team";
- foreach (ISubCategory subcat in cat.SubCategories) {
- TagSubCategory ts = subcat as TagSubCategory;
- if (ts == null)
+ foreach (SubCategory subcat in cat.SubCategories) {
+ if (subcat == null)
continue;
- foreach (string desc in ts.ElementsDesc()) {
- headers += String.Format (";{0}:{1}", ts.Name, desc);
+ foreach (string desc in subcat.Options) {
+ headers += String.Format (";{0}:{1}", subcat.Name, desc);
}
}
- /* Players subcategories */
- foreach (ISubCategory subcat in cat.SubCategories) {
- PlayerSubCategory ps = subcat as PlayerSubCategory;
- if (ps == null)
- continue;
- headers += ";" + ps.Name;
- }
- output.Add (headers);
-
foreach (Play play in plays.OrderBy(p=>p.Start)) {
string line;
@@ -119,28 +109,16 @@ namespace LongoMatch.Plugins
play.Team);
/* Strings Tags */
- foreach (ISubCategory subcat in cat.SubCategories) {
- TagSubCategory ts = subcat as TagSubCategory;
- if (ts == null)
+ foreach (SubCategory subcat in cat.SubCategories) {
+ if (subcat == null)
continue;
- foreach (string desc in ts.ElementsDesc()) {
- StringTag t = new StringTag{SubCategory=subcat, Value = desc};
+ foreach (string desc in subcat.Options) {
+ Tag t = new Tag{SubCategory=subcat, Value = desc};
line += ";" + (play.Tags.Contains(t) ? "1" : "0");
}
}
- /* Player Tags */
- foreach (ISubCategory subcat in cat.SubCategories) {
- PlayerSubCategory ps = subcat as PlayerSubCategory;
- if (ps == null)
- continue;
-
- line += ";";
- foreach (PlayerTag p in play.Players.GetTags (ps)) {
- line += p.Value.Name + " ";
- }
- }
output.Add (line);
}
output.Add("");
diff --git a/LongoMatch.Plugins/LongoMatch.Plugins.mdp b/LongoMatch.Plugins/LongoMatch.Plugins.mdp
index 4708654..75a9909 100644
--- a/LongoMatch.Plugins/LongoMatch.Plugins.mdp
+++ b/LongoMatch.Plugins/LongoMatch.Plugins.mdp
@@ -18,10 +18,10 @@
<File subtype="Code" buildaction="Compile" name="CSVExporter.cs" />
</Contents>
<References>
- <ProjectReference type="Gac" localcopy="True" refto="System, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089" />
+ <ProjectReference type="Package" localcopy="True" refto="System, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089" />
<ProjectReference type="Project" localcopy="True" refto="LongoMatch.Addins" />
<ProjectReference type="Project" localcopy="True" refto="LongoMatch.Core" />
- <ProjectReference type="Gac" localcopy="False" refto="Mono.Addins, Version=0.6.0.0, Culture=neutral,
PublicKeyToken=0738eb9f132ed756" />
- <ProjectReference specificVersion="False" type="Gac" localcopy="False" refto="Mono.Posix,
Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756" />
+ <ProjectReference type="Package" localcopy="False" refto="Mono.Addins, Version=0.6.0.0, Culture=neutral,
PublicKeyToken=0738eb9f132ed756" />
+ <ProjectReference type="Package" specificVersion="False" localcopy="False" refto="Mono.Posix,
Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756" />
</References>
</Project>
\ No newline at end of file
diff --git a/LongoMatch.Services/LongoMatch.Services.mdp b/LongoMatch.Services/LongoMatch.Services.mdp
index 1cf8a74..1027439 100644
--- a/LongoMatch.Services/LongoMatch.Services.mdp
+++ b/LongoMatch.Services/LongoMatch.Services.mdp
@@ -27,7 +27,6 @@
<File subtype="Directory" buildaction="Compile" name=".." />
<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" />
<File subtype="Code" buildaction="Compile" name="Services/FileDB.cs" />
</Contents>
diff --git a/LongoMatch.Services/Services/Core.cs b/LongoMatch.Services/Services/Core.cs
index 879dc8f..bfec6eb 100644
--- a/LongoMatch.Services/Services/Core.cs
+++ b/LongoMatch.Services/Services/Core.cs
@@ -82,20 +82,15 @@ namespace LongoMatch.Services
ToolsManager toolsManager;
TemplatesService ts;
- ts = new TemplatesService (Config.TemplatesDir);
+ ts = new TemplatesService ();
Config.TeamTemplatesProvider = ts.TeamTemplateProvider;
Config.CategoriesTemplatesProvider = ts.CategoriesTemplateProvider;
- Config.SubcategoriesTemplatesProvider = ts.SubCategoriesTemplateProvider;
/* Start DB services */
dbManager = new DataBaseManager (Config.DBDir, guiToolkit);
dbManager.SetActiveByName (Config.CurrentDatabase);
Config.DatabaseManager = dbManager;
- /* Start Migration */
- MigrationsManager migration = new MigrationsManager(ts, dbManager);
- migration.StartMigration();
-
/* Start the rendering jobs manager */
videoRenderer = new RenderingJobsManager (multimediaToolkit, guiToolkit);
Config.RenderingJobsManger = videoRenderer;
diff --git a/LongoMatch.Services/Services/EventsManager.cs b/LongoMatch.Services/Services/EventsManager.cs
index 1578a47..2f275dc 100644
--- a/LongoMatch.Services/Services/EventsManager.cs
+++ b/LongoMatch.Services/Services/EventsManager.cs
@@ -54,6 +54,7 @@ namespace LongoMatch.Services
this.renderer = renderer;
Config.EventsBroker.OpenedProjectChanged += HandleOpenedProjectChanged;
catsTime = new Dictionary<Category, Time>();
+ ConnectSignals ();
}
void HandleOpenedProjectChanged (Project project, ProjectType projectType,
@@ -67,12 +68,25 @@ namespace LongoMatch.Services
if (project == null)
return;
+ if (player != null) {
+ Console.WriteLine ("Disconnecting");
+ player.Prev -= OnPrev;
+ player.SegmentClosedEvent -= OnSegmentClosedEvent;
+ player.DrawFrame -= OnDrawFrame;
+ player.PlaybackRateChanged -= HandlePlaybackRateChanged;
+ }
+
player = analysisWindow.Player;
capturer = analysisWindow.Capturer;
- if (this.analysisWindow != analysisWindow) {
- this.analysisWindow = analysisWindow;
- ConnectSignals();
+
+ if (player != null) {
+ Console.WriteLine ("Connecting");
+ player.Prev += OnPrev;
+ player.SegmentClosedEvent += OnSegmentClosedEvent;
+ player.DrawFrame += OnDrawFrame;
+ player.PlaybackRateChanged += HandlePlaybackRateChanged;
}
+
}
void Save (Project project) {
@@ -98,14 +112,6 @@ namespace LongoMatch.Services
Config.EventsBroker.ShowProjectStatsEvent += HandleShowProjectStatsEvent;
Config.EventsBroker.TagSubcategoriesChangedEvent +=
HandleTagSubcategoriesChangedEvent;
-
- /* Connect player events */
- if (player != null) {
- player.Prev += OnPrev;
- player.SegmentClosedEvent += OnSegmentClosedEvent;
- player.DrawFrame += OnDrawFrame;
- player.PlaybackRateChanged += HandlePlaybackRateChanged;
- }
}
void HandleTagSubcategoriesChangedEvent (bool tagsubcategories)
@@ -338,6 +344,7 @@ namespace LongoMatch.Services
void OnDuplicatePlay (Play play)
{
Play copy = Cloner.Clone (play);
+ copy.ID = Guid.NewGuid();
/* The category is also serialized and desarialized */
copy.Category = play.Category;
openedProject.AddPlay (copy);
diff --git a/LongoMatch.Services/Services/FileDB.cs b/LongoMatch.Services/Services/FileDB.cs
index 35d1ee4..0be3f4a 100644
--- a/LongoMatch.Services/Services/FileDB.cs
+++ b/LongoMatch.Services/Services/FileDB.cs
@@ -45,7 +45,7 @@ namespace LongoMatch.DB
}
if (File.Exists(dbPath)) {
try {
- projectsDB = SerializableObject.Load<LiteDB> (dbPath);
+ projectsDB = Serializer.Load<LiteDB> (dbPath);
projectsDB.DBPath = dbPath;
}
catch (Exception e){
@@ -93,8 +93,8 @@ namespace LongoMatch.DB
public bool Exists (Project project) {
bool ret = false;
- if (projectsDB.ProjectsDict.ContainsKey (project.UUID)) {
- if (File.Exists (Path.Combine (dbDirPath, project.UUID.ToString()))) {
+ if (projectsDB.ProjectsDict.ContainsKey (project.ID)) {
+ if (File.Exists (Path.Combine (dbDirPath, project.ID.ToString()))) {
ret = true;
}
}
@@ -145,7 +145,7 @@ namespace LongoMatch.DB
try {
string projectFile = Path.Combine (dbDirPath, id.ToString());
if (File.Exists (projectFile)) {
- return SerializableObject.Load<Project> (projectFile);
+ return Serializer.Load<Project> (projectFile);
}
} catch (Exception ex) {
Log.Exception (ex);
@@ -157,16 +157,16 @@ namespace LongoMatch.DB
string projectFile;
try {
- projectFile = Path.Combine (dbDirPath, project.UUID.ToString());
+ projectFile = Path.Combine (dbDirPath, project.ID.ToString());
project.Description.LastModified = DateTime.Now;
projectsDB.Add (project.Description);
try {
if (File.Exists(projectFile))
File.Delete(projectFile);
- SerializableObject.Save(project, projectFile);
+ Serializer.Save(project, projectFile);
} catch (Exception ex) {
Log.Exception (ex);
- projectsDB.Delete (project.Description.UUID);
+ projectsDB.Delete (project.Description.ID);
}
return true;
} catch (Exception ex) {
@@ -203,7 +203,7 @@ namespace LongoMatch.DB
continue;
}
try {
- Project project = SerializableObject.Load<Project> (file.FullName);
+ Project project = Serializer.Load<Project> (file.FullName);
projectsDB.Add (project.Description);
} catch (Exception ex) {
Log.Exception (ex);
@@ -246,10 +246,10 @@ namespace LongoMatch.DB
}
public bool Add (ProjectDescription desc) {
- if (ProjectsDict.ContainsKey (desc.UUID)) {
- ProjectsDict[desc.UUID] = desc;
+ if (ProjectsDict.ContainsKey (desc.ID)) {
+ ProjectsDict[desc.ID] = desc;
} else {
- ProjectsDict.Add (desc.UUID, desc);
+ ProjectsDict.Add (desc.ID, desc);
}
return Save ();
}
@@ -266,7 +266,7 @@ namespace LongoMatch.DB
bool ret = false;
try {
- SerializableObject.Save (this, DBPath);
+ Serializer.Save (this, DBPath);
ret = true;
} catch (Exception ex) {
Log.Exception (ex);
diff --git a/LongoMatch.Services/Services/HotKeysManager.cs b/LongoMatch.Services/Services/HotKeysManager.cs
index b641992..53d3aca 100644
--- a/LongoMatch.Services/Services/HotKeysManager.cs
+++ b/LongoMatch.Services/Services/HotKeysManager.cs
@@ -60,7 +60,7 @@ namespace LongoMatch.Services
dic.Clear();
ignoreKeys = false;
- foreach(Category cat in project.Categories) {
+ foreach(Category cat in project.Categories.List) {
if(cat.HotKey.Defined &&
!dic.ContainsKey(cat.HotKey))
dic.Add(cat.HotKey, cat);
diff --git a/LongoMatch.Services/Services/ProjectsManager.cs b/LongoMatch.Services/Services/ProjectsManager.cs
index b8ed6a8..217803c 100644
--- a/LongoMatch.Services/Services/ProjectsManager.cs
+++ b/LongoMatch.Services/Services/ProjectsManager.cs
@@ -132,18 +132,18 @@ namespace LongoMatch.Services
}
void SaveCaptureProject(Project project) {
- Guid projectID = project.UUID;
+ Guid projectID = project.ID;
string filePath = project.Description.File.FilePath;
/* scan the new file to build a new PreviewMediaFile with all the metadata */
try {
- Log.Debug ("Saving capture project: " + project.UUID);
+ Log.Debug ("Saving capture project: " + project.ID);
RemuxOutputFile (Capturer.CaptureSettings.EncodingSettings);
Log.Debug("Reloading saved file: " + filePath);
project.Description.File = multimediaToolkit.DiscoverFile(filePath);
- foreach (Play play in project.AllPlays ()) {
+ foreach (Play play in project.Timeline) {
play.Fps = project.Description.File.Fps;
}
DB.AddProject(project);
@@ -171,7 +171,7 @@ namespace LongoMatch.Services
CloseOpenedProject(true);
}
- Log.Debug ("Loading project " + project.UUID + " " + projectType);
+ Log.Debug ("Loading project " + project.ID + " " + projectType);
PlaysFilter = new PlaysFilter(project);
guiToolkit.OpenProject (project, projectType, props, PlaysFilter,
@@ -292,7 +292,7 @@ namespace LongoMatch.Services
if (save)
SaveProject(OpenedProject, OpenedProjectType);
- Log.Debug ("Closing project " + OpenedProject.UUID);
+ Log.Debug ("Closing project " + OpenedProject.ID);
if(OpenedProjectType != ProjectType.FileProject)
Capturer.Close();
else
diff --git a/LongoMatch.Services/Services/RenderingJobsManager.cs
b/LongoMatch.Services/Services/RenderingJobsManager.cs
index d8e73eb..abf2a78 100644
--- a/LongoMatch.Services/Services/RenderingJobsManager.cs
+++ b/LongoMatch.Services/Services/RenderingJobsManager.cs
@@ -145,7 +145,7 @@ namespace LongoMatch.Services
videoConverter.Error += OnError;
foreach(MediaFile file in job.InputFiles) {
- videoConverter.AddFile (file.FilePath, file.Length);
+ videoConverter.AddFile (file.FilePath, file.Duration.MSeconds);
}
try {
@@ -193,17 +193,17 @@ namespace LongoMatch.Services
videoEditor.AddSegment(segment.MediaFile.FilePath,
segment.Start.MSeconds,
- drawing.RenderTime - segment.Start.MSeconds,
+ drawing.Render.MSeconds - segment.Start.MSeconds,
segment.Rate,
segment.Name,
segment.MediaFile.HasAudio);
videoEditor.AddImageSegment(image_path,
- drawing.RenderTime,
- drawing.PauseTime,
+ drawing.Render.MSeconds,
+ drawing.Pause.MSeconds,
segment.Name);
videoEditor.AddSegment(segment.MediaFile.FilePath,
- drawing.RenderTime,
- segment.Stop.MSeconds - drawing.RenderTime,
+ drawing.Render.MSeconds,
+ segment.Stop.MSeconds - drawing.Render.MSeconds,
segment.Rate,
segment.Name,
segment.MediaFile.HasAudio);
diff --git a/LongoMatch.Services/Services/TemplatesService.cs
b/LongoMatch.Services/Services/TemplatesService.cs
index ecfa00a..59abbd3 100644
--- a/LongoMatch.Services/Services/TemplatesService.cs
+++ b/LongoMatch.Services/Services/TemplatesService.cs
@@ -33,18 +33,14 @@ namespace LongoMatch.Services
public class TemplatesService: ITemplatesService
{
private Dictionary<Type, ITemplateProvider> dict;
- private List<PlayerSubCategory> playerSubcatList;
- private List<TeamSubCategory> teamSubcatList;
- public TemplatesService (string basePath)
+ public TemplatesService ()
{
dict = new Dictionary<Type, ITemplateProvider>();
- dict.Add(typeof(SubCategoryTemplate), new SubCategoriesTemplatesProvider(basePath));
- dict.Add(typeof(TeamTemplate), new TeamTemplatesProvider(basePath));
- dict.Add(typeof(Categories), new CategoriesTemplatesProvider (basePath));
+ dict.Add(typeof(TeamTemplate),
+ new TeamTemplatesProvider(Config.TeamsDir));
+ dict.Add(typeof(Categories), new CategoriesTemplatesProvider (Config.AnalysisDir));
CheckDefaultTemplates();
- CreateDefaultPlayerSubCategories();
- CreateDefaultTeamSubCategories();
}
private void CheckDefaultTemplates () {
@@ -52,47 +48,12 @@ namespace LongoMatch.Services
t.CheckDefaultTemplate();
}
- private void CreateDefaultPlayerSubCategories () {
- PlayerSubCategory subcat;
-
- /* Local team players */
- playerSubcatList = new List<PlayerSubCategory>();
- subcat = new PlayerSubCategory{
- Name=Catalog.GetString("Local team players"), AllowMultiple=true,
FastTag=true};
- subcat.Add(Team.LOCAL);
- playerSubcatList.Add(subcat);
-
- /* Visitor team players */
- subcat = new PlayerSubCategory{
- Name=Catalog.GetString("Visitor team players"), AllowMultiple=true,
FastTag=true};
- subcat.Add(Team.VISITOR);
- playerSubcatList.Add(subcat);
-
- /* Local and Visitor team players */
- subcat = new PlayerSubCategory{
- Name=Catalog.GetString("All teams players"), AllowMultiple=true,
FastTag=true};
- subcat.Add(Team.LOCAL);
- subcat.Add(Team.VISITOR);
- playerSubcatList.Add(subcat);
- }
-
- private void CreateDefaultTeamSubCategories () {
- teamSubcatList = new List<TeamSubCategory>();
- teamSubcatList.Add(new TeamSubCategory());
- }
-
public ITemplateProvider<T, U> GetTemplateProvider<T, U>() where T: ITemplate<U> {
if (dict.ContainsKey(typeof(T)))
return (ITemplateProvider<T, U>)dict[typeof(T)];
return null;
}
- public ISubcategoriesTemplatesProvider SubCategoriesTemplateProvider {
- get {
- return (ISubcategoriesTemplatesProvider) dict[typeof(SubCategoryTemplate)];
- }
- }
-
public ITeamTemplatesProvider TeamTemplateProvider {
get {
return (ITeamTemplatesProvider) dict[typeof(TeamTemplate)];
@@ -104,18 +65,6 @@ namespace LongoMatch.Services
return (ICategoriesTemplatesProvider) dict[typeof(Categories)];
}
}
-
- public List<PlayerSubCategory> PlayerSubcategories {
- get{
- return playerSubcatList;
- }
- }
-
- public List<TeamSubCategory> TeamSubcategories {
- get{
- return teamSubcatList;
- }
- }
}
public class TemplatesProvider<T, U>: ITemplateProvider<T, U> where T: ITemplate<U>
@@ -246,10 +195,4 @@ namespace LongoMatch.Services
public CategoriesTemplatesProvider (string basePath): base (basePath,
Constants.CAT_TEMPLATE_EXT) {}
}
-
- public class SubCategoriesTemplatesProvider : TemplatesProvider<SubCategoryTemplate, string>,
ISubcategoriesTemplatesProvider
- {
- public SubCategoriesTemplatesProvider (string basePath): base (basePath,
Constants.SUBCAT_TEMPLATE_EXT) {}
-
- }
}
diff --git a/LongoMatch.Services/Services/ToolsManager.cs b/LongoMatch.Services/Services/ToolsManager.cs
index d7357b6..138ff89 100644
--- a/LongoMatch.Services/Services/ToolsManager.cs
+++ b/LongoMatch.Services/Services/ToolsManager.cs
@@ -156,7 +156,7 @@ namespace LongoMatch.Services {
/* Create all the thumbnails */
capturer.Open(project.Description.File.FilePath);
- foreach(Play play in project.AllPlays()) {
+ foreach(Play play in project.Timeline) {
try {
capturer.Seek (play.Start + ((play.Stop - play.Start) / 2),
true);
diff --git a/LongoMatch.mds b/LongoMatch.mds
index fc9ca74..ab004bd 100644
--- a/LongoMatch.mds
+++ b/LongoMatch.mds
@@ -32,6 +32,8 @@
<Entry build="True" name="LongoMatch.GUI.Helpers" configuration="Debug" />
<Entry build="True" name="LongoMatch.Drawing" configuration="Debug" />
<Entry build="True" name="LongoMatch.Drawing.Cairo" configuration="Debug" />
+ <Entry build="True" name="LongoMatch.Addins.RFEBM" configuration="Debug" />
+ <Entry build="True" name="LongoMatch.Migration" configuration="Debug" />
</Configuration>
<Configuration name="Release" ctype="CombineConfiguration">
<Entry build="True" name="LongoMatch.GUI" configuration="Release" />
@@ -48,6 +50,8 @@
<Entry build="True" name="LongoMatch.GUI.Helpers" configuration="Release" />
<Entry build="True" name="LongoMatch.Drawing" configuration="Release" />
<Entry build="True" name="LongoMatch.Drawing.Cairo" configuration="Release" />
+ <Entry build="True" name="LongoMatch.Addins.RFEBM" configuration="Release" />
+ <Entry build="True" name="LongoMatch.Migration" configuration="Release" />
</Configuration>
</Configurations>
<StartMode startupentry="LongoMatchGtk" single="True">
@@ -65,6 +69,8 @@
<Execute type="None" entry="LongoMatch.GUI.Helpers" />
<Execute type="None" entry="LongoMatch.Drawing" />
<Execute type="None" entry="LongoMatch.Drawing.Cairo" />
+ <Execute type="None" entry="LongoMatch.Addins.RFEBM" />
+ <Execute type="None" entry="LongoMatch.Migration" />
</StartMode>
<Entries>
<Entry filename="LongoMatch.GUI/LongoMatch.GUI.mdp" />
@@ -81,5 +87,7 @@
<Entry filename="LongoMatch.GUI.Helpers/LongoMatch.GUI.Helpers.mdp" />
<Entry filename="LongoMatch.Drawing/LongoMatch.Drawing.mdp" />
<Entry filename="LongoMatch.Drawing.Cairo/LongoMatch.Drawing.Cairo.mdp" />
+ <Entry filename="LongoMatch.Addins.RFEBM/LongoMatch.Addins.RFEBM.mdp" />
+ <Entry filename="LongoMatch.Migration/LongoMatch.Migration.mdp" />
</Entries>
</Combine>
\ No newline at end of file
diff --git a/Tests/Core/TestCategoriesTemplate.cs b/Tests/Core/TestCategoriesTemplate.cs
index e8795e9..72b4ecc 100644
--- a/Tests/Core/TestCategoriesTemplate.cs
+++ b/Tests/Core/TestCategoriesTemplate.cs
@@ -35,26 +35,25 @@ namespace Tests.Core
Utils.CheckSerialization (cat);
cat.Name = "test";
- cat.Version = new Version (1, 2);
cat.GamePeriods = new List<string> ();
cat.GamePeriods.Add ("1");
cat.GamePeriods.Add ("2");
- cat.Add ( new Category {Name = "cat1"});
- cat.Add ( new Category {Name = "cat2"});
- cat.Add ( new Category {Name = "cat3"});
+ cat.List.Add ( new Category {Name = "cat1"});
+ cat.List.Add ( new Category {Name = "cat2"});
+ cat.List.Add ( new Category {Name = "cat3"});
Utils.CheckSerialization (cat);
Categories newcat = Utils.SerializeDeserialize (cat);
+ Assert.AreEqual (cat.ID, newcat.ID);
Assert.AreEqual (cat.Name, newcat.Name);
- Assert.AreEqual (cat.Version, newcat.Version);
Assert.AreEqual (cat.GamePeriods.Count, newcat.GamePeriods.Count);
Assert.AreEqual (cat.GamePeriods[0], newcat.GamePeriods[0]);
Assert.AreEqual (cat.GamePeriods[1], newcat.GamePeriods[1]);
- Assert.AreEqual (cat.Count, newcat.Count);
- Assert.AreEqual (cat[0].UUID, newcat[0].UUID);
- Assert.AreEqual (cat[1].UUID, newcat[1].UUID);
- Assert.AreEqual (cat[2].UUID, newcat[2].UUID);
+ Assert.AreEqual (cat.List.Count, newcat.List.Count);
+ Assert.AreEqual (cat.List[0].ID, newcat.List[0].ID);
+ Assert.AreEqual (cat.List[1].ID, newcat.List[1].ID);
+ Assert.AreEqual (cat.List[2].ID, newcat.List[2].ID);
}
}
}
diff --git a/Tests/Core/TestCategory.cs b/Tests/Core/TestCategory.cs
index 3e4dda1..a39b31f 100644
--- a/Tests/Core/TestCategory.cs
+++ b/Tests/Core/TestCategory.cs
@@ -50,21 +50,21 @@ namespace Tests.Core
cat.TagHalfFieldPosition = true;
cat.FieldPositionIsDistance = true;
cat.HalfFieldPositionIsDistance = false;
- cat.SubCategories = new
System.Collections.Generic.List<LongoMatch.Interfaces.ISubCategory>();
- cat.SubCategories.Add (new TagSubCategory {Name="TestSubcat"});
+ cat.SubCategories = new System.Collections.Generic.List<SubCategory>();
+ cat.SubCategories.Add (new SubCategory {Name="TestSubcat"});
Utils.CheckSerialization (cat);
stream = new MemoryStream ();
- SerializableObject.Save (cat, stream, SerializationType.Json);
+ Serializer.Save (cat, stream, SerializationType.Json);
stream.Seek (0, SeekOrigin.Begin);
reader = new StreamReader (stream);
jsonString = reader.ReadToEnd();
Assert.False (jsonString.Contains ("SortMethodString"));
stream.Seek (0, SeekOrigin.Begin);
- Category newcat = SerializableObject.Load<Category> (stream, SerializationType.Json);
+ Category newcat = Serializer.Load<Category> (stream, SerializationType.Json);
- Assert.AreEqual (cat.UUID, newcat.UUID);
+ Assert.AreEqual (cat.ID, newcat.ID);
Assert.AreEqual (cat.Name, newcat.Name);
Assert.AreEqual (cat.Position, newcat.Position);
Assert.AreEqual (cat.SortMethod, newcat.SortMethod);
@@ -83,6 +83,15 @@ namespace Tests.Core
Assert.AreEqual (newcat.SubCategories[0].Name, "TestSubcat");
}
+ [Test()]
+ public void TestNullList ()
+ {
+ Category cat = new Category();
+ Assert.AreNotEqual (cat.SubCategories, null);
+ Category newcat = Utils.SerializeDeserialize (cat);
+ Assert.AreNotEqual (newcat.SubCategories, null);
+ }
+
public static void Main (string [] args)
{
}
diff --git a/Tests/Core/TestColor.cs b/Tests/Core/TestColor.cs
index da822ca..7ea83ca 100644
--- a/Tests/Core/TestColor.cs
+++ b/Tests/Core/TestColor.cs
@@ -27,7 +27,7 @@ namespace Tests.Core
[Test()]
public void TestSerialization ()
{
- Color c = new Color (1, 2, 3, 4);
+ Color c = new Color (255, 10, 255, 10);
Utils.CheckSerialization (c);
Color c1 = Utils.SerializeDeserialize (c);
diff --git a/Tests/Core/TestCoordinates.cs b/Tests/Core/TestCoordinates.cs
index e45ca39..d0e9ed0 100644
--- a/Tests/Core/TestCoordinates.cs
+++ b/Tests/Core/TestCoordinates.cs
@@ -31,40 +31,40 @@ namespace Tests.Core
Coordinates coords = new Coordinates();
Point p1 = new Point (1, 2);
Point p2 = new Point (3, 4);
- coords.Add(p1);
- coords.Add(p2);
+ coords.Points.Add(p1);
+ coords.Points.Add(p2);
Utils.CheckSerialization(coords);
Coordinates newcoords = Utils.SerializeDeserialize(coords);
- Assert.AreEqual (coords.Count, newcoords.Count);
- Assert.AreEqual (coords[0].X, newcoords[0].X);
- Assert.AreEqual (coords[1].X, newcoords[1].X);
- Assert.AreEqual (coords[0].Y, newcoords[0].Y);
- Assert.AreEqual (coords[1].Y, newcoords[1].Y);
+ Assert.AreEqual (coords.Points.Count, newcoords.Points.Count);
+ Assert.AreEqual (coords.Points[0].X, newcoords.Points[0].X);
+ Assert.AreEqual (coords.Points[1].X, newcoords.Points[1].X);
+ Assert.AreEqual (coords.Points[0].Y, newcoords.Points[0].Y);
+ Assert.AreEqual (coords.Points[1].Y, newcoords.Points[1].Y);
}
[Test()]
public void TestEqual ()
{
Coordinates coords = new Coordinates();
- coords.Add(new Point (1, 2));
- coords.Add(new Point (3, 4));
+ coords.Points.Add(new Point (1, 2));
+ coords.Points.Add(new Point (3, 4));
Coordinates coords2 = new Coordinates();
- coords2.Add (new Point (1, 2));
- coords2.Add (new Point (3, 4));
+ coords2.Points.Add (new Point (1, 2));
+ coords2.Points.Add (new Point (3, 4));
Assert.AreEqual (coords, coords2);
/* Different number of elements */
- coords2.Add (new Point (1, 2));
+ coords2.Points.Add (new Point (1, 2));
Assert.AreNotEqual (coords, coords2);
/* Same number of elements but different points */
coords2 = new Coordinates();
- coords2.Add (new Point (1, 1));
- coords2.Add (new Point (3, 4));
+ coords2.Points.Add (new Point (1, 1));
+ coords2.Points.Add (new Point (3, 4));
Assert.AreNotEqual (coords, coords2);
}
}
diff --git a/LongoMatch.Core/Store/GameUnit.cs b/Tests/Core/TestImage.cs
similarity index 66%
copy from LongoMatch.Core/Store/GameUnit.cs
copy to Tests/Core/TestImage.cs
index f9ce9b9..0fdcac9 100644
--- a/LongoMatch.Core/Store/GameUnit.cs
+++ b/Tests/Core/TestImage.cs
@@ -1,43 +1,32 @@
-//
-// Copyright (C) 2011 andoni
-//
+//
+// Copyright (C) 2014 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 NUnit.Framework;
using System;
-using System.Collections.Generic;
-namespace LongoMatch.Store
+namespace Tests.Core
{
- [Serializable]
- public class GameUnit: List<TimelineNode>
+ [TestFixture()]
+ public class TestImage
{
-
- public GameUnit (string name)
+ [Test()]
+ public void TestSerialization ()
{
- Name=name;
+
}
-
- public string Name {
- get;
- set;
- }
-
- public override string ToString ()
- {
- return string.Format ("[GameUnit: Name={0}]", Name);
- }
}
-}
-
+}
\ No newline at end of file
diff --git a/Tests/Core/TestMediaFile.cs b/Tests/Core/TestMediaFile.cs
index 08be46f..3329217 100644
--- a/Tests/Core/TestMediaFile.cs
+++ b/Tests/Core/TestMediaFile.cs
@@ -29,12 +29,12 @@ namespace Tests.Core
public void TestSerialization ()
{
MediaFile mf = new MediaFile ("path", 34000, 25, true, true, "mp4", "h264",
- "aac", 320, 240, 1.3, new Image (null));
+ "aac", 320, 240, 1.3, null);
Utils.CheckSerialization (mf);
MediaFile newmf = Utils.SerializeDeserialize (mf);
Assert.AreEqual (mf.FilePath, newmf.FilePath);
- Assert.AreEqual (mf.Length, newmf.Length);
+ Assert.AreEqual (mf.Duration, newmf.Duration);
Assert.AreEqual (mf.Fps, newmf.Fps);
Assert.AreEqual (mf.HasAudio, newmf.HasAudio);
Assert.AreEqual (mf.HasVideo, newmf.HasVideo);
@@ -51,8 +51,7 @@ namespace Tests.Core
public void TestGetFrames ()
{
MediaFile mf = new MediaFile ("path", 34000, 25, true, true, "mp4", "h264",
- "aac", 320, 240, 1.3, new Image (null));
- Assert.AreEqual (mf.GetFrames(), 850);
+ "aac", 320, 240, 1.3, null);
}
}
}
diff --git a/Tests/Core/TestPlay.cs b/Tests/Core/TestPlay.cs
index c6f20b1..6feeae5 100644
--- a/Tests/Core/TestPlay.cs
+++ b/Tests/Core/TestPlay.cs
@@ -36,22 +36,19 @@ namespace Tests.Core
play.Fps = 30;
play.Selected = true;
play.Team = LongoMatch.Common.Team.LOCAL;
- play.GamePeriod = "2";
play.FieldPosition = new Coordinates();
- play.FieldPosition.Add (new Point (1, 2));
+ play.FieldPosition.Points.Add (new Point (1, 2));
play.HalfFieldPosition = new Coordinates ();
- play.HalfFieldPosition.Add (new Point (4,5));
+ play.HalfFieldPosition.Points.Add (new Point (4,5));
play.GoalPosition = new Coordinates ();
- play.GoalPosition.Add (new Point (6, 7));
+ play.GoalPosition.Points.Add (new Point (6, 7));
play.PlaybackRate = 1.5f;
play.Name = "Play";
play.Start = new Time(1000);
play.Stop = new Time(2000);
play.Rate = 2.3f;
- play.Tags.Add(new StringTag {Value = "test"});
- play.Teams.Add(new TeamTag {Value = Team.LOCAL});
- play.Players.Add(new PlayerTag {Value = new Player {Name="Test"}});
+ play.Tags.Add(new Tag {Value = "test"});
return play;
}
@@ -64,11 +61,10 @@ namespace Tests.Core
p = CreatePlay ();
var newp = Utils.SerializeDeserialize (p);
- Assert.AreEqual (p.Category.UUID, newp.Category.UUID);
+ Assert.AreEqual (p.Category.ID, newp.Category.ID);
Assert.AreEqual (p.Notes, newp.Notes);
Assert.AreEqual (p.Fps, newp.Fps);
Assert.AreEqual (p.Team, newp.Team);
- Assert.AreEqual (p.GamePeriod, newp.GamePeriod);
Assert.AreEqual (p.FieldPosition, newp.FieldPosition);
Assert.AreEqual (p.HalfFieldPosition, newp.HalfFieldPosition);
Assert.AreEqual (p.GoalPosition, newp.GoalPosition);
@@ -79,53 +75,6 @@ namespace Tests.Core
Assert.AreEqual (p.Rate, newp.Rate);
Assert.AreEqual (p.PlaybackRate, newp.PlaybackRate);
}
-
- [Test()]
- public void TestStartFrame ()
- {
- Play p = CreatePlay ();
- Assert.AreEqual (p.StartFrame, p.Start.MSeconds * p.Fps / 1000);
- }
-
- [Test()]
- public void TestStopFrame ()
- {
- Play p = CreatePlay ();
- Assert.AreEqual (p.StopFrame, p.Stop.MSeconds * p.Fps / 1000);
- }
-
- [Test()]
- public void TestTotalFrames ()
- {
- Play p = CreatePlay ();
- Assert.AreEqual (p.TotalFrames, p.StopFrame - p.StartFrame);
- }
-
- [Test()]
- public void TestCentralFrame ()
- {
- Play p = CreatePlay ();
- Assert.AreEqual (p.CentralFrame, p.StopFrame-((p.TotalFrames)/2));
- }
-
- [Test()]
- public void TestKeyframe ()
- {
- Play p = CreatePlay ();
- Assert.IsFalse (p.HasDrawings);
- Assert.AreEqual (p.KeyFrame, 0);
- p.KeyFrameDrawing = new Drawing {RenderTime = 1000};
- Assert.AreEqual (p.KeyFrame, p.KeyFrameDrawing.RenderTime * p.Fps / 1000);
- }
-
- [Test()]
- public void TestHasFrame ()
- {
- Play p = CreatePlay ();
- Assert.IsTrue (p.HasFrame (35));
- Assert.IsFalse (p.HasFrame (70));
- Assert.IsFalse (p.HasFrame (3));
- }
}
}
diff --git a/Tests/Core/TestPlayer.cs b/Tests/Core/TestPlayer.cs
index 6beabde..22fed9f 100644
--- a/Tests/Core/TestPlayer.cs
+++ b/Tests/Core/TestPlayer.cs
@@ -58,24 +58,9 @@ namespace Tests.Core
player.Photo = null;
Assert.AreEqual (player.Photo, null);
/* FIXME: test with real image */
- player.Photo = new DummyImage ("test");
+ player.Photo = null;
Utils.CheckSerialization (player);
}
}
- [Serializable]
- public class DummyImage: Image
- {
- string text;
-
- public DummyImage (string text): base (null)
- {
- this.text = text;
- }
-
- public byte[] Serialize () {
- Console.WriteLine ("SER");
- return new byte[] {byte.Parse ("1")};
- }
- }
}
diff --git a/Tests/Core/TestProject.cs b/Tests/Core/TestProject.cs
index 0ae75f2..51040c9 100644
--- a/Tests/Core/TestProject.cs
+++ b/Tests/Core/TestProject.cs
@@ -58,36 +58,36 @@ namespace Tests.Core
Project newp = Utils.SerializeDeserialize (p);
Assert.AreEqual (newp.CompareTo (p), 0);
Assert.AreEqual (newp.Description.CompareTo (p.Description), 0);
- Assert.AreEqual (newp.AllPlays().Count, p.AllPlays().Count);
+ Assert.AreEqual (newp.Timeline.Count, p.Timeline.Count);
}
[Test ()]
public void TestPlaysGrouping () {
Project p = CreateProject ();
- p.AddPlay (p.Categories[0], new Time (1000), new Time (2000), null);
- p.AddPlay (p.Categories[0], new Time (1000), new Time (2000), null);
- p.AddPlay (p.Categories[1], new Time (1000), new Time (2000), null);
- p.AddPlay (p.Categories[2], new Time (1000), new Time (2000), null);
- p.AddPlay (p.Categories[2], new Time (1000), new Time (2000), null);
- p.AddPlay (p.Categories[2], new Time (1000), new Time (2000), null);
- p.AddPlay (p.Categories[6], new Time (1000), new Time (2000), null);
+ p.AddPlay (p.Categories.List[0], new Time (1000), new Time (2000), null);
+ p.AddPlay (p.Categories.List[0], new Time (1000), new Time (2000), null);
+ p.AddPlay (p.Categories.List[1], new Time (1000), new Time (2000), null);
+ p.AddPlay (p.Categories.List[2], new Time (1000), new Time (2000), null);
+ p.AddPlay (p.Categories.List[2], new Time (1000), new Time (2000), null);
+ p.AddPlay (p.Categories.List[2], new Time (1000), new Time (2000), null);
+ p.AddPlay (p.Categories.List[6], new Time (1000), new Time (2000), null);
IEnumerable<IGrouping<Category, Play>> g = p.PlaysGroupedByCategory;
Assert.AreEqual (g.Count(), 4);
IGrouping<Category, Play> gr = g.ElementAt (0);
- Assert.AreEqual (gr.Key, p.Categories[0]);
+ Assert.AreEqual (gr.Key, p.Categories.List[0]);
Assert.AreEqual (gr.Count(), 2);
gr = g.ElementAt (1);
- Assert.AreEqual (gr.Key, p.Categories[1]);
+ Assert.AreEqual (gr.Key, p.Categories.List[1]);
Assert.AreEqual (gr.Count(), 1);
gr = g.ElementAt (2);
- Assert.AreEqual (gr.Key, p.Categories[2]);
+ Assert.AreEqual (gr.Key, p.Categories.List[2]);
Assert.AreEqual (gr.Count(), 3);
gr = g.ElementAt (3);
- Assert.AreEqual (gr.Key, p.Categories[6]);
+ Assert.AreEqual (gr.Key, p.Categories.List[6]);
Assert.AreEqual (gr.Count(), 1);
}
@@ -99,14 +99,14 @@ namespace Tests.Core
[Test ()]
public void TestAddPlay () {
Project p = CreateProject ();
- p.AddPlay (p.Categories[0], new Time (1000), new Time (2000), null);
- Assert.AreEqual (p.AllPlays().Count, 1);
- p.AddPlay (p.Categories[0], new Time (1000), new Time (2000), null);
- Assert.AreEqual (p.AllPlays().Count, 2);
+ p.AddPlay (p.Categories.List[0], new Time (1000), new Time (2000), null);
+ Assert.AreEqual (p.Timeline.Count, 1);
+ p.AddPlay (p.Categories.List[0], new Time (1000), new Time (2000), null);
+ Assert.AreEqual (p.Timeline.Count, 2);
p.AddPlay (new Play());
- Assert.AreEqual (p.AllPlays().Count, 3);
+ Assert.AreEqual (p.Timeline.Count, 3);
p.AddPlay (new Play());
- Assert.AreEqual (p.AllPlays().Count, 4);
+ Assert.AreEqual (p.Timeline.Count, 4);
}
[Test ()]
@@ -124,44 +124,43 @@ namespace Tests.Core
plays.Add(p1);
plays.Add(p2);
p.RemovePlays (plays);
- Assert.AreEqual (p.AllPlays().Count, 1);
- Assert.AreEqual (p.AllPlays()[0], p3);
+ Assert.AreEqual (p.Timeline.Count, 1);
+ Assert.AreEqual (p.Timeline[0], p3);
}
[Test ()]
public void TestRemoveCategory () {
Project p = CreateProject ();
- p.AddPlay (p.Categories[0], new Time (1000), new Time (2000), null);
- p.AddPlay (p.Categories[0], new Time (1000), new Time (2000), null);
- p.AddPlay (p.Categories[0], new Time (1000), new Time (2000), null);
- p.AddPlay (p.Categories[2], new Time (1000), new Time (2000), null);
- p.AddPlay (p.Categories[3], new Time (1000), new Time (2000), null);
- p.RemoveCategory(p.Categories[0]);
- Assert.AreEqual(p.AllPlays().Count, 2);
- Assert.AreEqual(p.Categories.Count, 9);
- p.RemoveCategory(p.Categories[0]);
- p.RemoveCategory(p.Categories[0]);
- p.RemoveCategory(p.Categories[0]);
- p.RemoveCategory(p.Categories[0]);
- p.RemoveCategory(p.Categories[0]);
- p.RemoveCategory(p.Categories[0]);
- p.RemoveCategory(p.Categories[0]);
- p.RemoveCategory(p.Categories[0]);
+ p.AddPlay (p.Categories.List[0], new Time (1000), new Time (2000), null);
+ p.AddPlay (p.Categories.List[0], new Time (1000), new Time (2000), null);
+ p.AddPlay (p.Categories.List[0], new Time (1000), new Time (2000), null);
+ p.AddPlay (p.Categories.List[2], new Time (1000), new Time (2000), null);
+ p.AddPlay (p.Categories.List[3], new Time (1000), new Time (2000), null);
+ p.RemoveCategory(p.Categories.List[0]);
+ Assert.AreEqual(p.Timeline.Count, 2);
+ Assert.AreEqual(p.Categories.List.Count, 9);
+ p.RemoveCategory(p.Categories.List[0]);
+ p.RemoveCategory(p.Categories.List[0]);
+ p.RemoveCategory(p.Categories.List[0]);
+ p.RemoveCategory(p.Categories.List[0]);
+ p.RemoveCategory(p.Categories.List[0]);
+ p.RemoveCategory(p.Categories.List[0]);
+ p.RemoveCategory(p.Categories.List[0]);
+ p.RemoveCategory(p.Categories.List[0]);
Assert.Throws<Exception>(
- delegate {p.RemoveCategory(p.Categories[0]);});
+ delegate {p.RemoveCategory(p.Categories.List[0]);});
}
[Test ()]
public void TestRemovePlayer () {
Play play = new Play();
Project project = CreateProject ();
- Player player = project.LocalTeamTemplate[0];
- PlayerTag tag = new PlayerTag {Value=player};
- play.Players.Add (tag);
+ Player player = project.LocalTeamTemplate.List[0];
+ play.Players.Add (player);
project.AddPlay (play);
project.RemovePlayer (project.LocalTeamTemplate, player);
- Assert.AreEqual (project.LocalTeamTemplate.Count, 9);
- Assert.IsFalse (play.Players.Contains (tag));
+ Assert.AreEqual (project.LocalTeamTemplate.List.Count, 9);
+ Assert.IsFalse (play.Players.Contains (player));
}
[Test ()]
@@ -172,15 +171,15 @@ namespace Tests.Core
[Test ()]
public void TestPlaysInCategory () {
Project p = CreateProject ();
- p.AddPlay (p.Categories[0], new Time (1000), new Time (2000), null);
- p.AddPlay (p.Categories[0], new Time (1000), new Time (2000), null);
- p.AddPlay (p.Categories[0], new Time (1000), new Time (2000), null);
- p.AddPlay (p.Categories[2], new Time (1000), new Time (2000), null);
- p.AddPlay (p.Categories[3], new Time (1000), new Time (2000), null);
- Assert.AreEqual (p.PlaysInCategory (p.Categories[0]).Count, 3);
- Assert.AreEqual (p.PlaysInCategory (p.Categories[1]).Count, 0);
- Assert.AreEqual (p.PlaysInCategory (p.Categories[2]).Count, 1);
- Assert.AreEqual (p.PlaysInCategory (p.Categories[3]).Count, 1);
+ p.AddPlay (p.Categories.List[0], new Time (1000), new Time (2000), null);
+ p.AddPlay (p.Categories.List[0], new Time (1000), new Time (2000), null);
+ p.AddPlay (p.Categories.List[0], new Time (1000), new Time (2000), null);
+ p.AddPlay (p.Categories.List[2], new Time (1000), new Time (2000), null);
+ p.AddPlay (p.Categories.List[3], new Time (1000), new Time (2000), null);
+ Assert.AreEqual (p.PlaysInCategory (p.Categories.List[0]).Count, 3);
+ Assert.AreEqual (p.PlaysInCategory (p.Categories.List[1]).Count, 0);
+ Assert.AreEqual (p.PlaysInCategory (p.Categories.List[2]).Count, 1);
+ Assert.AreEqual (p.PlaysInCategory (p.Categories.List[3]).Count, 1);
}
[Test ()]
diff --git a/Tests/Core/TestProjectDescription.cs b/Tests/Core/TestProjectDescription.cs
index 546028b..5367a2d 100644
--- a/Tests/Core/TestProjectDescription.cs
+++ b/Tests/Core/TestProjectDescription.cs
@@ -45,7 +45,7 @@ namespace Tests.Core
ProjectDescription newpd = Utils.SerializeDeserialize(pd);
Assert.AreEqual (pd.CompareTo (newpd), 0);
- Assert.AreEqual (pd.UUID, newpd.UUID);
+ Assert.AreEqual (pd.ID, newpd.ID);
}
}
}
diff --git a/Tests/Core/TestSubCategory.cs b/Tests/Core/TestSubCategory.cs
index 0b74c79..0f04004 100644
--- a/Tests/Core/TestSubCategory.cs
+++ b/Tests/Core/TestSubCategory.cs
@@ -29,59 +29,26 @@ namespace Tests.Core
public class TestSubCategory
{
[Test()]
- public void TestTagSubcategoryProps ()
- {
- string tag1="tag1", tag2="tag2";
- List<string> elementsDesc;
- TagSubCategory subcat = new TagSubCategory {Name="Test",
- AllowMultiple = true, FastTag = true};
-
- subcat.Add (tag1);
- subcat.Add (tag2);
- elementsDesc = subcat.ElementsDesc ();
- Assert.AreEqual (elementsDesc.Count, 2);
- Assert.AreEqual (elementsDesc[0], tag1);
- Assert.AreEqual (elementsDesc[1], tag2);
- }
-
-
- [Test()]
public void TestTagSubcategorySerialization ()
{
string tag1="tag1", tag2="tag2";
List<string> elementsDesc;
MemoryStream stream;
- TagSubCategory subcat, newsubcat;
+ SubCategory subcat, newsubcat;
- subcat = new TagSubCategory {Name="Test",
- AllowMultiple = true, FastTag = true};
- subcat.Add (tag1);
- subcat.Add (tag2);
+ subcat = new SubCategory {Name="Test",
+ AllowMultiple = true};
+ subcat.Options.Add (tag1);
+ subcat.Options.Add (tag2);
Utils.CheckSerialization (subcat);
-
- stream = new MemoryStream ();
- SerializableObject.Save (subcat, stream, SerializationType.Json);
- stream.Seek (0, SeekOrigin.Begin);
- var reader = new StreamReader (stream);
- var jsonString = reader.ReadToEnd();
- Console.WriteLine (jsonString);
- /* Count property is removed */
- Assert.False (jsonString.Contains ("Count"));
- Assert.True (jsonString.Contains ("_items"));
- Assert.True (jsonString.Contains ("_size"));
- stream.Seek (0, SeekOrigin.Begin);
+ newsubcat = Utils.SerializeDeserialize (subcat);
- newsubcat = SerializableObject.Load<TagSubCategory> (stream, SerializationType.Json);
-
Assert.AreEqual (subcat.Name, newsubcat.Name);
Assert.AreEqual (subcat.AllowMultiple, newsubcat.AllowMultiple);
- Assert.AreEqual (subcat.Count, newsubcat.Count);
- Assert.AreEqual (subcat.FastTag, newsubcat.FastTag);
- elementsDesc = newsubcat.ElementsDesc ();
- Assert.AreEqual (elementsDesc.Count, 2);
- Assert.AreEqual (elementsDesc[0], tag1);
- Assert.AreEqual (elementsDesc[1], tag2);
+ Assert.AreEqual (subcat.Options.Count, newsubcat.Options.Count);
+ Assert.AreEqual (subcat.Options[0], newsubcat.Options[0]);
+ Assert.AreEqual (subcat.Options[1], newsubcat.Options[1]);
}
}
}
diff --git a/Tests/Core/TestTagStore.cs b/Tests/Core/TestTagStore.cs
index bde6687..4f8dd7d 100644
--- a/Tests/Core/TestTagStore.cs
+++ b/Tests/Core/TestTagStore.cs
@@ -28,19 +28,19 @@ namespace Tests.Core
[TestFixture()]
public class TagStore
{
- StringTag tag1, tag2, tag3, tag4;
- SubCategory<string> subcat1, subcat2, subcat3;
- StringTagStore store;
+ Tag tag1, tag2, tag3, tag4;
+ SubCategory subcat1, subcat2, subcat3;
+ TagsStore store;
void FillStore () {
- store = new StringTagStore ();
- subcat1 = new SubCategory<string> {Name = "subcat1"};
- subcat2 = new SubCategory<string> {Name = "subcat2"};
- subcat3 = new SubCategory<string> {Name = "subcat3"};
- tag1 = new StringTag {SubCategory=subcat1, Value="tag1"};
- tag2 = new StringTag {SubCategory=subcat1, Value="tag2"};
- tag3 = new StringTag {SubCategory=subcat2, Value="tag3"};
- tag4 = new StringTag {SubCategory=subcat3, Value="tag4"};
+ store = new TagsStore ();
+ subcat1 = new SubCategory {Name = "subcat1"};
+ subcat2 = new SubCategory {Name = "subcat2"};
+ subcat3 = new SubCategory {Name = "subcat3"};
+ tag1 = new Tag {SubCategory=subcat1, Value="tag1"};
+ tag2 = new Tag {SubCategory=subcat1, Value="tag2"};
+ tag3 = new Tag {SubCategory=subcat2, Value="tag3"};
+ tag4 = new Tag {SubCategory=subcat3, Value="tag4"};
store.Add (tag1);
store.Add (tag2);
store.Add (tag3);
@@ -79,7 +79,7 @@ namespace Tests.Core
FillStore ();
Assert.AreEqual (store.AllUniqueElements.Count, 4);
- var tag = new StringTag {SubCategory=subcat1, Value="tag1"};
+ var tag = new Tag {SubCategory=subcat1, Value="tag1"};
store.Add (tag);
Assert.AreEqual (store.AllUniqueElements.Count, 4);
}
@@ -107,24 +107,6 @@ namespace Tests.Core
}
[Test()]
- public void TestRemoveByPlayer ()
- {
- var store = new PlayersTagStore ();
- var subcat1 = new SubCategory<string> {Name = "subcat1"};
- var player1 = new Player ();
- var player2 = new Player ();
- var tag1 = new PlayerTag {SubCategory=subcat1, Value=player1};
- var tag2 = new PlayerTag {SubCategory=subcat1, Value=player2};
- store.Add (tag1);
- store.Add (tag2);
-
- store.RemoveByPlayer (player1);
- Assert.AreEqual (store.Tags.Count, 1);
- store.RemoveByPlayer (player2);
- Assert.AreEqual (store.Tags.Count, 0);
- }
-
- [Test()]
public void TestSerialization ()
{
FillStore ();
diff --git a/Tests/Core/TestTeamTemplate.cs b/Tests/Core/TestTeamTemplate.cs
index f2ef1a8..4ae3507 100644
--- a/Tests/Core/TestTeamTemplate.cs
+++ b/Tests/Core/TestTeamTemplate.cs
@@ -34,24 +34,23 @@ namespace Tests.Core
Utils.CheckSerialization(t);
t.Name = "test";
- t.Version = new Version (1, 2);
t.TeamName = "team";
- t.Add (new Player {Name="P1"});
- t.Add (new Player {Name="P2"});
- t.Add (new Player {Name="P3"});
+ t.List.Add (new Player {Name="P1"});
+ t.List.Add (new Player {Name="P2"});
+ t.List.Add (new Player {Name="P3"});
Utils.CheckSerialization (t);
TeamTemplate newt = Utils.SerializeDeserialize(t);
+ Assert.AreEqual (t.ID, newt.ID);
Assert.AreEqual (t.Name, newt.Name);
- Assert.AreEqual (t.Version, newt.Version);
Assert.AreEqual (t.TeamName, newt.TeamName);
- Assert.AreEqual (t.Count, newt.Count);
- Assert.AreEqual (t[0].Name, newt[0].Name);
- Assert.AreEqual (t[1].Name, newt[1].Name);
- Assert.AreEqual (t[2].Name, newt[2].Name);
+ Assert.AreEqual (t.List.Count, newt.List.Count);
+ Assert.AreEqual (t.List[0].Name, newt.List[0].Name);
+ Assert.AreEqual (t.List[1].Name, newt.List[1].Name);
+ Assert.AreEqual (t.List[2].Name, newt.List[2].Name);
}
@@ -62,7 +61,6 @@ namespace Tests.Core
Player p1, p2, p3;
t.Name = "test";
- t.Version = new Version (1, 2);
t.TeamName = "team";
Assert.AreEqual (t.PlayingPlayersList.Count, 0);
@@ -70,11 +68,11 @@ namespace Tests.Core
p1 = new Player {Name="P1", Playing = true};
p2 = new Player {Name="P2", Playing = false};
p3 = new Player {Name="P3", Playing = true};
- t.Add (p1);
+ t.List.Add (p1);
Assert.AreEqual (t.PlayingPlayersList.Count, 1);
- t.Add (p2);
+ t.List.Add (p2);
Assert.AreEqual (t.PlayingPlayersList.Count, 1);
- t.Add (p3);
+ t.List.Add (p3);
Assert.AreEqual (t.PlayingPlayersList.Count, 2);
Assert.AreEqual (t.PlayingPlayersList[0], p1);
Assert.AreEqual (t.PlayingPlayersList[1], p3);
@@ -85,10 +83,21 @@ namespace Tests.Core
{
TeamTemplate t = TeamTemplate.DefaultTemplate (10);
- Assert.AreEqual (t.Count, 10);
+ Assert.AreEqual (t.List.Count, 10);
t.AddDefaultItem (8);
- Assert.AreEqual (t.Count, 11);
+ Assert.AreEqual (t.List.Count, 11);
}
+ [Test()]
+ public void TestFormation ()
+ {
+ TeamTemplate t = TeamTemplate.DefaultTemplate (1);
+ t.FormationStr = "1-2-3-4";
+ Assert.AreEqual (t.Formation.Length, 4);
+ Assert.AreEqual (t.Formation[0], 1);
+ Assert.AreEqual (t.Formation[1], 2);
+ Assert.AreEqual (t.Formation[2], 3);
+ Assert.AreEqual (t.Formation[3], 4);
+ }
}
}
diff --git a/LongoMatch.Core/Store/GameUnit.cs b/Tests/Core/TestTime.cs
similarity index 66%
rename from LongoMatch.Core/Store/GameUnit.cs
rename to Tests/Core/TestTime.cs
index f9ce9b9..3e40ebb 100644
--- a/LongoMatch.Core/Store/GameUnit.cs
+++ b/Tests/Core/TestTime.cs
@@ -1,43 +1,35 @@
-//
-// Copyright (C) 2011 andoni
-//
+//
+// Copyright (C) 2014 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 NUnit.Framework;
using System;
-using System.Collections.Generic;
+using LongoMatch.Store;
-namespace LongoMatch.Store
+namespace Tests.Core
{
- [Serializable]
- public class GameUnit: List<TimelineNode>
+ [TestFixture()]
+ public class TestTime
{
-
- public GameUnit (string name)
+ [Test()]
+ public void TestSerialization ()
{
- Name=name;
+ Time t = new Time (1000);
+ Utils.CheckSerialization (t);
}
-
- public string Name {
- get;
- set;
- }
-
- public override string ToString ()
- {
- return string.Format ("[GameUnit: Name={0}]", Name);
- }
}
}
diff --git a/Tests/Services/TestDatabase.cs b/Tests/Services/TestDatabase.cs
index 9e2449e..cfbbb54 100644
--- a/Tests/Services/TestDatabase.cs
+++ b/Tests/Services/TestDatabase.cs
@@ -119,8 +119,8 @@ namespace Tests.Services
ProjectDescription pd1 = new ProjectDescription ();
Project p1 = new Project {Description = pd1};
db.AddProject (p1);
- Project p2 = db.GetProject (p1.UUID);
- Assert.AreEqual (p1.UUID, p2.UUID);
+ Project p2 = db.GetProject (p1.ID);
+ Assert.AreEqual (p1.ID, p2.ID);
Assert.IsNull (db.GetProject (new Guid()));
}
@@ -132,7 +132,7 @@ namespace Tests.Services
ProjectDescription pd1 = new ProjectDescription ();
Project p1 = new Project {Description = pd1};
Assert.IsTrue (db.AddProject (p1));
- Assert.IsTrue (File.Exists (Path.Combine (dbdir, p1.UUID.ToString())));
+ Assert.IsTrue (File.Exists (Path.Combine (dbdir, p1.ID.ToString())));
Assert.IsTrue (db.AddProject (p1));
Assert.AreEqual (db.Count, 1);
db = new DataBase (dbdir);
@@ -147,12 +147,12 @@ namespace Tests.Services
ProjectDescription pd1 = new ProjectDescription ();
Project p1 = new Project {Description = pd1};
Assert.IsTrue (db.AddProject (p1));
- Assert.IsTrue (File.Exists (Path.Combine (dbdir, p1.UUID.ToString())));
+ Assert.IsTrue (File.Exists (Path.Combine (dbdir, p1.ID.ToString())));
Assert.AreEqual (db.Count, 1);
- Assert.IsTrue (db.RemoveProject (p1.UUID));
- Assert.IsFalse (File.Exists (Path.Combine (dbdir, p1.UUID.ToString())));
+ Assert.IsTrue (db.RemoveProject (p1.ID));
+ Assert.IsFalse (File.Exists (Path.Combine (dbdir, p1.ID.ToString())));
Assert.AreEqual (db.Count, 0);
- Assert.IsFalse (db.RemoveProject (p1.UUID));
+ Assert.IsFalse (db.RemoveProject (p1.ID));
db = new DataBase (dbdir);
Assert.AreEqual (db.Count, 0);
}
diff --git a/Tests/Tests.mdp b/Tests/Tests.mdp
index ca8d043..6ae96b9 100644
--- a/Tests/Tests.mdp
+++ b/Tests/Tests.mdp
@@ -30,7 +30,6 @@
<File subtype="Code" buildaction="Compile" name="Core/TestTimeNode.cs" />
<File subtype="Code" buildaction="Compile" name="Core/TestCategoriesTemplate.cs" />
<File subtype="Code" buildaction="Compile" name="Core/TestTeamTemplate.cs" />
- <File subtype="Code" buildaction="Compile" name="Core/TestSubcategoriesTemplate.cs" />
<File subtype="Directory" buildaction="Compile" name="Services" />
<File subtype="Code" buildaction="Compile" name="Services/TestDatabase.cs" />
<File subtype="Code" buildaction="Compile" name="Services/TestDatabasesManager.cs" />
@@ -46,15 +45,18 @@
<File subtype="Code" buildaction="Compile" name="Core/Drawables/TestDrawable.cs" />
<File subtype="Code" buildaction="Compile" name="Core/Drawables/TestCircle.cs" />
<File subtype="Code" buildaction="Compile" name="Core/TestColor.cs" />
+ <File subtype="Code" buildaction="Compile" name="Core/TestTime.cs" />
+ <File subtype="Code" buildaction="Compile" name="Core/TestImage.cs" />
</Contents>
<References>
- <ProjectReference type="Gac" localcopy="False" refto="nunit.core, Version=2.6.0.0, Culture=neutral,
PublicKeyToken=96d09a1eb7f44a77" />
- <ProjectReference type="Gac" localcopy="False" refto="nunit.framework, Version=2.6.0.0, Culture=neutral,
PublicKeyToken=96d09a1eb7f44a77" />
- <ProjectReference specificVersion="False" type="Gac" localcopy="False" refto="System, Version=4.0.0.0,
Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+ <ProjectReference type="Package" localcopy="False" refto="nunit.core, Version=2.6.0.0, Culture=neutral,
PublicKeyToken=96d09a1eb7f44a77" />
+ <ProjectReference type="Package" localcopy="False" refto="nunit.framework, Version=2.6.0.0,
Culture=neutral, PublicKeyToken=96d09a1eb7f44a77" />
+ <ProjectReference type="Package" specificVersion="False" localcopy="False" refto="System,
Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<ProjectReference type="Project" localcopy="True" refto="LongoMatch.Core" />
- <ProjectReference type="Gac" localcopy="False" refto="Newtonsoft.Json, Version=5.0.0.0, Culture=neutral,
PublicKeyToken=b9a188c8922137c6" />
- <ProjectReference specificVersion="False" type="Gac" localcopy="False" refto="System.Drawing,
Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
- <ProjectReference specificVersion="False" type="Gac" localcopy="False" refto="System.Core,
Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
+ <ProjectReference type="Package" localcopy="False" refto="Newtonsoft.Json, Version=5.0.0.0,
Culture=neutral, PublicKeyToken=b9a188c8922137c6" />
+ <ProjectReference type="Package" specificVersion="False" localcopy="False" refto="System.Drawing,
Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
+ <ProjectReference type="Package" specificVersion="False" localcopy="False" refto="System.Core,
Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<ProjectReference type="Project" localcopy="True" refto="LongoMatch.Services" />
+ <ProjectReference type="Package" localcopy="False" refto="gdk-sharp, Version=2.12.0.0, Culture=neutral,
PublicKeyToken=35e10195dab3c99f" />
</References>
</Project>
\ No newline at end of file
diff --git a/Tests/Utils.cs b/Tests/Utils.cs
index 240c761..7423454 100644
--- a/Tests/Utils.cs
+++ b/Tests/Utils.cs
@@ -30,27 +30,27 @@ namespace Tests
public static T SerializeDeserialize<T> (T obj) {
var stream = new MemoryStream ();
- SerializableObject.Save (obj, stream, SerializationType.Json);
+ Serializer.Save (obj, stream, SerializationType.Json);
stream.Seek (0, SeekOrigin.Begin);
var jsonString = new StreamReader(stream).ReadToEnd();
Console.WriteLine (jsonString);
stream.Seek(0, SeekOrigin.Begin);
- return SerializableObject.Load<T>(stream, SerializationType.Json);
+ return Serializer.Load<T>(stream, SerializationType.Json);
}
public static void CheckSerialization<T> (T obj) {
var stream = new MemoryStream ();
- SerializableObject.Save (obj, stream, SerializationType.Json);
+ Serializer.Save (obj, stream, SerializationType.Json);
stream.Seek (0, SeekOrigin.Begin);
var jsonString = new StreamReader(stream).ReadToEnd();
Console.WriteLine (jsonString);
stream.Seek(0, SeekOrigin.Begin);
- var newobj = SerializableObject.Load<T>(stream, SerializationType.Json);
+ var newobj = Serializer.Load<T>(stream, SerializationType.Json);
stream = new MemoryStream ();
- SerializableObject.Save (newobj, stream, SerializationType.Json);
+ Serializer.Save (newobj, stream, SerializationType.Json);
stream.Seek(0, SeekOrigin.Begin);
var newJsonString = new StreamReader(stream).ReadToEnd();
Console.WriteLine (newJsonString);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]