[longomatch] Add stats for players



commit c8acaaba1339dbb7561786a7178d0d837b3d0880
Author: Andoni Morales Alastruey <ylatuya gmail com>
Date:   Sat Sep 28 20:32:44 2013 +0200

    Add stats for players

 LongoMatch.Core/Stats/ProjectStats.cs              |    8 +-
 .../Gui/Component/Stats/CategoriesViewer.cs        |   25 ++-
 .../Gui/Component/Stats/PlayerCategoriesViewer.cs  |   83 ++++++++
 .../Gui/Component/Stats/PlayerCategoryViewer.cs    |   60 ++++++
 .../Gui/Component/Stats/PlayerSubcategoryViewer.cs |   54 +++++
 .../Gui/Component/Stats/PlayersViewer.cs           |   93 +++++++++
 LongoMatch.GUI/Gui/Component/Stats/Plotter.cs      |   43 +++-
 LongoMatch.GUI/Gui/Dialog/StatsViewer.cs           |    1 +
 LongoMatch.GUI/LongoMatch.GUI.mdp                  |    8 +
 LongoMatch.GUI/Makefile.am                         |    6 +
 .../LongoMatch.Gui.Component.PlayersTagger.cs      |    6 +-
 ...h.Gui.Component.Stats.PlayerCategoriesViewer.cs |   58 ++++++
 ...tch.Gui.Component.Stats.PlayerCategoryViewer.cs |   34 ++++
 ....Gui.Component.Stats.PlayerSubcategoryViewer.cs |   67 +++++++
 ...LongoMatch.Gui.Component.Stats.PlayersViewer.cs |   47 +++++
 .../LongoMatch.Gui.Component.StringTaggerWidget.cs |    2 -
 .../LongoMatch.Gui.Component.TaggerWidget.cs       |    2 -
 .../gtk-gui/LongoMatch.Gui.Dialog.StatsViewer.cs   |   50 +++--
 LongoMatch.GUI/gtk-gui/gui.stetic                  |  205 ++++++++++++++++++--
 LongoMatch.GUI/gtk-gui/objects.xml                 |   22 ++
 20 files changed, 816 insertions(+), 58 deletions(-)
---
diff --git a/LongoMatch.Core/Stats/ProjectStats.cs b/LongoMatch.Core/Stats/ProjectStats.cs
index 79aa31a..7f402fa 100644
--- a/LongoMatch.Core/Stats/ProjectStats.cs
+++ b/LongoMatch.Core/Stats/ProjectStats.cs
@@ -120,7 +120,7 @@ namespace LongoMatch.Stats
                public PlaysFilter Filter {
                        set {
                                filter = value;
-                               UpdateStats ()
+                               UpdateStats ();
                        }
                }
                
@@ -133,7 +133,7 @@ namespace LongoMatch.Stats
                        visitorTeamCount = plays.Where(p => p.Team == Team.VISITOR || p.Team == 
Team.BOTH).Count();
                }
 
-               void UpdateStats () {
+               public void UpdateStats () {
                        catStats.Clear();
                        
                        Field = project.Categories.FieldBackground;
@@ -145,9 +145,9 @@ namespace LongoMatch.Stats
                                List<Play> plays, homePlays, awayPlays;
                                int localTeamCount, visitorTeamCount;
                                
-                               plays = project.PlaysInCategory (cat).Where;
+                               plays = project.PlaysInCategory (cat);
                                if (filter != null) {
-                                       plays = plays.Where(p => filter.IsVisible (p));
+                                       plays = plays.Where(p => filter.IsVisible (p)).ToList();
                                }
                                homePlays =plays.Where(p => p.Team == Team.LOCAL || p.Team == 
Team.BOTH).ToList();
                                awayPlays =plays.Where(p => p.Team == Team.VISITOR || p.Team == 
Team.BOTH).ToList();
diff --git a/LongoMatch.GUI/Gui/Component/Stats/CategoriesViewer.cs 
b/LongoMatch.GUI/Gui/Component/Stats/CategoriesViewer.cs
index a14cccf..792b482 100644
--- a/LongoMatch.GUI/Gui/Component/Stats/CategoriesViewer.cs
+++ b/LongoMatch.GUI/Gui/Component/Stats/CategoriesViewer.cs
@@ -28,6 +28,7 @@ namespace LongoMatch.Gui.Component.Stats
        public partial class CategoriesViewer : Gtk.Bin
        {
                ListStore store;
+               ProjectStats pstats;
                
                public CategoriesViewer ()
                {
@@ -42,17 +43,33 @@ namespace LongoMatch.Gui.Component.Stats
                }
                
                public void LoadStats (ProjectStats pstats) {
+                       categoryviewer1.HomeName = pstats.LocalTeam;
+                       categoryviewer1.AwayName = pstats.VisitorTeam;
+                       categoryviewer1.LoadBackgrounds (pstats.Field, pstats.HalfField, pstats.Goal);
+                       this.pstats = pstats;
+                       ReloadStats();
+               }
+               
+               public void ReloadStats () {
                        TreeIter iter;
+                       TreePath selected = null;
+                       
+                       treeview.Selection.GetSelected (out iter);
+                       if (store.IterIsValid (iter))
+                               selected = store.GetPath (iter);
                        
                        store.Clear();
                        foreach (CategoryStats cstats in pstats.CategoriesStats) {
                                store.AppendValues (cstats, cstats.Name);
                        }
-                       store.GetIterFirst(out iter);
+                       
+                       /* Keep the selected category for when we reload the stats changing players */
+                       if (selected != null) {
+                               store.GetIter (out iter, selected);
+                       } else {
+                               store.GetIterFirst(out iter);
+                       }
                        treeview.Selection.SelectIter(iter);
-                       categoryviewer1.HomeName = pstats.LocalTeam;
-                       categoryviewer1.AwayName = pstats.VisitorTeam;
-                       categoryviewer1.LoadBackgrounds (pstats.Field, pstats.HalfField, pstats.Goal);
                        categoryviewer1.LoadStats (store.GetValue (iter, 0) as CategoryStats);
                }
                
diff --git a/LongoMatch.GUI/Gui/Component/Stats/PlayerCategoriesViewer.cs 
b/LongoMatch.GUI/Gui/Component/Stats/PlayerCategoriesViewer.cs
new file mode 100644
index 0000000..6fb6c88
--- /dev/null
+++ b/LongoMatch.GUI/Gui/Component/Stats/PlayerCategoriesViewer.cs
@@ -0,0 +1,83 @@
+//
+//  Copyright (C) 2013 Andoni Morales Alastruey
+//
+//  This program is free software; you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation; either version 2 of the License, or
+//  (at your option) any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program; if not, write to the Free Software
+//  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+//
+using System;
+using Gtk;
+using LongoMatch.Stats;
+using LongoMatch.Store;
+
+namespace LongoMatch.Gui.Component.Stats
+{
+       [System.ComponentModel.ToolboxItem(true)]
+       public partial class PlayerCategoriesViewer : Gtk.Bin
+       {
+               ListStore store;
+               ProjectStats pstats;
+               
+               public PlayerCategoriesViewer ()
+               {
+                       this.Build ();
+                       store = new ListStore(typeof(Category), typeof(string));
+                       treeview.AppendColumn ("Desc", new Gtk.CellRendererText (), "text", 1);
+                       treeview.CursorChanged += HandleCursorChanged;
+                       treeview.Model = store;
+                       treeview.HeadersVisible = false;
+                       treeview.EnableGridLines = TreeViewGridLines.None;
+                       treeview.EnableTreeLines = false;
+               }
+               
+               public void LoadStats (ProjectStats pstats) {
+                       categoryviewer.LoadBackgrounds (pstats.Field, pstats.HalfField, pstats.Goal);
+                       this.pstats = pstats;
+                       ReloadStats();
+               }
+               
+               public void ReloadStats () {
+                       TreeIter iter;
+                       TreePath selected = null;
+                       
+                       treeview.Selection.GetSelected (out iter);
+                       if (store.IterIsValid (iter))
+                               selected = store.GetPath (iter);
+                       
+                       store.Clear();
+                       foreach (CategoryStats cstats in pstats.CategoriesStats) {
+                               store.AppendValues (cstats, cstats.Name);
+                       }
+                       
+                       /* Keep the selected category for when we reload the stats changing players */
+                       if (selected != null) {
+                               store.GetIter (out iter, selected);
+                       } else {
+                               store.GetIterFirst(out iter);
+                       }
+                       treeview.Selection.SelectIter(iter);
+                       categoryviewer.LoadStats (store.GetValue (iter, 0) as CategoryStats);
+               }
+               
+               void HandleCursorChanged (object sender, EventArgs e)
+               {
+                       CategoryStats stats;
+                       TreeIter iter;
+                       
+                       treeview.Selection.GetSelected(out iter);
+                       stats = store.GetValue(iter, 0) as CategoryStats;
+                       categoryviewer.LoadStats (stats);
+               }       
+       }
+}
+
diff --git a/LongoMatch.GUI/Gui/Component/Stats/PlayerCategoryViewer.cs 
b/LongoMatch.GUI/Gui/Component/Stats/PlayerCategoryViewer.cs
new file mode 100644
index 0000000..a168677
--- /dev/null
+++ b/LongoMatch.GUI/Gui/Component/Stats/PlayerCategoryViewer.cs
@@ -0,0 +1,60 @@
+//
+//  Copyright (C) 2013 Andoni Morales Alastruey
+//
+//  This program is free software; you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation; either version 2 of the License, or
+//  (at your option) any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program; if not, write to the Free Software
+//  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+//
+using System;
+using System.Collections.Generic;
+using Gtk;
+
+using LongoMatch.Common;
+using LongoMatch.Stats;
+using Image = LongoMatch.Common.Image;
+
+namespace LongoMatch.Gui.Component.Stats
+{
+       [System.ComponentModel.ToolboxItem(true)]
+       public partial class PlayerCategoryViewer : Gtk.Bin
+       {
+               public PlayerCategoryViewer ()
+               {
+                       this.Build ();
+               }
+
+               public void LoadBackgrounds (Image field, Image halfField, Image goal) {
+                       tagger.LoadBackgrounds (field, halfField, goal);
+               }
+
+               public void LoadStats (CategoryStats stats) {
+                       tagger.LoadFieldCoordinates (stats.FieldCoordinates);
+                       tagger.LoadHalfFieldCoordinates (stats.HalfFieldCoordinates);
+                       tagger.LoadGoalCoordinates (stats.GoalCoordinates);
+                       tagger.CoordinatesSensitive = false;
+                       
+                       foreach (Widget child in vbox1.AllChildren) {
+                               if (!(child is PlaysCoordinatesTagger))
+                                       vbox1.Remove (child);
+                       }
+                       foreach (SubCategoryStat st in stats.SubcategoriesStats) {
+                               PlayerSubcategoryViewer subcatviewer = new PlayerSubcategoryViewer();
+                               subcatviewer.LoadStats (st);
+                               vbox1.PackStart (subcatviewer);
+                               vbox1.PackStart (new HSeparator());
+                               subcatviewer.Show ();
+                       }
+               }       
+       }
+}
+
diff --git a/LongoMatch.GUI/Gui/Component/Stats/PlayerSubcategoryViewer.cs 
b/LongoMatch.GUI/Gui/Component/Stats/PlayerSubcategoryViewer.cs
new file mode 100644
index 0000000..6fa3179
--- /dev/null
+++ b/LongoMatch.GUI/Gui/Component/Stats/PlayerSubcategoryViewer.cs
@@ -0,0 +1,54 @@
+//
+//  Copyright (C) 2013 Andoni Morales Alastruey
+//
+//  This program is free software; you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation; either version 2 of the License, or
+//  (at your option) any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program; if not, write to the Free Software
+//  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+//
+using System;
+using Gtk;
+using Mono.Unix;
+
+using LongoMatch.Stats;
+using LongoMatch.Common;
+
+namespace LongoMatch.Gui.Component.Stats
+{
+       [System.ComponentModel.ToolboxItem(true)]
+       public partial class PlayerSubcategoryViewer : Gtk.Bin
+       {
+               ListStore store;
+               
+               public PlayerSubcategoryViewer ()
+               {
+                       this.Build ();
+                       treeview.AppendColumn (Catalog.GetString ("Name"), new Gtk.CellRendererText (), 
"text", 0);
+                       treeview.AppendColumn (Catalog.GetString("Count"), new Gtk.CellRendererText (), 
"text", 1);
+                       plotter.ShowTeams = false;
+                       plotter.WidthRequest = 500;
+               }
+               
+               public void LoadStats (SubCategoryStat stats) {
+                       store = new ListStore(typeof(string), typeof(string));
+                       treeview.Model = store;
+                       
+                       gtkframe.Markup = String.Format("<b> {0} </b>", stats.Name);
+                       plotter.LoadHistogram (stats);
+                       
+                       foreach (PercentualStat st in stats.OptionStats) {
+                               store.AppendValues (st.Name, st.TotalCount.ToString());
+                       }
+               }
+       }
+}
+
diff --git a/LongoMatch.GUI/Gui/Component/Stats/PlayersViewer.cs 
b/LongoMatch.GUI/Gui/Component/Stats/PlayersViewer.cs
new file mode 100644
index 0000000..6947c36
--- /dev/null
+++ b/LongoMatch.GUI/Gui/Component/Stats/PlayersViewer.cs
@@ -0,0 +1,93 @@
+//
+//  Copyright (C) 2013 Andoni Morales Alastruey
+//
+//  This program is free software; you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation; either version 2 of the License, or
+//  (at your option) any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program; if not, write to the Free Software
+//  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+//
+using System;
+
+using LongoMatch.Store;
+using Gtk;
+using Mono.Unix;
+using LongoMatch.Store.Templates;
+using LongoMatch.Stats;
+using LongoMatch.Common;
+
+namespace LongoMatch.Gui.Component.Stats
+{
+       [System.ComponentModel.ToolboxItem(true)]
+       public partial class PlayersViewer : Gtk.Bin
+       {
+               TreeStore store;
+               ProjectStats pstats;
+               PlaysFilter filter;
+               Player current;
+               
+               public PlayersViewer ()
+               {
+                       this.Build ();
+                       store = new TreeStore(typeof(string), typeof(object));
+                       treeview1.AppendColumn ("Desc", new Gtk.CellRendererText (), "text", 0);
+                       treeview1.CursorChanged += HandleCursorChanged;
+                       treeview1.Model = store;
+                       treeview1.HeadersVisible = false;
+                       treeview1.EnableGridLines = TreeViewGridLines.None;
+                       treeview1.EnableTreeLines = false;
+               }
+               
+               public void LoadProject (Project project) {
+                       TreeIter first;
+                       
+                       store.Clear();
+                       pstats =  new ProjectStats (project);
+                       filter = new PlaysFilter (project);
+                       filter.PlayersFilterEnabled = true;
+                       pstats.Filter = filter;
+                       categoriesviewer.LoadStats (pstats);
+                       AddTeam (project.LocalTeamTemplate, project.Categories);
+                       AddTeam (project.VisitorTeamTemplate, project.Categories);
+                       filter.Update();
+                       store.GetIter (out first, new TreePath ("0:0"));
+                       treeview1.Selection.SelectIter (first);
+               }
+               
+               void AddTeam (TeamTemplate tpl, Categories cats) {
+                       TreeIter teamIter;
+                       
+                       teamIter = store.AppendValues (tpl.TeamName, null);
+                       foreach (Player p in tpl) {
+                               store.AppendValues (teamIter, p.Name, p);
+                               filter.FilterPlayer (p);
+                       }
+               }
+               
+               void HandleCursorChanged (object sender, EventArgs e)
+               {
+                       TreeIter iter;
+                       
+                       if (current != null)
+                               filter.FilterPlayer (current);
+                       
+                       treeview1.Selection.GetSelected(out iter);
+                       current = store.GetValue(iter, 1) as Player;
+                       if (current != null) {
+                               filter.UnFilterPlayer (current);
+                               filter.Update();
+                               pstats.UpdateStats ();
+                               categoriesviewer.ReloadStats ();
+                       }
+               }
+       }
+}
+
diff --git a/LongoMatch.GUI/Gui/Component/Stats/Plotter.cs b/LongoMatch.GUI/Gui/Component/Stats/Plotter.cs
index 5f19b6f..596c1d5 100644
--- a/LongoMatch.GUI/Gui/Component/Stats/Plotter.cs
+++ b/LongoMatch.GUI/Gui/Component/Stats/Plotter.cs
@@ -36,18 +36,33 @@ namespace LongoMatch.Gui.Component.Stats
        {
                const double WIDTH = 700;
                const double HEIGHT = 300;
+               const double NO_TEAMS_WIDTH = 500;
                GraphType graphType;
                SubCategoryStat stats;
+               bool showTeams;
+               double graphWidth;
                
                public Plotter ()
                {
                        this.Build ();
-                       HeightRequest = (int) HEIGHT;
+                       HeightRequest = (int) HEIGHT + 20;
                        WidthRequest = (int) WIDTH;
                        pieradiobutton.Toggled += HandleToggled;
                        historadiobutton.Toggled += HandleToggled;
                        HomeName = Catalog.GetString ("Home");
                        AwayName = Catalog.GetString ("Away");
+                       ShowTeams = true;
+               }
+               
+               public bool ShowTeams {
+                       protected get {
+                               return showTeams;
+                       }
+                       set {
+                               showTeams = value;
+                               graphWidth = value ? WIDTH : NO_TEAMS_WIDTH;
+                               WidthRequest = (int) graphWidth;
+                       }
                }
                
                public string HomeName {
@@ -92,10 +107,12 @@ namespace LongoMatch.Gui.Component.Stats
             
                        model.Series.Add(new ColumnSeries { Title = Catalog.GetString ("Total"), ItemsSource 
= stats.OptionStats,
                                ValueField = "TotalCount" });   
-                       model.Series.Add(new ColumnSeries { Title = HomeName, ItemsSource = stats.OptionStats,
-                               ValueField = "LocalTeamCount", FillColor = new OxyColor {R=0xFF, G=0x33, 
B=0x0, A=0xFF}});      
-                       model.Series.Add(new ColumnSeries { Title = AwayName, ItemsSource = stats.OptionStats,
-                               ValueField = "VisitorTeamCount",  FillColor = new OxyColor {R=0, G=0x99, 
B=0xFF, A=0xFF} });    
+                       if (ShowTeams) {
+                               model.Series.Add(new ColumnSeries { Title = HomeName, ItemsSource = 
stats.OptionStats,
+                                       ValueField = "LocalTeamCount", FillColor = new OxyColor {R=0xFF, 
G=0x33, B=0x0, A=0xFF}});      
+                               model.Series.Add(new ColumnSeries { Title = AwayName, ItemsSource = 
stats.OptionStats,
+                                       ValueField = "VisitorTeamCount",  FillColor = new OxyColor {R=0, 
G=0x99, B=0xFF, A=0xFF} });    
+                       }
             model.Axes.Add(categoryAxis);
             model.Axes.Add(valueAxis);
             
@@ -160,16 +177,20 @@ namespace LongoMatch.Gui.Component.Stats
                        
                        switch (graphType) {
                        case GraphType.Histogram:
-                               imageall.Pixbuf = Load (GetHistogram (stats), WIDTH, HEIGHT);
+                               imageall.Pixbuf = Load (GetHistogram (stats), graphWidth, HEIGHT);
                                imagehome.Visible = false;
                                imageaway.Visible = false;
                                break;
                        case GraphType.Pie:
-                               imageall.Pixbuf = Load (GetPie (stats, Team.BOTH), WIDTH / 3, HEIGHT);
-                               imagehome.Pixbuf = Load (GetPie (stats, Team.LOCAL), WIDTH / 3, HEIGHT);
-                               imageaway.Pixbuf = Load (GetPie (stats, Team.VISITOR), WIDTH / 3, HEIGHT);
-                               imagehome.Visible = true;
-                               imageaway.Visible = true;
+                               if (ShowTeams) {
+                                       imageall.Pixbuf = Load (GetPie (stats, Team.BOTH), graphWidth / 3, 
HEIGHT);
+                                       imagehome.Pixbuf = Load (GetPie (stats, Team.LOCAL), graphWidth / 3, 
HEIGHT);
+                                       imageaway.Pixbuf = Load (GetPie (stats, Team.VISITOR), graphWidth / 
3, HEIGHT);
+                               } else {
+                                       imageall.Pixbuf = Load (GetPie (stats, Team.BOTH), graphWidth, 
HEIGHT);
+                               }
+                               imagehome.Visible = ShowTeams;
+                               imageaway.Visible = ShowTeams;
                                break;
                        }
                }
diff --git a/LongoMatch.GUI/Gui/Dialog/StatsViewer.cs b/LongoMatch.GUI/Gui/Dialog/StatsViewer.cs
index 1381c7d..18db526 100644
--- a/LongoMatch.GUI/Gui/Dialog/StatsViewer.cs
+++ b/LongoMatch.GUI/Gui/Dialog/StatsViewer.cs
@@ -42,6 +42,7 @@ namespace LongoMatch.Gui.Dialog
                                stats.Dispose();
                        stats = new ProjectStats (project);
                        categoriesviewer.LoadStats (stats);
+                       playersviewer.LoadProject (project);
                        gameviewer.Project = project;
                }
        }
diff --git a/LongoMatch.GUI/LongoMatch.GUI.mdp b/LongoMatch.GUI/LongoMatch.GUI.mdp
index b51c721..8a65c18 100644
--- a/LongoMatch.GUI/LongoMatch.GUI.mdp
+++ b/LongoMatch.GUI/LongoMatch.GUI.mdp
@@ -193,6 +193,14 @@
     <File subtype="Code" buildaction="Compile" name="gtk-gui/LongoMatch.Gui.Dialog.StatsViewer.cs" />
     <File subtype="Code" buildaction="Compile" name="Gui/Component/Stats/GameViewer.cs" />
     <File subtype="Code" buildaction="Compile" name="gtk-gui/LongoMatch.Gui.Component.GameViewer.cs" />
+    <File subtype="Code" buildaction="Compile" name="Gui/Component/Stats/PlayersViewer.cs" />
+    <File subtype="Code" buildaction="Compile" 
name="gtk-gui/LongoMatch.Gui.Component.Stats.PlayersViewer.cs" />
+    <File subtype="Code" buildaction="Compile" name="Gui/Component/Stats/PlayerCategoriesViewer.cs" />
+    <File subtype="Code" buildaction="Compile" 
name="gtk-gui/LongoMatch.Gui.Component.Stats.PlayerCategoriesViewer.cs" />
+    <File subtype="Code" buildaction="Compile" name="Gui/Component/Stats/PlayerCategoryViewer.cs" />
+    <File subtype="Code" buildaction="Compile" 
name="gtk-gui/LongoMatch.Gui.Component.Stats.PlayerCategoryViewer.cs" />
+    <File subtype="Code" buildaction="Compile" name="Gui/Component/Stats/PlayerSubcategoryViewer.cs" />
+    <File subtype="Code" buildaction="Compile" 
name="gtk-gui/LongoMatch.Gui.Component.Stats.PlayerSubcategoryViewer.cs" />
   </Contents>
   <References>
     <ProjectReference type="Gac" localcopy="True" refto="atk-sharp, Version=2.12.0.0, Culture=neutral, 
PublicKeyToken=35e10195dab3c99f" />
diff --git a/LongoMatch.GUI/Makefile.am b/LongoMatch.GUI/Makefile.am
index 6bdebfc..ea7315c 100644
--- a/LongoMatch.GUI/Makefile.am
+++ b/LongoMatch.GUI/Makefile.am
@@ -32,6 +32,9 @@ SOURCES = \
        gtk-gui/LongoMatch.Gui.Component.GameViewer.cs \
        gtk-gui/LongoMatch.Gui.Component.Stats.CategoriesViewer.cs \
        gtk-gui/LongoMatch.Gui.Component.Stats.CategoryViewer.cs \
+       gtk-gui/LongoMatch.Gui.Component.Stats.PlayerCategoriesViewer.cs \
+       gtk-gui/LongoMatch.Gui.Component.Stats.PlayerCategoryViewer.cs \
+       gtk-gui/LongoMatch.Gui.Component.Stats.PlayerSubcategoryViewer.cs \
        gtk-gui/LongoMatch.Gui.Component.Stats.Plotter.cs \
        gtk-gui/LongoMatch.Gui.Component.Stats.SubCategoryViewer.cs \
        gtk-gui/LongoMatch.Gui.Component.StringTaggerWidget.cs \
@@ -99,6 +102,9 @@ SOURCES = \
        Gui/Component/Stats/CategoryViewer.cs \
        Gui/Component/Stats/GameViewer.cs \
        Gui/Component/Stats/PangoTextMeasurer.cs \
+       Gui/Component/Stats/PlayerCategoriesViewer.cs \
+       Gui/Component/Stats/PlayerCategoryViewer.cs \
+       Gui/Component/Stats/PlayerSubcategoryViewer.cs \
        Gui/Component/Stats/Plotter.cs \
        Gui/Component/Stats/SubcategoryViewer.cs \
        Gui/Component/StringTaggerWidget.cs \
diff --git a/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.PlayersTagger.cs 
b/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.PlayersTagger.cs
index 6078cb5..e3d814d 100644
--- a/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.PlayersTagger.cs
+++ b/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.PlayersTagger.cs
@@ -22,11 +22,10 @@ namespace LongoMatch.Gui.Component
                        // Container child vbox4.Gtk.Box+BoxChild
                        this.localtable = new global::Gtk.Table (((uint)(3)), ((uint)(3)), false);
                        this.localtable.Name = "localtable";
-                       this.localtable.RowSpacing = ((uint)(6));
-                       this.localtable.ColumnSpacing = ((uint)(6));
                        this.vbox4.Add (this.localtable);
                        global::Gtk.Box.BoxChild w1 = ((global::Gtk.Box.BoxChild)(this.vbox4 
[this.localtable]));
                        w1.Position = 0;
+                       w1.Expand = false;
                        // Container child vbox4.Gtk.Box+BoxChild
                        this.hseparator1 = new global::Gtk.HSeparator ();
                        this.hseparator1.Name = "hseparator1";
@@ -38,11 +37,10 @@ namespace LongoMatch.Gui.Component
                        // Container child vbox4.Gtk.Box+BoxChild
                        this.visitortable = new global::Gtk.Table (((uint)(3)), ((uint)(3)), false);
                        this.visitortable.Name = "visitortable";
-                       this.visitortable.RowSpacing = ((uint)(6));
-                       this.visitortable.ColumnSpacing = ((uint)(6));
                        this.vbox4.Add (this.visitortable);
                        global::Gtk.Box.BoxChild w3 = ((global::Gtk.Box.BoxChild)(this.vbox4 
[this.visitortable]));
                        w3.Position = 2;
+                       w3.Expand = false;
                        this.Add (this.vbox4);
                        if ((this.Child != null)) {
                                this.Child.ShowAll ();
diff --git a/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.Stats.PlayerCategoriesViewer.cs 
b/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.Stats.PlayerCategoriesViewer.cs
new file mode 100644
index 0000000..e7408e4
--- /dev/null
+++ b/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.Stats.PlayerCategoriesViewer.cs
@@ -0,0 +1,58 @@
+
+// This file has been generated by the GUI designer. Do not modify.
+namespace LongoMatch.Gui.Component.Stats
+{
+       public partial class PlayerCategoriesViewer
+       {
+               private global::Gtk.HPaned hpaned1;
+               private global::Gtk.ScrolledWindow GtkScrolledWindow;
+               private global::Gtk.TreeView treeview;
+               private global::Gtk.ScrolledWindow scrolledwindow3;
+               private global::LongoMatch.Gui.Component.Stats.PlayerCategoryViewer categoryviewer;
+               
+               protected virtual void Build ()
+               {
+                       global::Stetic.Gui.Initialize (this);
+                       // Widget LongoMatch.Gui.Component.Stats.PlayerCategoriesViewer
+                       global::Stetic.BinContainer.Attach (this);
+                       this.Name = "LongoMatch.Gui.Component.Stats.PlayerCategoriesViewer";
+                       // Container child 
LongoMatch.Gui.Component.Stats.PlayerCategoriesViewer.Gtk.Container+ContainerChild
+                       this.hpaned1 = new global::Gtk.HPaned ();
+                       this.hpaned1.CanFocus = true;
+                       this.hpaned1.Name = "hpaned1";
+                       this.hpaned1.Position = 185;
+                       // Container child hpaned1.Gtk.Paned+PanedChild
+                       this.GtkScrolledWindow = new global::Gtk.ScrolledWindow ();
+                       this.GtkScrolledWindow.Name = "GtkScrolledWindow";
+                       this.GtkScrolledWindow.ShadowType = ((global::Gtk.ShadowType)(1));
+                       // Container child GtkScrolledWindow.Gtk.Container+ContainerChild
+                       this.treeview = new global::Gtk.TreeView ();
+                       this.treeview.CanFocus = true;
+                       this.treeview.Name = "treeview";
+                       this.GtkScrolledWindow.Add (this.treeview);
+                       this.hpaned1.Add (this.GtkScrolledWindow);
+                       global::Gtk.Paned.PanedChild w2 = ((global::Gtk.Paned.PanedChild)(this.hpaned1 
[this.GtkScrolledWindow]));
+                       w2.Resize = false;
+                       // Container child hpaned1.Gtk.Paned+PanedChild
+                       this.scrolledwindow3 = new global::Gtk.ScrolledWindow ();
+                       this.scrolledwindow3.CanFocus = true;
+                       this.scrolledwindow3.Name = "scrolledwindow3";
+                       this.scrolledwindow3.ShadowType = ((global::Gtk.ShadowType)(1));
+                       // Container child scrolledwindow3.Gtk.Container+ContainerChild
+                       global::Gtk.Viewport w3 = new global::Gtk.Viewport ();
+                       w3.ShadowType = ((global::Gtk.ShadowType)(0));
+                       // Container child GtkViewport.Gtk.Container+ContainerChild
+                       this.categoryviewer = new global::LongoMatch.Gui.Component.Stats.PlayerCategoryViewer 
();
+                       this.categoryviewer.Events = ((global::Gdk.EventMask)(256));
+                       this.categoryviewer.Name = "categoryviewer";
+                       w3.Add (this.categoryviewer);
+                       this.scrolledwindow3.Add (w3);
+                       this.hpaned1.Add (this.scrolledwindow3);
+                       this.Add (this.hpaned1);
+                       if ((this.Child != null)) {
+                               this.Child.ShowAll ();
+                       }
+                       this.Hide ();
+               }
+       }
+}
diff --git a/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.Stats.PlayerCategoryViewer.cs 
b/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.Stats.PlayerCategoryViewer.cs
new file mode 100644
index 0000000..7b9eb63
--- /dev/null
+++ b/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.Stats.PlayerCategoryViewer.cs
@@ -0,0 +1,34 @@
+
+// This file has been generated by the GUI designer. Do not modify.
+namespace LongoMatch.Gui.Component.Stats
+{
+       public partial class PlayerCategoryViewer
+       {
+               private global::Gtk.VBox vbox1;
+               private global::LongoMatch.Gui.Component.PlaysCoordinatesTagger tagger;
+               
+               protected virtual void Build ()
+               {
+                       global::Stetic.Gui.Initialize (this);
+                       // Widget LongoMatch.Gui.Component.Stats.PlayerCategoryViewer
+                       global::Stetic.BinContainer.Attach (this);
+                       this.Name = "LongoMatch.Gui.Component.Stats.PlayerCategoryViewer";
+                       // Container child 
LongoMatch.Gui.Component.Stats.PlayerCategoryViewer.Gtk.Container+ContainerChild
+                       this.vbox1 = new global::Gtk.VBox ();
+                       this.vbox1.Name = "vbox1";
+                       this.vbox1.Spacing = 6;
+                       // Container child vbox1.Gtk.Box+BoxChild
+                       this.tagger = new global::LongoMatch.Gui.Component.PlaysCoordinatesTagger ();
+                       this.tagger.Events = ((global::Gdk.EventMask)(256));
+                       this.tagger.Name = "tagger";
+                       this.vbox1.Add (this.tagger);
+                       global::Gtk.Box.BoxChild w1 = ((global::Gtk.Box.BoxChild)(this.vbox1 [this.tagger]));
+                       w1.Position = 0;
+                       this.Add (this.vbox1);
+                       if ((this.Child != null)) {
+                               this.Child.ShowAll ();
+                       }
+                       this.Hide ();
+               }
+       }
+}
diff --git a/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.Stats.PlayerSubcategoryViewer.cs 
b/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.Stats.PlayerSubcategoryViewer.cs
new file mode 100644
index 0000000..6ef81ae
--- /dev/null
+++ b/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.Stats.PlayerSubcategoryViewer.cs
@@ -0,0 +1,67 @@
+
+// This file has been generated by the GUI designer. Do not modify.
+namespace LongoMatch.Gui.Component.Stats
+{
+       public partial class PlayerSubcategoryViewer
+       {
+               private global::Gtk.Frame frame2;
+               private global::Gtk.Alignment GtkAlignment;
+               private global::Gtk.HBox hbox1;
+               private global::Gtk.ScrolledWindow GtkScrolledWindow;
+               private global::Gtk.TreeView treeview;
+               private global::LongoMatch.Gui.Component.Stats.Plotter plotter;
+               private global::Gtk.Label gtkframe;
+               
+               protected virtual void Build ()
+               {
+                       global::Stetic.Gui.Initialize (this);
+                       // Widget LongoMatch.Gui.Component.Stats.PlayerSubcategoryViewer
+                       global::Stetic.BinContainer.Attach (this);
+                       this.Name = "LongoMatch.Gui.Component.Stats.PlayerSubcategoryViewer";
+                       // Container child 
LongoMatch.Gui.Component.Stats.PlayerSubcategoryViewer.Gtk.Container+ContainerChild
+                       this.frame2 = new global::Gtk.Frame ();
+                       this.frame2.Name = "frame2";
+                       this.frame2.ShadowType = ((global::Gtk.ShadowType)(0));
+                       // Container child frame2.Gtk.Container+ContainerChild
+                       this.GtkAlignment = new global::Gtk.Alignment (0F, 0F, 1F, 1F);
+                       this.GtkAlignment.Name = "GtkAlignment";
+                       this.GtkAlignment.LeftPadding = ((uint)(12));
+                       // Container child GtkAlignment.Gtk.Container+ContainerChild
+                       this.hbox1 = new global::Gtk.HBox ();
+                       this.hbox1.Name = "hbox1";
+                       this.hbox1.Spacing = 6;
+                       // Container child hbox1.Gtk.Box+BoxChild
+                       this.GtkScrolledWindow = new global::Gtk.ScrolledWindow ();
+                       this.GtkScrolledWindow.Name = "GtkScrolledWindow";
+                       this.GtkScrolledWindow.ShadowType = ((global::Gtk.ShadowType)(1));
+                       // Container child GtkScrolledWindow.Gtk.Container+ContainerChild
+                       this.treeview = new global::Gtk.TreeView ();
+                       this.treeview.CanFocus = true;
+                       this.treeview.Name = "treeview";
+                       this.GtkScrolledWindow.Add (this.treeview);
+                       this.hbox1.Add (this.GtkScrolledWindow);
+                       global::Gtk.Box.BoxChild w2 = ((global::Gtk.Box.BoxChild)(this.hbox1 
[this.GtkScrolledWindow]));
+                       w2.Position = 0;
+                       // Container child hbox1.Gtk.Box+BoxChild
+                       this.plotter = new global::LongoMatch.Gui.Component.Stats.Plotter ();
+                       this.plotter.Events = ((global::Gdk.EventMask)(256));
+                       this.plotter.Name = "plotter";
+                       this.hbox1.Add (this.plotter);
+                       global::Gtk.Box.BoxChild w3 = ((global::Gtk.Box.BoxChild)(this.hbox1 [this.plotter]));
+                       w3.Position = 1;
+                       w3.Expand = false;
+                       this.GtkAlignment.Add (this.hbox1);
+                       this.frame2.Add (this.GtkAlignment);
+                       this.gtkframe = new global::Gtk.Label ();
+                       this.gtkframe.Name = "gtkframe";
+                       this.gtkframe.LabelProp = global::Mono.Unix.Catalog.GetString ("<b></b>");
+                       this.gtkframe.UseMarkup = true;
+                       this.frame2.LabelWidget = this.gtkframe;
+                       this.Add (this.frame2);
+                       if ((this.Child != null)) {
+                               this.Child.ShowAll ();
+                       }
+                       this.Hide ();
+               }
+       }
+}
diff --git a/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.Stats.PlayersViewer.cs 
b/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.Stats.PlayersViewer.cs
new file mode 100644
index 0000000..f14cf8d
--- /dev/null
+++ b/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.Stats.PlayersViewer.cs
@@ -0,0 +1,47 @@
+
+// This file has been generated by the GUI designer. Do not modify.
+namespace LongoMatch.Gui.Component.Stats
+{
+       public partial class PlayersViewer
+       {
+               private global::Gtk.HPaned hpaned1;
+               private global::Gtk.ScrolledWindow GtkScrolledWindow2;
+               private global::Gtk.TreeView treeview1;
+               private global::LongoMatch.Gui.Component.Stats.PlayerCategoriesViewer categoriesviewer;
+               
+               protected virtual void Build ()
+               {
+                       global::Stetic.Gui.Initialize (this);
+                       // Widget LongoMatch.Gui.Component.Stats.PlayersViewer
+                       global::Stetic.BinContainer.Attach (this);
+                       this.Name = "LongoMatch.Gui.Component.Stats.PlayersViewer";
+                       // Container child 
LongoMatch.Gui.Component.Stats.PlayersViewer.Gtk.Container+ContainerChild
+                       this.hpaned1 = new global::Gtk.HPaned ();
+                       this.hpaned1.CanFocus = true;
+                       this.hpaned1.Name = "hpaned1";
+                       this.hpaned1.Position = 123;
+                       // Container child hpaned1.Gtk.Paned+PanedChild
+                       this.GtkScrolledWindow2 = new global::Gtk.ScrolledWindow ();
+                       this.GtkScrolledWindow2.Name = "GtkScrolledWindow2";
+                       this.GtkScrolledWindow2.ShadowType = ((global::Gtk.ShadowType)(1));
+                       // Container child GtkScrolledWindow2.Gtk.Container+ContainerChild
+                       this.treeview1 = new global::Gtk.TreeView ();
+                       this.treeview1.CanFocus = true;
+                       this.treeview1.Name = "treeview1";
+                       this.GtkScrolledWindow2.Add (this.treeview1);
+                       this.hpaned1.Add (this.GtkScrolledWindow2);
+                       global::Gtk.Paned.PanedChild w2 = ((global::Gtk.Paned.PanedChild)(this.hpaned1 
[this.GtkScrolledWindow2]));
+                       w2.Resize = false;
+                       // Container child hpaned1.Gtk.Paned+PanedChild
+                       this.categoriesviewer = new 
global::LongoMatch.Gui.Component.Stats.PlayerCategoriesViewer ();
+                       this.categoriesviewer.Events = ((global::Gdk.EventMask)(256));
+                       this.categoriesviewer.Name = "categoriesviewer";
+                       this.hpaned1.Add (this.categoriesviewer);
+                       this.Add (this.hpaned1);
+                       if ((this.Child != null)) {
+                               this.Child.ShowAll ();
+                       }
+                       this.Hide ();
+               }
+       }
+}
diff --git a/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.StringTaggerWidget.cs 
b/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.StringTaggerWidget.cs
index 2aff48c..961681b 100644
--- a/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.StringTaggerWidget.cs
+++ b/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.StringTaggerWidget.cs
@@ -26,8 +26,6 @@ namespace LongoMatch.Gui.Component
                        // Container child GtkAlignment.Gtk.Container+ContainerChild
                        this.table = new global::Gtk.Table (((uint)(3)), ((uint)(3)), false);
                        this.table.Name = "table";
-                       this.table.RowSpacing = ((uint)(6));
-                       this.table.ColumnSpacing = ((uint)(6));
                        this.GtkAlignment.Add (this.table);
                        this.frame.Add (this.GtkAlignment);
                        this.titlelabel = new global::Gtk.Label ();
diff --git a/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.TaggerWidget.cs 
b/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.TaggerWidget.cs
index 4d7acc8..7bdc37f 100644
--- a/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.TaggerWidget.cs
+++ b/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Component.TaggerWidget.cs
@@ -109,8 +109,6 @@ namespace LongoMatch.Gui.Component
                        // Container child vbox3.Gtk.Box+BoxChild
                        this.table1 = new global::Gtk.Table (((uint)(3)), ((uint)(3)), false);
                        this.table1.Name = "table1";
-                       this.table1.RowSpacing = ((uint)(6));
-                       this.table1.ColumnSpacing = ((uint)(6));
                        this.vbox3.Add (this.table1);
                        global::Gtk.Box.BoxChild w10 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.table1]));
                        w10.Position = 1;
diff --git a/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Dialog.StatsViewer.cs 
b/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Dialog.StatsViewer.cs
index fb027cf..67dd0b4 100644
--- a/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Dialog.StatsViewer.cs
+++ b/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Dialog.StatsViewer.cs
@@ -8,7 +8,9 @@ namespace LongoMatch.Gui.Dialog
                private global::LongoMatch.Gui.Component.GameViewer gameviewer;
                private global::Gtk.Label label2;
                private global::LongoMatch.Gui.Component.Stats.CategoriesViewer categoriesviewer;
-               private global::Gtk.Label label1;
+               private global::Gtk.Label label4;
+               private global::LongoMatch.Gui.Component.Stats.PlayersViewer playersviewer;
+               private global::Gtk.Label label5;
                private global::Gtk.Button buttonCancel;
                
                protected virtual void Build ()
@@ -18,6 +20,7 @@ namespace LongoMatch.Gui.Dialog
                        this.Name = "LongoMatch.Gui.Dialog.StatsViewer";
                        this.Title = global::Mono.Unix.Catalog.GetString ("Stats");
                        this.Icon = global::Gdk.Pixbuf.LoadFromResource ("logo.svg");
+                       this.TypeHint = ((global::Gdk.WindowTypeHint)(5));
                        this.WindowPosition = ((global::Gtk.WindowPosition)(3));
                        this.Modal = true;
                        this.DestroyWithParent = true;
@@ -32,7 +35,7 @@ namespace LongoMatch.Gui.Dialog
                        this.notebook1 = new global::Gtk.Notebook ();
                        this.notebook1.CanFocus = true;
                        this.notebook1.Name = "notebook1";
-                       this.notebook1.CurrentPage = 0;
+                       this.notebook1.CurrentPage = 2;
                        // Container child notebook1.Gtk.Notebook+NotebookChild
                        this.gameviewer = new global::LongoMatch.Gui.Component.GameViewer ();
                        this.gameviewer.Events = ((global::Gdk.EventMask)(256));
@@ -52,20 +55,33 @@ namespace LongoMatch.Gui.Dialog
                        global::Gtk.Notebook.NotebookChild w3 = 
((global::Gtk.Notebook.NotebookChild)(this.notebook1 [this.categoriesviewer]));
                        w3.Position = 1;
                        // Notebook tab
-                       this.label1 = new global::Gtk.Label ();
-                       this.label1.Name = "label1";
-                       this.label1.LabelProp = global::Mono.Unix.Catalog.GetString ("Categories stats");
-                       this.notebook1.SetTabLabel (this.categoriesviewer, this.label1);
-                       this.label1.ShowAll ();
+                       this.label4 = new global::Gtk.Label ();
+                       this.label4.Name = "label4";
+                       this.label4.LabelProp = global::Mono.Unix.Catalog.GetString ("Categories stats");
+                       this.notebook1.SetTabLabel (this.categoriesviewer, this.label4);
+                       this.label4.ShowAll ();
+                       // Container child notebook1.Gtk.Notebook+NotebookChild
+                       this.playersviewer = new global::LongoMatch.Gui.Component.Stats.PlayersViewer ();
+                       this.playersviewer.Events = ((global::Gdk.EventMask)(256));
+                       this.playersviewer.Name = "playersviewer";
+                       this.notebook1.Add (this.playersviewer);
+                       global::Gtk.Notebook.NotebookChild w4 = 
((global::Gtk.Notebook.NotebookChild)(this.notebook1 [this.playersviewer]));
+                       w4.Position = 2;
+                       // Notebook tab
+                       this.label5 = new global::Gtk.Label ();
+                       this.label5.Name = "label5";
+                       this.label5.LabelProp = global::Mono.Unix.Catalog.GetString ("Players stats");
+                       this.notebook1.SetTabLabel (this.playersviewer, this.label5);
+                       this.label5.ShowAll ();
                        w1.Add (this.notebook1);
-                       global::Gtk.Box.BoxChild w4 = ((global::Gtk.Box.BoxChild)(w1 [this.notebook1]));
-                       w4.Position = 0;
+                       global::Gtk.Box.BoxChild w5 = ((global::Gtk.Box.BoxChild)(w1 [this.notebook1]));
+                       w5.Position = 0;
                        // Internal child LongoMatch.Gui.Dialog.StatsViewer.ActionArea
-                       global::Gtk.HButtonBox w5 = this.ActionArea;
-                       w5.Name = "dialog1_ActionArea";
-                       w5.Spacing = 10;
-                       w5.BorderWidth = ((uint)(5));
-                       w5.LayoutStyle = ((global::Gtk.ButtonBoxStyle)(4));
+                       global::Gtk.HButtonBox w6 = this.ActionArea;
+                       w6.Name = "dialog1_ActionArea";
+                       w6.Spacing = 10;
+                       w6.BorderWidth = ((uint)(5));
+                       w6.LayoutStyle = ((global::Gtk.ButtonBoxStyle)(4));
                        // Container child dialog1_ActionArea.Gtk.ButtonBox+ButtonBoxChild
                        this.buttonCancel = new global::Gtk.Button ();
                        this.buttonCancel.CanDefault = true;
@@ -75,9 +91,9 @@ namespace LongoMatch.Gui.Dialog
                        this.buttonCancel.UseUnderline = true;
                        this.buttonCancel.Label = "gtk-close";
                        this.AddActionWidget (this.buttonCancel, -7);
-                       global::Gtk.ButtonBox.ButtonBoxChild w6 = ((global::Gtk.ButtonBox.ButtonBoxChild)(w5 
[this.buttonCancel]));
-                       w6.Expand = false;
-                       w6.Fill = false;
+                       global::Gtk.ButtonBox.ButtonBoxChild w7 = ((global::Gtk.ButtonBox.ButtonBoxChild)(w6 
[this.buttonCancel]));
+                       w7.Expand = false;
+                       w7.Fill = false;
                        if ((this.Child != null)) {
                                this.Child.ShowAll ();
                        }
diff --git a/LongoMatch.GUI/gtk-gui/gui.stetic b/LongoMatch.GUI/gtk-gui/gui.stetic
index 38b4e81..2393445 100644
--- a/LongoMatch.GUI/gtk-gui/gui.stetic
+++ b/LongoMatch.GUI/gtk-gui/gui.stetic
@@ -5615,8 +5615,6 @@ Show-&gt;&lt;b&gt; S&lt;/b&gt;
                 <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>
@@ -6523,8 +6521,6 @@ You can continue with the current capture, cancel it or save your project.
                 <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>
@@ -7141,7 +7137,7 @@ Defining &lt;b&gt; Game Units &lt;/b&gt; will help you during the analysis to in
       </widget>
     </child>
   </widget>
-  <widget class="Gtk.Bin" id="LongoMatch.Gui.Component.PlayersTagger" design-size="300 300">
+  <widget class="Gtk.Bin" id="LongoMatch.Gui.Component.PlayersTagger" design-size="331 191">
     <property name="MemberName" />
     <property name="Visible">False</property>
     <child>
@@ -7153,8 +7149,6 @@ Defining &lt;b&gt; Game Units &lt;/b&gt; will help you during the analysis to in
             <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>
@@ -7185,7 +7179,8 @@ Defining &lt;b&gt; Game Units &lt;/b&gt; will help you during the analysis to in
           </widget>
           <packing>
             <property name="Position">0</property>
-            <property name="AutoSize">True</property>
+            <property name="AutoSize">False</property>
+            <property name="Expand">False</property>
           </packing>
         </child>
         <child>
@@ -7204,8 +7199,6 @@ Defining &lt;b&gt; Game Units &lt;/b&gt; will help you during the analysis to in
             <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>
@@ -7236,7 +7229,8 @@ Defining &lt;b&gt; Game Units &lt;/b&gt; will help you during the analysis to in
           </widget>
           <packing>
             <property name="Position">2</property>
-            <property name="AutoSize">True</property>
+            <property name="AutoSize">False</property>
+            <property name="Expand">False</property>
           </packing>
         </child>
       </widget>
@@ -8866,7 +8860,7 @@ Defining &lt;b&gt; Game Units &lt;/b&gt; will help you during the analysis to in
       </widget>
     </child>
   </widget>
-  <widget class="Gtk.Bin" id="LongoMatch.Gui.Component.Stats.Plotter" design-size="258 181">
+  <widget class="Gtk.Bin" id="LongoMatch.Gui.Component.Stats.Plotter" design-size="257 181">
     <property name="MemberName" />
     <property name="Visible">False</property>
     <child>
@@ -9067,6 +9061,7 @@ Defining &lt;b&gt; Game Units &lt;/b&gt; will help you during the analysis to in
     <property name="MemberName" />
     <property name="Title" translatable="yes">Stats</property>
     <property name="Icon">resource:logo.svg</property>
+    <property name="TypeHint">Utility</property>
     <property name="WindowPosition">CenterAlways</property>
     <property name="Modal">True</property>
     <property name="DestroyWithParent">True</property>
@@ -9083,7 +9078,7 @@ Defining &lt;b&gt; Game Units &lt;/b&gt; will help you during the analysis to in
           <widget class="Gtk.Notebook" id="notebook1">
             <property name="MemberName" />
             <property name="CanFocus">True</property>
-            <property name="CurrentPage">0</property>
+            <property name="CurrentPage">2</property>
             <child>
               <widget class="LongoMatch.Gui.Component.GameViewer" id="gameviewer">
                 <property name="MemberName" />
@@ -9109,7 +9104,7 @@ Defining &lt;b&gt; Game Units &lt;/b&gt; will help you during the analysis to in
               </packing>
             </child>
             <child>
-              <widget class="Gtk.Label" id="label1">
+              <widget class="Gtk.Label" id="label4">
                 <property name="MemberName" />
                 <property name="LabelProp" translatable="yes">Categories stats</property>
               </widget>
@@ -9117,6 +9112,24 @@ Defining &lt;b&gt; Game Units &lt;/b&gt; will help you during the analysis to in
                 <property name="type">tab</property>
               </packing>
             </child>
+            <child>
+              <widget class="LongoMatch.Gui.Component.Stats.PlayersViewer" id="playersviewer">
+                <property name="MemberName" />
+                <property name="Events">ButtonPressMask</property>
+              </widget>
+              <packing>
+                <property name="Position">2</property>
+              </packing>
+            </child>
+            <child>
+              <widget class="Gtk.Label" id="label5">
+                <property name="MemberName" />
+                <property name="LabelProp" translatable="yes">Players stats</property>
+              </widget>
+              <packing>
+                <property name="type">tab</property>
+              </packing>
+            </child>
           </widget>
           <packing>
             <property name="Position">0</property>
@@ -9265,4 +9278,168 @@ Defining &lt;b&gt; Game Units &lt;/b&gt; will help you during the analysis to in
       </widget>
     </child>
   </widget>
+  <widget class="Gtk.Bin" id="LongoMatch.Gui.Component.Stats.PlayersViewer" design-size="642 459">
+    <property name="MemberName" />
+    <property name="Visible">False</property>
+    <child>
+      <widget class="Gtk.HPaned" id="hpaned1">
+        <property name="MemberName" />
+        <property name="CanFocus">True</property>
+        <property name="Position">123</property>
+        <child>
+          <widget class="Gtk.ScrolledWindow" id="GtkScrolledWindow2">
+            <property name="MemberName" />
+            <property name="ShadowType">In</property>
+            <child>
+              <widget class="Gtk.TreeView" id="treeview1">
+                <property name="MemberName" />
+                <property name="CanFocus">True</property>
+                <property name="ShowScrollbars">True</property>
+              </widget>
+            </child>
+          </widget>
+          <packing>
+            <property name="Resize">False</property>
+          </packing>
+        </child>
+        <child>
+          <widget class="LongoMatch.Gui.Component.Stats.PlayerCategoriesViewer" id="categoriesviewer">
+            <property name="MemberName" />
+            <property name="Events">ButtonPressMask</property>
+          </widget>
+        </child>
+      </widget>
+    </child>
+  </widget>
+  <widget class="Gtk.Bin" id="LongoMatch.Gui.Component.Stats.PlayerCategoriesViewer" design-size="866 566">
+    <property name="MemberName" />
+    <property name="Visible">False</property>
+    <child>
+      <widget class="Gtk.HPaned" id="hpaned1">
+        <property name="MemberName" />
+        <property name="CanFocus">True</property>
+        <property name="Position">185</property>
+        <child>
+          <widget class="Gtk.ScrolledWindow" id="GtkScrolledWindow">
+            <property name="MemberName" />
+            <property name="ShadowType">In</property>
+            <child>
+              <widget class="Gtk.TreeView" id="treeview">
+                <property name="MemberName" />
+                <property name="CanFocus">True</property>
+                <property name="ShowScrollbars">True</property>
+              </widget>
+            </child>
+          </widget>
+          <packing>
+            <property name="Resize">False</property>
+          </packing>
+        </child>
+        <child>
+          <widget class="Gtk.ScrolledWindow" id="scrolledwindow3">
+            <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="LongoMatch.Gui.Component.Stats.PlayerCategoryViewer" id="categoryviewer">
+                    <property name="MemberName" />
+                    <property name="Events">ButtonPressMask</property>
+                  </widget>
+                </child>
+              </widget>
+            </child>
+          </widget>
+        </child>
+      </widget>
+    </child>
+  </widget>
+  <widget class="Gtk.Bin" id="LongoMatch.Gui.Component.Stats.PlayerCategoryViewer" design-size="787 585">
+    <property name="MemberName" />
+    <property name="Visible">False</property>
+    <child>
+      <widget class="Gtk.VBox" id="vbox1">
+        <property name="MemberName" />
+        <property name="Spacing">6</property>
+        <child>
+          <widget class="LongoMatch.Gui.Component.PlaysCoordinatesTagger" id="tagger">
+            <property name="MemberName" />
+            <property name="Events">ButtonPressMask</property>
+          </widget>
+          <packing>
+            <property name="Position">0</property>
+            <property name="AutoSize">True</property>
+          </packing>
+        </child>
+        <child>
+          <placeholder />
+        </child>
+      </widget>
+    </child>
+  </widget>
+  <widget class="Gtk.Bin" id="LongoMatch.Gui.Component.Stats.PlayerSubcategoryViewer" design-size="383 281">
+    <property name="MemberName" />
+    <property name="Visible">False</property>
+    <child>
+      <widget class="Gtk.Frame" id="frame2">
+        <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="hbox1">
+                <property name="MemberName" />
+                <property name="Spacing">6</property>
+                <child>
+                  <widget class="Gtk.ScrolledWindow" id="GtkScrolledWindow">
+                    <property name="MemberName" />
+                    <property name="ShadowType">In</property>
+                    <child>
+                      <widget class="Gtk.TreeView" id="treeview">
+                        <property name="MemberName" />
+                        <property name="CanFocus">True</property>
+                        <property name="ShowScrollbars">True</property>
+                      </widget>
+                    </child>
+                  </widget>
+                  <packing>
+                    <property name="Position">0</property>
+                    <property name="AutoSize">False</property>
+                  </packing>
+                </child>
+                <child>
+                  <widget class="LongoMatch.Gui.Component.Stats.Plotter" id="plotter">
+                    <property name="MemberName" />
+                    <property name="Events">ButtonPressMask</property>
+                  </widget>
+                  <packing>
+                    <property name="Position">1</property>
+                    <property name="AutoSize">False</property>
+                    <property name="Expand">False</property>
+                  </packing>
+                </child>
+              </widget>
+            </child>
+          </widget>
+        </child>
+        <child>
+          <widget class="Gtk.Label" id="gtkframe">
+            <property name="MemberName" />
+            <property name="LabelProp" translatable="yes">&lt;b&gt;&lt;/b&gt;</property>
+            <property name="UseMarkup">True</property>
+          </widget>
+          <packing>
+            <property name="type">label_item</property>
+          </packing>
+        </child>
+      </widget>
+    </child>
+  </widget>
 </stetic-interface>
\ No newline at end of file
diff --git a/LongoMatch.GUI/gtk-gui/objects.xml b/LongoMatch.GUI/gtk-gui/objects.xml
index c1e2f0b..9b720d3 100644
--- a/LongoMatch.GUI/gtk-gui/objects.xml
+++ b/LongoMatch.GUI/gtk-gui/objects.xml
@@ -394,6 +394,7 @@
       <itemgroup label="Plotter Properties">
         <property name="HomeName" />
         <property name="AwayName" />
+        <property name="ShowTeams" />
       </itemgroup>
     </itemgroups>
     <signals />
@@ -419,4 +420,25 @@
     <itemgroups />
     <signals />
   </object>
+  <object type="LongoMatch.Gui.Component.Stats.PlayersViewer" palette-category="General" 
allow-children="false" base-type="Gtk.Bin">
+    <itemgroups />
+    <signals />
+  </object>
+  <object type="LongoMatch.Gui.Component.Stats.PlayerCategoriesViewer" palette-category="General" 
allow-children="false" base-type="Gtk.Bin">
+    <itemgroups />
+    <signals />
+  </object>
+  <object type="LongoMatch.Gui.Component.Stats.PlayerCategoryViewer" palette-category="General" 
allow-children="false" base-type="Gtk.Bin">
+    <itemgroups>
+    </itemgroups>
+    <signals />
+  </object>
+  <object type="LongoMatch.Gui.Component.Stats.PlayerSubcategoryViewer" palette-category="General" 
allow-children="false" base-type="Gtk.Bin">
+    <itemgroups />
+    <signals />
+  </object>
+  <object type="LongoMatch.Gui.Component.Stats.PlayerPlotter" 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]