[longomatch] Add a new drawing tool
- From: Andoni Morales Alastruey <amorales src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [longomatch] Add a new drawing tool
- Date: Mon, 7 Jul 2014 11:32:05 +0000 (UTC)
commit b91bc0a97e131594b7deecc5c88637f4c0a12ebb
Author: Andoni Morales Alastruey <ylatuya gmail com>
Date: Fri Jun 27 18:39:27 2014 +0200
Add a new drawing tool
LongoMatch.Core/Common/Area.cs | 28 +
LongoMatch.Core/Common/Color.cs | 9 +
LongoMatch.Core/Common/Constants.cs | 6 +
LongoMatch.Core/Common/Enums.cs | 27 +-
LongoMatch.Core/Common/EventsBroker.cs | 12 +-
LongoMatch.Core/Handlers/Handlers.cs | 21 +-
LongoMatch.Core/Handlers/Multimedia.cs | 2 +-
.../Drawing/{ICanvasObject.cs => ICanvas.cs} | 16 +-
LongoMatch.Core/Interfaces/Drawing/IDrawable.cs | 8 +-
.../Interfaces/Drawing/IDrawingToolkit.cs | 17 +-
LongoMatch.Core/Interfaces/Drawing/IWidget.cs | 3 +-
LongoMatch.Core/Interfaces/GUI/IGUIToolkit.cs | 2 +-
LongoMatch.Core/LongoMatch.Core.mdp | 9 +-
LongoMatch.Core/Store/Drawables/Angle.cs | 2 +-
LongoMatch.Core/Store/Drawables/Circle.cs | 74 --
.../Drawables/Counter.cs} | 29 +-
LongoMatch.Core/Store/Drawables/Cross.cs | 85 ++-
LongoMatch.Core/Store/Drawables/Drawable.cs | 56 +-
LongoMatch.Core/Store/Drawables/Ellipse.cs | 36 +-
LongoMatch.Core/Store/Drawables/Line.cs | 13 +-
LongoMatch.Core/Store/Drawables/MultiPoints.cs | 2 +-
LongoMatch.Core/Store/Drawables/Quadrilateral.cs | 20 +-
LongoMatch.Core/Store/Drawables/Rectangle.cs | 30 +-
LongoMatch.Core/Store/Drawables/Selection.cs | 4 +-
.../Store/{Drawing.cs => FrameDrawing.cs} | 16 +-
LongoMatch.Core/Store/Play.cs | 6 +-
LongoMatch.Core/Store/PlayListPlay.cs | 2 +-
LongoMatch.Drawing.Cairo/CairoBackend.cs | 142 +++-
.../LongoMatch.Drawing.Cairo.mdp | 10 +
.../Surface.cs | 49 +-
LongoMatch.Drawing.Cairo/WidgetWrapper.cs | 56 +-
LongoMatch.Drawing/Canvas.cs | 67 +-
LongoMatch.Drawing/CanvasObject/CanvasObject.cs | 127 +++
LongoMatch.Drawing/CanvasObject/CategoryLabel.cs | 2 +-
.../{BaseCanvasObject.cs => CategoryObject.cs} | 59 +-
.../{BaseCanvasObject.cs => CounterObject.cs} | 62 +-
.../{CircleObject.cs => CrossObject.cs} | 25 +-
.../{CircleObject.cs => EllipseObject.cs} | 19 +-
LongoMatch.Drawing/CanvasObject/LineObject.cs | 35 +-
LongoMatch.Drawing/CanvasObject/PlayerObject.cs | 2 +-
LongoMatch.Drawing/CanvasObject/PositionObject.cs | 2 +-
.../{CircleObject.cs => QuadrilateralObject.cs} | 19 +-
.../{CircleObject.cs => RectangleObject.cs} | 22 +-
.../{CircleObject.cs => TextObject.cs} | 26 +-
LongoMatch.Drawing/CanvasObject/TimeNodeObject.cs | 2 +-
LongoMatch.Drawing/CanvasObject/TimelineObject.cs | 16 +-
LongoMatch.Drawing/Common.cs | 2 +
LongoMatch.Drawing/LongoMatch.Drawing.mdp | 10 +-
LongoMatch.Drawing/Widgets/Blackboard.cs | 304 ++++++
LongoMatch.Drawing/Widgets/PlaysTimeline.cs | 3 +
LongoMatch.Drawing/Widgets/TeamTagger.cs | 13 +-
LongoMatch.Drawing/Widgets/TimersTimeline.cs | 9 +-
LongoMatch.Drawing/Widgets/Timerule.cs | 2 +-
LongoMatch.GUI.Helpers/Misc.cs | 4 +-
LongoMatch.GUI.Multimedia/Gui/PlayerBin.cs | 2 +-
LongoMatch.GUI.Multimedia/gtk-gui/objects.xml | 9 +-
LongoMatch.GUI/Gui/Dialog/DrawingTool.cs | 345 ++++++-
LongoMatch.GUI/Gui/GUIToolkit.cs | 12 +-
LongoMatch.GUI/LongoMatch.GUI.mdp | 26 +-
.../LongoMatch.Gui.Component.DrawingToolBox.cs | 303 ------
.../LongoMatch.Gui.Component.DrawingWidget.cs | 42 -
.../gtk-gui/LongoMatch.Gui.Dialog.DrawingTool.cs | 630 ++++++++++--
LongoMatch.GUI/gtk-gui/gui.stetic | 1070 ++++++++++++--------
LongoMatch.GUI/gtk-gui/objects.xml | 43 +-
LongoMatch.Multimedia/Player/GstPlayer.cs | 18 +-
LongoMatch.Services/Services/EventsManager.cs | 33 +-
.../Services/RenderingJobsManager.cs | 8 +-
Tests/Core/Drawables/TestAngle.cs | 2 +-
Tests/Core/Drawables/TestCircle.cs | 81 --
Tests/Core/Drawables/TestLine.cs | 4 +-
Tests/Core/Drawables/TestMultipoints.cs | 4 +-
Tests/Core/Drawables/TestQuadrilateral.cs | 16 +-
Tests/Core/Drawables/TestRectangle.cs | 28 +-
Tests/Tests.mdp | 1 -
images/cursors/angle | 38 +
images/cursors/arrow | 38 +
images/cursors/ellipse | 38 +
images/cursors/freehand | 38 +
images/cursors/number | 38 +
images/cursors/rect | 38 +
images/cursors/text | 38 +
images/stock_draw-freeform-line.png | Bin 276 -> 0 bytes
images/stock_draw-line-ends-with-arrow.png | Bin 155 -> 0 bytes
images/tools/dash-line.svg | 65 ++
images/tools/draw-arrow.png | Bin 0 -> 210 bytes
.../draw-circle-unfilled.png} | Bin 418 -> 418 bytes
.../draw-cross.png} | Bin 113 -> 113 bytes
images/tools/draw-ellipse.png | Bin 0 -> 945 bytes
images/tools/draw-eraser.png | Bin 0 -> 751 bytes
images/tools/draw-freehand.png | Bin 0 -> 682 bytes
images/tools/draw-number.png | Bin 0 -> 449 bytes
images/tools/draw-pointer.png | Bin 0 -> 685 bytes
.../draw-rectangle-unfilled.png} | Bin 123 -> 123 bytes
images/tools/draw-rectangle.png | Bin 0 -> 394 bytes
images/tools/draw-text.png | Bin 0 -> 662 bytes
images/tools/line-arrow.svg | 131 +++
images/tools/line-dot.svg | 157 +++
images/tools/line-double-arrow.svg | 144 +++
images/tools/line-double-dot.svg | 157 +++
images/tools/line.svg | 65 ++
100 files changed, 3841 insertions(+), 1445 deletions(-)
---
diff --git a/LongoMatch.Core/Common/Area.cs b/LongoMatch.Core/Common/Area.cs
index 0e7fee1..b4745a6 100644
--- a/LongoMatch.Core/Common/Area.cs
+++ b/LongoMatch.Core/Common/Area.cs
@@ -43,6 +43,34 @@ namespace LongoMatch.Common
get;
set;
}
+
+ public Point Center {
+ get {
+ return new Point (Start.X + Width / 2, Start.Y + Height / 2);
+ }
+ }
+
+ public Point[] Vertices {
+ get {
+ return new Point[] {
+ new Point (Start.X, Start.Y),
+ new Point (Start.X + Width, Start.Y),
+ new Point (Start.X + Width, Start.Y + Height),
+ new Point (Start.X, Start.Y + Height)};
+ }
+ }
+
+ public Point[] VerticesCenter {
+ get {
+ Point [] points = Vertices;
+
+ points[0].X += Width / 2;
+ points[1].Y += Height / 2;
+ points[2].X = points[0].X;
+ points[3].Y = points[1].Y;
+ return points;
+ }
+ }
}
}
diff --git a/LongoMatch.Core/Common/Color.cs b/LongoMatch.Core/Common/Color.cs
index 03c77d5..915b079 100644
--- a/LongoMatch.Core/Common/Color.cs
+++ b/LongoMatch.Core/Common/Color.cs
@@ -21,6 +21,7 @@ using Newtonsoft.Json;
namespace LongoMatch.Common
{
[JsonConverter (typeof (LongoMatchConverter))]
+ [Serializable]
public class Color
{
public Color (byte r, byte g, byte b, byte a=byte.MaxValue)
@@ -51,6 +52,10 @@ namespace LongoMatch.Common
set;
}
+ public Color Copy () {
+ return new Color (R, G, B, A);
+ }
+
public override bool Equals (object obj)
{
Color c = obj as Color;
@@ -68,6 +73,10 @@ namespace LongoMatch.Common
static public byte UShortToByte (ushort val) {
return (byte) (((float)val) / ushort.MaxValue * byte.MaxValue);
}
+
+ static public ushort ByteToUShort (byte val) {
+ return (ushort) ((float)val / byte.MaxValue * ushort.MaxValue);
+ }
static public Color ColorFromUShort (ushort r, ushort g, ushort b, ushort a =
ushort.MaxValue) {
return new Color (UShortToByte (r), UShortToByte (g),
diff --git a/LongoMatch.Core/Common/Constants.cs b/LongoMatch.Core/Common/Constants.cs
index f51aa74..af0b2cc 100644
--- a/LongoMatch.Core/Common/Constants.cs
+++ b/LongoMatch.Core/Common/Constants.cs
@@ -100,6 +100,12 @@ Xavier Queralt Mateu (ca)";
public const string FIELD_BACKGROUND = "field_background.svg";
public const string HALF_FIELD_BACKGROUND = "half_field_background.svg";
public const string GOAL_BACKGROUND = "goal_background.svg";
+ public const string LINE_NORMAL = "line.svg";
+ public const string LINE_DASHED = "dash-line.svg";
+ public const string LINE_ARROW = "line-arrow.svg";
+ public const string LINE_DOUBLE_ARROW = "line-double-arrow.svg";
+ public const string LINE_DOT = "line-dot.svg";
+ public const string LINE_DOUBLE_DOT = "line-double-dot.svg";
public const int DB_MAYOR_VERSION = 3;
public const int DB_MINOR_VERSION = 1;
diff --git a/LongoMatch.Core/Common/Enums.cs b/LongoMatch.Core/Common/Enums.cs
index 4274ad7..04ac254 100644
--- a/LongoMatch.Core/Common/Enums.cs
+++ b/LongoMatch.Core/Common/Enums.cs
@@ -100,16 +100,19 @@ namespace LongoMatch.Common
}
public enum DrawTool {
- PEN,
- LINE,
- DASHED_LINE,
- CIRCLE,
- DASHED_CIRCLE,
- RECTANGLE,
- DASHED_RECTANGLE,
- CROSS,
- DASHED_CROSS,
- ERASER
+ Pen,
+ Line,
+ Ellipse,
+ Rectangle,
+ Angle,
+ Cross,
+ Eraser,
+ Selection,
+ RectangleArea,
+ CircleArea,
+ Player,
+ Text,
+ Counter,
}
public enum CaptureSourceType {
@@ -161,7 +164,6 @@ namespace LongoMatch.Common
AngleCenter,
CircleBorder,
All,
- None,
}
public enum LineStyle {
@@ -174,7 +176,8 @@ namespace LongoMatch.Common
Simple,
Arrow,
DoubleArrow,
- Rounded
+ Dot,
+ DoubleDot
}
public enum FontSlant {
diff --git a/LongoMatch.Core/Common/EventsBroker.cs b/LongoMatch.Core/Common/EventsBroker.cs
index dd2abc2..002995a 100644
--- a/LongoMatch.Core/Common/EventsBroker.cs
+++ b/LongoMatch.Core/Common/EventsBroker.cs
@@ -39,7 +39,7 @@ namespace LongoMatch.Common
public event TimeNodeChangedHandler TimeNodeChanged;
public event SnapshotSeriesHandler SnapshotSeries;
public event TagPlayHandler TagPlay;
- public event DuplicatePlayHandler DuplicatePlay;
+ public event DuplicatePlaysHandler DuplicatePlays;
public event TeamsTagsChangedHandler TeamTagsChanged;
/* Playlist */
@@ -168,10 +168,10 @@ namespace LongoMatch.Common
TagPlay (play);
}
- public void EmitDuplicatePlay (Play play)
+ public void EmitDuplicatePlay (List<Play> plays)
{
- if (DuplicatePlay != null)
- DuplicatePlay (play);
+ if (DuplicatePlays != null)
+ DuplicatePlays (plays);
}
public void EmitNewPlaylist() {
@@ -370,10 +370,10 @@ namespace LongoMatch.Common
}
}
- public void EmitDrawFrame (Time currentTime)
+ public void EmitDrawFrame (Play play, int drawingIndex)
{
if (DrawFrame != null) {
- DrawFrame (currentTime);
+ DrawFrame (play, drawingIndex);
}
}
diff --git a/LongoMatch.Core/Handlers/Handlers.cs b/LongoMatch.Core/Handlers/Handlers.cs
index 48184cd..b8be20a 100644
--- a/LongoMatch.Core/Handlers/Handlers.cs
+++ b/LongoMatch.Core/Handlers/Handlers.cs
@@ -24,6 +24,8 @@ using LongoMatch.Interfaces;
using LongoMatch.Interfaces.GUI;
using LongoMatch.Store;
using LongoMatch.Common;
+using LongoMatch.Store.Drawables;
+using LongoMatch.Interfaces.Drawing;
namespace LongoMatch.Handlers
{
@@ -50,7 +52,7 @@ namespace LongoMatch.Handlers
/* Change the Play's category */
public delegate void PlayCategoryChangedHandler(Play play, Category cat);
/* DUplicate play */
- public delegate void DuplicatePlayHandler (Play play);
+ public delegate void DuplicatePlaysHandler (List<Play> plays);
public delegate void TeamsTagsChangedHandler ();
@@ -89,20 +91,6 @@ namespace LongoMatch.Handlers
/* Save a playlist */
public delegate void SavePlaylistHandler();
- /* Drawing events */
- /* Draw tool changed */
- public delegate void DrawToolChangedHandler(DrawTool drawTool);
- /* Paint color changed */
- public delegate void ColorChangedHandler(Color color);
- /* Paint line width changed */
- public delegate void LineWidthChangedHandler(int width);
- /* Toggle widget visibility */
- public delegate void VisibilityChangedHandler(bool visible);
- /* Clear drawings */
- public delegate void ClearDrawingHandler();
- /* Transparency value changed */
- public delegate void TransparencyChangedHandler(double transparency);
-
/* The position of the stream has changed */
public delegate void PositionChangedHandler(Time pos);
@@ -155,6 +143,9 @@ namespace LongoMatch.Handlers
public delegate void ShowTimelineMenuHandler (List<Play> plays, Category cat, Time time);
public delegate void ShowTaggerMenuHandler (List<Play> plays);
+ public delegate void ShowDrawToolMenuHandler (IBlackboardObject drawable);
+ public delegate void ConfigureDrawingObjectHandler (IBlackboardObject drawable);
+ public delegate void DrawableChangedHandler (IBlackboardObject drawable);
public delegate void BackEventHandle ();
}
diff --git a/LongoMatch.Core/Handlers/Multimedia.cs b/LongoMatch.Core/Handlers/Multimedia.cs
index 3c35994..06732b5 100644
--- a/LongoMatch.Core/Handlers/Multimedia.cs
+++ b/LongoMatch.Core/Handlers/Multimedia.cs
@@ -32,7 +32,7 @@ namespace LongoMatch.Handlers
public delegate void PrevButtonClickedHandler();
public delegate void ProgressHandler(float progress);
public delegate void FramesProgressHandler(int actual, int total, Image frame);
- public delegate void DrawFrameHandler(Time time);
+ public delegate void DrawFrameHandler (Play play, int drawingIndex);
public delegate void EllpasedTimeHandler(Time ellapsedTime);
public delegate void PlaybackRateChangedHandler (float rate);
diff --git a/LongoMatch.Core/Interfaces/Drawing/ICanvasObject.cs
b/LongoMatch.Core/Interfaces/Drawing/ICanvas.cs
similarity index 79%
copy from LongoMatch.Core/Interfaces/Drawing/ICanvasObject.cs
copy to LongoMatch.Core/Interfaces/Drawing/ICanvas.cs
index e13b55a..3ac0bd6 100644
--- a/LongoMatch.Core/Interfaces/Drawing/ICanvasObject.cs
+++ b/LongoMatch.Core/Interfaces/Drawing/ICanvas.cs
@@ -23,6 +23,12 @@ using LongoMatch.Interfaces.Drawing;
namespace LongoMatch.Interfaces.Drawing
{
+
+ public interface ICanvas
+ {
+ void Draw (object context, Area area);
+ }
+
public interface ICanvasObject
{
void Draw (IDrawingToolkit tk, Area area);
@@ -30,8 +36,16 @@ namespace LongoMatch.Interfaces.Drawing
string Description {set; get;}
}
- public interface ICanvasSelectableObject: ICanvasObject, IDrawable
+ public interface ICanvasSelectableObject: ICanvasObject, IMovableObject
+ {
+ }
+
+ public interface ICanvasDrawableObject: ICanvasSelectableObject
{
+ IBlackboardObject IDrawableObject {
+ get;
+ set;
+ }
}
}
diff --git a/LongoMatch.Core/Interfaces/Drawing/IDrawable.cs b/LongoMatch.Core/Interfaces/Drawing/IDrawable.cs
index 88a6b6e..0c9b8cb 100644
--- a/LongoMatch.Core/Interfaces/Drawing/IDrawable.cs
+++ b/LongoMatch.Core/Interfaces/Drawing/IDrawable.cs
@@ -21,11 +21,17 @@ using LongoMatch.Common;
namespace LongoMatch.Interfaces.Drawing
{
- public interface IDrawable
+ public interface IMovableObject
{
bool Selected {get;set;}
Selection GetSelection (Point point, double precision);
void Move (Selection s, Point dst, Point start);
}
+
+ public interface IBlackboardObject: IMovableObject
+ {
+ Area Area {get;}
+ void Reorder ();
+ }
}
diff --git a/LongoMatch.Core/Interfaces/Drawing/IDrawingToolkit.cs
b/LongoMatch.Core/Interfaces/Drawing/IDrawingToolkit.cs
index f5c876d..8f363b7 100644
--- a/LongoMatch.Core/Interfaces/Drawing/IDrawingToolkit.cs
+++ b/LongoMatch.Core/Interfaces/Drawing/IDrawingToolkit.cs
@@ -18,20 +18,32 @@
using System;
using LongoMatch.Common;
using System.Collections.Generic;
+using LongoMatch.Interfaces.Drawing;
namespace LongoMatch.Interfaces
{
+
+ public interface ISurface:IDisposable {
+ Image Copy ();
+ object Value {get;}
+ object Context {get;}
+ }
+
public interface IDrawingToolkit
{
object Context {set;}
int LineWidth {set;}
+ bool Clear {set;}
Color StrokeColor {set;}
Color FillColor {set;}
string FontFamily {set;}
FontSlant FontSlant {set;}
FontWeight FontWeight {set;}
int FontSize {set;}
+ LineStyle LineStyle {set;}
+ ISurface CreateSurface (int width, int height, Image image=null);
+ void DrawSurface (ISurface surface);
void Begin();
void End();
void TranslateAndScale (Point translation, Point scale);
@@ -40,13 +52,16 @@ namespace LongoMatch.Interfaces
SelectionPosition orientation);
void DrawRectangle (Point start, double width, double height);
void DrawRoundedRectangle (Point start, double width, double height, double radius);
- void DrawArea (List<Point> vertices);
+ void DrawArea (params Point[] vertices);
void DrawPoint (Point point);
void DrawCircle (Point center, double radius);
void DrawEllipse (Point center, double axisX, double axisY);
void DrawText (Point point, double width, double height, string text);
void DrawImage (Image image);
void DrawImage (Point start, double width, double height, Image image, bool scale);
+ void DrawArrow(Point start, Point stop, int lenght, double degrees, bool closed);
+ void Save (ICanvas canvas, double width, double height, string filename);
+ Image Copy (ICanvas canvas, double width, double height);
}
}
diff --git a/LongoMatch.Core/Interfaces/Drawing/IWidget.cs b/LongoMatch.Core/Interfaces/Drawing/IWidget.cs
index 374edb3..9160154 100644
--- a/LongoMatch.Core/Interfaces/Drawing/IWidget.cs
+++ b/LongoMatch.Core/Interfaces/Drawing/IWidget.cs
@@ -33,8 +33,9 @@ namespace LongoMatch.Interfaces.Drawing
double Width {get;set;}
double Height {get;set;}
void ReDraw (Area area = null);
- void ReDraw (IDrawable drawable);
+ void ReDraw (IMovableObject drawable);
void SetCursor (CursorType type);
+ void SetCursorForTool (DrawTool tool);
void ShowTooltip (string text);
}
}
diff --git a/LongoMatch.Core/Interfaces/GUI/IGUIToolkit.cs b/LongoMatch.Core/Interfaces/GUI/IGUIToolkit.cs
index a3d3824..62869ca 100644
--- a/LongoMatch.Core/Interfaces/GUI/IGUIToolkit.cs
+++ b/LongoMatch.Core/Interfaces/GUI/IGUIToolkit.cs
@@ -78,7 +78,7 @@ namespace LongoMatch.Interfaces.GUI
void ManageJobs ();
void TagPlay (Play play, Project project);
- void DrawingTool(Image pixbuf, Play play, Time stopTime);
+ void DrawingTool(Image pixbuf, Play play, int drawingIndex);
string RemuxFile (string filePath, string outputFile, VideoMuxerType muxer);
diff --git a/LongoMatch.Core/LongoMatch.Core.mdp b/LongoMatch.Core/LongoMatch.Core.mdp
index c5b047f..2454bef 100644
--- a/LongoMatch.Core/LongoMatch.Core.mdp
+++ b/LongoMatch.Core/LongoMatch.Core.mdp
@@ -20,7 +20,6 @@
<File subtype="Code" buildaction="Compile" name="Common/Enums.cs" />
<File subtype="Code" buildaction="Compile" name="Common/Log.cs" />
<File subtype="Code" buildaction="Compile" name="Store/Category.cs" />
- <File subtype="Code" buildaction="Compile" name="Store/Drawing.cs" />
<File subtype="Code" buildaction="Compile" name="Store/HotKey.cs" />
<File subtype="Code" buildaction="Compile" name="Store/PixbufTimeNode.cs" />
<File subtype="Code" buildaction="Compile" name="Store/Play.cs" />
@@ -110,7 +109,6 @@
<File subtype="Code" buildaction="Compile" name="Store/Drawables/Quadrilateral.cs" />
<File subtype="Code" buildaction="Compile" name="Store/Drawables/Ellipse.cs" />
<File subtype="Code" buildaction="Compile" name="Store/Drawables/Line.cs" />
- <File subtype="Code" buildaction="Compile" name="Store/Drawables/Text.cs" />
<File subtype="Code" buildaction="Compile" name="Store/Drawables/MultiPoints.cs" />
<File subtype="Code" buildaction="Compile" name="Store/Drawables/Drawable.cs" />
<File subtype="Code" buildaction="Compile" name="Store/Drawables/Cross.cs" />
@@ -119,14 +117,13 @@
<File subtype="Code" buildaction="Compile" name="Store/Drawables/Angle.cs" />
<File subtype="Code" buildaction="Compile" name="Store/Coordinates.cs" />
<File subtype="Code" buildaction="Compile" name="Store/Point.cs" />
- <File subtype="Code" buildaction="Compile" name="Store/Drawables/Circle.cs" />
<File subtype="Code" buildaction="Compile" name="Common/Area.cs" />
<File subtype="Directory" buildaction="Compile" name="Interfaces/Drawing" />
<File subtype="Code" buildaction="Compile" name="Interfaces/Drawing/IDrawingToolkit.cs" />
<File subtype="Code" buildaction="Compile" name="Interfaces/Drawing/IWidget.cs" />
<File subtype="Code" buildaction="Compile" name="Handlers/Drawing.cs" />
<File subtype="Code" buildaction="Compile" name="Interfaces/Drawing/IDrawable.cs" />
- <File subtype="Code" buildaction="Compile" name="Interfaces/Drawing/ICanvasObject.cs" />
+ <File subtype="Code" buildaction="Compile" name="Interfaces/Drawing/ICanvas.cs" />
<File subtype="Code" buildaction="Compile" name="Common/ExtensionMethods.cs" />
<File subtype="Code" buildaction="Compile" name="Store/Timer.cs" />
<File subtype="Code" buildaction="Compile" name="Store/Period.cs" />
@@ -136,6 +133,10 @@
<File subtype="Directory" buildaction="Compile" name="Store" />
<File subtype="Code" buildaction="Compile" name="Common/Serializer.cs" />
<File subtype="Code" buildaction="Compile" name="Interfaces/IIDObject.cs" />
+ <File subtype="Code" buildaction="Compile" name="Store/FrameDrawing.cs" />
+ <File subtype="Directory" buildaction="Compile" name="Store/Drawables" />
+ <File subtype="Code" buildaction="Compile" name="Store/Drawables/Text.cs" />
+ <File subtype="Code" buildaction="Compile" name="Store/Drawables/Counter.cs" />
</Contents>
<References>
<ProjectReference type="Package" localcopy="True" refto="System, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089" />
diff --git a/LongoMatch.Core/Store/Drawables/Angle.cs b/LongoMatch.Core/Store/Drawables/Angle.cs
index 4fd3b5f..fa04b22 100644
--- a/LongoMatch.Core/Store/Drawables/Angle.cs
+++ b/LongoMatch.Core/Store/Drawables/Angle.cs
@@ -68,7 +68,7 @@ namespace LongoMatch.Store.Drawables
} else if (p.Distance (Center) < pr) {
return new Selection (this, SelectionPosition.AngleCenter, p.Distance
(Center));
} else {
- return new Selection (this, SelectionPosition.None);
+ return null;
}
}
diff --git a/LongoMatch.Core/Interfaces/Drawing/ICanvasObject.cs b/LongoMatch.Core/Store/Drawables/Counter.cs
similarity index 70%
rename from LongoMatch.Core/Interfaces/Drawing/ICanvasObject.cs
rename to LongoMatch.Core/Store/Drawables/Counter.cs
index e13b55a..be355df 100644
--- a/LongoMatch.Core/Interfaces/Drawing/ICanvasObject.cs
+++ b/LongoMatch.Core/Store/Drawables/Counter.cs
@@ -16,22 +16,27 @@
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
//
using System;
-using LongoMatch.Interfaces;
using LongoMatch.Common;
-using LongoMatch.Store.Drawables;
-using LongoMatch.Interfaces.Drawing;
-namespace LongoMatch.Interfaces.Drawing
+namespace LongoMatch.Store.Drawables
{
- public interface ICanvasObject
- {
- void Draw (IDrawingToolkit tk, Area area);
- bool Visible {set; get;}
- string Description {set; get;}
- }
-
- public interface ICanvasSelectableObject: ICanvasObject, IDrawable
+ public class Counter: Ellipse
{
+ public Counter (Point center, double axisX, double axisY, int count):
+ base (center, axisX, axisY)
+ {
+ Count = count;
+ }
+
+ public int Count {
+ get;
+ set;
+ }
+
+ public Color TextColor {
+ get;
+ set;
+ }
}
}
diff --git a/LongoMatch.Core/Store/Drawables/Cross.cs b/LongoMatch.Core/Store/Drawables/Cross.cs
index 2ed7282..1b417ed 100644
--- a/LongoMatch.Core/Store/Drawables/Cross.cs
+++ b/LongoMatch.Core/Store/Drawables/Cross.cs
@@ -16,20 +16,43 @@
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
//
using System;
+using System.Linq;
using Newtonsoft.Json;
using LongoMatch.Common;
namespace LongoMatch.Store.Drawables
{
- public class Cross: Line
+ public class Cross: Drawable
{
public Cross ()
{
}
- public Cross (Point start, Point stop, LineType type, LineStyle style):
- base (start, stop, type, style)
+ public Cross (Point start, Point stop, LineStyle style)
{
+ Start = start;
+ Stop = stop;
+ Style = style;
+ }
+
+ public Point Start {
+ set;
+ get;
+ }
+
+ public Point Stop {
+ set;
+ get;
+ }
+
+ [JsonIgnore]
+ public override Area Area {
+ get {
+ Point tl = new Point (Math.Min (Start.X, Stop.X),
+ Math.Min (Start.Y, Stop.Y));
+ return new Area (tl, Math.Abs (Start.X - Stop.X),
+ Math.Abs (Start.Y - Stop.Y));
+ }
}
[JsonIgnore]
@@ -46,37 +69,73 @@ namespace LongoMatch.Store.Drawables
}
}
+ public override void Reorder ()
+ {
+ Point [] array = new Point[] {Start, Stop, StartI, StopI};
+
+ array = array.OrderBy (p=> p.X).ThenBy (p=> p.Y).ToArray();
+ Start = array[0];
+ Stop = array[3];
+ }
+
public override Selection GetSelection (Point p, double pr=0.05) {
double d;
+ Selection sel;
+
+ if (Selected) {
+ return base.GetSelection (p, pr);
+ }
if (MatchPoint (Start, p, pr, out d)) {
return new Selection (this, SelectionPosition.TopLeft, d);
+ } else if (MatchPoint (StopI, p, pr, out d)) {
+ return new Selection (this, SelectionPosition.BottomRight, d);
} else if (MatchPoint (StartI, p, pr, out d)) {
return new Selection (this, SelectionPosition.TopRight, d);
- } else if (MatchPoint (Stop, p, pr, out d)) {
- return new Selection (this, SelectionPosition.BottomRight, d);
} else if (MatchPoint (StopI, p, pr, out d)) {
return new Selection (this, SelectionPosition.BottomLeft, d);
} else {
- double slope = (Start.Y - Stop.Y) / (Start.X - Stop.Y);
- double yi = Start.Y / (slope * Start.X);
- d = Math.Abs (p.Y / (slope * p.X) - yi);
- if (d < pr) {
- return new Selection (this, SelectionPosition.All, d);
- } else {
- return new Selection (this, SelectionPosition.None, d);
+ Line aline = new Line {Start = Start, Stop = Stop};
+ sel = aline.GetSelection (p, pr);
+ if (sel == null) {
+ Line bline = new Line {Start = StartI, Stop = StopI};
+ sel = bline.GetSelection (p, pr);
+ }
+ if (sel != null) {
+ sel.Drawable = this;
}
+ return sel;
}
}
public override void Move (Selection sel, Point p, Point moveStart) {
- switch (sel.Position) {
+ switch (sel.Position) {
case SelectionPosition.TopLeft:
Start = p;
break;
case SelectionPosition.BottomRight:
Stop = p;
break;
+ case SelectionPosition.TopRight:
+ Start.Y = p.Y;
+ Stop.X = p.X;
+ break;
+ case SelectionPosition.BottomLeft:
+ Start.X = p.X;
+ Stop.Y = p.Y;
+ break;
+ case SelectionPosition.Top:
+ Start.Y = p.Y;
+ break;
+ case SelectionPosition.Bottom:
+ Stop.Y = p.Y;
+ break;
+ case SelectionPosition.Left:
+ Start.X = p.X;
+ break;
+ case SelectionPosition.Right:
+ Stop.X = p.X;
+ break;
case SelectionPosition.All:
Start.X += p.X - moveStart.X;
Start.Y += p.Y - moveStart.Y;
diff --git a/LongoMatch.Core/Store/Drawables/Drawable.cs b/LongoMatch.Core/Store/Drawables/Drawable.cs
index 8477a55..18fb732 100644
--- a/LongoMatch.Core/Store/Drawables/Drawable.cs
+++ b/LongoMatch.Core/Store/Drawables/Drawable.cs
@@ -22,7 +22,7 @@ using LongoMatch.Interfaces.Drawing;
namespace LongoMatch.Store.Drawables
{
- public abstract class Drawable: IDrawable
+ public abstract class Drawable: IBlackboardObject
{
public Drawable ()
{
@@ -48,7 +48,59 @@ namespace LongoMatch.Store.Drawables
set;
}
- public abstract Selection GetSelection (Point point, double precision);
+ public LineStyle Style{
+ get;
+ set;
+ }
+
+ public virtual Area Area {
+ get;
+ protected set;
+ }
+
+ public virtual void Reorder () {
+ }
+
+ public virtual Selection GetSelection (Point point, double pr) {
+ Point[] vertices;
+ double d;
+
+ if (Area == null) {
+ return null;
+ }
+
+ if ((point.X < Area.Start.X - pr) ||
+ (point.X > Area.Start.X + Area.Width + pr) ||
+ (point.Y < Area.Start.Y - pr) ||
+ (point.Y > Area.Start.Y + Area.Height + pr)) {
+ return null;
+ }
+
+ /* Check vertices */
+ vertices = Area.Vertices;
+ if (MatchPoint (vertices[0], point, pr, out d)) {
+ return new Selection (this, SelectionPosition.TopLeft, d);
+ } else if (MatchPoint (vertices[1], point, pr, out d)) {
+ return new Selection (this, SelectionPosition.TopRight, d);
+ } else if (MatchPoint (vertices[2], point, pr, out d)) {
+ return new Selection (this, SelectionPosition.BottomRight, d);
+ } else if (MatchPoint (vertices[3], point, pr, out d)) {
+ return new Selection (this, SelectionPosition.BottomLeft, d);
+ }
+
+ vertices = Area.VerticesCenter;
+ if (MatchPoint (vertices[0], point, pr, out d)) {
+ return new Selection (this, SelectionPosition.Top, d);
+ } else if (MatchPoint (vertices[1], point, pr, out d)) {
+ return new Selection (this, SelectionPosition.Right, d);
+ } else if (MatchPoint (vertices[2], point, pr, out d)) {
+ return new Selection (this, SelectionPosition.Bottom, d);
+ } else if (MatchPoint (vertices[3], point, pr, out d)) {
+ return new Selection (this, SelectionPosition.Left, d);
+ }
+
+ return new Selection (this, SelectionPosition.All, point.Distance (Area.Center));
+ }
public abstract void Move (Selection s, Point dst, Point start);
diff --git a/LongoMatch.Core/Store/Drawables/Ellipse.cs b/LongoMatch.Core/Store/Drawables/Ellipse.cs
index f8a0b32..b2a3ff5 100644
--- a/LongoMatch.Core/Store/Drawables/Ellipse.cs
+++ b/LongoMatch.Core/Store/Drawables/Ellipse.cs
@@ -27,11 +27,12 @@ namespace LongoMatch.Store.Drawables
{
}
- public Ellipse (Point center, double axisX, double axisY)
+ public Ellipse (Point center, double axisX, double axisY, string text = null)
{
Center = center;
AxisX = axisX;
AxisY = axisY;
+ Text = text;
}
public Point Center {
@@ -49,6 +50,16 @@ namespace LongoMatch.Store.Drawables
set;
}
+ public string Text {
+ get;
+ set;
+ }
+
+ public Color TextColor {
+ get;
+ set;
+ }
+
[JsonIgnore]
public Point Top {
get {
@@ -70,15 +81,28 @@ namespace LongoMatch.Store.Drawables
}
}
+ [JsonIgnore]
public Point Right {
get {
return new Point (Center.X + AxisX, Center.Y);
}
}
+
+ [JsonIgnore]
+ public override Area Area {
+ get {
+ return new Area (new Point (Center.X - AxisX, Center.Y - AxisY),
+ AxisX * 2, AxisY * 2);
+ }
+ }
public override Selection GetSelection (Point p, double pr=0.05) {
double d;
+ if (Selected) {
+ return base.GetSelection (p, pr);
+ }
+
if (MatchPoint (Top, p, pr, out d)) {
return new Selection (this, SelectionPosition.Top, d);
} else if (MatchPoint (Bottom, p, pr, out d)) {
@@ -94,7 +118,7 @@ namespace LongoMatch.Store.Drawables
if ((a + b) <= 1) {
return new Selection (this, SelectionPosition.All, p.Distance
(Center));
} else {
- return new Selection (this, SelectionPosition.None);
+ return null;
}
}
}
@@ -111,6 +135,14 @@ namespace LongoMatch.Store.Drawables
AxisX = Math.Abs (p.X - Center.X);
break;
}
+ case SelectionPosition.TopLeft:
+ case SelectionPosition.TopRight:
+ case SelectionPosition.BottomLeft:
+ case SelectionPosition.BottomRight: {
+ AxisX = Math.Abs (p.X - Center.X);
+ AxisY = Math.Abs (p.Y - Center.Y);
+ break;
+ }
case SelectionPosition.All: {
Center.X += p.X - moveStart.X;
Center.Y += p.Y - moveStart.Y;
diff --git a/LongoMatch.Core/Store/Drawables/Line.cs b/LongoMatch.Core/Store/Drawables/Line.cs
index 4c14714..0bea251 100644
--- a/LongoMatch.Core/Store/Drawables/Line.cs
+++ b/LongoMatch.Core/Store/Drawables/Line.cs
@@ -50,11 +50,6 @@ namespace LongoMatch.Store.Drawables
set;
}
- public LineStyle Style{
- get;
- set;
- }
-
[JsonIgnore]
public Point Center {
get {
@@ -65,7 +60,7 @@ namespace LongoMatch.Store.Drawables
public override Selection GetSelection (Point p, double pr=0.05) {
double d;
-
+
if (MatchPoint (Start, p, pr, out d)) {
return new Selection (this, SelectionPosition.LineStart, d);
} else if (MatchPoint (Stop, p, pr, out d)) {
@@ -78,7 +73,7 @@ namespace LongoMatch.Store.Drawables
miny = Math.Min (Start.Y, Stop.Y) - pr;
maxy = Math.Max (Start.Y, Stop.Y) + pr;
if (p.X < minx || p.X > maxx || p.Y < miny || p.Y > maxy) {
- return new Selection (this, SelectionPosition.None);
+ return null;
}
if (Start.X == Stop.X) {
d = p.Distance (new Point (Start.X, p.Y));
@@ -95,13 +90,13 @@ namespace LongoMatch.Store.Drawables
if (d < pr) {
return new Selection (this, SelectionPosition.All, d);
} else {
- return new Selection (this, SelectionPosition.None, 0);
+ return null;
}
}
}
public override void Move (Selection sel, Point p, Point moveStart) {
- switch (sel.Position) {
+ switch (sel.Position) {
case SelectionPosition.LineStart:
Start = p;
break;
diff --git a/LongoMatch.Core/Store/Drawables/MultiPoints.cs b/LongoMatch.Core/Store/Drawables/MultiPoints.cs
index 0dd9eeb..5f10c1c 100644
--- a/LongoMatch.Core/Store/Drawables/MultiPoints.cs
+++ b/LongoMatch.Core/Store/Drawables/MultiPoints.cs
@@ -48,7 +48,7 @@ namespace LongoMatch.Store.Drawables
public override Selection GetSelection (Point p, double pr)
{
Selection s = base.GetSelection (p, pr);
- if (s.Position != SelectionPosition.None) {
+ if (s != null) {
s.Position = SelectionPosition.All;
}
return s;
diff --git a/LongoMatch.Core/Store/Drawables/Quadrilateral.cs
b/LongoMatch.Core/Store/Drawables/Quadrilateral.cs
index 385a152..0cb4f01 100644
--- a/LongoMatch.Core/Store/Drawables/Quadrilateral.cs
+++ b/LongoMatch.Core/Store/Drawables/Quadrilateral.cs
@@ -54,6 +54,18 @@ namespace LongoMatch.Store.Drawables
set;
}
+ public override Area Area {
+ get {
+ double xmin, xmax, ymin, ymax;
+
+ /* Create a rectangle that wraps the quadrilateral */
+ xmin = Math.Min (BottomLeft.X, TopLeft.X);
+ xmax = Math.Max (BottomRight.X, TopRight.X);
+ ymin = Math.Min (TopLeft.Y, TopRight.Y);
+ ymax = Math.Max (BottomLeft.Y, BottomRight.Y);
+ return new Area (new Point (xmin, ymin), xmax - xmin, ymax - ymin);
+ }
+ }
public override Selection GetSelection (Point p, double pr) {
double xmin, xmax, ymin, ymax;
double d;
@@ -61,11 +73,11 @@ namespace LongoMatch.Store.Drawables
/* Create a rectangle that wraps the quadrilateral */
xmin = Math.Min (BottomLeft.X, TopLeft.X) - pr;
xmax = Math.Max (BottomRight.X, TopRight.X) + pr;
- ymin = Math.Min (BottomLeft.Y, BottomRight.Y) - pr;
- ymax = Math.Max (TopLeft.Y, TopRight.Y) + pr;
+ ymin = Math.Min (TopLeft.Y, TopRight.Y) - pr;
+ ymax = Math.Max (BottomLeft.Y, BottomRight.Y) + pr;
- if (p.X > xmax || p.X < xmin || p.Y < ymin || p.Y > ymax) {
- return new Selection (this, SelectionPosition.None, 0);
+ if ((p.X > xmax || p.X < xmin || p.Y < ymin || p.Y > ymax)) {
+ return null;
} else if (MatchPoint (TopLeft, p, pr, out d)) {
return new Selection (this, SelectionPosition.TopLeft, d);
} else if (MatchPoint (TopRight, p, pr, out d)) {
diff --git a/LongoMatch.Core/Store/Drawables/Rectangle.cs b/LongoMatch.Core/Store/Drawables/Rectangle.cs
index d18caca..a66e42f 100644
--- a/LongoMatch.Core/Store/Drawables/Rectangle.cs
+++ b/LongoMatch.Core/Store/Drawables/Rectangle.cs
@@ -16,6 +16,7 @@
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
//
using System;
+using System.Linq;
using LongoMatch.Common;
using Newtonsoft.Json;
@@ -29,10 +30,10 @@ namespace LongoMatch.Store.Drawables
public Rectangle (Point origin, double width, double height)
{
- BottomLeft = origin;
- BottomRight = new Point (origin.X + width, origin.Y);
- TopLeft = new Point (origin.X, origin.Y + height);
- TopRight = new Point (origin.X + width, origin.Y + height);
+ TopLeft = origin;
+ TopRight = new Point (origin.X + width, origin.Y);
+ BottomLeft = new Point (origin.X, origin.Y + height);
+ BottomRight = new Point (origin.X + width, origin.Y + height);
}
[JsonIgnore]
@@ -45,22 +46,36 @@ namespace LongoMatch.Store.Drawables
[JsonIgnore]
public double Height {
get {
- return TopLeft.Y - BottomLeft.Y;
+ return BottomLeft.Y - TopLeft.Y;
}
}
[JsonIgnore]
public Point Center {
get {
- return new Point (BottomLeft.X + Width / 2, BottomLeft.Y + Height / 2);
+ return new Point (TopLeft.X + Width / 2, TopLeft.Y + Height / 2);
}
}
+
+
+ public override void Reorder () {
+ Point [] array = new Point[] {TopLeft, TopRight, BottomLeft, BottomRight};
+
+ array = array.OrderBy (p=> p.X).ThenBy (p=> p.Y).ToArray();
+ TopLeft = array[0];
+ BottomLeft = array[1];
+ TopRight = array[2];
+ BottomRight = array[3];
+ }
+
public override Selection GetSelection (Point p, double pr=0.05) {
Selection selection;
double d;
selection = base.GetSelection (p, pr);
+ if (selection == null)
+ return selection;
if (selection.Position == SelectionPosition.All) {
if (MatchAxis (p.X, TopLeft.X, pr, out d)) {
@@ -111,8 +126,7 @@ namespace LongoMatch.Store.Drawables
TopRight.X = p.X;
break;
case SelectionPosition.All:
- Center.X += p.X - moveStart.X;
- Center.Y += p.Y - moveStart.Y;
+ base.Move (sel, p, moveStart);
break;
}
}
diff --git a/LongoMatch.Core/Store/Drawables/Selection.cs b/LongoMatch.Core/Store/Drawables/Selection.cs
index 25913d2..3f0a665 100644
--- a/LongoMatch.Core/Store/Drawables/Selection.cs
+++ b/LongoMatch.Core/Store/Drawables/Selection.cs
@@ -23,14 +23,14 @@ namespace LongoMatch.Store.Drawables
{
public class Selection
{
- public Selection (IDrawable drawable, SelectionPosition selpos, double accuracy=0)
+ public Selection (IMovableObject drawable, SelectionPosition selpos, double accuracy=0)
{
Drawable = drawable;
Position = selpos;
Accuracy = accuracy;
}
- public IDrawable Drawable {
+ public IMovableObject Drawable {
get;
set;
}
diff --git a/LongoMatch.Core/Store/Drawing.cs b/LongoMatch.Core/Store/FrameDrawing.cs
similarity index 84%
rename from LongoMatch.Core/Store/Drawing.cs
rename to LongoMatch.Core/Store/FrameDrawing.cs
index e30c9ff..90d17f8 100644
--- a/LongoMatch.Core/Store/Drawing.cs
+++ b/LongoMatch.Core/Store/FrameDrawing.cs
@@ -20,12 +20,14 @@ using System;
using Newtonsoft.Json;
using LongoMatch.Common;
+using System.Collections.Generic;
+using LongoMatch.Store.Drawables;
namespace LongoMatch.Store
{
[Serializable]
- public class Drawing
+ public class FrameDrawing
{
private const int DEFAULT_PAUSE_TIME = 5000;
@@ -35,14 +37,20 @@ namespace LongoMatch.Store
/// are used by { MediaTimeNodes} to store the key frame drawing
/// which stop time is stored in a int value
/// </summary>
- public Drawing() {
+ public FrameDrawing() {
Pause = new Time (DEFAULT_PAUSE_TIME);
+ Drawables = new List<Drawable> ();
+ }
+
+ public Image Freehand {
+ get;
+ set;
}
/// <summary>
- /// Pixbuf with the drawing
+ /// List of Drawable objects in the canvas
/// </summary>
- public Image Pixbuf {
+ public List<Drawable> Drawables {
get;
set;
}
diff --git a/LongoMatch.Core/Store/Play.cs b/LongoMatch.Core/Store/Play.cs
index b54d420..b3b7266 100644
--- a/LongoMatch.Core/Store/Play.cs
+++ b/LongoMatch.Core/Store/Play.cs
@@ -39,7 +39,7 @@ namespace LongoMatch.Store
#region Constructors
public Play() {
- Drawings = new List<Drawing>();
+ Drawings = new List<FrameDrawing>();
Players = new List<Player> ();
Tags = new List<Tag>();
Fps = 25;
@@ -105,14 +105,14 @@ namespace LongoMatch.Store
/// <summary>
/// List of drawings for this play
/// </summary>
- public List<Drawing> Drawings {
+ public List<FrameDrawing> Drawings {
get;
set;
}
/* FIXME: Keep this until we support multiple drawings */
[JsonIgnore]
- public Drawing KeyFrameDrawing {
+ public FrameDrawing KeyFrameDrawing {
get {
if(Drawings.Count > 0)
return Drawings.First();
diff --git a/LongoMatch.Core/Store/PlayListPlay.cs b/LongoMatch.Core/Store/PlayListPlay.cs
index eca7f57..3f297fa 100644
--- a/LongoMatch.Core/Store/PlayListPlay.cs
+++ b/LongoMatch.Core/Store/PlayListPlay.cs
@@ -69,7 +69,7 @@ namespace LongoMatch.Store
/// <summary>
/// List of drawings to be displayed
/// </summary>
- public List<Drawing> Drawings {
+ public List<FrameDrawing> Drawings {
get;
set;
}
diff --git a/LongoMatch.Drawing.Cairo/CairoBackend.cs b/LongoMatch.Drawing.Cairo/CairoBackend.cs
index 6adc8bf..be06e90 100644
--- a/LongoMatch.Drawing.Cairo/CairoBackend.cs
+++ b/LongoMatch.Drawing.Cairo/CairoBackend.cs
@@ -27,7 +27,9 @@ using LFontWeight = LongoMatch.Common.FontWeight;
using FontSlant = Cairo.FontSlant;
using FontWeight = Cairo.FontWeight;
using Image = LongoMatch.Common.Image;
+using LineStyle = LongoMatch.Common.LineStyle;
using Gdk;
+using LongoMatch.Interfaces.Drawing;
namespace LongoMatch.Drawing.Cairo
{
@@ -38,7 +40,10 @@ namespace LongoMatch.Drawing.Cairo
FontSlant fSlant, savedFSlant;
FontWeight fWeight, savedFWeight;
int savedLineWidth, savedFontSize;
+ bool savedClear;
+ LineStyle savedLineStyle;
string savedFontFamily;
+ bool disableScalling;
public CairoBackend ()
{
@@ -49,6 +54,8 @@ namespace LongoMatch.Drawing.Cairo
FontFamily = "Verdana";
FontWeight = LFontWeight.Normal;
FontSlant = LFontSlant.Normal;
+ LineStyle = LineStyle.Normal;
+ Clear = false;
}
public object Context {
@@ -112,6 +119,20 @@ namespace LongoMatch.Drawing.Cairo
}
}
+ public LineStyle LineStyle {
+ get;
+ set;
+ }
+
+ public bool Clear {
+ get;
+ set;
+ }
+
+ public ISurface CreateSurface (int width, int height, Image image=null) {
+ return new Surface (width, height, image);
+ }
+
public void Begin() {
savedStrokeColor = StrokeColor;
savedFillColor = FillColor;
@@ -120,16 +141,21 @@ namespace LongoMatch.Drawing.Cairo
savedLineWidth = LineWidth;
savedFontSize = FontSize;
savedFontFamily = FontFamily;
+ savedLineStyle = LineStyle;
+ savedClear = Clear;
context.Save ();
}
public void TranslateAndScale (Point translation, Point scale) {
- context.Translate (translation.X, translation.Y);
- context.Scale (scale.X, scale.Y);
+ if (!disableScalling) {
+ context.Translate (translation.X, translation.Y);
+ context.Scale (scale.X, scale.Y);
+ }
}
public void End() {
context.Restore ();
+ Clear = savedClear;
StrokeColor = savedStrokeColor;
FillColor = savedFillColor;
fSlant = savedFSlant;
@@ -137,14 +163,14 @@ namespace LongoMatch.Drawing.Cairo
LineWidth = savedLineWidth;
FontSize = savedFontSize;
FontFamily = savedFontFamily;
+ LineStyle = savedLineStyle;
}
public void DrawLine (Point start, Point stop) {
- SetColor (StrokeColor);
context.LineWidth = LineWidth;
context.MoveTo (start.X, start.Y);
context.LineTo (stop.X, stop.Y);
- context.Stroke();
+ StrokeAndFill ();
}
public void DrawTriangle (Point corner, double width, double height,
@@ -175,13 +201,11 @@ namespace LongoMatch.Drawing.Cairo
context.LineTo (x2, y2);
context.LineTo (x3, y3);
context.ClosePath();
- context.StrokePreserve ();
- SetColor (FillColor);
- context.Fill();
+ StrokeAndFill ();
}
- public void DrawArea (List<Point> vertices) {
- for (int i=0; i < vertices.Count - 1; i++) {
+ public void DrawArea (params Point[] vertices) {
+ for (int i=0; i < vertices.Length - 1; i++) {
double x1, y1, x2, y2;
x1 = vertices[i].X;
@@ -197,8 +221,7 @@ namespace LongoMatch.Drawing.Cairo
}
public void DrawRectangle (Point start, double width, double height) {
- context.Rectangle (new PointD (start.X + LineWidth / 2, start.Y + LineWidth / 2),
- width - LineWidth, height - LineWidth);
+ context.Rectangle (start.X, start.Y, width, height);
StrokeAndFill ();
}
@@ -226,7 +249,6 @@ namespace LongoMatch.Drawing.Cairo
}
public void DrawCircle (Point center, double radius) {
- context.MoveTo (center.X, center.Y);
context.Arc (center.X, center.Y, radius, 0, 2 * Math.PI);
StrokeAndFill ();
}
@@ -240,6 +262,9 @@ namespace LongoMatch.Drawing.Cairo
FontExtents fextents;
double x, y;
+ if (text == null) {
+ return;
+ }
SetColor (StrokeColor);
context.SelectFontFace (FontFamily, fSlant, fWeight);
context.SetFontSize (FontSize);
@@ -249,6 +274,7 @@ namespace LongoMatch.Drawing.Cairo
y = point.Y + height / 2 - (extents.Height / 2 + extents.YBearing);
context.MoveTo (x, y);
context.ShowText (text);
+ StrokeAndFill ();
}
public void DrawImage (Image image) {
@@ -276,9 +302,89 @@ namespace LongoMatch.Drawing.Cairo
}
public void DrawEllipse (Point center, double axisX, double axisY) {
+ double max = Math.Max (axisX, axisY);
+ context.Save ();
+ context.Translate (center.X, center.Y);
+ context.Scale (axisX / max, axisY / max);
+ context.Arc (0, 0, max, 0, 2 * Math.PI);
+ StrokeAndFill ();
+ context.Restore ();
+ }
+
+ public void DrawArrow(Point start, Point stop, int lenght, double radians, bool closed) {
+ double vx1,vy1,vx2,vy2;
+ double angle = Math.Atan2(stop.Y - start.Y, stop.X - start.X) + Math.PI;
+
+ vx1 = stop.X + (lenght + LineWidth) * Math.Cos(angle - radians);
+ vy1 = stop.Y + (lenght + LineWidth) * Math.Sin(angle - radians);
+ vx2 = stop.X + (lenght + LineWidth) * Math.Cos(angle + radians);
+ vy2 = stop.Y + (lenght + LineWidth) * Math.Sin(angle + radians);
+
+ context.MoveTo(stop.X, stop.Y);
+ context.LineTo(vx1, vy1);
+ if (!closed) {
+ context.MoveTo(stop.X, stop.Y);
+ context.LineTo(vx2,vy2);
+ } else {
+ context.LineTo(vx2,vy2);
+ context.ClosePath ();
+ }
+ StrokeAndFill();
+ }
+
+ public void DrawSurface (ISurface surface) {
+ context.SetSourceSurface (surface.Value as ImageSurface, 0, 0);
+ context.Paint ();
}
+ public Image Copy (ICanvas canvas, double width, double height) {
+ Image img;
+ Pixmap pm;
+
+ pm = new Pixmap (null, (int) width, (int) height, 24);
+ disableScalling = true;
+ using(Context c = CairoHelper.Create (pm)) {
+ context = c;
+ canvas.Draw (context, new Area (new Point (0, 0), width, height));
+ }
+ img = new Image (Gdk.Pixbuf.FromDrawable (pm, Colormap.System, 0, 0, 0, 0,
+ (int) width, (int)height));
+ disableScalling = false;
+ context = null;
+ return img;
+ }
+
+ public void Save (ICanvas canvas, double width, double height, string filename) {
+ ImageSurface pngSurface = new ImageSurface(Format.ARGB32, (int) width, (int) height);
+ disableScalling = true;
+ using(Context c = new Context(pngSurface)) {
+ context = c;
+ canvas.Draw (context, new Area (new Point (0, 0), width, height));
+ }
+ pngSurface.WriteToPng(filename);
+ disableScalling = false;
+ context = null;
+ pngSurface.Dispose ();
+ }
+
+ void SetDash() {
+ switch (LineStyle) {
+ case LineStyle.Normal:
+ context.SetDash(new double[] {}, 0);
+ break;
+ default:
+ context.SetDash(new double[] {10, 10}, 10);
+ break;
+ }
+ }
+
void StrokeAndFill () {
+ SetDash ();
+ if (Clear) {
+ context.Operator = Operator.Clear;
+ } else {
+ context.Operator = Operator.Over;
+ }
context.LineCap = LineCap.Round;
context.LineJoin = LineJoin.Round;
context.LineWidth = LineWidth;
@@ -289,10 +395,14 @@ namespace LongoMatch.Drawing.Cairo
}
void SetColor (Color color) {
- context.SetSourceRGBA ((double) color.R / byte.MaxValue,
- (double) color.G / byte.MaxValue,
- (double) color.B / byte.MaxValue,
- (double) color.A / byte.MaxValue);
+ if (color != null) {
+ context.SetSourceRGBA ((double) color.R / byte.MaxValue,
+ (double) color.G / byte.MaxValue,
+ (double) color.B / byte.MaxValue,
+ (double) color.A / byte.MaxValue);
+ } else {
+ context.SetSourceRGBA (0, 0, 0, 0);
+ }
}
}
diff --git a/LongoMatch.Drawing.Cairo/LongoMatch.Drawing.Cairo.mdp
b/LongoMatch.Drawing.Cairo/LongoMatch.Drawing.Cairo.mdp
index 590517e..a001b93 100644
--- a/LongoMatch.Drawing.Cairo/LongoMatch.Drawing.Cairo.mdp
+++ b/LongoMatch.Drawing.Cairo/LongoMatch.Drawing.Cairo.mdp
@@ -16,6 +16,16 @@
<Contents>
<File subtype="Code" buildaction="Compile" name="CairoBackend.cs" />
<File subtype="Code" buildaction="Compile" name="WidgetWrapper.cs" />
+ <File subtype="Code" buildaction="EmbedAsResource" name="../images/cursors/text" />
+ <File subtype="Code" buildaction="EmbedAsResource" name="../images/cursors/rect" />
+ <File subtype="Code" buildaction="EmbedAsResource" name="../images/cursors/number" />
+ <File subtype="Code" buildaction="EmbedAsResource" name="../images/cursors/freehand" />
+ <File subtype="Code" buildaction="EmbedAsResource" name="../images/cursors/ellipse" />
+ <File subtype="Code" buildaction="EmbedAsResource" name="../images/cursors/arrow" />
+ <File subtype="Code" buildaction="Nothing" name="../images/cursors/angle" />
+ <File subtype="Code" buildaction="Compile" name="Surface.cs" />
+ <File subtype="Code" buildaction="EmbedAsResource" name="../images/tools/draw-eraser.png"
resource_id="eraser" />
+ <File subtype="Code" buildaction="EmbedAsResource" name="../images/tools/draw-cross.png"
resource_id="cross" />
</Contents>
<References>
<ProjectReference type="Package" localcopy="True" refto="System, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089" />
diff --git a/LongoMatch.Drawing/CanvasObject/CircleObject.cs b/LongoMatch.Drawing.Cairo/Surface.cs
similarity index 52%
copy from LongoMatch.Drawing/CanvasObject/CircleObject.cs
copy to LongoMatch.Drawing.Cairo/Surface.cs
index f697cf3..e5b5d1e 100644
--- a/LongoMatch.Drawing/CanvasObject/CircleObject.cs
+++ b/LongoMatch.Drawing.Cairo/Surface.cs
@@ -16,29 +16,48 @@
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
//
using System;
-using LongoMatch.Interfaces.Drawing;
-using LongoMatch.Store.Drawables;
-using LongoMatch.Common;
+using Cairo;
using LongoMatch.Interfaces;
+using LongoMatch.Common;
-namespace LongoMatch.Drawing.CanvasObject
+namespace LongoMatch.Drawing.Cairo
{
- public class PointObject: BaseCanvasDrawableObject<Circle>, ICanvasSelectableObject
+ public class Surface: ISurface
{
+ ImageSurface surface;
- public PointObject (Point center, double radius, Color color)
+ public Surface (int width, int height, Image image)
{
- Drawable = new Circle (center, radius);
- Drawable.FillColor = color;
- Drawable.StrokeColor = color;
- Drawable.LineWidth = 1;
+ surface = new ImageSurface(Format.ARGB32, width, height);
+ if (image != null) {
+ using (Context context = new Context(surface)) {
+ Gdk.CairoHelper.SetSourcePixbuf (context, image.Value, 0, 0);
+ context.Paint();
+ }
+ }
+ }
+
+ public object Value {
+ get {
+ return surface;
+ }
+ }
+
+ public object Context {
+ get {
+ return new Context (surface);
+ }
+ }
+
+ public Image Copy () {
+ string tempFile = System.IO.Path.GetTempFileName();
+ surface.WriteToPng (tempFile);
+ Gdk.Pixbuf pixbuf = new Gdk.Pixbuf (tempFile);
+ return new Image (pixbuf);
}
- public override void Draw (IDrawingToolkit tk, Area area) {
- tk.FillColor = Drawable.FillColor;
- tk.StrokeColor = Drawable.StrokeColor;
- tk.LineWidth = Drawable.LineWidth;
- tk.DrawCircle (Drawable.Center, Drawable.Radius);
+ public void Dispose () {
+ surface.Dispose ();
}
}
}
diff --git a/LongoMatch.Drawing.Cairo/WidgetWrapper.cs b/LongoMatch.Drawing.Cairo/WidgetWrapper.cs
index 5156e6d..025a701 100644
--- a/LongoMatch.Drawing.Cairo/WidgetWrapper.cs
+++ b/LongoMatch.Drawing.Cairo/WidgetWrapper.cs
@@ -48,9 +48,9 @@ namespace LongoMatch.Drawing.Cairo
public WidgetWrapper (DrawingArea widget)
{
this.widget = widget;
- widget.Events |= EventMask.PointerMotionMask;
- widget.Events |= EventMask.ButtonPressMask;
- widget.Events |= EventMask.ButtonReleaseMask ;
+ widget.AddEvents ((int)EventMask.PointerMotionMask);
+ widget.AddEvents ((int)EventMask.ButtonPressMask);
+ widget.AddEvents ((int)EventMask.ButtonReleaseMask);
widget.ExposeEvent += HandleExposeEvent;
widget.ButtonPressEvent += HandleButtonPressEvent;
widget.ButtonReleaseEvent += HandleButtonReleaseEvent;
@@ -91,7 +91,7 @@ namespace LongoMatch.Drawing.Cairo
widget.GdkWindow.ProcessUpdates(true);
}
- public void ReDraw (IDrawable drawable) {
+ public void ReDraw (IMovableObject drawable) {
/* FIXME: get region from drawable */
ReDraw ();
}
@@ -103,7 +103,6 @@ namespace LongoMatch.Drawing.Cairo
public void SetCursor (CursorType type) {
GCursorType gtype;
-
switch (type) {
case CursorType.Arrow:
gtype = GCursorType.Arrow;
@@ -123,6 +122,53 @@ namespace LongoMatch.Drawing.Cairo
}
widget.GdkWindow.Cursor = new Cursor (gtype);
}
+
+ public void SetCursorForTool (DrawTool tool) {
+ string cursor;
+
+ switch (tool) {
+ case DrawTool.Line:
+ cursor = "arrow";
+ break;
+ case DrawTool.Cross:
+ cursor = "cross";
+ break;
+ case DrawTool.Text:
+ cursor = "text";
+ break;
+ case DrawTool.Counter:
+ cursor = "number";
+ break;
+ case DrawTool.Ellipse:
+ case DrawTool.CircleArea:
+ cursor = "ellipse";
+ break;
+ case DrawTool.Rectangle:
+ case DrawTool.RectangleArea:
+ cursor = "rect";
+ break;
+ case DrawTool.Angle:
+ cursor = "angle";
+ break;
+ case DrawTool.Pen:
+ cursor = "freehand";
+ break;
+ case DrawTool.Eraser:
+ cursor = "eraser";
+ break;
+ case DrawTool.Selection:
+ default:
+ cursor = null;
+ break;
+ }
+ if (cursor == null) {
+ widget.GdkWindow.Cursor = null;
+ } else {
+ Cursor c = new Cursor (widget.Display,
+ Gdk.Pixbuf.LoadFromResource (cursor), 0, 0);
+ widget.GdkWindow.Cursor = c;
+ }
+ }
void Draw (Area area) {
if (DrawEvent != null) {
diff --git a/LongoMatch.Drawing/Canvas.cs b/LongoMatch.Drawing/Canvas.cs
index 349f984..b48662a 100644
--- a/LongoMatch.Drawing/Canvas.cs
+++ b/LongoMatch.Drawing/Canvas.cs
@@ -26,7 +26,7 @@ using LongoMatch.Drawing.CanvasObject;
namespace LongoMatch.Drawing
{
- public class Canvas
+ public class Canvas: ICanvas
{
protected IDrawingToolkit tk;
protected IWidget widget;
@@ -38,7 +38,7 @@ namespace LongoMatch.Drawing
this.widget = widget;
tk = Config.DrawingToolkit;
Objects = new List<ICanvasObject>();
- widget.DrawEvent += HandleDraw;
+ widget.DrawEvent += Draw;
scaleX = 1;
scaleY = 1;
translation = new Point (0, 0);
@@ -55,7 +55,7 @@ namespace LongoMatch.Drawing
}
- protected virtual void HandleDraw (object context, Area area) {
+ public virtual void Draw (object context, Area area) {
tk.Context = context;
tk.TranslateAndScale (translation, new Point (scaleX, scaleY));
tk.Begin ();
@@ -80,6 +80,7 @@ namespace LongoMatch.Drawing
Selections = new List<Selection>();
SelectionMode = MultiSelectionMode.Single;
Accuracy = 1;
+ MoveWithoutSelection = false;
widget.ButtonPressEvent += HandleButtonPressEvent;
widget.ButtonReleasedEvent += HandleButtonReleasedEvent;
@@ -97,6 +98,11 @@ namespace LongoMatch.Drawing
set;
}
+ protected bool MoveWithoutSelection {
+ get;
+ set;
+ }
+
protected List<Selection> Selections {
get;
set;
@@ -105,6 +111,9 @@ namespace LongoMatch.Drawing
protected virtual void StartMove (Selection sel) {
}
+ protected virtual void CursorMoved (Point coords) {
+ }
+
protected virtual void SelectionMoved (Selection sel) {
}
@@ -131,8 +140,19 @@ namespace LongoMatch.Drawing
}
protected void UpdateSelection (Selection sel, bool notify=true) {
- ICanvasSelectableObject so = sel.Drawable as ICanvasSelectableObject;
- Selection seldup = Selections.FirstOrDefault (s => s.Drawable == sel.Drawable);
+ ICanvasSelectableObject so;
+ Selection seldup;
+
+ if (sel == null) {
+ ClearSelection ();
+ if (notify) {
+ SelectionChanged (Selections);
+ }
+ return;
+ }
+
+ so = sel.Drawable as ICanvasSelectableObject;
+ seldup = Selections.FirstOrDefault (s => s.Drawable == sel.Drawable);
if (seldup != null) {
so.Selected = false;
@@ -170,13 +190,13 @@ namespace LongoMatch.Drawing
Selection sel = GetSelection (ToUserCoords (coords));
if (sel != null) {
ICanvasObject co = sel.Drawable as ICanvasObject;
- if (co.Description != null) {
+ if (co != null && co.Description != null) {
widget.ShowTooltip (co.Description);
}
}
}
- void HandleLeftButton (Point coords, ButtonModifier modif) {
+ protected virtual void HandleLeftButton (Point coords, ButtonModifier modif) {
Selection sel;
sel = GetSelection (coords);
@@ -192,33 +212,32 @@ namespace LongoMatch.Drawing
}
} else {
ClearSelection ();
- if (sel == null) {
- return;
- }
- moving = true;
start = coords;
UpdateSelection (sel);
StartMove (sel);
+ moving = Selections.Count > 0;
}
}
- void HandleRightButton (Point coords, ButtonModifier modif) {
+ protected virtual void HandleRightButton (Point coords, ButtonModifier modif) {
ShowMenu (coords);
}
- void HandleMotionEvent (Point coords)
+ protected virtual void HandleMotionEvent (Point coords)
{
Selection sel;
- if (!moving)
- return;
-
- coords = ToUserCoords (coords);
- sel = Selections[0];
- sel.Drawable.Move (sel, coords, start);
- widget.ReDraw (sel.Drawable);
- SelectionMoved (sel);
- start = coords;
+ coords = ToUserCoords (coords);
+ if (Selections.Count == 0) {
+ CursorMoved (coords);
+ start = coords;
+ } else if (moving) {
+ sel = Selections[0];
+ sel.Drawable.Move (sel, coords, start);
+ widget.ReDraw (sel.Drawable);
+ SelectionMoved (sel);
+ start = coords;
+ }
}
void HandleButtonReleasedEvent (Point coords, ButtonType type, ButtonModifier modifier)
@@ -269,7 +288,7 @@ namespace LongoMatch.Drawing
}
}
- protected override void HandleDraw (object context, Area area)
+ public override void Draw (object context, Area area)
{
if (Background != null) {
tk.Context = context;
@@ -278,7 +297,7 @@ namespace LongoMatch.Drawing
tk.DrawImage (Background);
tk.End ();
}
- base.HandleDraw (context, area);
+ base.Draw (context, area);
}
}
}
diff --git a/LongoMatch.Drawing/CanvasObject/CanvasObject.cs b/LongoMatch.Drawing/CanvasObject/CanvasObject.cs
new file mode 100644
index 0000000..ecd90c1
--- /dev/null
+++ b/LongoMatch.Drawing/CanvasObject/CanvasObject.cs
@@ -0,0 +1,127 @@
+//
+// Copyright (C) 2014 Andoni Morales Alastruey
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+//
+using System;
+using LongoMatch.Interfaces.Drawing;
+using LongoMatch.Interfaces;
+using LongoMatch.Common;
+using LongoMatch.Store.Drawables;
+
+namespace LongoMatch.Drawing.CanvasObject
+{
+ public abstract class CanvasObject: ICanvasObject
+ {
+ public CanvasObject ()
+ {
+ Visible = true;
+ }
+
+ public virtual string Description {
+ get;
+ set;
+ }
+
+ public bool Visible {
+ get;
+ set;
+ }
+
+ public virtual bool Selected {
+ set;
+ get;
+ }
+
+ public abstract void Draw (IDrawingToolkit tk, Area area);
+ }
+
+ public abstract class CanvasDrawableObject<T>: CanvasObject, ICanvasDrawableObject where T:
IBlackboardObject
+ {
+
+ public IBlackboardObject IDrawableObject {
+ get {
+ return Drawable;
+ }
+ set {
+ Drawable = (T) value;
+ }
+ }
+
+ public T Drawable {
+ get;
+ set;
+ }
+
+ public override bool Selected {
+ get {
+ return Drawable.Selected;
+ }
+ set {
+ Drawable.Selected = value;
+ }
+ }
+
+ public Selection GetSelection (Point point, double precision) {
+ Selection sel = Drawable.GetSelection (point, precision);
+ if (sel != null) {
+ sel.Drawable = this;
+ }
+ return sel;
+ }
+
+ public void Move (Selection s, Point p, Point start) {
+ s.Drawable = Drawable;
+ Drawable.Move (s, p, start);
+ s.Drawable = this;
+ }
+
+ protected void DrawCornerSelection (IDrawingToolkit tk, Point p)
+ {
+ tk.StrokeColor = tk.FillColor = Common.SELECTION_INDICATOR_COLOR;
+ tk.LineStyle = LineStyle.Normal;
+ tk.DrawRectangle (new Point (p.X - 3, p.Y - 3), 6, 6);
+ }
+
+ protected void DrawCenterSelection (IDrawingToolkit tk, Point p)
+ {
+ tk.StrokeColor = tk.FillColor = Common.SELECTION_INDICATOR_COLOR;
+ tk.LineStyle = LineStyle.Normal;
+ tk.DrawCircle (p, 3);
+ }
+
+ protected void DrawSelectionArea (IDrawingToolkit tk) {
+ Area area;
+
+ area = Drawable.Area;
+ if (!Selected || area == null) {
+ return;
+ }
+ tk.StrokeColor = Common.SELECTION_INDICATOR_COLOR;
+ tk.StrokeColor = Common.SELECTION_AREA_COLOR;
+ tk.FillColor = null;
+ tk.LineStyle = LineStyle.Dashed;
+ tk.LineWidth = 1;
+ tk.DrawRectangle (area.Start, area.Width, area.Height);
+ foreach (Point p in area.Vertices) {
+ DrawCornerSelection (tk, p);
+ }
+ foreach (Point p in area.VerticesCenter) {
+ DrawCenterSelection (tk, p);
+ }
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/LongoMatch.Drawing/CanvasObject/CategoryLabel.cs
b/LongoMatch.Drawing/CanvasObject/CategoryLabel.cs
index 3981009..87d63c4 100644
--- a/LongoMatch.Drawing/CanvasObject/CategoryLabel.cs
+++ b/LongoMatch.Drawing/CanvasObject/CategoryLabel.cs
@@ -23,7 +23,7 @@ using LongoMatch.Common;
namespace LongoMatch.Drawing.CanvasObject
{
- public class CategoryLabel: BaseCanvasObject, ICanvasObject
+ public class CategoryLabel: CanvasObject, ICanvasObject
{
Category category;
double width, height;
diff --git a/LongoMatch.Drawing/CanvasObject/BaseCanvasObject.cs
b/LongoMatch.Drawing/CanvasObject/CategoryObject.cs
similarity index 57%
copy from LongoMatch.Drawing/CanvasObject/BaseCanvasObject.cs
copy to LongoMatch.Drawing/CanvasObject/CategoryObject.cs
index 16890fb..eca4f2d 100644
--- a/LongoMatch.Drawing/CanvasObject/BaseCanvasObject.cs
+++ b/LongoMatch.Drawing/CanvasObject/CategoryObject.cs
@@ -17,55 +17,74 @@
//
using System;
using LongoMatch.Interfaces.Drawing;
+using LongoMatch.Store;
using LongoMatch.Interfaces;
using LongoMatch.Common;
using LongoMatch.Store.Drawables;
namespace LongoMatch.Drawing.CanvasObject
{
- public abstract class BaseCanvasObject: ICanvasObject
+ public class CategoryObject: BaseCanvasObject, ICanvasSelectableObject
{
- public BaseCanvasObject ()
+ public CategoryObject (Category category)
{
- Visible = true;
+ Category = category;
}
- public virtual string Description {
+ public Category Category {
get;
set;
}
- public bool Visible {
+ public Point Position {
get;
set;
}
- public bool Selected {
- set;
+ public double Width {
get;
+ set;
}
- public abstract void Draw (IDrawingToolkit tk, Area area);
- }
-
- public abstract class BaseCanvasDrawableObject<T>: BaseCanvasObject where T:Drawable
- {
- public T Drawable {
+ public double Height {
get;
set;
}
- public Canvas Parent {
- get;
- set;
+ public int NRows {
+ get {
+ /* Header + recoder */
+ int rows = 2;
+ foreach (SubCategory subcat in Category.SubCategories) {
+ rows += subcat.Options.Count / Common.CATEGORY_SUBCATEGORIES_COLUMNS
+ 1;
+ }
+ return rows;
+ }
}
- public Selection GetSelection (Point point, double precision) {
- return Drawable.GetSelection (point, precision);
+ public override void Draw (IDrawingToolkit tk, Area area) {
+ double heightPerRow;
+ double ptr = 0;
+
+ tk.Begin();
+ heightPerRow = NRows / Height;
+
+ /* Draw header */
+ tk.DrawRectangle (Position, Width, heightPerRow);
+ tk.DrawText (Position, Width, heightPerRow, Category.Name);
+ ptr += heightPerRow;
+ /* Draw Tagger */
+
+ tk.End();
}
+ public Selection GetSelection (Point point, double precision) {
+ return null;
+ }
+
public void Move (Selection s, Point p, Point start) {
- Drawable.Move (s, p, start);
}
+
}
-}
\ No newline at end of file
+}
+
diff --git a/LongoMatch.Drawing/CanvasObject/BaseCanvasObject.cs
b/LongoMatch.Drawing/CanvasObject/CounterObject.cs
similarity index 58%
rename from LongoMatch.Drawing/CanvasObject/BaseCanvasObject.cs
rename to LongoMatch.Drawing/CanvasObject/CounterObject.cs
index 16890fb..6ba4315 100644
--- a/LongoMatch.Drawing/CanvasObject/BaseCanvasObject.cs
+++ b/LongoMatch.Drawing/CanvasObject/CounterObject.cs
@@ -16,56 +16,40 @@
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
//
using System;
+using LongoMatch.Store.Drawables;
using LongoMatch.Interfaces.Drawing;
using LongoMatch.Interfaces;
using LongoMatch.Common;
-using LongoMatch.Store.Drawables;
namespace LongoMatch.Drawing.CanvasObject
{
- public abstract class BaseCanvasObject: ICanvasObject
+ public class CounterObject: CanvasDrawableObject<Counter>, ICanvasSelectableObject
{
- public BaseCanvasObject ()
+
+ public CounterObject ()
{
- Visible = true;
- }
-
- public virtual string Description {
- get;
- set;
- }
-
- public bool Visible {
- get;
- set;
- }
-
- public bool Selected {
- set;
- get;
}
- public abstract void Draw (IDrawingToolkit tk, Area area);
- }
-
- public abstract class BaseCanvasDrawableObject<T>: BaseCanvasObject where T:Drawable
- {
- public T Drawable {
- get;
- set;
- }
-
- public Canvas Parent {
- get;
- set;
- }
-
- public Selection GetSelection (Point point, double precision) {
- return Drawable.GetSelection (point, precision);
+ public CounterObject (Counter counter)
+ {
+ Drawable = counter;
}
- public void Move (Selection s, Point p, Point start) {
- Drawable.Move (s, p, start);
+ public override void Draw (IDrawingToolkit tk, Area area) {
+ Area darea;
+
+ darea = Drawable.Area;
+ tk.Begin ();
+ tk.FillColor = Drawable.FillColor;
+ tk.StrokeColor = Drawable.StrokeColor;
+ tk.LineWidth = Drawable.LineWidth;
+ tk.DrawEllipse (Drawable.Center, Drawable.AxisX, Drawable.AxisY);
+ tk.StrokeColor = Drawable.TextColor;
+ tk.DrawText (darea.Start, darea.Width, darea.Height,
+ Drawable.Count.ToString());
+ DrawSelectionArea (tk);
+ tk.End ();
}
}
-}
\ No newline at end of file
+}
+
diff --git a/LongoMatch.Drawing/CanvasObject/CircleObject.cs b/LongoMatch.Drawing/CanvasObject/CrossObject.cs
similarity index 76%
copy from LongoMatch.Drawing/CanvasObject/CircleObject.cs
copy to LongoMatch.Drawing/CanvasObject/CrossObject.cs
index f697cf3..57c3a2d 100644
--- a/LongoMatch.Drawing/CanvasObject/CircleObject.cs
+++ b/LongoMatch.Drawing/CanvasObject/CrossObject.cs
@@ -16,29 +16,34 @@
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
//
using System;
-using LongoMatch.Interfaces.Drawing;
using LongoMatch.Store.Drawables;
-using LongoMatch.Common;
+using LongoMatch.Interfaces.Drawing;
using LongoMatch.Interfaces;
+using LongoMatch.Common;
namespace LongoMatch.Drawing.CanvasObject
{
- public class PointObject: BaseCanvasDrawableObject<Circle>, ICanvasSelectableObject
+ public class CrossObject: CanvasDrawableObject<Cross>, ICanvasSelectableObject
{
-
- public PointObject (Point center, double radius, Color color)
+ public CrossObject ()
+ {
+ }
+
+ public CrossObject (Cross cross)
{
- Drawable = new Circle (center, radius);
- Drawable.FillColor = color;
- Drawable.StrokeColor = color;
- Drawable.LineWidth = 1;
+ Drawable = cross;
}
public override void Draw (IDrawingToolkit tk, Area area) {
+ tk.Begin ();
tk.FillColor = Drawable.FillColor;
tk.StrokeColor = Drawable.StrokeColor;
tk.LineWidth = Drawable.LineWidth;
- tk.DrawCircle (Drawable.Center, Drawable.Radius);
+ tk.LineStyle = Drawable.Style;
+ tk.DrawLine (Drawable.Start, Drawable.Stop);
+ tk.DrawLine (Drawable.StartI, Drawable.StopI);
+ DrawSelectionArea (tk);
+ tk.End ();
}
}
}
diff --git a/LongoMatch.Drawing/CanvasObject/CircleObject.cs
b/LongoMatch.Drawing/CanvasObject/EllipseObject.cs
similarity index 77%
copy from LongoMatch.Drawing/CanvasObject/CircleObject.cs
copy to LongoMatch.Drawing/CanvasObject/EllipseObject.cs
index f697cf3..365f74f 100644
--- a/LongoMatch.Drawing/CanvasObject/CircleObject.cs
+++ b/LongoMatch.Drawing/CanvasObject/EllipseObject.cs
@@ -23,22 +23,27 @@ using LongoMatch.Interfaces;
namespace LongoMatch.Drawing.CanvasObject
{
- public class PointObject: BaseCanvasDrawableObject<Circle>, ICanvasSelectableObject
+ public class EllipseObject: CanvasDrawableObject<Ellipse>, ICanvasSelectableObject
{
- public PointObject (Point center, double radius, Color color)
+ public EllipseObject ()
{
- Drawable = new Circle (center, radius);
- Drawable.FillColor = color;
- Drawable.StrokeColor = color;
- Drawable.LineWidth = 1;
+ }
+
+ public EllipseObject (Ellipse ellipse)
+ {
+ Drawable = ellipse;
}
public override void Draw (IDrawingToolkit tk, Area area) {
+ tk.Begin ();
tk.FillColor = Drawable.FillColor;
tk.StrokeColor = Drawable.StrokeColor;
tk.LineWidth = Drawable.LineWidth;
- tk.DrawCircle (Drawable.Center, Drawable.Radius);
+ tk.LineStyle = Drawable.Style;
+ tk.DrawEllipse (Drawable.Center, Drawable.AxisX, Drawable.AxisY);
+ DrawSelectionArea (tk);
+ tk.End ();
}
}
}
diff --git a/LongoMatch.Drawing/CanvasObject/LineObject.cs b/LongoMatch.Drawing/CanvasObject/LineObject.cs
index ac19d69..fb3a63a 100644
--- a/LongoMatch.Drawing/CanvasObject/LineObject.cs
+++ b/LongoMatch.Drawing/CanvasObject/LineObject.cs
@@ -23,15 +23,15 @@ using LongoMatch.Interfaces;
namespace LongoMatch.Drawing.CanvasObject
{
- public class LineObject: BaseCanvasDrawableObject<Line>, ICanvasSelectableObject
+ public class LineObject: CanvasDrawableObject<Line>, ICanvasSelectableObject
{
- public LineObject (Point start, Point stop, LineType type, LineStyle stile,
- Color color, int width)
+ public LineObject ()
{
- Drawable = new Line (start, stop, type, stile);
- Drawable.FillColor = color;
- Drawable.StrokeColor = color;
- Drawable.LineWidth = width;
+ }
+
+ public LineObject (Line line)
+ {
+ Drawable = line;
}
public override void Draw (IDrawingToolkit tk, Area area) {
@@ -39,7 +39,28 @@ namespace LongoMatch.Drawing.CanvasObject
tk.FillColor = Drawable.FillColor;
tk.StrokeColor = Drawable.StrokeColor;
tk.LineWidth = Drawable.LineWidth;
+ tk.LineStyle = Drawable.Style;
tk.DrawLine (Drawable.Start, Drawable.Stop);
+ tk.LineStyle = LineStyle.Normal;
+ if (Drawable.Type == LineType.Arrow ||
+ Drawable.Type == LineType.DoubleArrow) {
+ tk.DrawArrow (Drawable.Start, Drawable.Stop, 10, 0.3, true);
+ }
+ if (Drawable.Type == LineType.DoubleArrow) {
+ tk.DrawArrow (Drawable.Stop, Drawable.Start, 10, 0.3, true);
+ }
+ if (Drawable.Type == LineType.Dot ||
+ Drawable.Type == LineType.DoubleDot) {
+ tk.DrawPoint (Drawable.Stop);
+ }
+ if (Drawable.Type == LineType.DoubleDot) {
+ tk.DrawPoint (Drawable.Start);
+ }
+
+ if (Selected) {
+ DrawCornerSelection (tk, Drawable.Start);
+ DrawCornerSelection (tk, Drawable.Stop);
+ }
tk.End ();
}
diff --git a/LongoMatch.Drawing/CanvasObject/PlayerObject.cs b/LongoMatch.Drawing/CanvasObject/PlayerObject.cs
index 3373194..804ecb7 100644
--- a/LongoMatch.Drawing/CanvasObject/PlayerObject.cs
+++ b/LongoMatch.Drawing/CanvasObject/PlayerObject.cs
@@ -25,7 +25,7 @@ using LongoMatch.Drawing.Widgets;
namespace LongoMatch.Drawing.CanvasObject
{
- public class PlayerObject: BaseCanvasObject, ICanvasSelectableObject
+ public class PlayerObject: CanvasObject, ICanvasSelectableObject
{
public PlayerObject (Player player, Point position)
{
diff --git a/LongoMatch.Drawing/CanvasObject/PositionObject.cs
b/LongoMatch.Drawing/CanvasObject/PositionObject.cs
index b16feae..f49bf8b 100644
--- a/LongoMatch.Drawing/CanvasObject/PositionObject.cs
+++ b/LongoMatch.Drawing/CanvasObject/PositionObject.cs
@@ -26,7 +26,7 @@ using System.Collections.Generic;
namespace LongoMatch.Drawing.CanvasObject
{
- public class PositionObject: BaseCanvasObject, ICanvasSelectableObject
+ public class PositionObject: CanvasObject, ICanvasSelectableObject
{
public PositionObject (List<Point> points, int width, int height)
diff --git a/LongoMatch.Drawing/CanvasObject/CircleObject.cs
b/LongoMatch.Drawing/CanvasObject/QuadrilateralObject.cs
similarity index 75%
copy from LongoMatch.Drawing/CanvasObject/CircleObject.cs
copy to LongoMatch.Drawing/CanvasObject/QuadrilateralObject.cs
index f697cf3..b165df2 100644
--- a/LongoMatch.Drawing/CanvasObject/CircleObject.cs
+++ b/LongoMatch.Drawing/CanvasObject/QuadrilateralObject.cs
@@ -23,22 +23,25 @@ using LongoMatch.Interfaces;
namespace LongoMatch.Drawing.CanvasObject
{
- public class PointObject: BaseCanvasDrawableObject<Circle>, ICanvasSelectableObject
+ public class QuadrilateralObject: CanvasDrawableObject<Quadrilateral>, ICanvasSelectableObject
{
-
- public PointObject (Point center, double radius, Color color)
+ public QuadrilateralObject ()
+ {
+ }
+
+ public QuadrilateralObject (Quadrilateral quadrilateral)
{
- Drawable = new Circle (center, radius);
- Drawable.FillColor = color;
- Drawable.StrokeColor = color;
- Drawable.LineWidth = 1;
+ Drawable = quadrilateral;
}
public override void Draw (IDrawingToolkit tk, Area area) {
+ tk.Begin ();
tk.FillColor = Drawable.FillColor;
tk.StrokeColor = Drawable.StrokeColor;
tk.LineWidth = Drawable.LineWidth;
- tk.DrawCircle (Drawable.Center, Drawable.Radius);
+ tk.DrawArea (Drawable.TopLeft, Drawable.TopRight,
+ Drawable.BottomRight, Drawable.BottomLeft);
+ tk.End ();
}
}
}
diff --git a/LongoMatch.Drawing/CanvasObject/CircleObject.cs
b/LongoMatch.Drawing/CanvasObject/RectangleObject.cs
similarity index 76%
copy from LongoMatch.Drawing/CanvasObject/CircleObject.cs
copy to LongoMatch.Drawing/CanvasObject/RectangleObject.cs
index f697cf3..e779acb 100644
--- a/LongoMatch.Drawing/CanvasObject/CircleObject.cs
+++ b/LongoMatch.Drawing/CanvasObject/RectangleObject.cs
@@ -16,29 +16,33 @@
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
//
using System;
-using LongoMatch.Interfaces.Drawing;
using LongoMatch.Store.Drawables;
-using LongoMatch.Common;
+using LongoMatch.Interfaces.Drawing;
using LongoMatch.Interfaces;
+using LongoMatch.Common;
namespace LongoMatch.Drawing.CanvasObject
{
- public class PointObject: BaseCanvasDrawableObject<Circle>, ICanvasSelectableObject
+ public class RectangleObject: CanvasDrawableObject<Rectangle>, ICanvasSelectableObject
{
+ public RectangleObject ()
+ {
+ }
- public PointObject (Point center, double radius, Color color)
+ public RectangleObject (Rectangle rectangle)
{
- Drawable = new Circle (center, radius);
- Drawable.FillColor = color;
- Drawable.StrokeColor = color;
- Drawable.LineWidth = 1;
+ Drawable = rectangle;
}
public override void Draw (IDrawingToolkit tk, Area area) {
+ tk.Begin ();
tk.FillColor = Drawable.FillColor;
tk.StrokeColor = Drawable.StrokeColor;
tk.LineWidth = Drawable.LineWidth;
- tk.DrawCircle (Drawable.Center, Drawable.Radius);
+ tk.LineStyle = Drawable.Style;
+ tk.DrawRectangle (Drawable.TopLeft, Drawable.Width, Drawable.Height);
+ DrawSelectionArea (tk);
+ tk.End ();
}
}
}
diff --git a/LongoMatch.Drawing/CanvasObject/CircleObject.cs b/LongoMatch.Drawing/CanvasObject/TextObject.cs
similarity index 68%
rename from LongoMatch.Drawing/CanvasObject/CircleObject.cs
rename to LongoMatch.Drawing/CanvasObject/TextObject.cs
index f697cf3..e822311 100644
--- a/LongoMatch.Drawing/CanvasObject/CircleObject.cs
+++ b/LongoMatch.Drawing/CanvasObject/TextObject.cs
@@ -16,29 +16,37 @@
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
//
using System;
-using LongoMatch.Interfaces.Drawing;
using LongoMatch.Store.Drawables;
-using LongoMatch.Common;
+using LongoMatch.Interfaces.Drawing;
using LongoMatch.Interfaces;
+using LongoMatch.Common;
namespace LongoMatch.Drawing.CanvasObject
{
- public class PointObject: BaseCanvasDrawableObject<Circle>, ICanvasSelectableObject
+ public class TextObject: CanvasDrawableObject<Text>, ICanvasSelectableObject
{
+ public TextObject ()
+ {
+ }
- public PointObject (Point center, double radius, Color color)
+ public TextObject (Text text)
{
- Drawable = new Circle (center, radius);
- Drawable.FillColor = color;
- Drawable.StrokeColor = color;
- Drawable.LineWidth = 1;
+ Drawable = text;
}
public override void Draw (IDrawingToolkit tk, Area area) {
+ tk.Begin ();
tk.FillColor = Drawable.FillColor;
tk.StrokeColor = Drawable.StrokeColor;
tk.LineWidth = Drawable.LineWidth;
- tk.DrawCircle (Drawable.Center, Drawable.Radius);
+ tk.DrawRectangle (Drawable.TopLeft, Drawable.Width, Drawable.Height);
+ tk.DrawArea (Drawable.TopLeft, Drawable.TopRight,
+ Drawable.BottomRight, Drawable.BottomLeft);
+ tk.StrokeColor = Drawable.TextColor;
+ tk.DrawText (Drawable.TopLeft, Drawable.Width, Drawable.Height,
+ Drawable.Value);
+ DrawSelectionArea (tk);
+ tk.End ();
}
}
}
diff --git a/LongoMatch.Drawing/CanvasObject/TimeNodeObject.cs
b/LongoMatch.Drawing/CanvasObject/TimeNodeObject.cs
index 3462094..42d3c33 100644
--- a/LongoMatch.Drawing/CanvasObject/TimeNodeObject.cs
+++ b/LongoMatch.Drawing/CanvasObject/TimeNodeObject.cs
@@ -24,7 +24,7 @@ using LongoMatch.Store.Drawables;
namespace LongoMatch.Drawing.CanvasObject
{
- public class TimeNodeObject: BaseCanvasObject, ICanvasSelectableObject
+ public class TimeNodeObject: CanvasObject, ICanvasSelectableObject
{
const int MAX_TIME_SPAN=1000;
diff --git a/LongoMatch.Drawing/CanvasObject/TimelineObject.cs
b/LongoMatch.Drawing/CanvasObject/TimelineObject.cs
index c70c225..7d06f2e 100644
--- a/LongoMatch.Drawing/CanvasObject/TimelineObject.cs
+++ b/LongoMatch.Drawing/CanvasObject/TimelineObject.cs
@@ -25,7 +25,7 @@ using LongoMatch.Store.Drawables;
namespace LongoMatch.Drawing.CanvasObject
{
- public abstract class TimelineObject: BaseCanvasObject, ICanvasSelectableObject
+ public abstract class TimelineObject: CanvasObject, ICanvasSelectableObject
{
Color background;
List<TimeNodeObject> nodes;
@@ -121,14 +121,12 @@ namespace LongoMatch.Drawing.CanvasObject
if (tmp == null) {
continue;
}
- if (tmp.Position != SelectionPosition.None) {
- if (tmp.Accuracy == 0) {
- selection = tmp;
- break;
- }
- if (selection == null || tmp.Accuracy < selection.Accuracy) {
- selection = tmp;
- }
+ if (tmp.Accuracy == 0) {
+ selection = tmp;
+ break;
+ }
+ if (selection == null || tmp.Accuracy < selection.Accuracy) {
+ selection = tmp;
}
}
}
diff --git a/LongoMatch.Drawing/Common.cs b/LongoMatch.Drawing/Common.cs
index bf38e7e..369e832 100644
--- a/LongoMatch.Drawing/Common.cs
+++ b/LongoMatch.Drawing/Common.cs
@@ -46,6 +46,8 @@ namespace LongoMatch.Drawing
public static Color PLAYER_NOT_PLAYING_COLOR = Color.Red;
public static Color TIMER_UNSELECTED_COLOR = Color.Blue1;
public static Color TIMER_SELECTED_COLOR = Color.Red1;
+ public static Color SELECTION_INDICATOR_COLOR = Color.Blue1;
+ public static Color SELECTION_AREA_COLOR = Color.Grey1;
public const int TIMELINE_LINE_WIDTH = 1;
diff --git a/LongoMatch.Drawing/LongoMatch.Drawing.mdp b/LongoMatch.Drawing/LongoMatch.Drawing.mdp
index 9e7fa2c..493b9b3 100644
--- a/LongoMatch.Drawing/LongoMatch.Drawing.mdp
+++ b/LongoMatch.Drawing/LongoMatch.Drawing.mdp
@@ -26,16 +26,22 @@
<File subtype="Code" buildaction="Compile" name="Common.cs" />
<File subtype="Code" buildaction="Compile" name="Widgets/PlaysTimeline.cs" />
<File subtype="Code" buildaction="Compile" name="CanvasObject/TimelineObject.cs" />
- <File subtype="Code" buildaction="Compile" name="CanvasObject/BaseCanvasObject.cs" />
+ <File subtype="Code" buildaction="Compile" name="CanvasObject/CanvasObject.cs" />
<File subtype="Code" buildaction="Compile" name="CanvasObject/PlayerObject.cs" />
<File subtype="Code" buildaction="Compile" name="Widgets/TeamTagger.cs" />
<File subtype="Code" buildaction="Compile" name="CanvasObject/TimeNodeObject.cs" />
<File subtype="Code" buildaction="Compile" name="Widgets/TimersTimeline.cs" />
<File subtype="Code" buildaction="Compile" name="Widgets/PositionTagger.cs" />
<File subtype="Code" buildaction="Compile" name="CanvasObject/PositionObject.cs" />
- <File subtype="Code" buildaction="Compile" name="CanvasObject/CircleObject.cs" />
<File subtype="Code" buildaction="Compile" name="CanvasObject/LineObject.cs" />
<File subtype="Directory" buildaction="Compile" name="CanvasObject" />
+ <File subtype="Code" buildaction="Compile" name="CanvasObject/CrossObject.cs" />
+ <File subtype="Code" buildaction="Compile" name="CanvasObject/RectangleObject.cs" />
+ <File subtype="Code" buildaction="Compile" name="CanvasObject/QuadrilateralObject.cs" />
+ <File subtype="Code" buildaction="Compile" name="Widgets/Blackboard.cs" />
+ <File subtype="Code" buildaction="Compile" name="CanvasObject/EllipseObject.cs" />
+ <File subtype="Code" buildaction="Compile" name="CanvasObject/TextObject.cs" />
+ <File subtype="Code" buildaction="Compile" name="CanvasObject/CounterObject.cs" />
</Contents>
<References>
<ProjectReference type="Package" localcopy="True" refto="System, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089" />
diff --git a/LongoMatch.Drawing/Widgets/Blackboard.cs b/LongoMatch.Drawing/Widgets/Blackboard.cs
new file mode 100644
index 0000000..db511ea
--- /dev/null
+++ b/LongoMatch.Drawing/Widgets/Blackboard.cs
@@ -0,0 +1,304 @@
+//
+// Copyright (C) 2014 Andoni Morales Alastruey
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+//
+using System;
+using System.Linq;
+using System.Runtime.Remoting;
+using LongoMatch.Common;
+using LongoMatch.Interfaces.Drawing;
+using LongoMatch.Store;
+using LongoMatch.Drawing.CanvasObject;
+using LongoMatch.Store.Drawables;
+using LongoMatch.Handlers;
+using LongoMatch.Interfaces;
+
+namespace LongoMatch.Drawing.Widgets
+{
+ public class Blackboard: BackgroundCanvas
+ {
+
+ public event ShowDrawToolMenuHandler ShowMenuEvent;
+ public event ConfigureDrawingObjectHandler ConfigureObjectEvent;
+ public event DrawableChangedHandler DrawableChangedEvent;
+ DrawTool tool;
+ FrameDrawing drawing;
+ ISurface backbuffer;
+ bool handdrawing;
+
+ public Blackboard (IWidget widget): base(widget)
+ {
+ Accuracy = 5;
+ SelectionMode = MultiSelectionMode.Single;
+ LineWidth = 2;
+ Color = Color.Red1;
+ LineStyle = LineStyle.Normal;
+ LineType = LineType.Arrow;
+ tool = DrawTool.Selection;
+
+ }
+
+ public FrameDrawing Drawing {
+ set {
+ drawing = value;
+ foreach (IBlackboardObject d in value.Drawables) {
+ Add (d);
+ }
+ if (backbuffer != null) {
+ backbuffer.Dispose ();
+ }
+ backbuffer = tk.CreateSurface (Background.Width, Background.Height,
+ drawing.Freehand);
+ }
+ }
+
+ public Color Color {
+ get;
+ set;
+ }
+
+ public Color TextColor {
+ get;
+ set;
+ }
+
+ public Color TextBackgroundColor {
+ get;
+ set;
+ }
+
+ public LineStyle LineStyle {
+ get;
+ set;
+ }
+
+ public LineType LineType {
+ get;
+ set;
+ }
+
+ public int LineWidth {
+ get;
+ set;
+ }
+
+ public DrawTool Tool {
+ get {
+ return tool;
+ }
+ set {
+ tool = value;
+ widget.SetCursorForTool (tool);
+ }
+ }
+
+ public void DeleteSelection () {
+ foreach (ICanvasDrawableObject o in Selections.Select (s => s.Drawable)) {
+ Objects.Remove (o);
+ drawing.Drawables.Remove ((Drawable)o.IDrawableObject);
+ }
+ ClearSelection ();
+ UpdateCounters ();
+ widget.ReDraw ();
+ }
+
+ public void Clear () {
+ ClearSelection ();
+ drawing.Drawables.Clear ();
+ Objects.Clear ();
+ backbuffer.Dispose ();
+ backbuffer = tk.CreateSurface (Background.Width, Background.Height);
+ widget.ReDraw ();
+ }
+
+ public Image Save () {
+ ClearSelection ();
+ drawing.Freehand = backbuffer.Copy();
+ return tk.Copy (this, Background.Width, Background.Height);
+ }
+
+ public void Save (string filename) {
+ ClearSelection ();
+ tk.Save (this, Background.Width, Background.Height, filename);
+ }
+
+ ICanvasSelectableObject Add (IBlackboardObject drawable) {
+ string objecttype = String.Format ("LongoMatch.Drawing.CanvasObject.{0}Object",
+ drawable.GetType().ToString().Split('.').Last());
+ ObjectHandle handle = Activator.CreateInstance(null, objecttype);
+ ICanvasDrawableObject d = (ICanvasDrawableObject) handle.Unwrap();
+ d.IDrawableObject = drawable;
+ Objects.Add (d);
+ return d;
+ }
+
+ protected override void StartMove (Selection sel)
+ {
+ Drawable drawable = null;
+ SelectionPosition pos = SelectionPosition.BottomRight;
+ bool resize = true, copycolor = true;
+
+ if (sel != null || Tool == DrawTool.Selection)
+ return;
+
+ switch (Tool) {
+ case DrawTool.Line:
+ drawable = new Line (start, new Point (start.X + 1, start.Y + 1),
+ LineType, LineStyle);
+ drawable.FillColor = Color;
+ pos = SelectionPosition.LineStop;
+ break;
+ case DrawTool.Cross:
+ drawable = new Cross (start, new Point (start.X + 1, start.Y + 1),
+ LineStyle);
+ break;
+ case DrawTool.Ellipse:
+ drawable = new Ellipse (start, 2, 2);
+ break;
+ case DrawTool.Rectangle:
+ drawable = new Rectangle (start, 2, 2);
+ break;
+ case DrawTool.CircleArea:
+ drawable = new Ellipse (start, 2, 2);
+ drawable.FillColor = Color.Copy();
+ drawable.FillColor.A = byte.MaxValue / 2;
+ break;
+ case DrawTool.RectangleArea:
+ drawable = new Rectangle (start, 2, 2);
+ drawable.FillColor = Color.Copy();
+ drawable.FillColor.A = byte.MaxValue / 2;
+ break;
+ case DrawTool.Counter:
+ drawable = new Counter (start, 10, 10, 0);
+ drawable.FillColor = Color.Copy();
+ drawable.FillColor.A = byte.MaxValue / 2;
+ (drawable as Counter).TextColor = Color.Grey2;
+ resize = false;
+ break;
+ case DrawTool.Text: {
+ Text text = new Text (start, 1, 20, "");
+ if (ConfigureObjectEvent != null) {
+ ConfigureObjectEvent (text);
+ }
+ if (text.Value == null) {
+ return;
+ }
+ text.TopRight.X += text.Value.Length * 12;
+ text.BottomRight.X += text.Value.Length * 12;
+ text.TextColor = TextColor.Copy();
+ text.FillColor = text.StrokeColor = TextBackgroundColor.Copy();
+ resize = copycolor = false;
+ drawable = text;
+ break;
+ }
+ case DrawTool.Pen:
+ case DrawTool.Eraser:
+ handdrawing = true;
+ break;
+ }
+
+ if (drawable != null) {
+ if (copycolor) {
+ drawable.StrokeColor = Color.Copy ();
+ }
+ drawable.LineWidth = LineWidth;
+ drawable.Style = LineStyle;
+ var selo = Add (drawable);
+ drawing.Drawables.Add (drawable);
+ if (Tool == DrawTool.Counter) {
+ UpdateCounters ();
+ }
+ if (resize) {
+ UpdateSelection (new Selection (selo, pos, 5));
+ } else {
+ UpdateSelection (new Selection (selo, SelectionPosition.All, 5));
+ }
+ widget.ReDraw ();
+ }
+ }
+
+ protected override void StopMove ()
+ {
+ Selection sel = Selections.FirstOrDefault();
+ if (sel != null) {
+ (sel.Drawable as ICanvasDrawableObject).IDrawableObject.Reorder();
+ }
+ handdrawing = false;
+ }
+
+ protected override void ShowMenu (Point coords)
+ {
+ Selection sel = Selections.FirstOrDefault ();
+ if (sel != null && ShowMenuEvent != null) {
+ ShowMenuEvent ((sel.Drawable as ICanvasDrawableObject).IDrawableObject);
+ }
+
+ }
+
+ protected override void SelectionChanged (System.Collections.Generic.List<Selection> sel)
+ {
+ if (sel != null && sel.Count > 0 && DrawableChangedEvent != null) {
+ DrawableChangedEvent ((sel[0].Drawable as
ICanvasDrawableObject).IDrawableObject);
+ } else {
+ DrawableChangedEvent (null);
+ }
+ }
+
+ void UpdateCounters () {
+ int index = 1;
+
+ foreach (IBlackboardObject bo in
+ Objects.Select (o => (o as ICanvasDrawableObject).IDrawableObject)) {
+ if (bo is Counter) {
+ (bo as Counter).Count = index;
+ index ++;
+ }
+ }
+ }
+
+ protected override void CursorMoved (Point coords)
+ {
+ if (handdrawing) {
+ tk.Context = backbuffer.Context;
+ tk.Begin ();
+ tk.LineStyle = LineStyle.Normal;
+ tk.LineWidth = LineWidth;
+ if (tool == DrawTool.Eraser) {
+ tk.StrokeColor = tk.FillColor = new Color (0, 0, 0, 255);
+ tk.LineWidth = LineWidth * 4;
+ tk.Clear = true;
+ } else {
+ tk.StrokeColor = tk.FillColor = Color;
+ }
+ tk.DrawLine (start, coords);
+ tk.End ();
+ widget.ReDraw();
+ }
+ }
+
+ public override void Draw (object context, Area area)
+ {
+ base.Draw (context, area);
+ if (backbuffer != null) {
+ tk.Context = context;
+ tk.Begin ();
+ tk.DrawSurface (backbuffer);
+ tk.End ();
+ }
+ }
+ }
+}
+
diff --git a/LongoMatch.Drawing/Widgets/PlaysTimeline.cs b/LongoMatch.Drawing/Widgets/PlaysTimeline.cs
index 4fba821..23fbfc6 100644
--- a/LongoMatch.Drawing/Widgets/PlaysTimeline.cs
+++ b/LongoMatch.Drawing/Widgets/PlaysTimeline.cs
@@ -153,6 +153,9 @@ namespace LongoMatch.Drawing.Widgets
}
protected override void StartMove (Selection sel) {
+ if (sel == null)
+ return;
+
if (sel.Position != SelectionPosition.All) {
widget.SetCursor (CursorType.DoubleArrow);
}
diff --git a/LongoMatch.Drawing/Widgets/TeamTagger.cs b/LongoMatch.Drawing/Widgets/TeamTagger.cs
index a746017..3f60584 100644
--- a/LongoMatch.Drawing/Widgets/TeamTagger.cs
+++ b/LongoMatch.Drawing/Widgets/TeamTagger.cs
@@ -257,12 +257,6 @@ namespace LongoMatch.Drawing.Widgets
}
}
- protected override void StartMove (Selection sel) {
- }
-
- protected override void StopMove () {
- }
-
protected override void ShowMenu (Point coords) {
if (ShowMenuEvent != null && Selections.Count > 0){
ShowMenuEvent (
@@ -270,10 +264,7 @@ namespace LongoMatch.Drawing.Widgets
}
}
- protected override void SelectionMoved (Selection sel) {
- }
-
- protected override void HandleDraw (object context, Area area)
+ public override void Draw (object context, Area area)
{
if (currentWidth != widget.Width || currentHeight != widget.Height) {
Resize ();
@@ -289,7 +280,7 @@ namespace LongoMatch.Drawing.Widgets
}
tk.End ();
- base.HandleDraw (context, area);
+ base.Draw (context, area);
}
}
}
diff --git a/LongoMatch.Drawing/Widgets/TimersTimeline.cs b/LongoMatch.Drawing/Widgets/TimersTimeline.cs
index cf6172d..2f9224a 100644
--- a/LongoMatch.Drawing/Widgets/TimersTimeline.cs
+++ b/LongoMatch.Drawing/Widgets/TimersTimeline.cs
@@ -83,10 +83,10 @@ namespace LongoMatch.Drawing.Widgets
Update ();
}
- protected override void SelectionChanged (List<Selection> selections) {
- }
-
protected override void StartMove (Selection sel) {
+ if (sel == null)
+ return;
+
if (sel.Position != SelectionPosition.All) {
widget.SetCursor (CursorType.DoubleArrow);
}
@@ -96,9 +96,6 @@ namespace LongoMatch.Drawing.Widgets
widget.SetCursor (CursorType.Arrow);
}
- protected override void ShowMenu (Point coords) {
- }
-
protected override void SelectionMoved (Selection sel) {
if (TimeNodeChanged != null) {
Time moveTime;
diff --git a/LongoMatch.Drawing/Widgets/Timerule.cs b/LongoMatch.Drawing/Widgets/Timerule.cs
index b5ed3d3..202b8db 100644
--- a/LongoMatch.Drawing/Widgets/Timerule.cs
+++ b/LongoMatch.Drawing/Widgets/Timerule.cs
@@ -55,7 +55,7 @@ namespace LongoMatch.Drawing.Widgets
get;
}
- protected override void HandleDraw (object context, Area area)
+ public override void Draw (object context, Area area)
{
double height = widget.Height;
double width = widget.Width;
diff --git a/LongoMatch.GUI.Helpers/Misc.cs b/LongoMatch.GUI.Helpers/Misc.cs
index c999cbf..c6a82c7 100644
--- a/LongoMatch.GUI.Helpers/Misc.cs
+++ b/LongoMatch.GUI.Helpers/Misc.cs
@@ -111,8 +111,8 @@ namespace LongoMatch.Gui.Helpers
return new Color (color.R, color.G, color.B);
}
- public static LColor ToLgmColor(Color color) {
- return LColor.ColorFromUShort (color.Red, color.Green, color.Blue);
+ public static LColor ToLgmColor(Color color, ushort alpha = ushort.MaxValue) {
+ return LColor.ColorFromUShort (color.Red, color.Green, color.Blue, alpha);
}
public static ListStore FillImageFormat (ComboBox formatBox, VideoStandard def) {
diff --git a/LongoMatch.GUI.Multimedia/Gui/PlayerBin.cs b/LongoMatch.GUI.Multimedia/Gui/PlayerBin.cs
index 60dc943..4140f68 100644
--- a/LongoMatch.GUI.Multimedia/Gui/PlayerBin.cs
+++ b/LongoMatch.GUI.Multimedia/Gui/PlayerBin.cs
@@ -619,7 +619,7 @@ namespace LongoMatch.Gui
void OnDrawButtonClicked(object sender, System.EventArgs e)
{
- Config.EventsBroker.EmitDrawFrame (CurrentTime);
+ Config.EventsBroker.EmitDrawFrame (null, -1);
}
void HandleRealized (object sender, EventArgs e)
diff --git a/LongoMatch.GUI.Multimedia/gtk-gui/objects.xml b/LongoMatch.GUI.Multimedia/gtk-gui/objects.xml
index d7dd50b..6457e6c 100644
--- a/LongoMatch.GUI.Multimedia/gtk-gui/objects.xml
+++ b/LongoMatch.GUI.Multimedia/gtk-gui/objects.xml
@@ -5,8 +5,7 @@
<property name="Capturing" />
</itemgroup>
</itemgroups>
- <signals>
- </signals>
+ <signals />
</object>
<object type="LongoMatch.Gui.PlayerBin" palette-category="General" allow-children="false"
base-type="Gtk.Bin">
<itemgroups>
@@ -15,10 +14,10 @@
</itemgroup>
</itemgroups>
<signals>
- <itemgroup label="IPlayerBin Signals">
+ <itemgroup label="PlayerBin Signals">
+ <signal name="Tick" />
<signal name="PlayStateChanged" />
<signal name="SeekEvent" />
- <signal name="Tick" />
</itemgroup>
</signals>
</object>
@@ -29,7 +28,7 @@
</itemgroup>
</itemgroups>
<signals>
- <itemgroup label="ICapturerBin Signals">
+ <itemgroup label="IPlayerBin Signals">
<signal name="PlayStateChanged" />
<signal name="SeekEvent" />
</itemgroup>
diff --git a/LongoMatch.GUI/Gui/Dialog/DrawingTool.cs b/LongoMatch.GUI/Gui/Dialog/DrawingTool.cs
index c70aef7..9688b12 100644
--- a/LongoMatch.GUI/Gui/Dialog/DrawingTool.cs
+++ b/LongoMatch.GUI/Gui/Dialog/DrawingTool.cs
@@ -17,106 +17,361 @@
//
using System;
-using Gdk;
using Gtk;
using Mono.Unix;
-using Image = LongoMatch.Common.Image;
using LongoMatch.Common;
using LongoMatch.Gui.Component;
using LongoMatch.Store;
using LongoMatch.Gui.Helpers;
+using LongoMatch.Drawing.Widgets;
+using LongoMatch.Drawing.Cairo;
+using LongoMatch.Store.Drawables;
+using LongoMatch.Interfaces.Drawing;
+using Misc = LongoMatch.Gui.Helpers.Misc;
+using Color = LongoMatch.Common.Color;
+using Drawable = LongoMatch.Store.Drawables.Drawable;
+using Image = LongoMatch.Common.Image;
namespace LongoMatch.Gui.Dialog
{
-
public partial class DrawingTool : Gtk.Dialog
{
Play play;
- Time stopTime;
+ Blackboard blackboard;
+ FrameDrawing drawing;
+ Drawable selectedDrawable;
+ int drawingIndex;
public DrawingTool()
{
this.Build();
- drawingtoolbox1.DrawToolChanged += OnDrawingtoolbox1DrawToolChanged;
- drawingtoolbox1.TransparencyChanged += OnDrawingtoolbox1TransparencyChanged;
- drawingtoolbox1.ToolsVisible = true;
- drawingtoolbox1.InfoVisible = false;
+ blackboard = new Blackboard(new WidgetWrapper (drawingarea));
+ blackboard.ConfigureObjectEvent += HandleConfigureObjectEvent;
+ blackboard.ShowMenuEvent += HandleShowMenuEvent;
+ blackboard.DrawableChangedEvent += HandleDrawableChangedEvent;
+
+ selectbutton.Active = true;
+
+ selectbutton.Toggled += HandleToolClicked;
+ eraserbutton.Toggled += HandleToolClicked;
+ penbutton.Toggled += HandleToolClicked;
+ textbutton.Toggled += HandleToolClicked;
+ linebutton.Toggled += HandleToolClicked;
+ crossbutton.Toggled += HandleToolClicked;
+ rectanglebutton.Toggled += HandleToolClicked;
+ ellipsebutton.Toggled += HandleToolClicked;
+ rectanglefilledbutton.Toggled += HandleToolClicked;
+ ellipsefilledbutton.Toggled += HandleToolClicked;
+ playerbutton.Toggled += HandleToolClicked;
+ anglebutton.Toggled += HandleToolClicked;
+ numberbutton.Toggled += HandleToolClicked;
+
+ colorbutton.Color = Misc.ToGdkColor (Color.Red1);
+ colorbutton.ColorSet += HandleColorSet;
+ textcolorbutton.Color = Misc.ToGdkColor (Color.White);
+ textcolorbutton.ColorSet += HandleTextColorSet;
+ backgroundcolorbutton.Color = Misc.ToGdkColor (Color.Grey2);
+ backgroundcolorbutton.ColorSet += HandleBackgroundColorSet;
+ backgroundcolorbutton.UseAlpha = true;
+ blackboard.Color = Color.Red1;
+ blackboard.TextColor = Color.White;
+ blackboard.TextBackgroundColor = Color.Grey2;
+
+ widthcombobox.Changed += HandleLineWidthChanged;
+ widthcombobox.Active = 1;
+
+ clearbutton.Clicked += HandleClearClicked;
+ FillLineStyle ();
+ FillLineType ();
+ }
+
+ void FillLineStyle () {
+ ListStore formatStore;
+ CellRendererPixbuf renderer = new CellRendererPixbuf();
+
+ formatStore = new ListStore(typeof(Gdk.Pixbuf), typeof (LineStyle));
+ formatStore.AppendValues (Gdk.Pixbuf.LoadFromResource (Constants.LINE_NORMAL),
+ LineStyle.Normal);
+ formatStore.AppendValues (Gdk.Pixbuf.LoadFromResource (Constants.LINE_DASHED),
+ LineStyle.Dashed);
+ stylecombobox.Clear ();
+ stylecombobox.PackStart (renderer, true);
+ stylecombobox.AddAttribute (renderer, "pixbuf", 0);
+ stylecombobox.Model = formatStore;
+ stylecombobox.Active = 0;
+ stylecombobox.Changed += HandleLineStyleChanged;
+ }
+
+ void FillLineType () {
+ ListStore formatStore;
+ CellRendererPixbuf renderer = new CellRendererPixbuf();
+
+ formatStore = new ListStore(typeof(Gdk.Pixbuf), typeof (LineStyle));
+ formatStore.AppendValues (Gdk.Pixbuf.LoadFromResource (Constants.LINE_NORMAL),
+ LineType.Simple);
+ formatStore.AppendValues (Gdk.Pixbuf.LoadFromResource (Constants.LINE_ARROW),
+ LineType.Arrow);
+ formatStore.AppendValues (Gdk.Pixbuf.LoadFromResource (Constants.LINE_DOUBLE_ARROW),
+ LineType.DoubleArrow);
+ formatStore.AppendValues (Gdk.Pixbuf.LoadFromResource (Constants.LINE_DOT),
+ LineType.Dot);
+ formatStore.AppendValues (Gdk.Pixbuf.LoadFromResource (Constants.LINE_DOUBLE_DOT),
+ LineType.DoubleDot);
+ typecombobox.Clear ();
+ typecombobox.PackStart (renderer, true);
+ typecombobox.AddAttribute (renderer, "pixbuf", 0);
+ typecombobox.Model = formatStore;
+ typecombobox.Active = 0;
+ typecombobox.Changed += HandleLineTypeChanged;
}
- ~ DrawingTool() {
- drawingwidget1.Destroy();
+ void HandleLineStyleChanged (object sender, EventArgs e)
+ {
+ TreeIter iter;
+ LineStyle style;
+
+ stylecombobox.GetActiveIter(out iter);
+ style = (LineStyle) stylecombobox.Model.GetValue(iter, 1);
+ if (selectedDrawable != null) {
+ selectedDrawable.Style = style;
+ QueueDraw ();
+ } else {
+ blackboard.LineStyle = style;
+ }
}
- public Pixbuf Image {
- set {
- Screen screen = Display.Default.DefaultScreen;
- int width = Math.Min(screen.Width, value.Width + vbox2.Allocation.Width + 10);
- int height = Math.Min(screen.Height, value.Height + 20);
- this.Resize(width, height);
- drawingwidget1.SourceImage = value;
+ void HandleLineTypeChanged (object sender, EventArgs e)
+ {
+ TreeIter iter;
+ LineType type;
+
+ typecombobox.GetActiveIter(out iter);
+ type = (LineType) typecombobox.Model.GetValue(iter, 1);
+ if (selectedDrawable != null && selectedDrawable is Line) {
+ (selectedDrawable as Line).Type = type;
+ QueueDraw ();
+ } else {
+ blackboard.LineType = type;
}
}
- public void SetPlay(Play play, Time stopTime) {
- this.play = play;
- this.stopTime = stopTime;
- savetoprojectbutton.Visible = true;
+ void HandleClearClicked (object sender, EventArgs e)
+ {
+ string msg = Catalog.GetString ("Do you want to clear the drawing?");
+ if (MessagesHelpers.QuestionMessage (this, msg)) {
+ blackboard.Clear();
+ }
}
- protected virtual void OnDrawingtoolbox1LineWidthChanged(int width)
+ void HandleBackgroundColorSet (object sender, EventArgs e)
{
- drawingwidget1.LineWidth = width;
+ if (selectedDrawable is Text) {
+ Text t = (selectedDrawable as Text);
+ t.FillColor = t.StrokeColor = Misc.ToLgmColor (backgroundcolorbutton.Color);
+ QueueDraw ();
+ } else {
+ blackboard.TextBackgroundColor = Misc.ToLgmColor
(backgroundcolorbutton.Color);
+ }
}
- protected virtual void OnDrawingtoolbox1ColorChanged (LongoMatch.Common.Color color)
+ void HandleTextColorSet (object sender, EventArgs e)
{
- drawingwidget1.LineColor = Helpers.Misc.ToGdkColor(color);
+ if (selectedDrawable is Text) {
+ (selectedDrawable as Text).TextColor = Misc.ToLgmColor
(textcolorbutton.Color);
+ QueueDraw ();
+ } else {
+ blackboard.TextColor = Misc.ToLgmColor (textcolorbutton.Color);
+ }
}
- protected virtual void OnDrawingtoolbox1VisibilityChanged(bool visible)
+ void HandleColorSet (object sender, EventArgs e)
{
- drawingwidget1.DrawingsVisible = visible;
+ if (selectedDrawable != null) {
+ selectedDrawable.StrokeColor = Misc.ToLgmColor (colorbutton.Color);
+ if (selectedDrawable.FillColor != null) {
+ Color c = Misc.ToLgmColor (colorbutton.Color);
+ c.A = selectedDrawable.FillColor.A;
+ selectedDrawable.FillColor = c;
+ }
+ QueueDraw ();
+ } else {
+ blackboard.Color = Misc.ToLgmColor (colorbutton.Color);
+ }
}
- protected virtual void OnDrawingtoolbox1ClearDrawing()
+ void HandleLineWidthChanged (object sender, EventArgs e)
{
- drawingwidget1.ClearDrawing();
+ TreeIter iter;
+ string swidth;
+ int width;
+
+ widthcombobox.GetActiveIter (out iter);
+ swidth = (string) widthcombobox.Model.GetValue (iter, 0);
+ width = int.Parse (swidth.Split (' ')[0]);
+ if (selectedDrawable != null) {
+ selectedDrawable.LineWidth = width;
+ QueueDraw ();
+ } else {
+ blackboard.LineWidth = width;
+ }
}
- protected virtual void OnDrawingtoolbox1DrawToolChanged(DrawTool tool)
+ public void LoadFrame (Image frame) {
+ drawing = new FrameDrawing ();
+ blackboard.Background = frame;
+ blackboard.Drawing = drawing;
+ savetoprojectbutton.Visible = false;
+ }
+
+ protected override bool OnKeyPressEvent (Gdk.EventKey evnt)
{
- drawingwidget1.DrawTool = tool;
+ if (evnt.Key == Gdk.Key.Delete) {
+ blackboard.DeleteSelection();
+ }
+ return base.OnKeyPressEvent (evnt);
}
- protected virtual void OnDrawingtoolbox1TransparencyChanged(double transparency)
+ void HandleToolClicked (object sender, EventArgs e)
{
- drawingwidget1.Transparency = transparency;
+ if (!(sender as RadioButton).Active) {
+ return;
+ }
+
+ if (sender == selectbutton) {
+ blackboard.Tool = DrawTool.Selection;
+ } else if (sender == eraserbutton) {
+ blackboard.Tool = DrawTool.Eraser;
+ } else if (sender == penbutton) {
+ blackboard.Tool = DrawTool.Pen;
+ } else if (sender == textbutton) {
+ blackboard.Tool = DrawTool.Text;
+ } else if (sender == linebutton) {
+ blackboard.Tool = DrawTool.Line;
+ } else if (sender == crossbutton) {
+ blackboard.Tool = DrawTool.Cross;
+ } else if (sender == rectanglebutton) {
+ blackboard.Tool = DrawTool.Rectangle;
+ } else if (sender == ellipsebutton) {
+ blackboard.Tool = DrawTool.Ellipse;
+ } else if (sender == rectanglefilledbutton) {
+ blackboard.Tool = DrawTool.RectangleArea;
+ } else if (sender == ellipsefilledbutton) {
+ blackboard.Tool = DrawTool.CircleArea;
+ } else if (sender == numberbutton) {
+ blackboard.Tool = DrawTool.Counter;
+ } else if (sender == anglebutton) {
+ blackboard.Tool = DrawTool.Angle;
+ } else if (sender == playerbutton) {
+ blackboard.Tool = DrawTool.Player;
+ }
+ }
+
+ public void LoadPlay (Play play, Image frame, int drawingIndex) {
+ this.play = play;
+ this.drawingIndex = drawingIndex;
+ blackboard.Background = frame;
+ savetoprojectbutton.Visible = true;
+ drawing = play.Drawings [drawingIndex].Clone ();
+ blackboard.Drawing = drawing;
+ }
+
+ void EditText (Text text) {
+ text.Value = MessagesHelpers.QueryMessage (this, Catalog.GetString ("Text"),
+ null, text.Value);
+ QueueDraw ();
}
- protected virtual void OnSavebuttonClicked(object sender, System.EventArgs e)
+ void OnSavebuttonClicked(object sender, System.EventArgs e)
{
string filename;
filename = FileChooserHelper.SaveFile (this, Catalog.GetString("Save File as..."),
null, Config.SnapshotsDir, "PNG Images", new
string[] {"*.png"});
if (filename != null) {
- if(System.IO.Path.GetExtension(filename) != "png")
- filename += ".png";
- drawingwidget1.SaveAll(filename);
+ System.IO.Path.ChangeExtension (filename, ".png");
+ blackboard.Save (filename);
+ drawing = null;
+ Respond (ResponseType.Accept);
+ }
+ }
+
+ void OnSavetoprojectbuttonClicked(object sender, System.EventArgs e)
+ {
+ play.Drawings[drawingIndex] = drawing;
+ play.Miniature = blackboard.Save ();
+ play.Miniature.Scale (Constants.MAX_THUMBNAIL_SIZE,
+ Constants.MAX_THUMBNAIL_SIZE);
+ drawing = null;
+ Respond (ResponseType.Accept);
+ }
+
+ void HandleConfigureObjectEvent (IBlackboardObject drawable)
+ {
+ if (drawable is Text) {
+ EditText (drawable as Text);
+ }
+ }
+
+ void HandleDrawableChangedEvent (IBlackboardObject drawable)
+ {
+ selectedDrawable = drawable as Drawable;
+
+ colorbutton.Sensitive = !(drawable is Text);
+
+ if (selectedDrawable == null) {
+ colorbutton.Color = Misc.ToGdkColor (blackboard.Color);
+ textcolorbutton.Color = Misc.ToGdkColor (blackboard.TextColor);
+ backgroundcolorbutton.Color = Misc.ToGdkColor
(blackboard.TextBackgroundColor);
+ widthcombobox.Active = blackboard.LineWidth / 2 - 1;
+ if (blackboard.LineStyle == LineStyle.Normal) {
+ stylecombobox.Active = 0;
+ } else {
+ stylecombobox.Active = 1;
+ }
+ typecombobox.Active = (int) blackboard.LineType;
+ } else {
+ if (drawable is Text) {
+ textcolorbutton.Color = Misc.ToGdkColor ((selectedDrawable as
Text).TextColor);
+ backgroundcolorbutton.Color = Misc.ToGdkColor
(selectedDrawable.FillColor);
+ } else {
+ colorbutton.Color = Misc.ToGdkColor (selectedDrawable.StrokeColor);
+ }
+ if (drawable is Line) {
+ typecombobox.Active = (int) (drawable as Line).Type;
+ }
+ widthcombobox.Active = selectedDrawable.LineWidth / 2 - 1;
+ if (selectedDrawable.Style == LineStyle.Normal) {
+ stylecombobox.Active = 0;
+ } else {
+ stylecombobox.Active = 1;
+ }
}
}
- protected virtual void OnSavetoprojectbuttonClicked(object sender, System.EventArgs e)
+ void HandleShowMenuEvent (IBlackboardObject drawable)
+ {
+ Menu m = new Menu ();
+ MenuItem item = new MenuItem (Catalog.GetString ("Delete"));
+ item.Activated += (sender, e) => {blackboard.DeleteSelection ();};
+ m.Add (item);
+ if (drawable is Text) {
+ MenuItem edit = new MenuItem (Catalog.GetString ("Edit"));
+ edit.Activated += (sender, e) => {EditText (drawable as Text);};
+ m.Add (edit);
+ }
+ m.ShowAll ();
+ m.Popup();
+ }
+ void HandleDeleteEvent (object o, DeleteEventArgs args)
{
- string tempFile = System.IO.Path.GetTempFileName();
- drawingwidget1.SaveDrawings(tempFile);
- Pixbuf frame = new Pixbuf(tempFile);
- play.KeyFrameDrawing = new LongoMatch.Store.Drawing { Pixbuf= new Image(frame),
Render = stopTime};
- drawingwidget1.SaveAll(tempFile);
- frame.Dispose();
- play.Miniature = new Image(new Pixbuf(tempFile));
+ string msg = Catalog.GetString ("Do you want to close the current drawing?");
+ if (MessagesHelpers.QuestionMessage (this, msg)) {
+ args.RetVal = false;
+ } else {
+ args.RetVal = true;
+ }
}
}
}
diff --git a/LongoMatch.GUI/Gui/GUIToolkit.cs b/LongoMatch.GUI/Gui/GUIToolkit.cs
index b204cca..9eeb260 100644
--- a/LongoMatch.GUI/Gui/GUIToolkit.cs
+++ b/LongoMatch.GUI/Gui/GUIToolkit.cs
@@ -215,15 +215,17 @@ namespace LongoMatch.Gui
d.Destroy();
}
- public void DrawingTool (Image image, Play play, Time stopTime) {
+ public void DrawingTool (Image image, Play play, int drawingIndex) {
DrawingTool dialog = new DrawingTool();
+ dialog.Show ();
Log.Information ("Drawing tool");
- dialog.Image = image.Value;
- if (play != null)
- dialog.SetPlay (play, stopTime);
+ if (play == null) {
+ dialog.LoadFrame (image);
+ } else {
+ dialog.LoadPlay (play, image, drawingIndex);
+ }
dialog.TransientFor = mainWindow as Gtk.Window;
- image.Dispose();
dialog.Run();
dialog.Destroy();
}
diff --git a/LongoMatch.GUI/LongoMatch.GUI.mdp b/LongoMatch.GUI/LongoMatch.GUI.mdp
index ebb36b5..dbd07d5 100644
--- a/LongoMatch.GUI/LongoMatch.GUI.mdp
+++ b/LongoMatch.GUI/LongoMatch.GUI.mdp
@@ -22,7 +22,6 @@
<File subtype="Code" buildaction="Compile" name="Gui/Dialog/EntryDialog.cs" />
<File subtype="Directory" buildaction="Compile" name="Gui/Component" />
<File subtype="Code" buildaction="Compile" name="Gui/Component/ButtonsWidget.cs" />
- <File subtype="Code" buildaction="Compile" name="Gui/Component/DrawingToolBox.cs" />
<File subtype="Code" buildaction="Compile" name="Gui/Component/NotesWidget.cs" />
<File subtype="Code" buildaction="Compile" name="Gui/Dialog/FramesCaptureProgressDialog.cs" />
<File subtype="Code" buildaction="Compile" name="Gui/Dialog/HotKeySelectorDialog.cs" />
@@ -41,7 +40,6 @@
<File subtype="Code" buildaction="Compile" name="Gui/Dialog/VideoEditionProperties.cs" />
<File subtype="Code" buildaction="Compile" name="Gui/Component/CategoryProperties.cs" />
<File subtype="Code" buildaction="Compile" name="Gui/Component/PlaysListTreeWidget.cs" />
- <File subtype="Code" buildaction="Compile" name="Gui/Component/DrawingWidget.cs" />
<File subtype="Code" buildaction="Compile" name="Gui/Dialog/DrawingTool.cs" />
<File subtype="Code" buildaction="Compile" name="Gui/Dialog/EndCaptureDialog.cs" />
<File subtype="Code" buildaction="Compile" name="Gui/Dialog/BusyDialog.cs" />
@@ -62,9 +60,7 @@
<File subtype="Code" buildaction="Compile" name="gtk-gui/LongoMatch.Gui.Dialog.HotKeySelectorDialog.cs"
/>
<File subtype="Code" buildaction="Compile"
name="gtk-gui/LongoMatch.Gui.Component.PlayersListTreeWidget.cs" />
<File subtype="Code" buildaction="Compile" name="gtk-gui/LongoMatch.Gui.Popup.TransparentDrawingArea.cs"
/>
- <File subtype="Code" buildaction="Compile" name="gtk-gui/LongoMatch.Gui.Component.DrawingToolBox.cs" />
<File subtype="Code" buildaction="Compile" name="gtk-gui/LongoMatch.Gui.Dialog.EditCategoryDialog.cs" />
- <File subtype="Code" buildaction="Compile" name="gtk-gui/LongoMatch.Gui.Component.DrawingWidget.cs" />
<File subtype="Code" buildaction="Compile" name="gtk-gui/LongoMatch.Gui.Dialog.DrawingTool.cs" />
<File subtype="Code" buildaction="Compile" name="gtk-gui/LongoMatch.Gui.Dialog.EndCaptureDialog.cs" />
<File subtype="Code" buildaction="Compile" name="gtk-gui/LongoMatch.Gui.Dialog.BusyDialog.cs" />
@@ -79,11 +75,6 @@
<File subtype="Directory" buildaction="Compile" name="." />
<File subtype="Code" buildaction="Compile" name="Gui/Dialog/About.cs" />
<File subtype="Code" buildaction="EmbedAsResource" name="../images/logo.svg" />
- <File subtype="Code" buildaction="EmbedAsResource" name="../images/stock_draw-circle-unfilled.png" />
- <File subtype="Code" buildaction="EmbedAsResource" name="../images/stock_draw-freeform-line.png" />
- <File subtype="Code" buildaction="EmbedAsResource" name="../images/stock_draw-line-45.png" />
- <File subtype="Code" buildaction="EmbedAsResource" name="../images/stock_draw-line-ends-with-arrow.png"
/>
- <File subtype="Code" buildaction="EmbedAsResource" name="../images/stock_draw-rectangle-unfilled.png" />
<File subtype="Code" buildaction="EmbedAsResource" name="../images/video.png" />
<File subtype="Code" buildaction="EmbedAsResource" name="../images/camera-video.png" />
<File subtype="Directory" buildaction="Compile" name="Gui/Component" />
@@ -177,6 +168,23 @@
<File subtype="Directory" buildaction="Compile" name="Gui/Menu" />
<File subtype="Code" buildaction="Compile" name="Gui/Menu/PlaysMenu.cs" />
<File subtype="Code" buildaction="Compile" name="Gui/GtkGlue.cs" />
+ <File subtype="Code" buildaction="EmbedAsResource" name="../images/tools/draw-arrow.png" />
+ <File subtype="Code" buildaction="EmbedAsResource" name="../images/tools/draw-circle-unfilled.png" />
+ <File subtype="Code" buildaction="EmbedAsResource" name="../images/tools/draw-cross.png" />
+ <File subtype="Code" buildaction="EmbedAsResource" name="../images/tools/draw-ellipse.png" />
+ <File subtype="Code" buildaction="EmbedAsResource" name="../images/tools/draw-eraser.png" />
+ <File subtype="Code" buildaction="EmbedAsResource" name="../images/tools/draw-freehand.png" />
+ <File subtype="Code" buildaction="EmbedAsResource" name="../images/tools/draw-number.png" />
+ <File subtype="Code" buildaction="EmbedAsResource" name="../images/tools/draw-pointer.png" />
+ <File subtype="Code" buildaction="EmbedAsResource" name="../images/tools/draw-rectangle.png" />
+ <File subtype="Code" buildaction="EmbedAsResource" name="../images/tools/draw-rectangle-unfilled.png" />
+ <File subtype="Code" buildaction="EmbedAsResource" name="../images/tools/draw-text.png" />
+ <File subtype="Code" buildaction="EmbedAsResource" name="../images/tools/dash-line.svg" />
+ <File subtype="Code" buildaction="EmbedAsResource" name="../images/tools/line.svg" />
+ <File subtype="Code" buildaction="EmbedAsResource" name="../images/tools/line-double-dot.svg" />
+ <File subtype="Code" buildaction="EmbedAsResource" name="../images/tools/line-dot.svg" />
+ <File subtype="Code" buildaction="EmbedAsResource" name="../images/tools/line-double-arrow.svg" />
+ <File subtype="Code" buildaction="EmbedAsResource" name="../images/tools/line-arrow.svg" />
</Contents>
<References>
<ProjectReference type="Package" localcopy="True" refto="atk-sharp, Version=2.12.0.0, Culture=neutral,
PublicKeyToken=35e10195dab3c99f" />
diff --git a/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Dialog.DrawingTool.cs
b/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Dialog.DrawingTool.cs
index 95510bc..9ed50e2 100644
--- a/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Dialog.DrawingTool.cs
+++ b/LongoMatch.GUI/gtk-gui/LongoMatch.Gui.Dialog.DrawingTool.cs
@@ -6,11 +6,52 @@ namespace LongoMatch.Gui.Dialog
{
private global::Gtk.HBox hbox1;
private global::Gtk.VBox vbox2;
- private global::LongoMatch.Gui.Component.DrawingToolBox drawingtoolbox1;
+ private global::Gtk.VBox vbox3;
+ private global::Gtk.Label toolslabel;
+ private global::Gtk.Table toolstable;
+ private global::Gtk.RadioButton anglebutton;
+ private global::Gtk.Image image90;
+ private global::Gtk.RadioButton crossbutton;
+ private global::Gtk.Image image83;
+ private global::Gtk.RadioButton ellipsebutton;
+ private global::Gtk.Image image79;
+ private global::Gtk.RadioButton ellipsefilledbutton;
+ private global::Gtk.Image image86;
+ private global::Gtk.RadioButton eraserbutton;
+ private global::Gtk.Image image81;
+ private global::Gtk.RadioButton linebutton;
+ private global::Gtk.Image image82;
+ private global::Gtk.RadioButton numberbutton;
+ private global::Gtk.Image image88;
+ private global::Gtk.RadioButton penbutton;
+ private global::Gtk.Image image91;
+ private global::Gtk.RadioButton playerbutton;
+ private global::Gtk.Image image89;
+ private global::Gtk.RadioButton rectanglebutton;
+ private global::Gtk.Image image84;
+ private global::Gtk.RadioButton rectanglefilledbutton;
+ private global::Gtk.Image image85;
+ private global::Gtk.RadioButton selectbutton;
+ private global::Gtk.Image image80;
+ private global::Gtk.RadioButton textbutton;
+ private global::Gtk.Image image87;
+ private global::Gtk.Label colorslabel;
+ private global::Gtk.ColorButton colorbutton;
+ private global::Gtk.Label label3;
+ private global::Gtk.ComboBox widthcombobox;
+ private global::Gtk.Label label4;
+ private global::Gtk.ComboBox stylecombobox;
+ private global::Gtk.Label label5;
+ private global::Gtk.ComboBox typecombobox;
+ private global::Gtk.Label textcolorslabel;
+ private global::Gtk.ColorButton textcolorbutton;
+ private global::Gtk.Label backgroundcolorslabel;
+ private global::Gtk.ColorButton backgroundcolorbutton;
+ private global::Gtk.Button clearbutton;
private global::Gtk.Button savetoprojectbutton;
private global::Gtk.Button savebutton;
- private global::LongoMatch.Gui.Component.DrawingWidget drawingwidget1;
- private global::Gtk.Button button271;
+ private global::Gtk.DrawingArea drawingarea;
+ private global::Gtk.Button closebutton;
protected virtual void Build ()
{
@@ -37,111 +78,550 @@ namespace LongoMatch.Gui.Dialog
this.vbox2.Name = "vbox2";
this.vbox2.Spacing = 6;
// Container child vbox2.Gtk.Box+BoxChild
- this.drawingtoolbox1 = new global::LongoMatch.Gui.Component.DrawingToolBox ();
- this.drawingtoolbox1.Events = ((global::Gdk.EventMask)(256));
- this.drawingtoolbox1.Name = "drawingtoolbox1";
- this.vbox2.Add (this.drawingtoolbox1);
- global::Gtk.Box.BoxChild w2 = ((global::Gtk.Box.BoxChild)(this.vbox2
[this.drawingtoolbox1]));
+ this.vbox3 = new global::Gtk.VBox ();
+ this.vbox3.Name = "vbox3";
+ this.vbox3.Spacing = 6;
+ // Container child vbox3.Gtk.Box+BoxChild
+ this.toolslabel = new global::Gtk.Label ();
+ this.toolslabel.Name = "toolslabel";
+ this.toolslabel.Xalign = 0F;
+ this.toolslabel.LabelProp = global::Mono.Unix.Catalog.GetString ("<b>Tools</b>");
+ this.toolslabel.UseMarkup = true;
+ this.vbox3.Add (this.toolslabel);
+ global::Gtk.Box.BoxChild w2 = ((global::Gtk.Box.BoxChild)(this.vbox3
[this.toolslabel]));
w2.Position = 0;
w2.Expand = false;
w2.Fill = false;
+ // Container child vbox3.Gtk.Box+BoxChild
+ this.toolstable = new global::Gtk.Table (((uint)(7)), ((uint)(2)), true);
+ this.toolstable.Name = "toolstable";
+ this.toolstable.RowSpacing = ((uint)(6));
+ this.toolstable.ColumnSpacing = ((uint)(6));
+ // Container child toolstable.Gtk.Table+TableChild
+ this.anglebutton = new global::Gtk.RadioButton ("");
+ this.anglebutton.TooltipMarkup = "Angle tool";
+ this.anglebutton.CanFocus = true;
+ this.anglebutton.Name = "anglebutton";
+ this.anglebutton.DrawIndicator = false;
+ this.anglebutton.UseUnderline = true;
+ this.anglebutton.Group = new global::GLib.SList (global::System.IntPtr.Zero);
+ this.anglebutton.Remove (this.anglebutton.Child);
+ // Container child anglebutton.Gtk.Container+ContainerChild
+ this.image90 = new global::Gtk.Image ();
+ this.image90.Name = "image90";
+ this.image90.Pixbuf = global::Stetic.IconLoader.LoadIcon (this, "gtk-go-down",
global::Gtk.IconSize.Menu);
+ this.anglebutton.Add (this.image90);
+ this.toolstable.Add (this.anglebutton);
+ global::Gtk.Table.TableChild w4 = ((global::Gtk.Table.TableChild)(this.toolstable
[this.anglebutton]));
+ w4.TopAttach = ((uint)(6));
+ w4.BottomAttach = ((uint)(7));
+ w4.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child toolstable.Gtk.Table+TableChild
+ this.crossbutton = new global::Gtk.RadioButton ("");
+ this.crossbutton.TooltipMarkup = "Cross tool";
+ this.crossbutton.CanFocus = true;
+ this.crossbutton.Name = "crossbutton";
+ this.crossbutton.DrawIndicator = false;
+ this.crossbutton.UseUnderline = true;
+ this.crossbutton.Group = this.anglebutton.Group;
+ this.crossbutton.Remove (this.crossbutton.Child);
+ // Container child crossbutton.Gtk.Container+ContainerChild
+ this.image83 = new global::Gtk.Image ();
+ this.image83.Name = "image83";
+ this.image83.Pixbuf = global::Gdk.Pixbuf.LoadFromResource ("draw-cross.png");
+ this.crossbutton.Add (this.image83);
+ this.toolstable.Add (this.crossbutton);
+ global::Gtk.Table.TableChild w6 = ((global::Gtk.Table.TableChild)(this.toolstable
[this.crossbutton]));
+ w6.TopAttach = ((uint)(2));
+ w6.BottomAttach = ((uint)(3));
+ w6.LeftAttach = ((uint)(1));
+ w6.RightAttach = ((uint)(2));
+ w6.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child toolstable.Gtk.Table+TableChild
+ this.ellipsebutton = new global::Gtk.RadioButton ("");
+ this.ellipsebutton.TooltipMarkup = "Ellipse tool";
+ this.ellipsebutton.CanFocus = true;
+ this.ellipsebutton.Name = "ellipsebutton";
+ this.ellipsebutton.DrawIndicator = false;
+ this.ellipsebutton.UseUnderline = true;
+ this.ellipsebutton.Group = this.anglebutton.Group;
+ this.ellipsebutton.Remove (this.ellipsebutton.Child);
+ // Container child ellipsebutton.Gtk.Container+ContainerChild
+ this.image79 = new global::Gtk.Image ();
+ this.image79.Name = "image79";
+ this.image79.Pixbuf = global::Gdk.Pixbuf.LoadFromResource
("draw-circle-unfilled.png");
+ this.ellipsebutton.Add (this.image79);
+ this.toolstable.Add (this.ellipsebutton);
+ global::Gtk.Table.TableChild w8 = ((global::Gtk.Table.TableChild)(this.toolstable
[this.ellipsebutton]));
+ w8.TopAttach = ((uint)(3));
+ w8.BottomAttach = ((uint)(4));
+ w8.LeftAttach = ((uint)(1));
+ w8.RightAttach = ((uint)(2));
+ w8.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child toolstable.Gtk.Table+TableChild
+ this.ellipsefilledbutton = new global::Gtk.RadioButton ("");
+ this.ellipsefilledbutton.TooltipMarkup = "Filled ellipse";
+ this.ellipsefilledbutton.CanFocus = true;
+ this.ellipsefilledbutton.Name = "ellipsefilledbutton";
+ this.ellipsefilledbutton.DrawIndicator = false;
+ this.ellipsefilledbutton.UseUnderline = true;
+ this.ellipsefilledbutton.Group = this.anglebutton.Group;
+ this.ellipsefilledbutton.Remove (this.ellipsefilledbutton.Child);
+ // Container child ellipsefilledbutton.Gtk.Container+ContainerChild
+ this.image86 = new global::Gtk.Image ();
+ this.image86.Name = "image86";
+ this.image86.Pixbuf = global::Gdk.Pixbuf.LoadFromResource ("draw-ellipse.png");
+ this.ellipsefilledbutton.Add (this.image86);
+ this.toolstable.Add (this.ellipsefilledbutton);
+ global::Gtk.Table.TableChild w10 = ((global::Gtk.Table.TableChild)(this.toolstable
[this.ellipsefilledbutton]));
+ w10.TopAttach = ((uint)(4));
+ w10.BottomAttach = ((uint)(5));
+ w10.LeftAttach = ((uint)(1));
+ w10.RightAttach = ((uint)(2));
+ w10.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child toolstable.Gtk.Table+TableChild
+ this.eraserbutton = new global::Gtk.RadioButton ("");
+ this.eraserbutton.TooltipMarkup = "Rubber tool";
+ this.eraserbutton.CanFocus = true;
+ this.eraserbutton.Name = "eraserbutton";
+ this.eraserbutton.DrawIndicator = false;
+ this.eraserbutton.UseUnderline = true;
+ this.eraserbutton.Group = this.anglebutton.Group;
+ this.eraserbutton.Remove (this.eraserbutton.Child);
+ // Container child eraserbutton.Gtk.Container+ContainerChild
+ this.image81 = new global::Gtk.Image ();
+ this.image81.Name = "image81";
+ this.image81.Pixbuf = global::Gdk.Pixbuf.LoadFromResource ("draw-eraser.png");
+ this.eraserbutton.Add (this.image81);
+ this.toolstable.Add (this.eraserbutton);
+ global::Gtk.Table.TableChild w12 = ((global::Gtk.Table.TableChild)(this.toolstable
[this.eraserbutton]));
+ w12.LeftAttach = ((uint)(1));
+ w12.RightAttach = ((uint)(2));
+ w12.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child toolstable.Gtk.Table+TableChild
+ this.linebutton = new global::Gtk.RadioButton ("");
+ this.linebutton.TooltipMarkup = "Line tool";
+ this.linebutton.CanFocus = true;
+ this.linebutton.Name = "linebutton";
+ this.linebutton.DrawIndicator = false;
+ this.linebutton.UseUnderline = true;
+ this.linebutton.Group = this.anglebutton.Group;
+ this.linebutton.Remove (this.linebutton.Child);
+ // Container child linebutton.Gtk.Container+ContainerChild
+ this.image82 = new global::Gtk.Image ();
+ this.image82.Name = "image82";
+ this.image82.Pixbuf = global::Gdk.Pixbuf.LoadFromResource ("draw-arrow.png");
+ this.linebutton.Add (this.image82);
+ this.toolstable.Add (this.linebutton);
+ global::Gtk.Table.TableChild w14 = ((global::Gtk.Table.TableChild)(this.toolstable
[this.linebutton]));
+ w14.TopAttach = ((uint)(2));
+ w14.BottomAttach = ((uint)(3));
+ w14.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child toolstable.Gtk.Table+TableChild
+ this.numberbutton = new global::Gtk.RadioButton ("");
+ this.numberbutton.TooltipMarkup = "Index tool";
+ this.numberbutton.CanFocus = true;
+ this.numberbutton.Name = "numberbutton";
+ this.numberbutton.DrawIndicator = false;
+ this.numberbutton.UseUnderline = true;
+ this.numberbutton.Group = this.anglebutton.Group;
+ this.numberbutton.Remove (this.numberbutton.Child);
+ // Container child numberbutton.Gtk.Container+ContainerChild
+ this.image88 = new global::Gtk.Image ();
+ this.image88.Name = "image88";
+ this.image88.Pixbuf = global::Gdk.Pixbuf.LoadFromResource ("draw-number.png");
+ this.numberbutton.Add (this.image88);
+ this.toolstable.Add (this.numberbutton);
+ global::Gtk.Table.TableChild w16 = ((global::Gtk.Table.TableChild)(this.toolstable
[this.numberbutton]));
+ w16.TopAttach = ((uint)(5));
+ w16.BottomAttach = ((uint)(6));
+ w16.LeftAttach = ((uint)(1));
+ w16.RightAttach = ((uint)(2));
+ w16.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child toolstable.Gtk.Table+TableChild
+ this.penbutton = new global::Gtk.RadioButton ("");
+ this.penbutton.TooltipMarkup = "Pencil tool";
+ this.penbutton.CanFocus = true;
+ this.penbutton.Name = "penbutton";
+ this.penbutton.DrawIndicator = false;
+ this.penbutton.UseUnderline = true;
+ this.penbutton.Group = this.anglebutton.Group;
+ this.penbutton.Remove (this.penbutton.Child);
+ // Container child penbutton.Gtk.Container+ContainerChild
+ this.image91 = new global::Gtk.Image ();
+ this.image91.Name = "image91";
+ this.image91.Pixbuf = global::Gdk.Pixbuf.LoadFromResource ("draw-freehand.png");
+ this.penbutton.Add (this.image91);
+ this.toolstable.Add (this.penbutton);
+ global::Gtk.Table.TableChild w18 = ((global::Gtk.Table.TableChild)(this.toolstable
[this.penbutton]));
+ w18.TopAttach = ((uint)(1));
+ w18.BottomAttach = ((uint)(2));
+ w18.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child toolstable.Gtk.Table+TableChild
+ this.playerbutton = new global::Gtk.RadioButton ("");
+ this.playerbutton.TooltipMarkup = "Player tool";
+ this.playerbutton.CanFocus = true;
+ this.playerbutton.Name = "playerbutton";
+ this.playerbutton.DrawIndicator = false;
+ this.playerbutton.UseUnderline = true;
+ this.playerbutton.Group = this.anglebutton.Group;
+ this.playerbutton.Remove (this.playerbutton.Child);
+ // Container child playerbutton.Gtk.Container+ContainerChild
+ this.image89 = new global::Gtk.Image ();
+ this.image89.Name = "image89";
+ this.image89.Pixbuf = global::Stetic.IconLoader.LoadIcon (this, "stock_person",
global::Gtk.IconSize.Menu);
+ this.playerbutton.Add (this.image89);
+ this.toolstable.Add (this.playerbutton);
+ global::Gtk.Table.TableChild w20 = ((global::Gtk.Table.TableChild)(this.toolstable
[this.playerbutton]));
+ w20.TopAttach = ((uint)(5));
+ w20.BottomAttach = ((uint)(6));
+ w20.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child toolstable.Gtk.Table+TableChild
+ this.rectanglebutton = new global::Gtk.RadioButton ("");
+ this.rectanglebutton.TooltipMarkup = "Rectangle tool";
+ this.rectanglebutton.CanFocus = true;
+ this.rectanglebutton.Name = "rectanglebutton";
+ this.rectanglebutton.DrawIndicator = false;
+ this.rectanglebutton.UseUnderline = true;
+ this.rectanglebutton.Group = this.anglebutton.Group;
+ this.rectanglebutton.Remove (this.rectanglebutton.Child);
+ // Container child rectanglebutton.Gtk.Container+ContainerChild
+ this.image84 = new global::Gtk.Image ();
+ this.image84.Name = "image84";
+ this.image84.Pixbuf = global::Gdk.Pixbuf.LoadFromResource
("draw-rectangle-unfilled.png");
+ this.rectanglebutton.Add (this.image84);
+ this.toolstable.Add (this.rectanglebutton);
+ global::Gtk.Table.TableChild w22 = ((global::Gtk.Table.TableChild)(this.toolstable
[this.rectanglebutton]));
+ w22.TopAttach = ((uint)(3));
+ w22.BottomAttach = ((uint)(4));
+ w22.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child toolstable.Gtk.Table+TableChild
+ this.rectanglefilledbutton = new global::Gtk.RadioButton ("");
+ this.rectanglefilledbutton.TooltipMarkup = "Filled rectangle tool";
+ this.rectanglefilledbutton.CanFocus = true;
+ this.rectanglefilledbutton.Name = "rectanglefilledbutton";
+ this.rectanglefilledbutton.DrawIndicator = false;
+ this.rectanglefilledbutton.UseUnderline = true;
+ this.rectanglefilledbutton.Group = this.anglebutton.Group;
+ this.rectanglefilledbutton.Remove (this.rectanglefilledbutton.Child);
+ // Container child rectanglefilledbutton.Gtk.Container+ContainerChild
+ this.image85 = new global::Gtk.Image ();
+ this.image85.Name = "image85";
+ this.image85.Pixbuf = global::Gdk.Pixbuf.LoadFromResource ("draw-rectangle.png");
+ this.rectanglefilledbutton.Add (this.image85);
+ this.toolstable.Add (this.rectanglefilledbutton);
+ global::Gtk.Table.TableChild w24 = ((global::Gtk.Table.TableChild)(this.toolstable
[this.rectanglefilledbutton]));
+ w24.TopAttach = ((uint)(4));
+ w24.BottomAttach = ((uint)(5));
+ w24.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child toolstable.Gtk.Table+TableChild
+ this.selectbutton = new global::Gtk.RadioButton ("");
+ this.selectbutton.TooltipMarkup = "Selection tool";
+ this.selectbutton.CanFocus = true;
+ this.selectbutton.Name = "selectbutton";
+ this.selectbutton.DrawIndicator = false;
+ this.selectbutton.UseUnderline = true;
+ this.selectbutton.Group = this.anglebutton.Group;
+ this.selectbutton.Remove (this.selectbutton.Child);
+ // Container child selectbutton.Gtk.Container+ContainerChild
+ this.image80 = new global::Gtk.Image ();
+ this.image80.Name = "image80";
+ this.image80.Pixbuf = global::Gdk.Pixbuf.LoadFromResource ("draw-pointer.png");
+ this.selectbutton.Add (this.image80);
+ this.toolstable.Add (this.selectbutton);
+ global::Gtk.Table.TableChild w26 = ((global::Gtk.Table.TableChild)(this.toolstable
[this.selectbutton]));
+ w26.YOptions = ((global::Gtk.AttachOptions)(4));
+ // Container child toolstable.Gtk.Table+TableChild
+ this.textbutton = new global::Gtk.RadioButton ("");
+ this.textbutton.TooltipMarkup = "Text tool";
+ this.textbutton.CanFocus = true;
+ this.textbutton.Name = "textbutton";
+ this.textbutton.DrawIndicator = false;
+ this.textbutton.UseUnderline = true;
+ this.textbutton.Group = this.anglebutton.Group;
+ this.textbutton.Remove (this.textbutton.Child);
+ // Container child textbutton.Gtk.Container+ContainerChild
+ this.image87 = new global::Gtk.Image ();
+ this.image87.Name = "image87";
+ this.image87.Pixbuf = global::Gdk.Pixbuf.LoadFromResource ("draw-text.png");
+ this.textbutton.Add (this.image87);
+ this.toolstable.Add (this.textbutton);
+ global::Gtk.Table.TableChild w28 = ((global::Gtk.Table.TableChild)(this.toolstable
[this.textbutton]));
+ w28.TopAttach = ((uint)(1));
+ w28.BottomAttach = ((uint)(2));
+ w28.LeftAttach = ((uint)(1));
+ w28.RightAttach = ((uint)(2));
+ w28.YOptions = ((global::Gtk.AttachOptions)(4));
+ this.vbox3.Add (this.toolstable);
+ global::Gtk.Box.BoxChild w29 = ((global::Gtk.Box.BoxChild)(this.vbox3
[this.toolstable]));
+ w29.Position = 1;
+ w29.Expand = false;
+ // Container child vbox3.Gtk.Box+BoxChild
+ this.colorslabel = new global::Gtk.Label ();
+ this.colorslabel.Name = "colorslabel";
+ this.colorslabel.Xalign = 0F;
+ this.colorslabel.LabelProp = global::Mono.Unix.Catalog.GetString ("<b>Color</b>");
+ this.colorslabel.UseMarkup = true;
+ this.vbox3.Add (this.colorslabel);
+ global::Gtk.Box.BoxChild w30 = ((global::Gtk.Box.BoxChild)(this.vbox3
[this.colorslabel]));
+ w30.Position = 2;
+ w30.Expand = false;
+ w30.Fill = false;
+ // Container child vbox3.Gtk.Box+BoxChild
+ this.colorbutton = new global::Gtk.ColorButton ();
+ this.colorbutton.CanFocus = true;
+ this.colorbutton.Events = ((global::Gdk.EventMask)(784));
+ this.colorbutton.Name = "colorbutton";
+ this.vbox3.Add (this.colorbutton);
+ global::Gtk.Box.BoxChild w31 = ((global::Gtk.Box.BoxChild)(this.vbox3
[this.colorbutton]));
+ w31.Position = 3;
+ w31.Expand = false;
+ w31.Fill = false;
+ // Container child vbox3.Gtk.Box+BoxChild
+ this.label3 = new global::Gtk.Label ();
+ this.label3.Name = "label3";
+ this.label3.Xalign = 0F;
+ this.label3.LabelProp = global::Mono.Unix.Catalog.GetString ("<b>Line size</b>");
+ this.label3.UseMarkup = true;
+ this.vbox3.Add (this.label3);
+ global::Gtk.Box.BoxChild w32 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.label3]));
+ w32.Position = 4;
+ w32.Expand = false;
+ w32.Fill = false;
+ // Container child vbox3.Gtk.Box+BoxChild
+ this.widthcombobox = global::Gtk.ComboBox.NewText ();
+ this.widthcombobox.AppendText (global::Mono.Unix.Catalog.GetString ("2 px"));
+ this.widthcombobox.AppendText (global::Mono.Unix.Catalog.GetString ("4 px"));
+ this.widthcombobox.AppendText (global::Mono.Unix.Catalog.GetString ("6 px"));
+ this.widthcombobox.AppendText (global::Mono.Unix.Catalog.GetString ("8 px"));
+ this.widthcombobox.AppendText (global::Mono.Unix.Catalog.GetString ("10 px"));
+ this.widthcombobox.TooltipMarkup = "Change the line width";
+ this.widthcombobox.Name = "widthcombobox";
+ this.widthcombobox.Active = 2;
+ this.vbox3.Add (this.widthcombobox);
+ global::Gtk.Box.BoxChild w33 = ((global::Gtk.Box.BoxChild)(this.vbox3
[this.widthcombobox]));
+ w33.Position = 5;
+ w33.Expand = false;
+ w33.Fill = false;
+ // Container child vbox3.Gtk.Box+BoxChild
+ this.label4 = new global::Gtk.Label ();
+ this.label4.Name = "label4";
+ this.label4.Xalign = 0F;
+ this.label4.LabelProp = global::Mono.Unix.Catalog.GetString ("<b>Line style</b>");
+ this.label4.UseMarkup = true;
+ this.vbox3.Add (this.label4);
+ global::Gtk.Box.BoxChild w34 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.label4]));
+ w34.Position = 6;
+ w34.Expand = false;
+ w34.Fill = false;
+ // Container child vbox3.Gtk.Box+BoxChild
+ this.stylecombobox = global::Gtk.ComboBox.NewText ();
+ this.stylecombobox.TooltipMarkup = "Change the line style";
+ this.stylecombobox.Name = "stylecombobox";
+ this.vbox3.Add (this.stylecombobox);
+ global::Gtk.Box.BoxChild w35 = ((global::Gtk.Box.BoxChild)(this.vbox3
[this.stylecombobox]));
+ w35.Position = 7;
+ w35.Expand = false;
+ w35.Fill = false;
+ // Container child vbox3.Gtk.Box+BoxChild
+ this.label5 = new global::Gtk.Label ();
+ this.label5.Name = "label5";
+ this.label5.Xalign = 0F;
+ this.label5.LabelProp = global::Mono.Unix.Catalog.GetString ("<b>Line type</b>");
+ this.label5.UseMarkup = true;
+ this.vbox3.Add (this.label5);
+ global::Gtk.Box.BoxChild w36 = ((global::Gtk.Box.BoxChild)(this.vbox3 [this.label5]));
+ w36.Position = 8;
+ w36.Expand = false;
+ w36.Fill = false;
+ // Container child vbox3.Gtk.Box+BoxChild
+ this.typecombobox = global::Gtk.ComboBox.NewText ();
+ this.typecombobox.TooltipMarkup = "Change the line style";
+ this.typecombobox.Name = "typecombobox";
+ this.vbox3.Add (this.typecombobox);
+ global::Gtk.Box.BoxChild w37 = ((global::Gtk.Box.BoxChild)(this.vbox3
[this.typecombobox]));
+ w37.Position = 9;
+ w37.Expand = false;
+ w37.Fill = false;
+ // Container child vbox3.Gtk.Box+BoxChild
+ this.textcolorslabel = new global::Gtk.Label ();
+ this.textcolorslabel.Name = "textcolorslabel";
+ this.textcolorslabel.Xalign = 0F;
+ this.textcolorslabel.LabelProp = global::Mono.Unix.Catalog.GetString ("<b>Text
color</b>");
+ this.textcolorslabel.UseMarkup = true;
+ this.vbox3.Add (this.textcolorslabel);
+ global::Gtk.Box.BoxChild w38 = ((global::Gtk.Box.BoxChild)(this.vbox3
[this.textcolorslabel]));
+ w38.Position = 10;
+ w38.Expand = false;
+ w38.Fill = false;
+ // Container child vbox3.Gtk.Box+BoxChild
+ this.textcolorbutton = new global::Gtk.ColorButton ();
+ this.textcolorbutton.CanFocus = true;
+ this.textcolorbutton.Events = ((global::Gdk.EventMask)(784));
+ this.textcolorbutton.Name = "textcolorbutton";
+ this.vbox3.Add (this.textcolorbutton);
+ global::Gtk.Box.BoxChild w39 = ((global::Gtk.Box.BoxChild)(this.vbox3
[this.textcolorbutton]));
+ w39.Position = 11;
+ w39.Expand = false;
+ w39.Fill = false;
+ // Container child vbox3.Gtk.Box+BoxChild
+ this.backgroundcolorslabel = new global::Gtk.Label ();
+ this.backgroundcolorslabel.Name = "backgroundcolorslabel";
+ this.backgroundcolorslabel.Xalign = 0F;
+ this.backgroundcolorslabel.LabelProp = global::Mono.Unix.Catalog.GetString ("<b>Text
background</b>");
+ this.backgroundcolorslabel.UseMarkup = true;
+ this.vbox3.Add (this.backgroundcolorslabel);
+ global::Gtk.Box.BoxChild w40 = ((global::Gtk.Box.BoxChild)(this.vbox3
[this.backgroundcolorslabel]));
+ w40.Position = 12;
+ w40.Expand = false;
+ w40.Fill = false;
+ // Container child vbox3.Gtk.Box+BoxChild
+ this.backgroundcolorbutton = new global::Gtk.ColorButton ();
+ this.backgroundcolorbutton.CanFocus = true;
+ this.backgroundcolorbutton.Events = ((global::Gdk.EventMask)(784));
+ this.backgroundcolorbutton.Name = "backgroundcolorbutton";
+ this.vbox3.Add (this.backgroundcolorbutton);
+ global::Gtk.Box.BoxChild w41 = ((global::Gtk.Box.BoxChild)(this.vbox3
[this.backgroundcolorbutton]));
+ w41.Position = 13;
+ w41.Expand = false;
+ w41.Fill = false;
+ // Container child vbox3.Gtk.Box+BoxChild
+ this.clearbutton = new global::Gtk.Button ();
+ this.clearbutton.TooltipMarkup = "Clear all drawings";
+ this.clearbutton.CanFocus = true;
+ this.clearbutton.Name = "clearbutton";
+ this.clearbutton.UseUnderline = true;
+ // Container child clearbutton.Gtk.Container+ContainerChild
+ global::Gtk.Alignment w42 = new global::Gtk.Alignment (0.5F, 0.5F, 0F, 0F);
+ // Container child GtkAlignment.Gtk.Container+ContainerChild
+ global::Gtk.HBox w43 = new global::Gtk.HBox ();
+ w43.Spacing = 2;
+ // Container child GtkHBox.Gtk.Container+ContainerChild
+ global::Gtk.Image w44 = new global::Gtk.Image ();
+ w44.Pixbuf = global::Stetic.IconLoader.LoadIcon (this, "gtk-clear",
global::Gtk.IconSize.LargeToolbar);
+ w43.Add (w44);
+ // Container child GtkHBox.Gtk.Container+ContainerChild
+ global::Gtk.Label w46 = new global::Gtk.Label ();
+ w43.Add (w46);
+ w42.Add (w43);
+ this.clearbutton.Add (w42);
+ this.vbox3.Add (this.clearbutton);
+ global::Gtk.Box.BoxChild w50 = ((global::Gtk.Box.BoxChild)(this.vbox3
[this.clearbutton]));
+ w50.Position = 14;
+ w50.Expand = false;
+ w50.Fill = false;
+ this.vbox2.Add (this.vbox3);
+ global::Gtk.Box.BoxChild w51 = ((global::Gtk.Box.BoxChild)(this.vbox2 [this.vbox3]));
+ w51.Position = 0;
+ w51.Expand = false;
+ w51.Fill = false;
// Container child vbox2.Gtk.Box+BoxChild
this.savetoprojectbutton = new global::Gtk.Button ();
this.savetoprojectbutton.CanFocus = true;
this.savetoprojectbutton.Name = "savetoprojectbutton";
this.savetoprojectbutton.UseUnderline = true;
// Container child savetoprojectbutton.Gtk.Container+ContainerChild
- global::Gtk.Alignment w3 = new global::Gtk.Alignment (0.5F, 0.5F, 0F, 0F);
+ global::Gtk.Alignment w52 = new global::Gtk.Alignment (0.5F, 0.5F, 0F, 0F);
// Container child GtkAlignment.Gtk.Container+ContainerChild
- global::Gtk.HBox w4 = new global::Gtk.HBox ();
- w4.Spacing = 2;
+ global::Gtk.HBox w53 = new global::Gtk.HBox ();
+ w53.Spacing = 2;
// Container child GtkHBox.Gtk.Container+ContainerChild
- global::Gtk.Image w5 = new global::Gtk.Image ();
- w5.Pixbuf = global::Stetic.IconLoader.LoadIcon (this, "gtk-save",
global::Gtk.IconSize.Menu);
- w4.Add (w5);
+ global::Gtk.Image w54 = new global::Gtk.Image ();
+ w54.Pixbuf = global::Stetic.IconLoader.LoadIcon (this, "gtk-save",
global::Gtk.IconSize.Menu);
+ w53.Add (w54);
// Container child GtkHBox.Gtk.Container+ContainerChild
- global::Gtk.Label w7 = new global::Gtk.Label ();
- w7.LabelProp = global::Mono.Unix.Catalog.GetString ("Save to Project");
- w7.UseUnderline = true;
- w4.Add (w7);
- w3.Add (w4);
- this.savetoprojectbutton.Add (w3);
+ global::Gtk.Label w56 = new global::Gtk.Label ();
+ w56.LabelProp = global::Mono.Unix.Catalog.GetString ("Save to Project");
+ w56.UseUnderline = true;
+ w53.Add (w56);
+ w52.Add (w53);
+ this.savetoprojectbutton.Add (w52);
this.vbox2.Add (this.savetoprojectbutton);
- global::Gtk.Box.BoxChild w11 = ((global::Gtk.Box.BoxChild)(this.vbox2
[this.savetoprojectbutton]));
- w11.PackType = ((global::Gtk.PackType)(1));
- w11.Position = 1;
- w11.Expand = false;
- w11.Fill = false;
+ global::Gtk.Box.BoxChild w60 = ((global::Gtk.Box.BoxChild)(this.vbox2
[this.savetoprojectbutton]));
+ w60.PackType = ((global::Gtk.PackType)(1));
+ w60.Position = 1;
+ w60.Expand = false;
+ w60.Fill = false;
// Container child vbox2.Gtk.Box+BoxChild
this.savebutton = new global::Gtk.Button ();
this.savebutton.CanFocus = true;
this.savebutton.Name = "savebutton";
this.savebutton.UseUnderline = true;
// Container child savebutton.Gtk.Container+ContainerChild
- global::Gtk.Alignment w12 = new global::Gtk.Alignment (0.5F, 0.5F, 0F, 0F);
+ global::Gtk.Alignment w61 = new global::Gtk.Alignment (0.5F, 0.5F, 0F, 0F);
// Container child GtkAlignment.Gtk.Container+ContainerChild
- global::Gtk.HBox w13 = new global::Gtk.HBox ();
- w13.Spacing = 2;
+ global::Gtk.HBox w62 = new global::Gtk.HBox ();
+ w62.Spacing = 2;
// Container child GtkHBox.Gtk.Container+ContainerChild
- global::Gtk.Image w14 = new global::Gtk.Image ();
- w14.Pixbuf = global::Stetic.IconLoader.LoadIcon (this, "gtk-save",
global::Gtk.IconSize.Menu);
- w13.Add (w14);
+ global::Gtk.Image w63 = new global::Gtk.Image ();
+ w63.Pixbuf = global::Stetic.IconLoader.LoadIcon (this, "gtk-save",
global::Gtk.IconSize.Menu);
+ w62.Add (w63);
// Container child GtkHBox.Gtk.Container+ContainerChild
- global::Gtk.Label w16 = new global::Gtk.Label ();
- w16.LabelProp = global::Mono.Unix.Catalog.GetString ("Save to File");
- w16.UseUnderline = true;
- w13.Add (w16);
- w12.Add (w13);
- this.savebutton.Add (w12);
+ global::Gtk.Label w65 = new global::Gtk.Label ();
+ w65.LabelProp = global::Mono.Unix.Catalog.GetString ("Save to File");
+ w65.UseUnderline = true;
+ w62.Add (w65);
+ w61.Add (w62);
+ this.savebutton.Add (w61);
this.vbox2.Add (this.savebutton);
- global::Gtk.Box.BoxChild w20 = ((global::Gtk.Box.BoxChild)(this.vbox2
[this.savebutton]));
- w20.PackType = ((global::Gtk.PackType)(1));
- w20.Position = 2;
- w20.Expand = false;
- w20.Fill = false;
+ global::Gtk.Box.BoxChild w69 = ((global::Gtk.Box.BoxChild)(this.vbox2
[this.savebutton]));
+ w69.PackType = ((global::Gtk.PackType)(1));
+ w69.Position = 2;
+ w69.Expand = false;
+ w69.Fill = false;
this.hbox1.Add (this.vbox2);
- global::Gtk.Box.BoxChild w21 = ((global::Gtk.Box.BoxChild)(this.hbox1 [this.vbox2]));
- w21.Position = 0;
- w21.Expand = false;
- w21.Fill = false;
+ global::Gtk.Box.BoxChild w70 = ((global::Gtk.Box.BoxChild)(this.hbox1 [this.vbox2]));
+ w70.Position = 0;
+ w70.Expand = false;
+ w70.Fill = false;
// Container child hbox1.Gtk.Box+BoxChild
- this.drawingwidget1 = new global::LongoMatch.Gui.Component.DrawingWidget ();
- this.drawingwidget1.Events = ((global::Gdk.EventMask)(256));
- this.drawingwidget1.Name = "drawingwidget1";
- this.hbox1.Add (this.drawingwidget1);
- global::Gtk.Box.BoxChild w22 = ((global::Gtk.Box.BoxChild)(this.hbox1
[this.drawingwidget1]));
- w22.Position = 1;
+ this.drawingarea = new global::Gtk.DrawingArea ();
+ this.drawingarea.Name = "drawingarea";
+ this.hbox1.Add (this.drawingarea);
+ global::Gtk.Box.BoxChild w71 = ((global::Gtk.Box.BoxChild)(this.hbox1
[this.drawingarea]));
+ w71.Position = 1;
w1.Add (this.hbox1);
- global::Gtk.Box.BoxChild w23 = ((global::Gtk.Box.BoxChild)(w1 [this.hbox1]));
- w23.Position = 0;
+ global::Gtk.Box.BoxChild w72 = ((global::Gtk.Box.BoxChild)(w1 [this.hbox1]));
+ w72.Position = 0;
// Internal child LongoMatch.Gui.Dialog.DrawingTool.ActionArea
- global::Gtk.HButtonBox w24 = this.ActionArea;
- w24.Name = "dialog1_ActionArea";
- w24.Spacing = 6;
- w24.BorderWidth = ((uint)(5));
- w24.LayoutStyle = ((global::Gtk.ButtonBoxStyle)(4));
+ global::Gtk.HButtonBox w73 = this.ActionArea;
+ w73.Name = "dialog1_ActionArea";
+ w73.Spacing = 6;
+ w73.BorderWidth = ((uint)(5));
+ w73.LayoutStyle = ((global::Gtk.ButtonBoxStyle)(4));
// Container child dialog1_ActionArea.Gtk.ButtonBox+ButtonBoxChild
- this.button271 = new global::Gtk.Button ();
- this.button271.CanFocus = true;
- this.button271.Name = "button271";
- this.button271.UseUnderline = true;
- this.button271.Label = "";
- this.AddActionWidget (this.button271, 0);
- global::Gtk.ButtonBox.ButtonBoxChild w25 =
((global::Gtk.ButtonBox.ButtonBoxChild)(w24 [this.button271]));
- w25.Expand = false;
- w25.Fill = false;
+ this.closebutton = new global::Gtk.Button ();
+ this.closebutton.CanFocus = true;
+ this.closebutton.Name = "closebutton";
+ this.closebutton.UseUnderline = true;
+ // Container child closebutton.Gtk.Container+ContainerChild
+ global::Gtk.Alignment w74 = new global::Gtk.Alignment (0.5F, 0.5F, 0F, 0F);
+ // Container child GtkAlignment.Gtk.Container+ContainerChild
+ global::Gtk.HBox w75 = new global::Gtk.HBox ();
+ w75.Spacing = 2;
+ // Container child GtkHBox.Gtk.Container+ContainerChild
+ global::Gtk.Image w76 = new global::Gtk.Image ();
+ w76.Pixbuf = global::Stetic.IconLoader.LoadIcon (this, "gtk-close",
global::Gtk.IconSize.Menu);
+ w75.Add (w76);
+ // Container child GtkHBox.Gtk.Container+ContainerChild
+ global::Gtk.Label w78 = new global::Gtk.Label ();
+ w78.LabelProp = global::Mono.Unix.Catalog.GetString ("Close");
+ w78.UseUnderline = true;
+ w75.Add (w78);
+ w74.Add (w75);
+ this.closebutton.Add (w74);
+ this.AddActionWidget (this.closebutton, 0);
+ global::Gtk.ButtonBox.ButtonBoxChild w82 =
((global::Gtk.ButtonBox.ButtonBoxChild)(w73 [this.closebutton]));
+ w82.Expand = false;
+ w82.Fill = false;
if ((this.Child != null)) {
this.Child.ShowAll ();
}
- this.DefaultWidth = 600;
- this.DefaultHeight = 579;
+ this.DefaultWidth = 977;
+ this.DefaultHeight = 863;
this.savetoprojectbutton.Hide ();
- this.button271.Hide ();
+ this.closebutton.Hide ();
this.Show ();
- this.drawingtoolbox1.LineWidthChanged += new
global::LongoMatch.Handlers.LineWidthChangedHandler (this.OnDrawingtoolbox1LineWidthChanged);
- this.drawingtoolbox1.ColorChanged += new
global::LongoMatch.Handlers.ColorChangedHandler (this.OnDrawingtoolbox1ColorChanged);
- this.drawingtoolbox1.VisibilityChanged += new
global::LongoMatch.Handlers.VisibilityChangedHandler (this.OnDrawingtoolbox1VisibilityChanged);
- this.drawingtoolbox1.ClearDrawing += new
global::LongoMatch.Handlers.ClearDrawingHandler (this.OnDrawingtoolbox1ClearDrawing);
this.savebutton.Clicked += new global::System.EventHandler (this.OnSavebuttonClicked);
this.savetoprojectbutton.Clicked += new global::System.EventHandler
(this.OnSavetoprojectbuttonClicked);
}
diff --git a/LongoMatch.GUI/gtk-gui/gui.stetic b/LongoMatch.GUI/gtk-gui/gui.stetic
index 9eeaa99..6ac0b04 100644
--- a/LongoMatch.GUI/gtk-gui/gui.stetic
+++ b/LongoMatch.GUI/gtk-gui/gui.stetic
@@ -829,7 +829,6 @@ Sort by duration</property>
<property name="MemberName" />
<property name="CanFocus">True</property>
<property name="Label" translatable="yes">Enable</property>
- <property name="Active">True</property>
<property name="DrawIndicator">True</property>
<property name="HasLabel">True</property>
<property name="UseUnderline">True</property>
@@ -962,7 +961,6 @@ Sort by duration</property>
<property name="MemberName" />
<property name="CanFocus">True</property>
<property name="Label" translatable="yes">Enable</property>
- <property name="Active">True</property>
<property name="DrawIndicator">True</property>
<property name="HasLabel">True</property>
<property name="UseUnderline">True</property>
@@ -1685,7 +1683,6 @@ new one.</property>
<property name="MemberName" />
<property name="CanFocus">True</property>
<property name="Label" translatable="yes">Enable title overlay</property>
- <property name="Active">True</property>
<property name="DrawIndicator">True</property>
<property name="HasLabel">True</property>
<property name="UseUnderline">True</property>
@@ -2480,366 +2477,6 @@ Hotkeys with a single key are also allowed with Ctrl+key.</property>
</widget>
</child>
</widget>
- <widget class="Gtk.Bin" id="LongoMatch.Gui.Component.DrawingToolBox" design-size="94 430">
- <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="toolslabel">
- <property name="MemberName" />
- <property name="Xalign">0</property>
- <property name="LabelProp" translatable="yes"><b>Tools</b></property>
- <property name="UseMarkup">True</property>
- </widget>
- <packing>
- <property name="Position">0</property>
- <property name="AutoSize">True</property>
- <property name="Expand">False</property>
- <property name="Fill">False</property>
- </packing>
- </child>
- <child>
- <widget class="Gtk.Table" id="toolstable">
- <property name="MemberName" />
- <property name="NRows">3</property>
- <property name="NColumns">2</property>
- <property name="RowSpacing">6</property>
- <property name="ColumnSpacing">6</property>
- <child>
- <widget class="Gtk.RadioButton" id="circlebutton">
- <property name="MemberName" />
- <property name="CanFocus">True</property>
- <property name="Label" translatable="yes" />
- <property name="Active">True</property>
- <property name="DrawIndicator">False</property>
- <property name="HasLabel">False</property>
- <property name="UseUnderline">True</property>
- <property name="Group">tools</property>
- <signal name="Toggled" handler="OnCirclebuttonToggled" />
- <child>
- <widget class="Gtk.Image" id="image79">
- <property name="MemberName" />
- <property name="Tooltip" translatable="yes">Circle tool</property>
- <property name="Pixbuf">resource:stock_draw-circle-unfilled.png</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="TopAttach">2</property>
- <property name="BottomAttach">3</property>
- <property name="LeftAttach">1</property>
- <property name="RightAttach">2</property>
- <property name="AutoSize">True</property>
- <property name="YOptions">Fill</property>
- <property name="XExpand">True</property>
- <property name="XFill">True</property>
- <property name="XShrink">False</property>
- <property name="YExpand">False</property>
- <property name="YFill">True</property>
- <property name="YShrink">False</property>
- </packing>
- </child>
- <child>
- <widget class="Gtk.RadioButton" id="crossbutton">
- <property name="MemberName" />
- <property name="CanFocus">True</property>
- <property name="Label" translatable="yes" />
- <property name="DrawIndicator">False</property>
- <property name="HasLabel">False</property>
- <property name="UseUnderline">True</property>
- <property name="Group">tools</property>
- <signal name="Toggled" handler="OnCrossbuttonToggled" />
- <child>
- <widget class="Gtk.Image" id="image83">
- <property name="MemberName" />
- <property name="Tooltip" translatable="yes">Cross tool</property>
- <property name="Pixbuf">resource:stock_draw-line-45.png</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="TopAttach">1</property>
- <property name="BottomAttach">2</property>
- <property name="LeftAttach">1</property>
- <property name="RightAttach">2</property>
- <property name="AutoSize">True</property>
- <property name="YOptions">Fill</property>
- <property name="XExpand">True</property>
- <property name="XFill">True</property>
- <property name="XShrink">False</property>
- <property name="YExpand">False</property>
- <property name="YFill">True</property>
- <property name="YShrink">False</property>
- </packing>
- </child>
- <child>
- <widget class="Gtk.RadioButton" id="eraserbutton">
- <property name="MemberName" />
- <property name="Tooltip" translatable="yes">Rubber tool</property>
- <property name="CanFocus">True</property>
- <property name="Label" translatable="yes" />
- <property name="DrawIndicator">False</property>
- <property name="HasLabel">False</property>
- <property name="UseUnderline">True</property>
- <property name="Group">tools</property>
- <signal name="Toggled" handler="OnEraserbuttonToggled" />
- <child>
- <widget class="Gtk.Image" id="image81">
- <property name="MemberName" />
- <property name="Pixbuf">stock:gtk-delete Menu</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="LeftAttach">1</property>
- <property name="RightAttach">2</property>
- <property name="AutoSize">True</property>
- <property name="YOptions">Fill</property>
- <property name="XExpand">True</property>
- <property name="XFill">True</property>
- <property name="XShrink">False</property>
- <property name="YExpand">False</property>
- <property name="YFill">True</property>
- <property name="YShrink">False</property>
- </packing>
- </child>
- <child>
- <widget class="Gtk.RadioButton" id="linebutton">
- <property name="MemberName" />
- <property name="CanFocus">True</property>
- <property name="Label" translatable="yes" />
- <property name="DrawIndicator">False</property>
- <property name="HasLabel">False</property>
- <property name="UseUnderline">True</property>
- <property name="Group">tools</property>
- <signal name="Toggled" handler="OnLinebuttonToggled" />
- <child>
- <widget class="Gtk.Image" id="image82">
- <property name="MemberName" />
- <property name="Tooltip" translatable="yes">Arrow line tool</property>
- <property name="Pixbuf">resource:stock_draw-line-ends-with-arrow.png</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="TopAttach">1</property>
- <property name="BottomAttach">2</property>
- <property name="AutoSize">True</property>
- <property name="YOptions">Fill</property>
- <property name="XExpand">True</property>
- <property name="XFill">True</property>
- <property name="XShrink">False</property>
- <property name="YExpand">False</property>
- <property name="YFill">True</property>
- <property name="YShrink">False</property>
- </packing>
- </child>
- <child>
- <widget class="Gtk.RadioButton" id="penbutton">
- <property name="MemberName" />
- <property name="Tooltip" translatable="yes">Pencil tool</property>
- <property name="CanFocus">True</property>
- <property name="Label" translatable="yes" />
- <property name="DrawIndicator">False</property>
- <property name="HasLabel">False</property>
- <property name="UseUnderline">True</property>
- <property name="Group">tools</property>
- <signal name="Toggled" handler="OnPenbuttonToggled" />
- <child>
- <widget class="Gtk.Image" id="image80">
- <property name="MemberName" />
- <property name="Tooltip" translatable="yes">Pencil</property>
- <property name="Pixbuf">resource:stock_draw-freeform-line.png</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="AutoSize">True</property>
- <property name="YOptions">Fill</property>
- <property name="XExpand">True</property>
- <property name="XFill">True</property>
- <property name="XShrink">False</property>
- <property name="YExpand">False</property>
- <property name="YFill">True</property>
- <property name="YShrink">False</property>
- </packing>
- </child>
- <child>
- <widget class="Gtk.RadioButton" id="rectanglebutton">
- <property name="MemberName" />
- <property name="CanFocus">True</property>
- <property name="Label" translatable="yes" />
- <property name="DrawIndicator">False</property>
- <property name="HasLabel">False</property>
- <property name="UseUnderline">True</property>
- <property name="Group">tools</property>
- <signal name="Toggled" handler="OnRectanglebuttonToggled" />
- <child>
- <widget class="Gtk.Image" id="image84">
- <property name="MemberName" />
- <property name="Tooltip" translatable="yes">Rectangle tool</property>
- <property name="Pixbuf">resource:stock_draw-rectangle-unfilled.png</property>
- </widget>
- </child>
- </widget>
- <packing>
- <property name="TopAttach">2</property>
- <property name="BottomAttach">3</property>
- <property name="AutoSize">True</property>
- <property name="YOptions">Fill</property>
- <property name="XExpand">True</property>
- <property name="XFill">True</property>
- <property name="XShrink">False</property>
- <property name="YExpand">False</property>
- <property name="YFill">True</property>
- <property name="YShrink">False</property>
- </packing>
- </child>
- </widget>
- <packing>
- <property name="Position">1</property>
- <property name="AutoSize">False</property>
- <property name="Expand">False</property>
- </packing>
- </child>
- <child>
- <widget class="Gtk.Label" id="colorslabel">
- <property name="MemberName" />
- <property name="Xalign">0</property>
- <property name="LabelProp" translatable="yes"><b>Color</b></property>
- <property name="UseMarkup">True</property>
- </widget>
- <packing>
- <property name="Position">2</property>
- <property name="AutoSize">True</property>
- <property name="Expand">False</property>
- <property name="Fill">False</property>
- </packing>
- </child>
- <child>
- <widget class="Gtk.ColorButton" id="colorbutton">
- <property name="MemberName" />
- <property name="CanFocus">True</property>
- <property name="Events">ButtonMotionMask, ButtonPressMask, ButtonReleaseMask</property>
- <property name="Alpha">-1</property>
- <signal name="ColorSet" handler="OnColorbuttonColorSet" />
- </widget>
- <packing>
- <property name="Position">3</property>
- <property name="AutoSize">True</property>
- <property name="Expand">False</property>
- <property name="Fill">False</property>
- </packing>
- </child>
- <child>
- <widget class="Gtk.Label" id="label3">
- <property name="MemberName" />
- <property name="Xalign">0</property>
- <property name="LabelProp" translatable="yes"><b>Width</b></property>
- <property name="UseMarkup">True</property>
- </widget>
- <packing>
- <property name="Position">4</property>
- <property name="AutoSize">True</property>
- <property name="Expand">False</property>
- <property name="Fill">False</property>
- </packing>
- </child>
- <child>
- <widget class="Gtk.ComboBox" id="combobox1">
- <property name="MemberName" />
- <property name="Tooltip">Change the line's width</property>
- <property name="IsTextCombo">True</property>
- <property name="Items">2 px
-4 px
-6 px
-8 px
-10 px</property>
- <property name="Active">2</property>
- <signal name="Changed" handler="OnCombobox1Changed" />
- </widget>
- <packing>
- <property name="Position">5</property>
- <property name="AutoSize">True</property>
- <property name="Expand">False</property>
- <property name="Fill">False</property>
- </packing>
- </child>
- <child>
- <widget class="Gtk.Label" id="transparencylabel">
- <property name="MemberName" />
- <property name="Xalign">0</property>
- <property name="LabelProp" translatable="yes"><b>Transparency</b></property>
- <property name="UseMarkup">True</property>
- </widget>
- <packing>
- <property name="Position">6</property>
- <property name="AutoSize">True</property>
- <property name="Expand">False</property>
- <property name="Fill">False</property>
- </packing>
- </child>
- <child>
- <widget class="Gtk.SpinButton" id="spinbutton1">
- <property name="MemberName" />
- <property name="Tooltip" translatable="yes">Change the drawings' transparency</property>
- <property name="CanFocus">True</property>
- <property name="Upper">100</property>
- <property name="PageIncrement">10</property>
- <property name="StepIncrement">1</property>
- <property name="ClimbRate">1</property>
- <property name="Numeric">True</property>
- <property name="Value">80</property>
- <signal name="Changed" handler="OnSpinbutton1Changed" />
- </widget>
- <packing>
- <property name="Position">7</property>
- <property name="AutoSize">True</property>
- <property name="Expand">False</property>
- <property name="Fill">False</property>
- </packing>
- </child>
- <child>
- <widget class="Gtk.Button" id="clearbutton">
- <property name="MemberName" />
- <property name="Tooltip" translatable="yes">Clear all drawings</property>
- <property name="CanFocus">True</property>
- <property name="Type">TextAndIcon</property>
- <property name="Icon">stock:gtk-clear LargeToolbar</property>
- <property name="Label" translatable="yes" />
- <property name="UseUnderline">True</property>
- <signal name="Clicked" handler="OnClearbuttonClicked" />
- </widget>
- <packing>
- <property name="Position">8</property>
- <property name="AutoSize">False</property>
- <property name="Expand">False</property>
- <property name="Fill">False</property>
- </packing>
- </child>
- <child>
- <widget class="Gtk.Label" id="label1">
- <property name="MemberName" />
- <property name="LabelProp" translatable="yes">Draw-><b> D</b>
-Clear-><b> C</b>
-Hide-><b> S</b>
-Show-><b> S</b>
-</property>
- <property name="UseMarkup">True</property>
- </widget>
- <packing>
- <property name="Position">9</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.EditCategoryDialog" design-size="522 538">
<property name="MemberName" />
<property name="Title" translatable="yes">Category Details</property>
@@ -2890,36 +2527,7 @@ Show-><b> S</b>
</widget>
</child>
</widget>
- <widget class="Gtk.Bin" id="LongoMatch.Gui.Component.DrawingWidget" design-size="300 300">
- <property name="MemberName" />
- <property name="Visible">False</property>
- <child>
- <widget class="Gtk.ScrolledWindow" id="GtkScrolledWindow">
- <property name="MemberName" />
- <property name="ShadowType">In</property>
- <child>
- <widget class="Gtk.Viewport" id="GtkViewport">
- <property name="MemberName" />
- <property name="ShadowType">None</property>
- <child>
- <widget class="Gtk.DrawingArea" id="drawingarea">
- <property name="MemberName" />
- <property name="Events">ButtonMotionMask, ButtonPressMask, ButtonReleaseMask</property>
- <property name="ShowScrollbars">True</property>
- <signal name="ExposeEvent" handler="OnDrawingareaExposeEvent" />
- <signal name="ButtonPressEvent" handler="OnDrawingareaButtonPressEvent" />
- <signal name="ButtonReleaseEvent" handler="OnDrawingareaButtonReleaseEvent" />
- <signal name="MotionNotifyEvent" handler="OnDrawingareaMotionNotifyEvent" />
- <signal name="SizeAllocated" handler="OnDrawingareaSizeAllocated" />
- <signal name="ConfigureEvent" handler="OnDrawingareaConfigureEvent" />
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- </child>
- </widget>
- <widget class="Gtk.Dialog" id="LongoMatch.Gui.Dialog.DrawingTool" design-size="600 579">
+ <widget class="Gtk.Dialog" id="LongoMatch.Gui.Dialog.DrawingTool" design-size="977 863">
<property name="MemberName" />
<property name="Title" translatable="yes">Drawing Tool</property>
<property name="Icon">resource:logo.svg</property>
@@ -2943,13 +2551,642 @@ Show-><b> S</b>
<property name="MemberName" />
<property name="Spacing">6</property>
<child>
- <widget class="LongoMatch.Gui.Component.DrawingToolBox" id="drawingtoolbox1">
+ <widget class="Gtk.VBox" id="vbox3">
<property name="MemberName" />
- <property name="Events">ButtonPressMask</property>
- <signal name="LineWidthChanged" handler="OnDrawingtoolbox1LineWidthChanged" />
- <signal name="ColorChanged" handler="OnDrawingtoolbox1ColorChanged" />
- <signal name="VisibilityChanged" handler="OnDrawingtoolbox1VisibilityChanged" />
- <signal name="ClearDrawing" handler="OnDrawingtoolbox1ClearDrawing" />
+ <property name="Spacing">6</property>
+ <child>
+ <widget class="Gtk.Label" id="toolslabel">
+ <property name="MemberName" />
+ <property name="Xalign">0</property>
+ <property name="LabelProp" translatable="yes"><b>Tools</b></property>
+ <property name="UseMarkup">True</property>
+ </widget>
+ <packing>
+ <property name="Position">0</property>
+ <property name="AutoSize">True</property>
+ <property name="Expand">False</property>
+ <property name="Fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Table" id="toolstable">
+ <property name="MemberName" />
+ <property name="NRows">7</property>
+ <property name="NColumns">2</property>
+ <property name="Homogeneous">True</property>
+ <property name="RowSpacing">6</property>
+ <property name="ColumnSpacing">6</property>
+ <child>
+ <placeholder />
+ </child>
+ <child>
+ <widget class="Gtk.RadioButton" id="anglebutton">
+ <property name="MemberName" />
+ <property name="Tooltip" translatable="yes">Angle tool</property>
+ <property name="CanFocus">True</property>
+ <property name="Label" translatable="yes" />
+ <property name="Active">True</property>
+ <property name="DrawIndicator">False</property>
+ <property name="HasLabel">False</property>
+ <property name="UseUnderline">True</property>
+ <property name="Group">tools</property>
+ <child>
+ <widget class="Gtk.Image" id="image90">
+ <property name="MemberName" />
+ <property name="Tooltip" translatable="yes" />
+ <property name="Pixbuf">stock:gtk-go-down Menu</property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="TopAttach">6</property>
+ <property name="BottomAttach">7</property>
+ <property name="AutoSize">True</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">True</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.RadioButton" id="crossbutton">
+ <property name="MemberName" />
+ <property name="Tooltip" translatable="yes">Cross tool</property>
+ <property name="CanFocus">True</property>
+ <property name="Label" translatable="yes" />
+ <property name="DrawIndicator">False</property>
+ <property name="HasLabel">False</property>
+ <property name="UseUnderline">True</property>
+ <property name="Group">tools</property>
+ <child>
+ <widget class="Gtk.Image" id="image83">
+ <property name="MemberName" />
+ <property name="Tooltip" translatable="yes" />
+ <property name="Pixbuf">resource:draw-cross.png</property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="TopAttach">2</property>
+ <property name="BottomAttach">3</property>
+ <property name="LeftAttach">1</property>
+ <property name="RightAttach">2</property>
+ <property name="AutoSize">True</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">True</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.RadioButton" id="ellipsebutton">
+ <property name="MemberName" />
+ <property name="Tooltip" translatable="yes">Ellipse tool</property>
+ <property name="CanFocus">True</property>
+ <property name="Label" translatable="yes" />
+ <property name="DrawIndicator">False</property>
+ <property name="HasLabel">False</property>
+ <property name="UseUnderline">True</property>
+ <property name="Group">tools</property>
+ <child>
+ <widget class="Gtk.Image" id="image79">
+ <property name="MemberName" />
+ <property name="Tooltip" translatable="yes" />
+ <property name="Pixbuf">resource:draw-circle-unfilled.png</property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="TopAttach">3</property>
+ <property name="BottomAttach">4</property>
+ <property name="LeftAttach">1</property>
+ <property name="RightAttach">2</property>
+ <property name="AutoSize">True</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">True</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.RadioButton" id="ellipsefilledbutton">
+ <property name="MemberName" />
+ <property name="Tooltip" translatable="yes">Filled ellipse</property>
+ <property name="CanFocus">True</property>
+ <property name="Label" translatable="yes" />
+ <property name="DrawIndicator">False</property>
+ <property name="HasLabel">False</property>
+ <property name="UseUnderline">True</property>
+ <property name="Group">tools</property>
+ <child>
+ <widget class="Gtk.Image" id="image86">
+ <property name="MemberName" />
+ <property name="Tooltip" translatable="yes" />
+ <property name="Pixbuf">resource:draw-ellipse.png</property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="TopAttach">4</property>
+ <property name="BottomAttach">5</property>
+ <property name="LeftAttach">1</property>
+ <property name="RightAttach">2</property>
+ <property name="AutoSize">True</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">True</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.RadioButton" id="eraserbutton">
+ <property name="MemberName" />
+ <property name="Tooltip" translatable="yes">Rubber tool</property>
+ <property name="CanFocus">True</property>
+ <property name="Label" translatable="yes" />
+ <property name="DrawIndicator">False</property>
+ <property name="HasLabel">False</property>
+ <property name="UseUnderline">True</property>
+ <property name="Group">tools</property>
+ <child>
+ <widget class="Gtk.Image" id="image81">
+ <property name="MemberName" />
+ <property name="Pixbuf">resource:draw-eraser.png</property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="LeftAttach">1</property>
+ <property name="RightAttach">2</property>
+ <property name="AutoSize">True</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">True</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.RadioButton" id="linebutton">
+ <property name="MemberName" />
+ <property name="Tooltip" translatable="yes">Line tool</property>
+ <property name="CanFocus">True</property>
+ <property name="Label" translatable="yes" />
+ <property name="DrawIndicator">False</property>
+ <property name="HasLabel">False</property>
+ <property name="UseUnderline">True</property>
+ <property name="Group">tools</property>
+ <child>
+ <widget class="Gtk.Image" id="image82">
+ <property name="MemberName" />
+ <property name="Tooltip" translatable="yes" />
+ <property name="Pixbuf">resource:draw-arrow.png</property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="TopAttach">2</property>
+ <property name="BottomAttach">3</property>
+ <property name="AutoSize">True</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">True</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.RadioButton" id="numberbutton">
+ <property name="MemberName" />
+ <property name="Tooltip" translatable="yes">Index tool</property>
+ <property name="CanFocus">True</property>
+ <property name="Label" translatable="yes" />
+ <property name="DrawIndicator">False</property>
+ <property name="HasLabel">False</property>
+ <property name="UseUnderline">True</property>
+ <property name="Group">tools</property>
+ <child>
+ <widget class="Gtk.Image" id="image88">
+ <property name="MemberName" />
+ <property name="Tooltip" translatable="yes" />
+ <property name="Pixbuf">resource:draw-number.png</property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="TopAttach">5</property>
+ <property name="BottomAttach">6</property>
+ <property name="LeftAttach">1</property>
+ <property name="RightAttach">2</property>
+ <property name="AutoSize">True</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">True</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.RadioButton" id="penbutton">
+ <property name="MemberName" />
+ <property name="Tooltip" translatable="yes">Pencil tool</property>
+ <property name="CanFocus">True</property>
+ <property name="Label" translatable="yes" />
+ <property name="DrawIndicator">False</property>
+ <property name="HasLabel">False</property>
+ <property name="UseUnderline">True</property>
+ <property name="Group">tools</property>
+ <child>
+ <widget class="Gtk.Image" id="image91">
+ <property name="MemberName" />
+ <property name="Tooltip" translatable="yes" />
+ <property name="Pixbuf">resource:draw-freehand.png</property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="TopAttach">1</property>
+ <property name="BottomAttach">2</property>
+ <property name="AutoSize">True</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">True</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.RadioButton" id="playerbutton">
+ <property name="MemberName" />
+ <property name="Tooltip" translatable="yes">Player tool</property>
+ <property name="CanFocus">True</property>
+ <property name="Label" translatable="yes" />
+ <property name="DrawIndicator">False</property>
+ <property name="HasLabel">False</property>
+ <property name="UseUnderline">True</property>
+ <property name="Group">tools</property>
+ <child>
+ <widget class="Gtk.Image" id="image89">
+ <property name="MemberName" />
+ <property name="Tooltip" translatable="yes" />
+ <property name="Pixbuf">stock:stock_person Menu</property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="TopAttach">5</property>
+ <property name="BottomAttach">6</property>
+ <property name="AutoSize">True</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">True</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.RadioButton" id="rectanglebutton">
+ <property name="MemberName" />
+ <property name="Tooltip" translatable="yes">Rectangle tool</property>
+ <property name="CanFocus">True</property>
+ <property name="Label" translatable="yes" />
+ <property name="DrawIndicator">False</property>
+ <property name="HasLabel">False</property>
+ <property name="UseUnderline">True</property>
+ <property name="Group">tools</property>
+ <child>
+ <widget class="Gtk.Image" id="image84">
+ <property name="MemberName" />
+ <property name="Tooltip" translatable="yes" />
+ <property name="Pixbuf">resource:draw-rectangle-unfilled.png</property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="TopAttach">3</property>
+ <property name="BottomAttach">4</property>
+ <property name="AutoSize">True</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">True</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.RadioButton" id="rectanglefilledbutton">
+ <property name="MemberName" />
+ <property name="Tooltip" translatable="yes">Filled rectangle tool</property>
+ <property name="CanFocus">True</property>
+ <property name="Label" translatable="yes" />
+ <property name="DrawIndicator">False</property>
+ <property name="HasLabel">False</property>
+ <property name="UseUnderline">True</property>
+ <property name="Group">tools</property>
+ <child>
+ <widget class="Gtk.Image" id="image85">
+ <property name="MemberName" />
+ <property name="Tooltip" translatable="yes" />
+ <property name="Pixbuf">resource:draw-rectangle.png</property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="TopAttach">4</property>
+ <property name="BottomAttach">5</property>
+ <property name="AutoSize">True</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">True</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.RadioButton" id="selectbutton">
+ <property name="MemberName" />
+ <property name="Tooltip" translatable="yes">Selection tool</property>
+ <property name="CanFocus">True</property>
+ <property name="Label" translatable="yes" />
+ <property name="DrawIndicator">False</property>
+ <property name="HasLabel">False</property>
+ <property name="UseUnderline">True</property>
+ <property name="Group">tools</property>
+ <child>
+ <widget class="Gtk.Image" id="image80">
+ <property name="MemberName" />
+ <property name="Tooltip" translatable="yes" />
+ <property name="Pixbuf">resource:draw-pointer.png</property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="AutoSize">True</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">True</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.RadioButton" id="textbutton">
+ <property name="MemberName" />
+ <property name="Tooltip" translatable="yes">Text tool</property>
+ <property name="CanFocus">True</property>
+ <property name="Label" translatable="yes" />
+ <property name="DrawIndicator">False</property>
+ <property name="HasLabel">False</property>
+ <property name="UseUnderline">True</property>
+ <property name="Group">tools</property>
+ <child>
+ <widget class="Gtk.Image" id="image87">
+ <property name="MemberName" />
+ <property name="Tooltip" translatable="yes" />
+ <property name="Pixbuf">resource:draw-text.png</property>
+ </widget>
+ </child>
+ </widget>
+ <packing>
+ <property name="TopAttach">1</property>
+ <property name="BottomAttach">2</property>
+ <property name="LeftAttach">1</property>
+ <property name="RightAttach">2</property>
+ <property name="AutoSize">True</property>
+ <property name="YOptions">Fill</property>
+ <property name="XExpand">True</property>
+ <property name="XFill">True</property>
+ <property name="XShrink">False</property>
+ <property name="YExpand">False</property>
+ <property name="YFill">True</property>
+ <property name="YShrink">False</property>
+ </packing>
+ </child>
+ </widget>
+ <packing>
+ <property name="Position">1</property>
+ <property name="AutoSize">False</property>
+ <property name="Expand">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Label" id="colorslabel">
+ <property name="MemberName" />
+ <property name="Xalign">0</property>
+ <property name="LabelProp" translatable="yes"><b>Color</b></property>
+ <property name="UseMarkup">True</property>
+ </widget>
+ <packing>
+ <property name="Position">2</property>
+ <property name="AutoSize">True</property>
+ <property name="Expand">False</property>
+ <property name="Fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.ColorButton" id="colorbutton">
+ <property name="MemberName" />
+ <property name="CanFocus">True</property>
+ <property name="Events">ButtonMotionMask, ButtonPressMask,
ButtonReleaseMask</property>
+ <property name="Alpha">-1</property>
+ </widget>
+ <packing>
+ <property name="Position">3</property>
+ <property name="AutoSize">True</property>
+ <property name="Expand">False</property>
+ <property name="Fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Label" id="label3">
+ <property name="MemberName" />
+ <property name="Xalign">0</property>
+ <property name="LabelProp" translatable="yes"><b>Line size</b></property>
+ <property name="UseMarkup">True</property>
+ </widget>
+ <packing>
+ <property name="Position">4</property>
+ <property name="AutoSize">True</property>
+ <property name="Expand">False</property>
+ <property name="Fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.ComboBox" id="widthcombobox">
+ <property name="MemberName" />
+ <property name="Tooltip">Change the line width</property>
+ <property name="IsTextCombo">True</property>
+ <property name="Items">2 px
+4 px
+6 px
+8 px
+10 px</property>
+ <property name="Active">2</property>
+ </widget>
+ <packing>
+ <property name="Position">5</property>
+ <property name="AutoSize">True</property>
+ <property name="Expand">False</property>
+ <property name="Fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Label" id="label4">
+ <property name="MemberName" />
+ <property name="Xalign">0</property>
+ <property name="LabelProp" translatable="yes"><b>Line
style</b></property>
+ <property name="UseMarkup">True</property>
+ </widget>
+ <packing>
+ <property name="Position">6</property>
+ <property name="AutoSize">True</property>
+ <property name="Expand">False</property>
+ <property name="Fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.ComboBox" id="stylecombobox">
+ <property name="MemberName" />
+ <property name="Tooltip">Change the line style</property>
+ <property name="IsTextCombo">True</property>
+ <property name="Items" />
+ </widget>
+ <packing>
+ <property name="Position">7</property>
+ <property name="AutoSize">True</property>
+ <property name="Expand">False</property>
+ <property name="Fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Label" id="label5">
+ <property name="MemberName" />
+ <property name="Xalign">0</property>
+ <property name="LabelProp" translatable="yes"><b>Line type</b></property>
+ <property name="UseMarkup">True</property>
+ </widget>
+ <packing>
+ <property name="Position">8</property>
+ <property name="AutoSize">True</property>
+ <property name="Expand">False</property>
+ <property name="Fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.ComboBox" id="typecombobox">
+ <property name="MemberName" />
+ <property name="Tooltip">Change the line style</property>
+ <property name="IsTextCombo">True</property>
+ <property name="Items" />
+ </widget>
+ <packing>
+ <property name="Position">9</property>
+ <property name="AutoSize">True</property>
+ <property name="Expand">False</property>
+ <property name="Fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Label" id="textcolorslabel">
+ <property name="MemberName" />
+ <property name="Xalign">0</property>
+ <property name="LabelProp" translatable="yes"><b>Text
color</b></property>
+ <property name="UseMarkup">True</property>
+ </widget>
+ <packing>
+ <property name="Position">10</property>
+ <property name="AutoSize">True</property>
+ <property name="Expand">False</property>
+ <property name="Fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.ColorButton" id="textcolorbutton">
+ <property name="MemberName" />
+ <property name="CanFocus">True</property>
+ <property name="Events">ButtonMotionMask, ButtonPressMask,
ButtonReleaseMask</property>
+ <property name="Alpha">-1</property>
+ </widget>
+ <packing>
+ <property name="Position">11</property>
+ <property name="AutoSize">True</property>
+ <property name="Expand">False</property>
+ <property name="Fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Label" id="backgroundcolorslabel">
+ <property name="MemberName" />
+ <property name="Xalign">0</property>
+ <property name="LabelProp" translatable="yes"><b>Text
background</b></property>
+ <property name="UseMarkup">True</property>
+ </widget>
+ <packing>
+ <property name="Position">12</property>
+ <property name="AutoSize">True</property>
+ <property name="Expand">False</property>
+ <property name="Fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.ColorButton" id="backgroundcolorbutton">
+ <property name="MemberName" />
+ <property name="CanFocus">True</property>
+ <property name="Events">ButtonMotionMask, ButtonPressMask,
ButtonReleaseMask</property>
+ <property name="Alpha">-1</property>
+ </widget>
+ <packing>
+ <property name="Position">13</property>
+ <property name="AutoSize">True</property>
+ <property name="Expand">False</property>
+ <property name="Fill">False</property>
+ </packing>
+ </child>
+ <child>
+ <widget class="Gtk.Button" id="clearbutton">
+ <property name="MemberName" />
+ <property name="Tooltip" translatable="yes">Clear all drawings</property>
+ <property name="CanFocus">True</property>
+ <property name="Type">TextAndIcon</property>
+ <property name="Icon">stock:gtk-clear LargeToolbar</property>
+ <property name="Label" translatable="yes" />
+ <property name="UseUnderline">True</property>
+ </widget>
+ <packing>
+ <property name="Position">14</property>
+ <property name="AutoSize">False</property>
+ <property name="Expand">False</property>
+ <property name="Fill">False</property>
+ </packing>
+ </child>
</widget>
<packing>
<property name="Position">0</property>
@@ -3004,13 +3241,12 @@ Show-><b> S</b>
</packing>
</child>
<child>
- <widget class="LongoMatch.Gui.Component.DrawingWidget" id="drawingwidget1">
+ <widget class="Gtk.DrawingArea" id="drawingarea">
<property name="MemberName" />
- <property name="Events">ButtonPressMask</property>
</widget>
<packing>
<property name="Position">1</property>
- <property name="AutoSize">False</property>
+ <property name="AutoSize">True</property>
</packing>
</child>
</widget>
@@ -3029,12 +3265,13 @@ Show-><b> S</b>
<property name="Size">1</property>
<property name="LayoutStyle">End</property>
<child>
- <widget class="Gtk.Button" id="button271">
+ <widget class="Gtk.Button" id="closebutton">
<property name="MemberName" />
<property name="Visible">False</property>
<property name="CanFocus">True</property>
- <property name="Type">TextOnly</property>
- <property name="Label" translatable="yes" />
+ <property name="Type">TextAndIcon</property>
+ <property name="Icon">stock:gtk-close Menu</property>
+ <property name="Label" translatable="yes">Close</property>
<property name="UseUnderline">True</property>
<property name="ResponseId">0</property>
</widget>
@@ -5969,6 +6206,7 @@ You can continue with the current capture, cancel it or save your project.
<property name="MemberName" />
<property name="CanFocus">True</property>
<property name="Label" translatable="yes">New project using a video
file</property>
+ <property name="Active">True</property>
<property name="DrawIndicator">True</property>
<property name="HasLabel">True</property>
<property name="UseUnderline">True</property>
@@ -9175,17 +9413,6 @@ Click 2 players to swap them</property>
</child>
</widget>
<widget class="Gtk.Bin" id="LongoMatch.Gui.Component.CodingWidget" design-size="673 300">
- <action-group name="Timeline">
- <action id="positionMode">
- <property name="Type">Radio</property>
- <property name="Label" translatable="yes" />
- <property name="StockId">gtk-justify-fill</property>
- <property name="DrawAsRadio">False</property>
- <property name="Active">False</property>
- <property name="Value">0</property>
- <property name="Group">codingmode</property>
- </action>
- </action-group>
<action-group name="Default">
<action id="timelineMode">
<property name="Type">Radio</property>
@@ -9222,6 +9449,17 @@ Click 2 players to swap them</property>
<property name="Group">codingmode</property>
</action>
</action-group>
+ <action-group name="Timeline">
+ <action id="positionMode">
+ <property name="Type">Radio</property>
+ <property name="Label" translatable="yes" />
+ <property name="StockId">gtk-justify-fill</property>
+ <property name="DrawAsRadio">False</property>
+ <property name="Active">False</property>
+ <property name="Value">0</property>
+ <property name="Group">codingmode</property>
+ </action>
+ </action-group>
<property name="MemberName" />
<property name="Visible">False</property>
<child>
diff --git a/LongoMatch.GUI/gtk-gui/objects.xml b/LongoMatch.GUI/gtk-gui/objects.xml
index 083d16c..2759da1 100644
--- a/LongoMatch.GUI/gtk-gui/objects.xml
+++ b/LongoMatch.GUI/gtk-gui/objects.xml
@@ -7,19 +7,6 @@
<itemgroups />
<signals />
</object>
- <object type="LongoMatch.Gui.Component.DrawingToolBox" palette-category="General" allow-children="false"
base-type="Gtk.Bin">
- <itemgroups />
- <signals>
- <itemgroup label="DrawingToolBox Signals">
- <signal name="LineWidthChanged" />
- <signal name="DrawToolChanged" />
- <signal name="ColorChanged" />
- <signal name="VisibilityChanged" />
- <signal name="ClearDrawing" />
- <signal name="TransparencyChanged" />
- </itemgroup>
- </signals>
- </object>
<object type="LongoMatch.Gui.Component.NotesWidget" palette-category="General" allow-children="false"
base-type="Gtk.Bin">
<itemgroups />
<signals />
@@ -95,14 +82,6 @@
<itemgroups />
<signals />
</object>
- <object type="LongoMatch.Gui.Component.DrawingWidget" palette-category="General" allow-children="false"
base-type="Gtk.Bin">
- <itemgroups />
- <signals />
- </object>
- <object type="LongoMatch.Gui.Component.BackgroundWidget" palette-category="General" allow-children="false"
base-type="Gtk.Bin">
- <itemgroups />
- <signals />
- </object>
<object type="LongoMatch.Gui.SubCategoriesTreeView" palette-category="General" allow-children="false"
base-type="Gtk.TreeView">
<itemgroups />
<signals>
@@ -142,8 +121,7 @@
<signals />
</object>
<object type="LongoMatch.Gui.Component.CoordinatesTagger" palette-category="General"
allow-children="false" base-type="Gtk.Bin">
- <itemgroups>
- </itemgroups>
+ <itemgroups />
<signals />
</object>
<object type="LongoMatch.Gui.Component.GeneralPreferencesPanel" palette-category="General"
allow-children="false" base-type="Gtk.Bin">
@@ -228,6 +206,10 @@
<itemgroups />
<signals />
</object>
+ <object type="LongoMatch.Gui.Component.BackgroundWidget" palette-category="General" allow-children="false"
base-type="Gtk.Bin">
+ <itemgroups />
+ <signals />
+ </object>
<object type="LongoMatch.Gui.Panel.OpenProjectPanel" palette-category="General" allow-children="false"
base-type="Gtk.Bin">
<itemgroups />
<signals>
@@ -312,14 +294,17 @@
<itemgroups />
<signals />
</object>
+ <object type="LongoMatch.Gui.Component.PlaysPositionViewer" palette-category="General"
allow-children="false" base-type="Gtk.Bin">
+ <itemgroups />
+ <signals />
+ </object>
<object type="LongoMatch.Gui.CapturerBin" palette-category="General" allow-children="false"
base-type="Gtk.Bin">
<itemgroups>
<itemgroup label="CapturerBin Properties">
<property name="Capturing" />
</itemgroup>
</itemgroups>
- <signals>
- </signals>
+ <signals />
</object>
<object type="LongoMatch.Gui.PlayerBin" palette-category="General" allow-children="false"
base-type="Gtk.Bin">
<itemgroups>
@@ -328,7 +313,7 @@
</itemgroup>
</itemgroups>
<signals>
- <itemgroup label="IPlayerBin Signals">
+ <itemgroup label="PlayerBin Signals">
<signal name="Tick" />
<signal name="PlayStateChanged" />
<signal name="SeekEvent" />
@@ -342,14 +327,10 @@
</itemgroup>
</itemgroups>
<signals>
- <itemgroup label="ICapturerBin Signals">
+ <itemgroup label="IPlayerBin Signals">
<signal name="PlayStateChanged" />
<signal name="SeekEvent" />
</itemgroup>
</signals>
</object>
- <object type="LongoMatch.Gui.Component.PlaysPositionViewer" palette-category="General"
allow-children="false" base-type="Gtk.Bin">
- <itemgroups />
- <signals />
- </object>
</objects>
\ No newline at end of file
diff --git a/LongoMatch.Multimedia/Player/GstPlayer.cs b/LongoMatch.Multimedia/Player/GstPlayer.cs
index 06f3d6a..a845f85 100644
--- a/LongoMatch.Multimedia/Player/GstPlayer.cs
+++ b/LongoMatch.Multimedia/Player/GstPlayer.cs
@@ -461,14 +461,19 @@ namespace LongoMatch.Video.Player {
}
public Image GetCurrentFrame (int outwidth=-1, int outheight=-1) {
- IntPtr raw_ret = lgm_video_player_get_current_frame (Handle);
- Gdk.Pixbuf unmanaged = GLib.Object.GetObject(raw_ret) as Gdk.Pixbuf;
+ Gdk.Pixbuf managed, unmanaged;
+ IntPtr raw_ret;
+ int h, w;
+ double rate;
+
+ raw_ret = lgm_video_player_get_current_frame (Handle);
+ unmanaged = GLib.Object.GetObject(raw_ret) as Gdk.Pixbuf;
if(unmanaged == null)
return null;
- Gdk.Pixbuf managed;
- int h = unmanaged.Height;
- int w = unmanaged.Width;
- double rate = (double)w/(double)h;
+
+ h = unmanaged.Height;
+ w = unmanaged.Width;
+ rate = (double)w/(double)h;
if(outwidth == -1 || outheight == -1) {
outwidth = w;
outheight = h;
@@ -477,6 +482,7 @@ namespace LongoMatch.Video.Player {
} else {
outheight = (int)(outwidth/rate);
}
+
managed = unmanaged.ScaleSimple(outwidth,outheight,Gdk.InterpType.Bilinear);
unmanaged.Dispose();
lgm_video_player_unref_pixbuf (raw_ret);
diff --git a/LongoMatch.Services/Services/EventsManager.cs b/LongoMatch.Services/Services/EventsManager.cs
index fb141ef..437e6b6 100644
--- a/LongoMatch.Services/Services/EventsManager.cs
+++ b/LongoMatch.Services/Services/EventsManager.cs
@@ -88,7 +88,7 @@ namespace LongoMatch.Services
Config.EventsBroker.PlaysDeleted += OnPlaysDeleted;
Config.EventsBroker.PlaySelected += OnPlaySelected;
Config.EventsBroker.PlayCategoryChanged += OnPlayCategoryChanged;
- Config.EventsBroker.DuplicatePlay += OnDuplicatePlay;
+ Config.EventsBroker.DuplicatePlays += OnDuplicatePlays;
Config.EventsBroker.PlayListNodeSelectedEvent += (tn) => {loadedPlay = tn;};
Config.EventsBroker.SnapshotSeries += OnSnapshotSeries;
@@ -328,14 +328,16 @@ namespace LongoMatch.Services
filter.Update();
}
- void OnDuplicatePlay (Play play)
+ void OnDuplicatePlays (List<Play> plays)
{
- Play copy = Cloner.Clone (play);
- copy.ID = Guid.NewGuid();
- /* The category is also serialized and desarialized */
- copy.Category = play.Category;
- openedProject.AddPlay (copy);
- analysisWindow.AddPlay (copy);
+ foreach (Play play in plays) {
+ Play copy = Cloner.Clone (play);
+ copy.ID = Guid.NewGuid();
+ /* The category is also serialized and desarialized */
+ copy.Category = play.Category;
+ openedProject.AddPlay (copy);
+ analysisWindow.AddPlay (copy);
+ }
filter.Update();
}
@@ -358,11 +360,20 @@ namespace LongoMatch.Services
player.Seek (pos, false);
}
- protected virtual void OnDrawFrame (Time time) {
- Image pixbuf = null;
+ protected virtual void OnDrawFrame (Play play, int drawingIndex) {
+ Image pixbuf;
player.Pause();
pixbuf = player.CurrentFrame;
- guiToolkit.DrawingTool (pixbuf, loadedPlay as Play, time);
+ if (play == null) {
+ play = loadedPlay as Play;
+ }
+ if (play != null && drawingIndex == -1) {
+ FrameDrawing drawing = new FrameDrawing ();
+ drawing.Render = player.CurrentTime;
+ play.Drawings.Add (drawing);
+ drawingIndex = play.Drawings.Count - 1;
+ }
+ guiToolkit.DrawingTool (pixbuf, play, drawingIndex);
}
protected virtual void OnPlayCategoryChanged(Play play, Category cat)
diff --git a/LongoMatch.Services/Services/RenderingJobsManager.cs
b/LongoMatch.Services/Services/RenderingJobsManager.cs
index abf2a78..fb7e02e 100644
--- a/LongoMatch.Services/Services/RenderingJobsManager.cs
+++ b/LongoMatch.Services/Services/RenderingJobsManager.cs
@@ -188,7 +188,7 @@ namespace LongoMatch.Services
Log.Debug(String.Format("Adding segment with {0} drawings", segment.Drawings.Count));
if (segment.Drawings.Count >= 1) {
- Drawing drawing = segment.Drawings[0];
+ FrameDrawing drawing = segment.Drawings[0];
string image_path = CreateStillImage(segment.MediaFile.FilePath, drawing);
videoEditor.AddSegment(segment.MediaFile.FilePath,
@@ -218,15 +218,15 @@ namespace LongoMatch.Services
return true;
}
- private string CreateStillImage(string filename, Drawing drawing) {
+ private string CreateStillImage(string filename, FrameDrawing drawing) {
Image frame, final_image;
string path = System.IO.Path.GetTempFileName().Replace(@"\", @"\\");
capturer.Open(filename);
capturer.Seek (drawing.Render, true);
frame = capturer.GetCurrentFrame();
- final_image = Image.Composite(frame, drawing.Pixbuf);
- final_image.Save(path);
+ //final_image = Image.Composite(frame, drawing.Pixbuf);
+ //final_image.Save(path);
return path;
}
diff --git a/Tests/Core/Drawables/TestAngle.cs b/Tests/Core/Drawables/TestAngle.cs
index 84245b3..e75321b 100644
--- a/Tests/Core/Drawables/TestAngle.cs
+++ b/Tests/Core/Drawables/TestAngle.cs
@@ -69,7 +69,7 @@ namespace Tests.Core.Drawables
p = new Point (5, 5);
s = a.GetSelection (p, 0.5);
- Assert.AreEqual (SelectionPosition.None, s.Position);
+ Assert.IsNull (s);
}
[Test()]
diff --git a/Tests/Core/Drawables/TestLine.cs b/Tests/Core/Drawables/TestLine.cs
index f649ce5..783bfd5 100644
--- a/Tests/Core/Drawables/TestLine.cs
+++ b/Tests/Core/Drawables/TestLine.cs
@@ -66,7 +66,7 @@ namespace Tests.Core.Drawables
/* None */
p3 = new Point (10, 5);
s = line.GetSelection (p3, 1);
- Assert.AreEqual (SelectionPosition.None, s.Position);
+ Assert.IsNull (s);
/* Start */
p3 = new Point (0, 5);
@@ -105,7 +105,7 @@ namespace Tests.Core.Drawables
p3 = new Point (0, 3);
s = line.GetSelection (p3, 1);
- Assert.AreEqual (SelectionPosition.None, s.Position);
+ Assert.IsNull (s);
p3 = new Point (2.5, 2.5);
s = line.GetSelection (p3, 1);
diff --git a/Tests/Core/Drawables/TestMultipoints.cs b/Tests/Core/Drawables/TestMultipoints.cs
index 8423250..042ec59 100644
--- a/Tests/Core/Drawables/TestMultipoints.cs
+++ b/Tests/Core/Drawables/TestMultipoints.cs
@@ -94,9 +94,9 @@ namespace Tests.Core.Drawables
Assert.AreEqual (SelectionPosition.All, s.Position);
s = m.GetSelection (new Point (0, 5), 1);
- Assert.AreEqual (SelectionPosition.None, s.Position);
+ Assert.IsNull (s);
s = m.GetSelection (new Point (5, 12), 1);
- Assert.AreEqual (SelectionPosition.None, s.Position);
+ Assert.IsNull (s);
}
}
}
diff --git a/Tests/Core/Drawables/TestQuadrilateral.cs b/Tests/Core/Drawables/TestQuadrilateral.cs
index 97f35ed..ee48ef5 100644
--- a/Tests/Core/Drawables/TestQuadrilateral.cs
+++ b/Tests/Core/Drawables/TestQuadrilateral.cs
@@ -51,10 +51,10 @@ namespace Tests.Core.Drawables
Quadrilateral q;
Selection s;
- bl = new Point (1, 1);
- br = new Point (10, 4);
- tl = new Point (3, 20);
- tr = new Point (12, 15);
+ tl = new Point (1, 1);
+ tr = new Point (10, 4);
+ bl = new Point (3, 20);
+ br = new Point (12, 15);
q = new Quadrilateral (tl, tr, bl, br);
s = q.GetSelection (bl, 1);
@@ -71,13 +71,13 @@ namespace Tests.Core.Drawables
* 1,1 12, 1
*/
s = q.GetSelection (new Point (0, 1), 0.5);
- Assert.AreEqual (SelectionPosition.None, s.Position);
+ Assert.IsNull (s);
s = q.GetSelection (new Point (1, 21), 0.5);
- Assert.AreEqual (SelectionPosition.None, s.Position);
+ Assert.IsNull (s);
s = q.GetSelection (new Point (13, 5), 0.5);
- Assert.AreEqual (SelectionPosition.None, s.Position);
+ Assert.IsNull (s);
s = q.GetSelection (new Point (4, 0), 0.5);
- Assert.AreEqual (SelectionPosition.None, s.Position);
+ Assert.IsNull (s);
s = q.GetSelection (new Point (4, 5), 0);
Assert.AreEqual (SelectionPosition.All, s.Position);
diff --git a/Tests/Core/Drawables/TestRectangle.cs b/Tests/Core/Drawables/TestRectangle.cs
index 03d0273..39b5b11 100644
--- a/Tests/Core/Drawables/TestRectangle.cs
+++ b/Tests/Core/Drawables/TestRectangle.cs
@@ -51,15 +51,15 @@ namespace Tests.Core.Drawables
Assert.AreEqual (height, r.Height);
Assert.AreEqual (width, r.Width);
p2 = new Point (2, 10);
- Assert.AreEqual (p2, r.BottomLeft);
+ Assert.AreEqual (p2, r.TopLeft);
p2.X += width;
- Assert.AreEqual (p2, r.BottomRight);
- p2.Y += height;
Assert.AreEqual (p2, r.TopRight);
+ p2.Y += height;
+ Assert.AreEqual (p2, r.BottomRight);
p2.X = 2;
- Assert.AreEqual (p2, r.TopLeft);
- p2.X = r.BottomLeft.X + width / 2;
- p2.Y = r.BottomLeft.Y + height / 2;
+ Assert.AreEqual (p2, r.BottomLeft);
+ p2.X = r.TopLeft.X + width / 2;
+ p2.Y = r.TopLeft.Y + height / 2;
Assert.AreEqual (p2, r.Center);
}
@@ -78,13 +78,13 @@ namespace Tests.Core.Drawables
Assert.AreEqual (SelectionPosition.Left, s.Position);
p2 = new Point (15, 30);
s = r.GetSelection (p2, 0);
- Assert.AreEqual (SelectionPosition.Top, s.Position);
+ Assert.AreEqual (SelectionPosition.Bottom, s.Position);
p2 = new Point (32, 12);
s = r.GetSelection (p2, 0);
Assert.AreEqual (SelectionPosition.Right, s.Position);
p2 = new Point (30, 10);
s = r.GetSelection (p2, 0);
- Assert.AreEqual (SelectionPosition.Bottom, s.Position);
+ Assert.AreEqual (SelectionPosition.Top, s.Position);
}
[Test()]
@@ -99,19 +99,19 @@ namespace Tests.Core.Drawables
r1 = new Rectangle (p1, width, height);
p2 = new Point (1, 1);
- r1.Move (SelectionPosition.BottomLeft, p2, null);
+ r1.Move (SelectionPosition.TopLeft, p2, null);
CompareRect (r1, p2, 9, 9);
p2 = new Point (9, 8);
- r1.Move (SelectionPosition.TopRight, p2, null);
+ r1.Move (SelectionPosition.BottomRight, p2, null);
CompareRect (r1, new Point (1, 1), 8, 7);
p2 = new Point (11, 2);
- r1.Move (SelectionPosition.BottomRight, p2, null);
+ r1.Move (SelectionPosition.TopRight, p2, null);
CompareRect (r1, new Point (1, 2), 10, 6);
p2 = new Point (2, 9);
- r1.Move (SelectionPosition.TopLeft, p2, null);
+ r1.Move (SelectionPosition.BottomLeft, p2, null);
CompareRect (r1, new Point (2, 2), 9, 7);
/* Move borders */
@@ -123,11 +123,11 @@ namespace Tests.Core.Drawables
CompareRect (r1, new Point (3, 0), 7, 10);
p2 = new Point (5, 11);
- r1.Move (SelectionPosition.Top, p2, null);
+ r1.Move (SelectionPosition.Bottom, p2, null);
CompareRect (r1, new Point (3, 0), 7, 11);
p2 = new Point (6, 2);
- r1.Move (SelectionPosition.Bottom, p2, null);
+ r1.Move (SelectionPosition.Top, p2, null);
CompareRect (r1, new Point (3, 2), 7, 9);
p2 = new Point (8, 11);
diff --git a/Tests/Tests.mdp b/Tests/Tests.mdp
index 6ae96b9..7b0d1be 100644
--- a/Tests/Tests.mdp
+++ b/Tests/Tests.mdp
@@ -43,7 +43,6 @@
<File subtype="Code" buildaction="Compile" name="Core/Drawables/TestAngle.cs" />
<File subtype="Code" buildaction="Compile" name="Core/Drawables/TestMultipoints.cs" />
<File subtype="Code" buildaction="Compile" name="Core/Drawables/TestDrawable.cs" />
- <File subtype="Code" buildaction="Compile" name="Core/Drawables/TestCircle.cs" />
<File subtype="Code" buildaction="Compile" name="Core/TestColor.cs" />
<File subtype="Code" buildaction="Compile" name="Core/TestTime.cs" />
<File subtype="Code" buildaction="Compile" name="Core/TestImage.cs" />
diff --git a/images/cursors/angle b/images/cursors/angle
new file mode 100644
index 0000000..7a7febb
--- /dev/null
+++ b/images/cursors/angle
@@ -0,0 +1,38 @@
+/* XPM */
+static char const *rect[] = {
+"32 32 3 1 4 4",
+" c None",
+". c #FFFFFF",
+"+ c #000000",
+" ... ",
+" .+. ",
+" .+. ",
+"....+.... ",
+".+++ +++. ",
+"....+.... ",
+" .+. ",
+" .+. ................. ",
+" ... .+++++++++++++++. ",
+" .+.............+. ",
+" .+.............+. ",
+" .+.............+. ",
+" .+.............+. ",
+" .+.............+. ",
+" .+.............+. ",
+" .+.............+. ",
+" .+.............+. ",
+" .+.............+. ",
+" .+++++++++++++++. ",
+" ................. ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "};
diff --git a/images/cursors/arrow b/images/cursors/arrow
new file mode 100644
index 0000000..f4c498b
--- /dev/null
+++ b/images/cursors/arrow
@@ -0,0 +1,38 @@
+/* XPM */
+static char const *arrow[] = {
+"32 32 3 1 4 4",
+" c None",
+". c #FFFFFF",
+"+ c #000000",
+" ... ",
+" .+. ",
+" .+. ",
+"....+.... ",
+".+++ +++. ",
+"....+.... ",
+" .+. ",
+" .+. ",
+" ... ",
+" .++.. ",
+" .+.++.. ",
+" .+..++.. ",
+" .+....++.. ",
+" .+.....++. ",
+" .+.......+. ",
+" .+......+. ",
+" .+.....+. ",
+" .+.....+. ",
+" .+..+...+. ",
+" .++.+...+. ",
+" .. .+...+. ",
+" .+...+. ",
+" .+...+. ",
+" .+...+. ",
+" .+...+. ",
+" .+ +. ",
+" .+. ",
+" . ",
+" ",
+" ",
+" ",
+" "};
diff --git a/images/cursors/ellipse b/images/cursors/ellipse
new file mode 100644
index 0000000..7429188
--- /dev/null
+++ b/images/cursors/ellipse
@@ -0,0 +1,38 @@
+/* XPM */
+static char const *ellipse[] = {
+"32 32 3 1 4 4",
+" c None",
+". c #FFFFFF",
+"+ c #000000",
+" ... ",
+" .+. ",
+" .+. ",
+"....+.... ",
+".+++ +++. ",
+"....+.... ",
+" .+. ",
+" .+. ....... ",
+" ... ....+++++.... ",
+" ..+++.....+++.. ",
+" ..+...........+.. ",
+" ..+.............+.. ",
+" .+...............+. ",
+" .+...............+. ",
+" .+...............+. ",
+" ..+.............+.. ",
+" ..+...........+.. ",
+" ..+++.....+++.. ",
+" ....+++++.... ",
+" ....... ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "};
diff --git a/images/cursors/freehand b/images/cursors/freehand
new file mode 100644
index 0000000..031d5e8
--- /dev/null
+++ b/images/cursors/freehand
@@ -0,0 +1,38 @@
+/* XPM */
+static char const *freehand[] = {
+"32 32 3 1 4 4",
+" c None",
+". c #FFFFFF",
+"+ c #000000",
+" ... ",
+" .+. ",
+" .+. ",
+"....+.... ",
+".+++ +++. ",
+"....+.... ",
+" .+. ",
+" .+. ",
+" ... ",
+" .. ",
+" .+...... ",
+" .++++++. ",
+" .++..+.+. ",
+" .+..++..+. ",
+" .+.+..+..+. ",
+" .+++...+..+. ",
+" .+..+...+..+. ",
+" .+..+...+..+. ",
+" .+..+...+..+. ",
+" .+..+...+..+. ",
+" .+..+...+.++. ",
+" .+..+...+..+. ",
+" .+..+.+...+. ",
+" .+..+...+. ",
+" .++...+. ",
+" .+..+. ",
+" .++. ",
+" .. ",
+" ",
+" ",
+" ",
+" "};
diff --git a/images/cursors/number b/images/cursors/number
new file mode 100644
index 0000000..7d6b664
--- /dev/null
+++ b/images/cursors/number
@@ -0,0 +1,38 @@
+/* XPM */
+static char const *number[] = {
+"32 32 3 1 7 7",
+" c None",
+". c #FFFFFF",
+"+ c #000000",
+" . ",
+" .+. ",
+" .+. ",
+" .+. ",
+" .+. ",
+" .+. ",
+" ..... ..... ",
+".+++++ +++++. ",
+" ..... ..... ",
+" .+. ",
+" .+. ",
+" .+. ",
+" .+. ",
+" .+. ",
+" . ....... ",
+" .++++++. ",
+" .+++++++. ",
+" ....+++++. ",
+" .... .++++. ",
+" .++. .++++. ",
+" .++. .++++. ",
+" ....++.... .++++. ",
+" .++++++++. .++++. ",
+" .++++++++. .++++. ",
+" ....++.... .++++. ",
+" .++. .++++. ",
+" .++. ...++++++... ",
+" .... .++++++++++. ",
+" .++++++++++. ",
+" ............ ",
+" ",
+" "};
diff --git a/images/cursors/rect b/images/cursors/rect
new file mode 100644
index 0000000..7a7febb
--- /dev/null
+++ b/images/cursors/rect
@@ -0,0 +1,38 @@
+/* XPM */
+static char const *rect[] = {
+"32 32 3 1 4 4",
+" c None",
+". c #FFFFFF",
+"+ c #000000",
+" ... ",
+" .+. ",
+" .+. ",
+"....+.... ",
+".+++ +++. ",
+"....+.... ",
+" .+. ",
+" .+. ................. ",
+" ... .+++++++++++++++. ",
+" .+.............+. ",
+" .+.............+. ",
+" .+.............+. ",
+" .+.............+. ",
+" .+.............+. ",
+" .+.............+. ",
+" .+.............+. ",
+" .+.............+. ",
+" .+.............+. ",
+" .+++++++++++++++. ",
+" ................. ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "};
diff --git a/images/cursors/text b/images/cursors/text
new file mode 100644
index 0000000..6fd139e
--- /dev/null
+++ b/images/cursors/text
@@ -0,0 +1,38 @@
+/* XPM */
+static char const *text[] = {
+"32 32 3 1 7 7",
+" c None",
+". c #FFFFFF",
+"+ c #000000",
+" . ",
+" .+. ",
+" .+. ",
+" .+. ",
+" .+. ",
+" .+. ",
+" ..... ..... ",
+".+++++ +++++. ",
+" ..... ..... ",
+" .+. ",
+" .+. ",
+" .+. .... ",
+" .+. .++++. ",
+" .+. .++++. ",
+" . .++++++. ",
+" .++++++. ",
+" .++++++. ",
+" .+++..+++. ",
+" .+++..+++. ",
+" .++++++++. ",
+" .++++++++++. ",
+" .+++....+++. ",
+" ... ... ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" ",
+" "};
diff --git a/images/tools/dash-line.svg b/images/tools/dash-line.svg
new file mode 100644
index 0000000..3a1af5f
--- /dev/null
+++ b/images/tools/dash-line.svg
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="92"
+ height="24"
+ id="svg3759"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="dash-line.svg">
+ <defs
+ id="defs3761" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.94"
+ inkscape:cx="55.102327"
+ inkscape:cy="-16.802957"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:window-width="1439"
+ inkscape:window-height="653"
+ inkscape:window-x="-334"
+ inkscape:window-y="156"
+ inkscape:window-maximized="0" />
+ <metadata
+ id="metadata3764">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Capa 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1028.3622)">
+ <path
+
style="fill:none;stroke:#000000;stroke-width:3.01958704;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:12.07834859,
12.07834859;stroke-dashoffset:0"
+ d="m 4.3222552,1040.1126 85.2823618,0 0,0 0,0"
+ id="path3767"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/images/tools/draw-arrow.png b/images/tools/draw-arrow.png
new file mode 100644
index 0000000..e200e7e
Binary files /dev/null and b/images/tools/draw-arrow.png differ
diff --git a/images/tools/draw-ellipse.png b/images/tools/draw-ellipse.png
new file mode 100644
index 0000000..afc7f14
Binary files /dev/null and b/images/tools/draw-ellipse.png differ
diff --git a/images/tools/draw-eraser.png b/images/tools/draw-eraser.png
new file mode 100644
index 0000000..f1413a1
Binary files /dev/null and b/images/tools/draw-eraser.png differ
diff --git a/images/tools/draw-freehand.png b/images/tools/draw-freehand.png
new file mode 100644
index 0000000..c373ea8
Binary files /dev/null and b/images/tools/draw-freehand.png differ
diff --git a/images/tools/draw-number.png b/images/tools/draw-number.png
new file mode 100644
index 0000000..467e45f
Binary files /dev/null and b/images/tools/draw-number.png differ
diff --git a/images/tools/draw-pointer.png b/images/tools/draw-pointer.png
new file mode 100644
index 0000000..18b6485
Binary files /dev/null and b/images/tools/draw-pointer.png differ
diff --git a/images/tools/draw-rectangle.png b/images/tools/draw-rectangle.png
new file mode 100644
index 0000000..2aa6af8
Binary files /dev/null and b/images/tools/draw-rectangle.png differ
diff --git a/images/tools/draw-text.png b/images/tools/draw-text.png
new file mode 100644
index 0000000..5b70f6d
Binary files /dev/null and b/images/tools/draw-text.png differ
diff --git a/images/tools/line-arrow.svg b/images/tools/line-arrow.svg
new file mode 100644
index 0000000..42922c6
--- /dev/null
+++ b/images/tools/line-arrow.svg
@@ -0,0 +1,131 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="92"
+ height="24"
+ id="svg3759"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="line.svg">
+ <defs
+ id="defs3761">
+ <marker
+ inkscape:stockid="TriangleOutM"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="TriangleOutM"
+ style="overflow:visible">
+ <path
+ id="path3925"
+ d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Mend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Mend"
+ style="overflow:visible;">
+ <path
+ id="path3807"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469
6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(0.6) rotate(180) translate(0,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Sstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Sstart"
+ style="overflow:visible">
+ <path
+ id="path3792"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.2) translate(6,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Mstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Mstart"
+ style="overflow:visible">
+ <path
+ id="path3786"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.4) translate(10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lstart"
+ style="overflow:visible">
+ <path
+ id="path3798"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469
6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) translate(1,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.94"
+ inkscape:cx="-142.2381"
+ inkscape:cy="-16.802957"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:window-width="1439"
+ inkscape:window-height="653"
+ inkscape:window-x="68"
+ inkscape:window-y="196"
+ inkscape:window-maximized="0" />
+ <metadata
+ id="metadata3764">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Capa 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1028.3622)">
+ <path
+
style="fill:none;stroke:#000000;stroke-width:2.84642601;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker-start:none;marker-end:url(#TriangleOutM)"
+ d="m 4.2354683,1040.1126 74.5369087,0 0,0 0,0"
+ id="path3767"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/images/tools/line-dot.svg b/images/tools/line-dot.svg
new file mode 100644
index 0000000..031c4d3
--- /dev/null
+++ b/images/tools/line-dot.svg
@@ -0,0 +1,157 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="92"
+ height="24"
+ id="svg3759"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="line--double-arrow.svg">
+ <defs
+ id="defs3761">
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotM"
+ style="overflow:visible">
+ <path
+ id="path3844"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0
C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.4) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleInM"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="TriangleInM"
+ style="overflow:visible">
+ <path
+ id="path3916"
+ d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(-0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutM"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="TriangleOutM"
+ style="overflow:visible">
+ <path
+ id="path3925"
+ d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Mend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Mend"
+ style="overflow:visible;">
+ <path
+ id="path3807"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469
6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(0.6) rotate(180) translate(0,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Sstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Sstart"
+ style="overflow:visible">
+ <path
+ id="path3792"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.2) translate(6,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Mstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Mstart"
+ style="overflow:visible">
+ <path
+ id="path3786"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.4) translate(10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lstart"
+ style="overflow:visible">
+ <path
+ id="path3798"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469
6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) translate(1,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.94"
+ inkscape:cx="-142.2381"
+ inkscape:cy="-16.802957"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:window-width="1439"
+ inkscape:window-height="653"
+ inkscape:window-x="68"
+ inkscape:window-y="196"
+ inkscape:window-maximized="0" />
+ <metadata
+ id="metadata3764">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Capa 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1028.3622)">
+ <path
+
style="fill:none;stroke:#000000;stroke-width:2.72143435000000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker-start:none;marker-end:url(#DotM)"
+ d="m 12.114091,1040.1126 67.290301,0 0,0 0,0"
+ id="path3767"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/images/tools/line-double-arrow.svg b/images/tools/line-double-arrow.svg
new file mode 100644
index 0000000..06d72f7
--- /dev/null
+++ b/images/tools/line-double-arrow.svg
@@ -0,0 +1,144 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="92"
+ height="24"
+ id="svg3759"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="line-arrow.svg">
+ <defs
+ id="defs3761">
+ <marker
+ inkscape:stockid="TriangleInM"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="TriangleInM"
+ style="overflow:visible">
+ <path
+ id="path3916"
+ d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(-0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutM"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="TriangleOutM"
+ style="overflow:visible">
+ <path
+ id="path3925"
+ d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Mend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Mend"
+ style="overflow:visible;">
+ <path
+ id="path3807"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469
6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(0.6) rotate(180) translate(0,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Sstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Sstart"
+ style="overflow:visible">
+ <path
+ id="path3792"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.2) translate(6,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Mstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Mstart"
+ style="overflow:visible">
+ <path
+ id="path3786"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.4) translate(10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lstart"
+ style="overflow:visible">
+ <path
+ id="path3798"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469
6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) translate(1,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.94"
+ inkscape:cx="-142.2381"
+ inkscape:cy="-16.802957"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:window-width="1439"
+ inkscape:window-height="653"
+ inkscape:window-x="68"
+ inkscape:window-y="196"
+ inkscape:window-maximized="0" />
+ <metadata
+ id="metadata3764">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Capa 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1028.3622)">
+ <path
+
style="fill:none;stroke:#000000;stroke-width:2.72143435;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker-start:url(#TriangleInM);marker-end:url(#TriangleOutM)"
+ d="m 12.114091,1040.1126 67.290301,0 0,0 0,0"
+ id="path3767"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/images/tools/line-double-dot.svg b/images/tools/line-double-dot.svg
new file mode 100644
index 0000000..a46d74a
--- /dev/null
+++ b/images/tools/line-double-dot.svg
@@ -0,0 +1,157 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="92"
+ height="24"
+ id="svg3759"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="line-dot.svg">
+ <defs
+ id="defs3761">
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="DotM"
+ style="overflow:visible">
+ <path
+ id="path3844"
+ d="M -2.5,-1.0 C -2.5,1.7600000 -4.7400000,4.0 -7.5,4.0 C -10.260000,4.0 -12.5,1.7600000 -12.5,-1.0
C -12.5,-3.7600000 -10.260000,-6.0 -7.5,-6.0 C -4.7400000,-6.0 -2.5,-3.7600000 -2.5,-1.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.4) translate(7.4, 1)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleInM"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="TriangleInM"
+ style="overflow:visible">
+ <path
+ id="path3916"
+ d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(-0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="TriangleOutM"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="TriangleOutM"
+ style="overflow:visible">
+ <path
+ id="path3925"
+ d="M 5.77,0.0 L -2.88,5.0 L -2.88,-5.0 L 5.77,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Mend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Mend"
+ style="overflow:visible;">
+ <path
+ id="path3807"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round;"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469
6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(0.6) rotate(180) translate(0,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Sstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Sstart"
+ style="overflow:visible">
+ <path
+ id="path3792"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.2) translate(6,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Mstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Mstart"
+ style="overflow:visible">
+ <path
+ id="path3786"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt"
+ transform="scale(0.4) translate(10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow2Lstart"
+ style="overflow:visible">
+ <path
+ id="path3798"
+ style="fill-rule:evenodd;stroke-width:0.62500000;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469
6.9831476,1.6157441 8.7185878,4.0337352 z "
+ transform="scale(1.1) translate(1,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.94"
+ inkscape:cx="-142.2381"
+ inkscape:cy="-16.802957"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:window-width="1439"
+ inkscape:window-height="653"
+ inkscape:window-x="68"
+ inkscape:window-y="196"
+ inkscape:window-maximized="0" />
+ <metadata
+ id="metadata3764">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Capa 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1028.3622)">
+ <path
+
style="fill:none;stroke:#000000;stroke-width:2.72143435000000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker-start:url(#DotM);marker-end:url(#DotM)"
+ d="m 12.114091,1040.1126 67.290301,0 0,0 0,0"
+ id="path3767"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
diff --git a/images/tools/line.svg b/images/tools/line.svg
new file mode 100644
index 0000000..3ebd793
--- /dev/null
+++ b/images/tools/line.svg
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="92"
+ height="24"
+ id="svg3759"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="dash-line.svg">
+ <defs
+ id="defs3761" />
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.94"
+ inkscape:cx="-142.2381"
+ inkscape:cy="-16.802957"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ fit-margin-top="0"
+ fit-margin-left="0"
+ fit-margin-right="0"
+ fit-margin-bottom="0"
+ inkscape:window-width="1439"
+ inkscape:window-height="653"
+ inkscape:window-x="68"
+ inkscape:window-y="196"
+ inkscape:window-maximized="0" />
+ <metadata
+ id="metadata3764">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Capa 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(0,-1028.3622)">
+ <path
+
style="fill:none;stroke:#000000;stroke-width:3.02;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ d="m 4.3222552,1040.1126 85.2823618,0 0,0 0,0"
+ id="path3767"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]