[longomatch] Added support for tagging plays



commit 0f462ea986f9486bc38dc5979974794b0ff74f69
Author: Andoni Morales Alastruey <ylatuya gmail com>
Date:   Sun Dec 20 22:50:02 2009 +0100

    Added support for tagging plays

 LongoMatch.mds                                     |    2 +-
 LongoMatch/DB/Project.cs                           |   20 +++-
 LongoMatch/DB/TagsTemplate.cs                      |   13 ++-
 LongoMatch/Gui/Component/PlaysListTreeWidget.cs    |    8 +
 LongoMatch/Gui/Component/TaggerWidget.cs           |  145 +++++++++++++++++
 .../{DB/Tag.cs => Gui/Dialog/TaggerDialog.cs}      |   66 ++++-----
 LongoMatch/Gui/TreeView/PlaysTreeView.cs           |   32 +++-
 LongoMatch/Handlers/EventsManager.cs               |   19 ++-
 LongoMatch/Handlers/Handlers.cs                    |    9 +-
 LongoMatch/LongoMatch.mdp                          |    6 +-
 LongoMatch/Makefile.am                             |    6 +-
 LongoMatch/Time/MediaTimeNode.cs                   |   43 +++++
 LongoMatch/{DB => Time}/Tag.cs                     |   12 +-
 ...LongoMatch.Gui.Component.PlaysListTreeWidget.cs |    1 +
 .../LongoMatch.Gui.Component.TaggerWidget.cs       |  120 ++++++++++++++
 .../gtk-gui/LongoMatch.Gui.Dialog.TaggerDialog.cs  |   65 ++++++++
 LongoMatch/gtk-gui/gui.stetic                      |  170 ++++++++++++++++++++
 LongoMatch/gtk-gui/objects.xml                     |   52 ++++---
 18 files changed, 700 insertions(+), 89 deletions(-)
---
diff --git a/LongoMatch.mds b/LongoMatch.mds
index e8d480d..0fbac54 100644
--- a/LongoMatch.mds
+++ b/LongoMatch.mds
@@ -1,7 +1,7 @@
 <Combine fileversion="2.0" description="LongoMatch : The Digital Coach" outputpath="build/bin/" releaseversion="0.9.0" name="LongoMatch">
   <Policies>
     <DotNetNamingPolicy DirectoryNamespaceAssociation="PrefixedHierarchical" ResourceNamePolicy="FileFormatDefault" />
-    <StandardHeader inheritsSet="GPLv2License" />
+    <StandardHeader Text="&#xA; Copyright (C) ${Year} ${CopyrightHolder}&#xA;&#xA; This program is free software; you can redistribute it and/or modify&#xA; it under the terms of the GNU General Public License as published by&#xA; the Free Software Foundation; either version 2 of the License, or&#xA; (at your option) any later version.&#xA;&#xA; This program is distributed in the hope that it will be useful,&#xA; but WITHOUT ANY WARRANTY; without even the implied warranty of&#xA; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the&#xA; GNU General Public License for more details.&#xA; &#xA; You should have received a copy of the GNU General Public License&#xA; along with this program; if not, write to the Free Software&#xA; Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.&#xA;" inheritsSet="MITX11License" />
     <VersionControlPolicy inheritsSet="Mono" />
     <ChangeLogPolicy UpdateMode="None" inheritsSet="Mono">
       <MessageStyle LineAlign="0" />
diff --git a/LongoMatch/DB/Project.cs b/LongoMatch/DB/Project.cs
index 1610f93..a8f6176 100644
--- a/LongoMatch/DB/Project.cs
+++ b/LongoMatch/DB/Project.cs
@@ -70,6 +70,8 @@ namespace LongoMatch.DB
 		private TeamTemplate visitorTeamTemplate;
 
 		private TeamTemplate localTeamTemplate;
+		
+		private TagsTemplate tagsTemplate;
 		//Keep this fiel for DB retrocompatibility
 		private List<MediaTimeNode>[] dataSectionArray;
 
@@ -131,7 +133,8 @@ namespace LongoMatch.DB
 			for (int i=0;i<sections.Count;i++) {
 				sectionPlaysList.Add(new List<MediaTimeNode>());
 			}
-
+			
+			this.tagsTemplate = new TagsTemplate();
 			this.Title = System.IO.Path.GetFileNameWithoutExtension(this.file.FilePath);
 		}
 		#endregion
@@ -280,6 +283,21 @@ namespace LongoMatch.DB
 				visitorTeamTemplate=value;
 			}
 		}
+		
+		/// <value>
+		/// Template with the project tags
+		/// </value>
+		public TagsTemplate Tags{
+			//Since 0.15.5
+			get{
+				if (tagsTemplate == null)
+					tagsTemplate = new TagsTemplate();
+				return tagsTemplate;
+			}
+			set{
+				tagsTemplate = value;
+			}
+		}
 		#endregion
 
 		#region Public Methods
diff --git a/LongoMatch/DB/TagsTemplate.cs b/LongoMatch/DB/TagsTemplate.cs
index a083b4c..fae3a41 100644
--- a/LongoMatch/DB/TagsTemplate.cs
+++ b/LongoMatch/DB/TagsTemplate.cs
@@ -18,6 +18,7 @@
 
 using System;
 using System.Collections.Generic;
+using LongoMatch.TimeNodes;
 
 namespace LongoMatch.DB
 {
@@ -31,7 +32,7 @@ namespace LongoMatch.DB
 			tagsList = new List<Tag>();
 		}
 
-		public bool AddTag(Tag tag) {
+		public bool AddTag(Tag tag) {			
 			if (tagsList.Contains(tag))
 				return false;
 			else
@@ -39,8 +40,16 @@ namespace LongoMatch.DB
 			return true;
 		}
 
-		public bool removeTag(Tag tag) {
+		public bool RemoveTag (Tag tag) {
 			return tagsList.Remove(tag);
 		}
+		
+		public Tag GetTag(int index){
+			return tagsList[index];
+		}
+		
+		public int Count (){
+			return tagsList.Count;
+		}
 	}
 }
diff --git a/LongoMatch/Gui/Component/PlaysListTreeWidget.cs b/LongoMatch/Gui/Component/PlaysListTreeWidget.cs
index 8dacc11..d6ab752 100644
--- a/LongoMatch/Gui/Component/PlaysListTreeWidget.cs
+++ b/LongoMatch/Gui/Component/PlaysListTreeWidget.cs
@@ -40,6 +40,8 @@ namespace LongoMatch.Gui.Component
 		public event PlayListNodeAddedHandler PlayListNodeAdded;
 		public event SnapshotSeriesHandler SnapshotSeriesEvent;
 		public event PlayersTaggedHandler PlayersTagged;
+		public event TagPlayHandler TagPlay;
+
 
 		private Project project;
 
@@ -137,5 +139,11 @@ namespace LongoMatch.Gui.Component
 			if (PlayersTagged != null)
 				PlayersTagged(tNode,team);
 		}
+
+		protected virtual void OnTreeviewTagPlay (LongoMatch.TimeNodes.MediaTimeNode tNode)
+		{
+			if (TagPlay != null)
+				TagPlay(tNode);
+		}
 	}
 }
diff --git a/LongoMatch/Gui/Component/TaggerWidget.cs b/LongoMatch/Gui/Component/TaggerWidget.cs
new file mode 100644
index 0000000..13cb1fb
--- /dev/null
+++ b/LongoMatch/Gui/Component/TaggerWidget.cs
@@ -0,0 +1,145 @@
+// 
+//  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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+// 
+
+using System;
+using System.Collections.Generic;
+using Gtk;
+using LongoMatch.TimeNodes;
+using LongoMatch.DB;
+using LongoMatch.Handlers;
+
+namespace LongoMatch.Gui.Component
+{
+	
+	
+	[System.ComponentModel.ToolboxItem(true)]
+	public partial class TaggerWidget : Gtk.Bin
+	{
+		private Dictionary<Tag, CheckButton> tagsDict;
+		private List<Tag> tagsList;
+		private MediaTimeNode play;
+
+		
+		public TaggerWidget()
+		{
+			this.Build();
+			tagsDict = new Dictionary<Tag, CheckButton>();
+			tagsList = new List<Tag>();
+			table1.NColumns = 5;
+			play = null;
+		}
+		
+		public MediaTimeNode Play{
+			set{
+				play = value;
+			}
+		}
+		
+		public TagsTemplate ProjectsTags{
+			set{
+				int tagsCount = value.Count();
+				scrolledwindow1.Visible = tagsCount > 0;
+				label1.Visible = !(tagsCount > 0);
+							
+				tagsDict.Clear();				
+				
+				foreach (Widget w in table1.AllChildren){
+					w.Unrealize();
+					table1.Remove(w);
+				}
+				
+				for(int i=0;i<tagsCount;i++){
+					AddTagWidget(value.GetTag(i), false);			
+				}
+			}
+		}		
+		
+		public List<Tag> Tags{
+			set{
+				CheckButton button = null;
+				foreach (Tag tag in value){
+					if (tagsDict.TryGetValue(tag, out button))
+						button.Active = true;
+				}
+			}
+			get{
+				List<Tag> list = new List<Tag>();
+				foreach (KeyValuePair<Tag, CheckButton> pair in tagsDict){
+					if (pair.Value.Active)
+						list.Add(pair.Key);
+				}
+				return list;
+			}
+		}
+		
+		private void AddTag(string text, bool check){
+			Tag tag = new Tag(text);
+			if (tagsDict.ContainsKey(tag))
+				return;
+			AddTagWidget(tag, check);
+		}
+		
+		private void AddTagWidget(Tag tag, bool check){
+			CheckButton button = new CheckButton(tag.Text);					
+			button.Name = tag.Text;		
+			AddElementToTable(button);	
+			button.Active = check;
+			tagsDict.Add(tag, button);
+		}
+			
+		private void AddElementToTable(CheckButton button){
+			uint row_top,row_bottom,col_left,col_right;
+			int index = tagsDict.Count;
+			
+			table1.NRows =(uint) (index/5 + 1);			
+			row_top =(uint) (index/table1.NColumns);
+			row_bottom = (uint) row_top+1 ;
+			col_left = (uint) index%table1.NColumns;
+			col_right = (uint) col_left+1 ;
+			
+			table1.Attach(button,col_left,col_right,row_top,row_bottom);	
+			button.Show();
+		}
+
+		protected virtual void OnTagbuttonClicked (object sender, System.EventArgs e)
+		{
+			Tag tag;
+			CheckButton button;
+			
+			// Don't allow tags with void strings
+			if (entry1.Text == "")
+				return;
+			// Check if it's the first tag and show the tags table
+			if (tagsDict.Count == 0){
+				scrolledwindow1.Visible = true;
+				label1.Visible = false;
+			}
+			tag = new Tag(entry1.Text);
+			if (tagsDict.TryGetValue(tag, out button))
+				button.Active = true;
+			else
+				AddTagWidget(new Tag(entry1.Text), true);	
+			entry1.Text = "";
+		}
+
+		protected virtual void OnEntry1Activated (object sender, System.EventArgs e)
+		{
+			tagbutton.Click();
+		}	
+	}
+}
\ No newline at end of file
diff --git a/LongoMatch/DB/Tag.cs b/LongoMatch/Gui/Dialog/TaggerDialog.cs
similarity index 58%
copy from LongoMatch/DB/Tag.cs
copy to LongoMatch/Gui/Dialog/TaggerDialog.cs
index cec70b4..de2f959 100644
--- a/LongoMatch/DB/Tag.cs
+++ b/LongoMatch/Gui/Dialog/TaggerDialog.cs
@@ -1,60 +1,52 @@
-//
-//  Copyright (C) 2007-2009 Andoni Morales Alastruey
-//
+// 
+//  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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
-//
+// 
 
 using System;
+using System.Collections.Generic;
+using LongoMatch.DB;
+using LongoMatch.TimeNodes;
 
-namespace LongoMatch.DB
+namespace LongoMatch.Gui.Dialog
 {
-
-
-	public class Tag
+	
+	
+	public partial class TaggerDialog : Gtk.Dialog
 	{
-		string text;
-		public Tag(string text)
+		
+		public TaggerDialog()
 		{
-			this.text=text;
+			this.Build();
+			buttonOk.Visible = false;
 		}
-
-		public string Text {
-			get {
-				return text;
-			}
-			set {
-				text=value;
+		
+		public TagsTemplate ProjectTags{
+			set{
+				taggerwidget1.ProjectsTags = value;
 			}
 		}
-
-		public bool Equals(Tag tagComp) {
-			return (this.text == tagComp.Text);
-		}
-
-		public override bool Equals(object obj)
-		{
-			Tag tag= obj as Tag;
-			if (tag != null)
-				return Equals(tag);
-			else
-				return false;
-		}
-
-		public override int GetHashCode()
-		{
-			return text.CompareTo("XXXXX") ^ 3 ;
+		
+		public List<Tag> Tags{
+			set{
+				taggerwidget1.Tags = value;
+			}
+			get{
+				return taggerwidget1.Tags;
+			}
 		}
 	}
 }
diff --git a/LongoMatch/Gui/TreeView/PlaysTreeView.cs b/LongoMatch/Gui/TreeView/PlaysTreeView.cs
index d8b7c43..4af5e08 100644
--- a/LongoMatch/Gui/TreeView/PlaysTreeView.cs
+++ b/LongoMatch/Gui/TreeView/PlaysTreeView.cs
@@ -41,11 +41,13 @@ namespace LongoMatch.Gui.Component
 		public event PlayListNodeAddedHandler PlayListNodeAdded;
 		public event SnapshotSeriesHandler SnapshotSeriesEvent;
 		public event PlayersTaggedHandler PlayersTagged;
+		public event TagPlayHandler TagPlay;
 
 		private Menu menu;
 		private MenuItem local;
 		private	MenuItem visitor;
 		private MenuItem noTeam;
+		private MenuItem tag;
 		private MenuItem addPLN;
 		private MenuItem deleteKeyFrame;
 		private MenuItem snapshot;
@@ -94,7 +96,11 @@ namespace LongoMatch.Gui.Component
 		}
 
 		private void SetMenu() {
-			Menu teamMenu = new Menu();
+			Menu teamMenu, playersMenu;
+			MenuItem localPlayers, visitorPlayers;
+			MenuItem team, quit;
+			
+			teamMenu = new Menu();
 			local = new MenuItem(Catalog.GetString("Local Team"));
 			visitor = new MenuItem(Catalog.GetString("Visitor Team"));
 			noTeam = new MenuItem(Catalog.GetString("No Team"));
@@ -102,34 +108,37 @@ namespace LongoMatch.Gui.Component
 			teamMenu .Append(visitor);
 			teamMenu .Append(noTeam);
 
-			Menu playersMenu = new Menu();
-			MenuItem localPlayers = new MenuItem(Catalog.GetString("Local team"));
-			MenuItem visitorPlayers = new MenuItem(Catalog.GetString("Visitor team"));
+			playersMenu = new Menu();
+			localPlayers = new MenuItem(Catalog.GetString("Local team"));
+			visitorPlayers = new MenuItem(Catalog.GetString("Visitor team"));
 			playersMenu.Append(localPlayers);
 			playersMenu.Append(visitorPlayers);
 
 			menu = new Menu();
 
 			name = new MenuItem(Catalog.GetString("Edit"));
-			MenuItem team = new MenuItem(Catalog.GetString("Team Selection"));
+			team = new MenuItem(Catalog.GetString("Team Selection"));
 			team.Submenu = teamMenu;
+			tag = new MenuItem(Catalog.GetString("Add tag"));
 			players = new MenuItem(Catalog.GetString("Tag player"));
 			players.Submenu = playersMenu;
-			MenuItem quit = new MenuItem(Catalog.GetString("Delete"));
+			quit = new MenuItem(Catalog.GetString("Delete"));
 			deleteKeyFrame = new MenuItem(Catalog.GetString("Delete key frame"));
 			addPLN = new MenuItem(Catalog.GetString("Add to playlist"));
 			addPLN.Sensitive=false;
 			snapshot = new MenuItem(Catalog.GetString("Export to PGN images"));
 
 			menu.Append(name);
-			menu.Append(team);
+			menu.Append(tag);
 			menu.Append(players);
+			menu.Append(team);
 			menu.Append(addPLN);
 			menu.Append(quit);
 			menu.Append(deleteKeyFrame);
 			menu.Append(snapshot);
 
 			name.Activated += OnEdit;
+			tag.Activated += OnTag;
 			local.Activated += OnTeamSelection;
 			visitor.Activated += OnTeamSelection;
 			noTeam.Activated += OnTeamSelection;
@@ -157,6 +166,7 @@ namespace LongoMatch.Gui.Component
 			name.Sensitive = !enabled;
 			snapshot.Sensitive = !enabled;
 			players.Sensitive = !enabled;
+			tag.Sensitive = !enabled;
 		}
 		
 		private void RenderMiniature(Gtk.TreeViewColumn column, Gtk.CellRenderer cell, Gtk.TreeModel model, Gtk.TreeIter iter)
@@ -247,7 +257,6 @@ namespace LongoMatch.Gui.Component
 					paths = Selection.GetSelectedRows();
 				}
 				
-				Console.WriteLine(paths.Length);
 				if (paths.Length == 1) {
 					TimeNode selectedTimeNode = GetValueFromPath(paths[0]);
 					if (selectedTimeNode is MediaTimeNode) {
@@ -340,6 +349,11 @@ namespace LongoMatch.Gui.Component
 				}
 			}
 		}
+		
+		protected void OnTag (object obj, EventArgs args){
+			if (TagPlay != null)
+				TagPlay((MediaTimeNode)GetValueFromPath(Selection.GetSelectedRows()[0]));
+		}
 
 		protected void OnSnapshot(object obj, EventArgs args) {
 			if (SnapshotSeriesEvent != null)
@@ -357,4 +371,4 @@ namespace LongoMatch.Gui.Component
 		}
 		
 	}
-}
\ No newline at end of file
+}
diff --git a/LongoMatch/Handlers/EventsManager.cs b/LongoMatch/Handlers/EventsManager.cs
index 8bbb0f5..f1bcf0e 100644
--- a/LongoMatch/Handlers/EventsManager.cs
+++ b/LongoMatch/Handlers/EventsManager.cs
@@ -110,6 +110,7 @@ namespace LongoMatch
 			visitorPlayersList.PlayListNodeAdded += OnPlayListNodeAdded;
 
 			treewidget.PlayersTagged += OnPlayersTagged;
+			treewidget.TagPlay += OnTagPlay;
 
 			treewidget.SnapshotSeriesEvent += OnSnapshotSeries;
 			localPlayersList.SnapshotSeriesEvent += OnSnapshotSeries;
@@ -329,10 +330,7 @@ namespace LongoMatch
 			Pixbuf pixbuf=null;
 			DrawingTool dialog = new DrawingTool();
 
-			if (selectedTimeNode == null)
-				player.SeekTo(time,true);
-			else
-				player.SeekTo(time,true);
+			player.SeekTo(time,true);
 			while (pixbuf == null)
 				pixbuf = player.CurrentFrame;
 
@@ -346,6 +344,19 @@ namespace LongoMatch
 			dialog.Run();
 			dialog.Destroy();
 		}
+		
+		protected virtual void OnTagPlay(MediaTimeNode tNode){
+			TaggerDialog tagger = new TaggerDialog();
+			tagger.ProjectTags = openedProject.Tags;
+			tagger.Tags = tNode.Tags;
+			tagger.TransientFor = (Gtk.Window)player.Toplevel;
+			tagger.Run();
+			tNode.Tags = tagger.Tags;
+			foreach (Tag tag in tagger.Tags){
+				openedProject.Tags.AddTag(tag);
+			}
+			tagger.Destroy();
+		}
 
 		protected virtual void OnPlayersTagged(MediaTimeNode tNode, Team team) {
 			PlayersSelectionDialog dialog = new PlayersSelectionDialog();
diff --git a/LongoMatch/Handlers/Handlers.cs b/LongoMatch/Handlers/Handlers.cs
index 1e98599..86dd512 100644
--- a/LongoMatch/Handlers/Handlers.cs
+++ b/LongoMatch/Handlers/Handlers.cs
@@ -41,6 +41,8 @@ namespace LongoMatch.Handlers
 	public delegate void TimeNodeDeletedHandler(MediaTimeNode tNode,int section);
 	//Players needs to be tagged
 	public delegate void PlayersTaggedHandler(MediaTimeNode tNode, Team team);
+	//Tag a play
+	public delegate void TagPlayHandler(MediaTimeNode tNode);
 
 	/*Playlist Events*/
 	//Add the a play to the opened playlist
@@ -73,10 +75,5 @@ namespace LongoMatch.Handlers
 	public delegate void SnapshotSeriesHandler(MediaTimeNode tNode);
 	//A new version of the software exists
 	public delegate void NewVersionHandler(Version version, string URL);
-
-
-
-
-
-
+	
 }
diff --git a/LongoMatch/LongoMatch.mdp b/LongoMatch/LongoMatch.mdp
index 49c0834..5e15583 100644
--- a/LongoMatch/LongoMatch.mdp
+++ b/LongoMatch/LongoMatch.mdp
@@ -70,7 +70,6 @@
     <File name="gtk-gui/LongoMatch.Gui.Dialog.TemplatesManager.cs" subtype="Code" buildaction="Compile" />
     <File name="gtk-gui/LongoMatch.Gui.Dialog.PlayersSelectionDialog.cs" subtype="Code" buildaction="Compile" />
     <File name="images/logo_48x48.png" subtype="Code" buildaction="Nothing" DeployService.RelativeDeployPath="icons/hicolor/48x48/longomatch.png" DeployService.TargetDirectoryId="CommonApplicationDataRoot" />
-    <File name="DB/Tag.cs" subtype="Code" buildaction="Compile" />
     <File name="DB/TagsTemplate.cs" subtype="Code" buildaction="Compile" />
     <File name="gtk-gui/LongoMatch.Gui.Dialog.Migrator.cs" subtype="Code" buildaction="Compile" />
     <File name="Compat/0.0/DatabaseMigrator.cs" subtype="Code" buildaction="Compile" />
@@ -169,6 +168,11 @@
     <File name="images/stock_draw-line-ends-with-arrow.png" subtype="Code" buildaction="EmbedAsResource" />
     <File name="images/stock_draw-rectangle-unfilled.png" subtype="Code" buildaction="EmbedAsResource" />
     <File name="Common/Enums.cs" subtype="Code" buildaction="Compile" />
+    <File name="Time/Tag.cs" subtype="Code" buildaction="Compile" />
+    <File name="gtk-gui/LongoMatch.Gui.Component.TaggerWidget.cs" subtype="Code" buildaction="Compile" />
+    <File name="Gui/Component/TaggerWidget.cs" subtype="Code" buildaction="Compile" />
+    <File name="Gui/Dialog/TaggerDialog.cs" subtype="Code" buildaction="Compile" />
+    <File name="gtk-gui/LongoMatch.Gui.Dialog.TaggerDialog.cs" subtype="Code" buildaction="Compile" />
   </Contents>
   <References>
     <ProjectReference type="Gac" localcopy="True" refto="Mono.Posix, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756" />
diff --git a/LongoMatch/Makefile.am b/LongoMatch/Makefile.am
index 1194568..c4fb3f2 100644
--- a/LongoMatch/Makefile.am
+++ b/LongoMatch/Makefile.am
@@ -96,7 +96,6 @@ FILES = \
 	DB/Project.cs \
 	DB/ProjectDescription.cs\
 	DB/Sections.cs \
-	DB/Tag.cs \
 	DB/TagsTemplate.cs \
 	DB/TeamTemplate.cs \
 	gtk-gui/generated.cs \
@@ -112,6 +111,7 @@ FILES = \
 	gtk-gui/LongoMatch.Gui.Component.ProjectDetailsWidget.cs \
 	gtk-gui/LongoMatch.Gui.Component.ProjectListWidget.cs \
 	gtk-gui/LongoMatch.Gui.Component.ProjectTemplateWidget.cs \
+	gtk-gui/LongoMatch.Gui.Component.TaggerWidget.cs \
 	gtk-gui/LongoMatch.Gui.Component.TeamTemplateWidget.cs \
 	gtk-gui/LongoMatch.Gui.Component.TimeAdjustWidget.cs \
 	gtk-gui/LongoMatch.Gui.Component.TimeLineWidget.cs \
@@ -128,6 +128,7 @@ FILES = \
 	gtk-gui/LongoMatch.Gui.Dialog.ProjectsManager.cs \
 	gtk-gui/LongoMatch.Gui.Dialog.ProjectTemplateEditorDialog.cs \
 	gtk-gui/LongoMatch.Gui.Dialog.SnapshotsDialog.cs \
+	gtk-gui/LongoMatch.Gui.Dialog.TaggerDialog.cs \
 	gtk-gui/LongoMatch.Gui.Dialog.TeamTemplateEditor.cs \
 	gtk-gui/LongoMatch.Gui.Dialog.TemplatesManager.cs \
 	gtk-gui/LongoMatch.Gui.Dialog.UpdateDialog.cs \
@@ -148,6 +149,7 @@ FILES = \
 	Gui/Component/ProjectDetailsWidget.cs \
 	Gui/Component/ProjectListWidget.cs \
 	Gui/Component/ProjectTemplateWidget.cs \
+	Gui/Component/TaggerWidget.cs\
 	Gui/Component/TeamTemplateWidget.cs\
 	Gui/Component/TimeAdjustWidget.cs \
 	Gui/Component/TimeLineWidget.cs \
@@ -166,6 +168,7 @@ FILES = \
 	Gui/Dialog/ProjectsManager.cs \
 	Gui/Dialog/ProjectTemplateEditorDialog.cs \
 	Gui/Dialog/SnapshotsDialog.cs \
+	Gui/Dialog/TaggerDialog.cs \
 	Gui/Dialog/TemplatesEditor.cs \
 	Gui/Dialog/TeamTemplateEditor.cs\
 	Gui/Dialog/UpdateDialog.cs \
@@ -192,6 +195,7 @@ FILES = \
 	Main.cs \
 	Playlist/IPlayList.cs \
 	Playlist/PlayList.cs \
+	Time/Tag.cs \
 	Time/Drawing.cs\
 	Time/HotKey.cs \
 	Time/MediaTimeNode.cs \
diff --git a/LongoMatch/Time/MediaTimeNode.cs b/LongoMatch/Time/MediaTimeNode.cs
index ffc800e..f95a367 100644
--- a/LongoMatch/Time/MediaTimeNode.cs
+++ b/LongoMatch/Time/MediaTimeNode.cs
@@ -58,6 +58,8 @@ namespace LongoMatch.TimeNodes
 		private List<int> localPlayersList; //Used for multitagging: one play and several players
 		// We use the int index of the player in the template,
 		private List<int> visitorPlayersList;// because it's the only unmutable variable
+		
+		private List<Tag> tagsList;
 
 		private Drawing keyFrame;
 
@@ -92,6 +94,7 @@ namespace LongoMatch.TimeNodes
 			this.stopFrame = (uint) this.Stop.MSeconds*fps/1000;
 			localPlayersList = new List<int>();
 			visitorPlayersList = new List<int>();
+			tagsList = new List<Tag>();
 		}
 		#endregion
 
@@ -245,6 +248,18 @@ namespace LongoMatch.TimeNodes
 				return keyFrame != null;
 			}
 		}
+		
+		//// <value>
+		/// Play's tags 
+		/// </value>
+		public List<Tag> Tags{
+			get{
+				return tagsList;
+			}
+			set{
+				tagsList = value;
+			}
+		}
 		#endregion
 
 		#region Public methods
@@ -300,6 +315,34 @@ namespace LongoMatch.TimeNodes
 		public void RemoveVisitorPlayer(int index) {
 			visitorPlayersList.Remove(index);
 		}
+		
+		/// <summary>
+		/// Adds a new tag to the play 
+		/// </summary>
+		/// <param name="tag">
+		/// A <see cref="Tag"/>: the tag to add
+		/// </param>
+		public void AddTag(Tag tag){
+			//From 0.15.5
+			if (tagsList == null)
+				tagsList = new List<Tag>();
+			if (!tagsList.Contains(tag))
+				tagsList.Add(tag);
+		}
+		
+		/// <summary>
+		/// Removes a tag to the play
+		/// </summary>
+		/// <param name="tag">
+		/// A <see cref="Tag"/>: the tag to remove
+		/// </param>
+		public void RemoveTag(Tag tag){
+			//From 0.15.5
+			if (tagsList == null)
+				tagsList = new List<Tag>();
+			if (tagsList.Contains(tag))
+				tagsList.Remove(tag);
+		}
 		#endregion
 	}
 }
diff --git a/LongoMatch/DB/Tag.cs b/LongoMatch/Time/Tag.cs
similarity index 88%
rename from LongoMatch/DB/Tag.cs
rename to LongoMatch/Time/Tag.cs
index cec70b4..99979cf 100644
--- a/LongoMatch/DB/Tag.cs
+++ b/LongoMatch/Time/Tag.cs
@@ -18,13 +18,14 @@
 
 using System;
 
-namespace LongoMatch.DB
+namespace LongoMatch.TimeNodes
 {
 
 
 	public class Tag
 	{
 		string text;
+		
 		public Tag(string text)
 		{
 			this.text=text;
@@ -35,12 +36,15 @@ namespace LongoMatch.DB
 				return text;
 			}
 			set {
-				text=value;
+				if (value == null)
+					text="";
+				else
+					text=value;
 			}
 		}
 
 		public bool Equals(Tag tagComp) {
-			return (this.text == tagComp.Text);
+			return (text == tagComp.Text);
 		}
 
 		public override bool Equals(object obj)
@@ -54,7 +58,7 @@ namespace LongoMatch.DB
 
 		public override int GetHashCode()
 		{
-			return text.CompareTo("XXXXX") ^ 3 ;
+			return text.GetHashCode();
 		}
 	}
 }
diff --git a/LongoMatch/gtk-gui/LongoMatch.Gui.Component.PlaysListTreeWidget.cs b/LongoMatch/gtk-gui/LongoMatch.Gui.Component.PlaysListTreeWidget.cs
index 2f940ea..fe73af7 100644
--- a/LongoMatch/gtk-gui/LongoMatch.Gui.Component.PlaysListTreeWidget.cs
+++ b/LongoMatch/gtk-gui/LongoMatch.Gui.Component.PlaysListTreeWidget.cs
@@ -46,6 +46,7 @@ namespace LongoMatch.Gui.Component {
             this.treeview.PlayListNodeAdded += new LongoMatch.Handlers.PlayListNodeAddedHandler(this.OnPlayListNodeAdded);
             this.treeview.SnapshotSeriesEvent += new LongoMatch.Handlers.SnapshotSeriesHandler(this.OnTreeviewSnapshotSeriesEvent);
             this.treeview.PlayersTagged += new LongoMatch.Handlers.PlayersTaggedHandler(this.OnTreeviewPlayersTagged);
+            this.treeview.TagPlay += new LongoMatch.Handlers.TagPlayHandler(this.OnTreeviewTagPlay);
         }
     }
 }
diff --git a/LongoMatch/gtk-gui/LongoMatch.Gui.Component.TaggerWidget.cs b/LongoMatch/gtk-gui/LongoMatch.Gui.Component.TaggerWidget.cs
new file mode 100644
index 0000000..9222d24
--- /dev/null
+++ b/LongoMatch/gtk-gui/LongoMatch.Gui.Component.TaggerWidget.cs
@@ -0,0 +1,120 @@
+// ------------------------------------------------------------------------------
+//  <autogenerated>
+//      This code was generated by a tool.
+//      
+// 
+//      Changes to this file may cause incorrect behavior and will be lost if 
+//      the code is regenerated.
+//  </autogenerated>
+// ------------------------------------------------------------------------------
+
+namespace LongoMatch.Gui.Component {
+    
+    
+    public partial class TaggerWidget {
+        
+        private Gtk.VBox vbox2;
+        
+        private Gtk.Label label1;
+        
+        private Gtk.ScrolledWindow scrolledwindow1;
+        
+        private Gtk.Table table1;
+        
+        private Gtk.HBox hbox1;
+        
+        private Gtk.Entry entry1;
+        
+        private Gtk.Button tagbutton;
+        
+        protected virtual void Build() {
+            Stetic.Gui.Initialize(this);
+            // Widget LongoMatch.Gui.Component.TaggerWidget
+            Stetic.BinContainer.Attach(this);
+            this.Name = "LongoMatch.Gui.Component.TaggerWidget";
+            // Container child LongoMatch.Gui.Component.TaggerWidget.Gtk.Container+ContainerChild
+            this.vbox2 = new Gtk.VBox();
+            this.vbox2.Name = "vbox2";
+            this.vbox2.Spacing = 6;
+            // Container child vbox2.Gtk.Box+BoxChild
+            this.label1 = new Gtk.Label();
+            this.label1.Name = "label1";
+            this.label1.LabelProp = Mono.Unix.Catalog.GetString("<b>This play hasn't been tagged yet.</b>\nYou can add new tags using the text entry and clicking \"Add Tag\"");
+            this.label1.UseMarkup = true;
+            this.label1.Justify = ((Gtk.Justification)(2));
+            this.vbox2.Add(this.label1);
+            Gtk.Box.BoxChild w1 = ((Gtk.Box.BoxChild)(this.vbox2[this.label1]));
+            w1.Position = 0;
+            // Container child vbox2.Gtk.Box+BoxChild
+            this.scrolledwindow1 = new Gtk.ScrolledWindow();
+            this.scrolledwindow1.CanFocus = true;
+            this.scrolledwindow1.Name = "scrolledwindow1";
+            this.scrolledwindow1.ShadowType = ((Gtk.ShadowType)(1));
+            // Container child scrolledwindow1.Gtk.Container+ContainerChild
+            Gtk.Viewport w2 = new Gtk.Viewport();
+            w2.ShadowType = ((Gtk.ShadowType)(0));
+            // Container child GtkViewport.Gtk.Container+ContainerChild
+            this.table1 = new Gtk.Table(((uint)(3)), ((uint)(3)), false);
+            this.table1.Name = "table1";
+            this.table1.RowSpacing = ((uint)(6));
+            this.table1.ColumnSpacing = ((uint)(6));
+            w2.Add(this.table1);
+            this.scrolledwindow1.Add(w2);
+            this.vbox2.Add(this.scrolledwindow1);
+            Gtk.Box.BoxChild w5 = ((Gtk.Box.BoxChild)(this.vbox2[this.scrolledwindow1]));
+            w5.Position = 1;
+            // Container child vbox2.Gtk.Box+BoxChild
+            this.hbox1 = new Gtk.HBox();
+            this.hbox1.Name = "hbox1";
+            this.hbox1.Spacing = 6;
+            // Container child hbox1.Gtk.Box+BoxChild
+            this.entry1 = new Gtk.Entry();
+            this.entry1.CanFocus = true;
+            this.entry1.Name = "entry1";
+            this.entry1.IsEditable = true;
+            this.entry1.InvisibleChar = 'â?¢';
+            this.hbox1.Add(this.entry1);
+            Gtk.Box.BoxChild w6 = ((Gtk.Box.BoxChild)(this.hbox1[this.entry1]));
+            w6.Position = 0;
+            // Container child hbox1.Gtk.Box+BoxChild
+            this.tagbutton = new Gtk.Button();
+            this.tagbutton.CanFocus = true;
+            this.tagbutton.Name = "tagbutton";
+            this.tagbutton.UseUnderline = true;
+            // Container child tagbutton.Gtk.Container+ContainerChild
+            Gtk.Alignment w7 = new Gtk.Alignment(0.5F, 0.5F, 0F, 0F);
+            // Container child GtkAlignment.Gtk.Container+ContainerChild
+            Gtk.HBox w8 = new Gtk.HBox();
+            w8.Spacing = 2;
+            // Container child GtkHBox.Gtk.Container+ContainerChild
+            Gtk.Image w9 = new Gtk.Image();
+            w9.Pixbuf = Stetic.IconLoader.LoadIcon(this, "gtk-add", Gtk.IconSize.Dialog, 48);
+            w8.Add(w9);
+            // Container child GtkHBox.Gtk.Container+ContainerChild
+            Gtk.Label w11 = new Gtk.Label();
+            w11.LabelProp = Mono.Unix.Catalog.GetString("Add Tag");
+            w11.UseUnderline = true;
+            w8.Add(w11);
+            w7.Add(w8);
+            this.tagbutton.Add(w7);
+            this.hbox1.Add(this.tagbutton);
+            Gtk.Box.BoxChild w15 = ((Gtk.Box.BoxChild)(this.hbox1[this.tagbutton]));
+            w15.Position = 1;
+            w15.Expand = false;
+            w15.Fill = false;
+            this.vbox2.Add(this.hbox1);
+            Gtk.Box.BoxChild w16 = ((Gtk.Box.BoxChild)(this.vbox2[this.hbox1]));
+            w16.Position = 2;
+            w16.Expand = false;
+            w16.Fill = false;
+            this.Add(this.vbox2);
+            if ((this.Child != null)) {
+                this.Child.ShowAll();
+            }
+            this.scrolledwindow1.Hide();
+            this.Hide();
+            this.entry1.Activated += new System.EventHandler(this.OnEntry1Activated);
+            this.tagbutton.Clicked += new System.EventHandler(this.OnTagbuttonClicked);
+        }
+    }
+}
diff --git a/LongoMatch/gtk-gui/LongoMatch.Gui.Dialog.TaggerDialog.cs b/LongoMatch/gtk-gui/LongoMatch.Gui.Dialog.TaggerDialog.cs
new file mode 100644
index 0000000..d688eab
--- /dev/null
+++ b/LongoMatch/gtk-gui/LongoMatch.Gui.Dialog.TaggerDialog.cs
@@ -0,0 +1,65 @@
+// ------------------------------------------------------------------------------
+//  <autogenerated>
+//      This code was generated by a tool.
+//      
+// 
+//      Changes to this file may cause incorrect behavior and will be lost if 
+//      the code is regenerated.
+//  </autogenerated>
+// ------------------------------------------------------------------------------
+
+namespace LongoMatch.Gui.Dialog {
+    
+    
+    public partial class TaggerDialog {
+        
+        private LongoMatch.Gui.Component.TaggerWidget taggerwidget1;
+        
+        private Gtk.Button buttonOk;
+        
+        protected virtual void Build() {
+            Stetic.Gui.Initialize(this);
+            // Widget LongoMatch.Gui.Dialog.TaggerDialog
+            this.Name = "LongoMatch.Gui.Dialog.TaggerDialog";
+            this.Title = Mono.Unix.Catalog.GetString("Tag play");
+            this.Icon = Stetic.IconLoader.LoadIcon(this, "longomatch", Gtk.IconSize.Menu, 16);
+            this.WindowPosition = ((Gtk.WindowPosition)(4));
+            this.HasSeparator = false;
+            // Internal child LongoMatch.Gui.Dialog.TaggerDialog.VBox
+            Gtk.VBox w1 = this.VBox;
+            w1.Name = "dialog1_VBox";
+            w1.BorderWidth = ((uint)(2));
+            // Container child dialog1_VBox.Gtk.Box+BoxChild
+            this.taggerwidget1 = new LongoMatch.Gui.Component.TaggerWidget();
+            this.taggerwidget1.Events = ((Gdk.EventMask)(256));
+            this.taggerwidget1.Name = "taggerwidget1";
+            w1.Add(this.taggerwidget1);
+            Gtk.Box.BoxChild w2 = ((Gtk.Box.BoxChild)(w1[this.taggerwidget1]));
+            w2.Position = 0;
+            // Internal child LongoMatch.Gui.Dialog.TaggerDialog.ActionArea
+            Gtk.HButtonBox w3 = this.ActionArea;
+            w3.Name = "dialog1_ActionArea";
+            w3.Spacing = 6;
+            w3.BorderWidth = ((uint)(5));
+            w3.LayoutStyle = ((Gtk.ButtonBoxStyle)(4));
+            // Container child dialog1_ActionArea.Gtk.ButtonBox+ButtonBoxChild
+            this.buttonOk = new Gtk.Button();
+            this.buttonOk.CanDefault = true;
+            this.buttonOk.CanFocus = true;
+            this.buttonOk.Name = "buttonOk";
+            this.buttonOk.UseStock = true;
+            this.buttonOk.UseUnderline = true;
+            this.buttonOk.Label = "gtk-ok";
+            this.AddActionWidget(this.buttonOk, -5);
+            Gtk.ButtonBox.ButtonBoxChild w4 = ((Gtk.ButtonBox.ButtonBoxChild)(w3[this.buttonOk]));
+            w4.Expand = false;
+            w4.Fill = false;
+            if ((this.Child != null)) {
+                this.Child.ShowAll();
+            }
+            this.DefaultWidth = 426;
+            this.DefaultHeight = 249;
+            this.Show();
+        }
+    }
+}
diff --git a/LongoMatch/gtk-gui/gui.stetic b/LongoMatch/gtk-gui/gui.stetic
index 25ac1b7..5813ce3 100644
--- a/LongoMatch/gtk-gui/gui.stetic
+++ b/LongoMatch/gtk-gui/gui.stetic
@@ -780,6 +780,7 @@
                 <signal name="PlayListNodeAdded" handler="OnPlayListNodeAdded" />
                 <signal name="SnapshotSeriesEvent" handler="OnTreeviewSnapshotSeriesEvent" />
                 <signal name="PlayersTagged" handler="OnTreeviewPlayersTagged" />
+                <signal name="TagPlay" handler="OnTreeviewTagPlay" />
               </widget>
             </child>
           </widget>
@@ -4972,4 +4973,173 @@ Show-&gt;&lt;b&gt; S&lt;/b&gt;
       </widget>
     </child>
   </widget>
+  <widget class="Gtk.Bin" id="LongoMatch.Gui.Component.TaggerWidget" design-size="357 181">
+    <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.Label" id="label1">
+            <property name="MemberName" />
+            <property name="LabelProp" translatable="yes">&lt;b&gt;This play hasn't been tagged yet.&lt;/b&gt;
+You can add new tags using the text entry and clicking "Add Tag"</property>
+            <property name="UseMarkup">True</property>
+            <property name="Justify">Center</property>
+          </widget>
+          <packing>
+            <property name="Position">0</property>
+            <property name="AutoSize">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.Viewport" id="GtkViewport">
+                <property name="MemberName" />
+                <property name="ShadowType">None</property>
+                <child>
+                  <widget class="Gtk.Table" id="table1">
+                    <property name="MemberName" />
+                    <property name="NRows">3</property>
+                    <property name="NColumns">3</property>
+                    <property name="RowSpacing">6</property>
+                    <property name="ColumnSpacing">6</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>
+          </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>
+                <signal name="Activated" handler="OnEntry1Activated" />
+              </widget>
+              <packing>
+                <property name="Position">0</property>
+                <property name="AutoSize">True</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="Gtk.Button" id="tagbutton">
+                <property name="MemberName" />
+                <property name="CanFocus">True</property>
+                <property name="Type">TextAndIcon</property>
+                <property name="Icon">stock:gtk-add Dialog</property>
+                <property name="Label" translatable="yes">Add Tag</property>
+                <property name="UseUnderline">True</property>
+                <signal name="Clicked" handler="OnTagbuttonClicked" />
+              </widget>
+              <packing>
+                <property name="Position">1</property>
+                <property name="AutoSize">True</property>
+                <property name="Expand">False</property>
+                <property name="Fill">False</property>
+              </packing>
+            </child>
+          </widget>
+          <packing>
+            <property name="Position">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.Dialog" id="LongoMatch.Gui.Dialog.TaggerDialog" design-size="426 249">
+    <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="Buttons">1</property>
+    <property name="HelpButton">False</property>
+    <property name="HasSeparator">False</property>
+    <child internal-child="VBox">
+      <widget class="Gtk.VBox" id="dialog1_VBox">
+        <property name="MemberName" />
+        <property name="BorderWidth">2</property>
+        <child>
+          <widget class="LongoMatch.Gui.Component.TaggerWidget" id="taggerwidget1">
+            <property name="MemberName" />
+            <property name="Events">ButtonPressMask</property>
+          </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>
 </stetic-interface>
\ No newline at end of file
diff --git a/LongoMatch/gtk-gui/objects.xml b/LongoMatch/gtk-gui/objects.xml
index 50fa71a..ff8aaf2 100644
--- a/LongoMatch/gtk-gui/objects.xml
+++ b/LongoMatch/gtk-gui/objects.xml
@@ -85,6 +85,7 @@
         <signal name="PlayListNodeAdded" />
         <signal name="SnapshotSeriesEvent" />
         <signal name="PlayersTagged" />
+        <signal name="TagPlay" />
       </itemgroup>
     </signals>
   </object>
@@ -173,29 +174,6 @@
       </itemgroup>
     </signals>
   </object>
-  <object type="LongoMatch.Gui.Component.PlayListWidget" palette-category="LongoMatch" allow-children="false" base-type="Gtk.Bin">
-    <itemgroups />
-    <signals>
-      <itemgroup label="PlayListWidget Signals">
-        <signal name="PlayListNodeSelected" />
-        <signal name="ApplyCurrentRate" />
-        <signal name="Progress" />
-      </itemgroup>
-    </signals>
-  </object>
-  <object type="LongoMatch.Gui.Component.PlaysListTreeWidget" palette-category="LongoMatch" allow-children="false" base-type="Gtk.Bin">
-    <itemgroups />
-    <signals>
-      <itemgroup label="PlaysListTreeWidget Signals">
-        <signal name="TimeNodeSelected" />
-        <signal name="TimeNodeChanged" />
-        <signal name="TimeNodeDeleted" />
-        <signal name="PlayListNodeAdded" />
-        <signal name="SnapshotSeriesEvent" />
-        <signal name="PlayersTagged" />
-      </itemgroup>
-    </signals>
-  </object>
   <object type="LongoMatch.Gui.Popup.TransparentDrawingArea" palette-category="General" allow-children="false" base-type="Gtk.Window">
     <itemgroups />
     <signals />
@@ -243,4 +221,32 @@
     </itemgroups>
     <signals />
   </object>
+  <object type="LongoMatch.Gui.Component.PlaysListTreeWidget" palette-category="LongoMatch" allow-children="false" base-type="Gtk.Bin">
+    <itemgroups />
+    <signals>
+      <itemgroup label="PlaysListTreeWidget Signals">
+        <signal name="TimeNodeSelected" />
+        <signal name="TimeNodeChanged" />
+        <signal name="TimeNodeDeleted" />
+        <signal name="PlayListNodeAdded" />
+        <signal name="SnapshotSeriesEvent" />
+        <signal name="PlayersTagged" />
+        <signal name="TagPlay" />
+      </itemgroup>
+    </signals>
+  </object>
+  <object type="LongoMatch.Gui.Component.PlayListWidget" palette-category="LongoMatch" allow-children="false" base-type="Gtk.Bin">
+    <itemgroups />
+    <signals>
+      <itemgroup label="PlayListWidget Signals">
+        <signal name="PlayListNodeSelected" />
+        <signal name="ApplyCurrentRate" />
+        <signal name="Progress" />
+      </itemgroup>
+    </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



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