banshee r3365 - in trunk/banshee: . src/Core/Banshee.ThickClient src/Core/Banshee.ThickClient/Banshee.Collection.Gui src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView src/Libraries/Hyena.Gui/Hyena.Gui.Theatrics src/Libraries/Hyena.Gui/Hyena.Gui.Theming



Author: abock
Date: Sun Mar  2 02:09:05 2008
New Revision: 3365
URL: http://svn.gnome.org/viewvc/banshee?rev=3365&view=rev

Log:
2008-03-01  Aaron Bockover  <abock gnome org>

    * src/Core/Banshee.ThickClient/Banshee.Collection.Gui/BetaReleaseViewOverlay.cs:
    A sweet overlay thingy that draws some big warning/welcome for users
    about the state of trunk/preview release

    * src/Core/Banshee.ThickClient/Banshee.Collection.Gui/TrackListView.cs:
    Render the hot overlay

    * src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Windowing.cs:
    Expose some properties as protected

    * src/Libraries/Hyena.Gui/Hyena.Gui.Theatrics/Stage.cs:
    Fix a bug when iterating actors in the stage by creating a copy to
    iterate; this allows actor step handlers to modify the stage actors

    * src/Libraries/Hyena.Gui/Hyena.Gui.Theming/GtkTheme.cs:
    * src/Libraries/Hyena.Gui/Hyena.Gui.Theming/Theme.cs: Added DrawPie

    * src/Libraries/Hyena.Gui/Hyena.Gui.Theming/ThemeContext.cs: Add some
    more state properties



Added:
   trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/BetaReleaseViewOverlay.cs
Modified:
   trunk/banshee/ChangeLog
   trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/TrackListView.cs
   trunk/banshee/src/Core/Banshee.ThickClient/Banshee.ThickClient.mdp
   trunk/banshee/src/Core/Banshee.ThickClient/Makefile.am
   trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Windowing.cs
   trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Gui.Theatrics/Stage.cs
   trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Gui.Theming/GtkTheme.cs
   trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Gui.Theming/Theme.cs
   trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Gui.Theming/ThemeContext.cs

Added: trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/BetaReleaseViewOverlay.cs
==============================================================================
--- (empty file)
+++ trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/BetaReleaseViewOverlay.cs	Sun Mar  2 02:09:05 2008
@@ -0,0 +1,228 @@
+//
+// BetaReleaseViewOverlay.cs
+//
+// Author:
+//   Aaron Bockover <abockover novell com>
+//
+// Copyright (C) 2008 Novell, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using Mono.Unix;
+using Cairo;
+using Gtk;
+
+using Hyena.Gui;
+using Hyena.Gui.Theming;
+using Hyena.Gui.Theatrics;
+
+using Banshee.Gui;
+using Banshee.Sources;
+using Banshee.ServiceStack;
+
+namespace Banshee.Collection.Gui
+{
+    public class BetaReleaseViewOverlay
+    {
+        private string welcome_string;
+        private SingleActorStage stage = new SingleActorStage ();
+        private Gdk.Pixbuf logo_scale;
+        private Gdk.Pixbuf arrow;
+        private Widget widget;
+        private Source source;
+        private bool dismissed;
+
+        public event EventHandler Finished;
+
+        public BetaReleaseViewOverlay (Widget widget)
+        {
+            if (dismissed) {
+                return;
+            }
+
+            this.widget = widget;
+
+            System.Text.StringBuilder builder = new System.Text.StringBuilder ();
+            builder.AppendFormat ("<big><big><big><b>{0}</b></big></big></big>\n\n", GLib.Markup.EscapeText (
+                Catalog.GetString ("Welcome to the Banshee 1.0 Alpha 1 release!")));
+            builder.Append (Catalog.GetString (
+                "It is <i>very</i> important to note that this is a <i>preview release</i> and does " +
+                "<i>not yet</i> contain all of the features you may be used to in previous Banshee releases."));
+            builder.Append ("\n\n");
+            builder.Append (Catalog.GetString (
+                "Most notably, hardware features are not yet available (Audio CDs, Digital Audio Players), " + 
+                "and the Podcasting, Internet Radio, Recommendations, Mini Mode, and DAAP (iTunes Music Sharing) " +
+                "plugins are not available."));
+            builder.Append ("\n\n");
+            builder.Append (Catalog.GetString (
+                "All of the features you have come to love in Banshee will be added back before the final 1.0 release."));
+            builder.Append ("\n\n");
+            builder.AppendFormat ("<big><b><i>{0}</i></b></big>", Catalog.GetString ("Enjoy the preview!"));
+            welcome_string = builder.ToString ();
+
+            source = ServiceManager.SourceManager.DefaultSource;
+            ServiceManager.SourceManager.ActiveSourceChanged += OnActiveSourceChanged;
+        }
+
+        private void OnActiveSourceChanged (SourceEventArgs args)
+        {
+            if (source != null && source != args.Source) {
+                if (source.Properties.GetString ("Message.Id") == "beta-release") {
+                    source.Properties.RemoveStartingWith ("Message.");
+                }
+            }
+
+            source = args.Source;
+
+            if (!source.Properties.Contains ("Message.Text") && ! source.Properties.Contains ("Message.Id")) {
+                source.Properties.SetString ("Message.Id", "beta-release");
+                source.Properties.SetString ("Message.Text", Catalog.GetString (
+                    "Please confirm your understanding of the message above."
+                ));
+                source.Properties.SetString ("Message.Icon.Name", Stock.Info);
+                source.Properties.SetBoolean ("Message.CanClose", false);
+                source.Properties.SetString ("Message.Action.Label", Catalog.GetString ("I understand this is a preview release"));
+                source.Properties.Set<EventHandler> ("Message.Action.NotifyHandler", delegate { 
+                    stage.Iteration += OnStageIteration;
+                    stage.Reset ();
+                    dismissed = true;
+                });
+            }
+        }
+
+        protected virtual void OnFinished ()
+        {
+            EventHandler handler = Finished;
+            if (handler != null) {
+                handler (this, EventArgs.Empty);
+            }
+        }
+
+        private void OnStageIteration (object o, EventArgs args)
+        {
+            if (stage.ActorCount == 0) {
+                stage.Iteration -= OnStageIteration;
+                stage = null;
+
+                if (logo_scale != null) {
+                    logo_scale.Dispose ();
+                    logo_scale = null;
+                }
+
+                ServiceManager.SourceManager.ActiveSourceChanged -= OnActiveSourceChanged;
+
+                if (source != null) {
+                    source.Properties.RemoveStartingWith ("Message.");
+                    source = null;
+                }
+
+                OnFinished ();
+            }
+
+            widget.QueueDraw ();
+        }
+
+        public void Render (Theme theme, Cairo.Context cr, Gdk.Rectangle clip)
+        {
+            if (widget == null) {
+                return;
+            }
+
+            if (logo_scale == null) {
+                logo_scale = Gdk.Pixbuf.LoadFromResource ("banshee-logo.png");
+                logo_scale = logo_scale.ScaleSimple (64, 64, Gdk.InterpType.Bilinear);
+            }
+
+            theme.PushContext ();
+            theme.Context.Cairo = cr;
+            theme.Context.Radius = 12;
+
+            Gdk.Rectangle rect = new Gdk.Rectangle ();
+            rect.Width = (int)Math.Round (widget.Allocation.Width * 0.65);
+
+            int padding = (int)theme.Context.Radius * 2;
+            int spacing = padding / 2;
+            int layout_width = rect.Width - logo_scale.Width - 2 * padding - spacing;
+            int layout_height;
+
+            Pango.Layout layout = new Pango.Layout (widget.PangoContext);
+            layout.FontDescription = widget.PangoContext.FontDescription.Copy ();
+            layout.Width = (int)(layout_width * Pango.Scale.PangoScale);
+            layout.Wrap = Pango.WrapMode.Word;
+            layout.SetMarkup (welcome_string);
+
+            layout.GetPixelSize (out layout_width, out layout_height);
+
+            rect.Height = layout_height + 2 * padding;
+            rect.X = (widget.Allocation.Width - rect.Width) / 2;
+            rect.Y = (widget.Allocation.Height - rect.Height) / 2;
+            int layout_x = rect.X + padding + spacing + logo_scale.Width;
+            int layout_y = rect.Y + padding;
+            double alpha = stage.ActorCount > 0 ? 1.0 - stage.Actor.Percent : 1.0;
+
+            Cairo.Color color = theme.Colors.GetWidgetColor (GtkColorClass.Background, StateType.Normal);
+            color.A = Theme.Clamp (0.0, 0.85, alpha);
+            cr.Color = color;
+            cr.Rectangle (0, 0, widget.Allocation.Width, widget.Allocation.Height);
+            cr.Fill ();
+
+            if (stage.Playing && alpha < 1.0) {
+                CairoExtensions.PushGroup (cr);
+            }
+
+            theme.Context.FillAlpha = 0.65;
+            theme.DrawFrame (cr, rect, true);
+            cr.MoveTo (layout_x, layout_y);
+            cr.Color = theme.Colors.GetWidgetColor (GtkColorClass.Text, StateType.Normal);
+            Pango.CairoHelper.ShowLayout (cr, layout);
+
+            int x = rect.X + padding;
+            int y = rect.Y + padding;
+            cr.Rectangle (x, y, logo_scale.Width, logo_scale.Height);
+            cr.Save ();
+            cr.Translate (0.5, 0.5);
+            Gdk.CairoHelper.SetSourcePixbuf (cr, logo_scale, x, y);
+            cr.Fill ();
+            cr.Restore ();
+
+            if (arrow == null) {
+                arrow = IconThemeUtils.LoadIcon (22, Stock.GoDown);
+            }
+
+            x = rect.X + rect.Width - spacing - arrow.Width;
+            y = rect.Y + rect.Height - spacing - arrow.Height;
+            cr.Rectangle (x, y, arrow.Width, arrow.Height);
+            cr.Save ();
+            cr.Translate (0.5, 0.5);
+            Gdk.CairoHelper.SetSourcePixbuf (cr, arrow, x, y);
+            cr.Fill ();
+            cr.Restore ();
+
+            if (stage.Playing && alpha < 1.0) {
+                CairoExtensions.PopGroupToSource (cr);
+                cr.PaintWithAlpha (alpha);
+            }
+
+            theme.PopContext ();
+        }
+    }
+}

Modified: trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/TrackListView.cs
==============================================================================
--- trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/TrackListView.cs	(original)
+++ trunk/banshee/src/Core/Banshee.ThickClient/Banshee.Collection.Gui/TrackListView.cs	Sun Mar  2 02:09:05 2008
@@ -32,6 +32,8 @@
 using Gtk;
 
 using Hyena.Gui;
+using Hyena.Gui.Theming;
+using Hyena.Gui.Theatrics;
 using Hyena.Data.Gui;
 
 using Banshee.Gui;
@@ -45,7 +47,8 @@
     public class TrackListView : ListView<TrackInfo>
     {
         private PersistentColumnController column_controller;
-        
+        private BetaReleaseViewOverlay overlay;
+
         public TrackListView () : base ()
         {
             column_controller = new PersistentColumnController ("track_view_columns");
@@ -76,8 +79,8 @@
             
             ServiceManager.PlayerEngine.StateChanged += OnPlayerEngineStateChanged;
             
-            if (ServiceManager.Contains ("GtkElementsService")) {
-                ServiceManager.Get<Banshee.Gui.GtkElementsService> ().ThemeChanged += delegate {
+            if (ServiceManager.Contains<GtkElementsService> ()) {
+                ServiceManager.Get<GtkElementsService> ().ThemeChanged += delegate {
                     foreach (Column column in column_controller) {
                         if (column.HeaderCell != null) {
                             column.HeaderCell.NotifyThemeChange ();
@@ -91,6 +94,16 @@
                     QueueDraw ();
                 };
             }
+
+            overlay = new BetaReleaseViewOverlay (this);
+            overlay.Finished += OnOverlayFinished;
+        }
+        
+        private void OnOverlayFinished (object o, EventArgs args)
+        {
+            overlay.Finished -= OnOverlayFinished;
+            overlay = null;
+            QueueDraw ();
         }
 
         protected override bool OnPopupMenu ()
@@ -106,19 +119,9 @@
 
         protected override void ChildClassPostRender (Gdk.EventExpose evnt, Cairo.Context cr, Gdk.Rectangle clip)
         {
-            /*Gdk.Rectangle rect = new Gdk.Rectangle ();
-            rect.Width = (int)Math.Round (Allocation.Width * 0.65);
-            rect.Height = (int)Math.Round (Allocation.Height * 0.50);
-            rect.X = (Allocation.Width - rect.Width) / 2;
-            rect.Y = ((Allocation.Height - rect.Height) / 2) - (int)(rect.Height * .15);
-
-            CairoExtensions.PushGroup (cr);
-            Theme.PushContext ();
-            Theme.Context.Radius = 12;
-            Theme.DrawFrame (cr, rect, true);
-            Theme.PopContext ();
-            CairoExtensions.PopGroupToSource (cr);
-            cr.PaintWithAlpha (0.8);*/
+            if (evnt.Window == ListWindow && overlay != null) {
+                overlay.Render (Theme, cr, clip);
+            }
         }
         
 #region Drag and Drop

Modified: trunk/banshee/src/Core/Banshee.ThickClient/Banshee.ThickClient.mdp
==============================================================================
--- trunk/banshee/src/Core/Banshee.ThickClient/Banshee.ThickClient.mdp	(original)
+++ trunk/banshee/src/Core/Banshee.ThickClient/Banshee.ThickClient.mdp	Sun Mar  2 02:09:05 2008
@@ -100,6 +100,7 @@
     <File name="Banshee.Gui.Widgets/RepeatActionButton.cs" subtype="Code" buildaction="Compile" />
     <File name="Banshee.Gui/PlaybackRepeatActions.cs" subtype="Code" buildaction="Compile" />
     <File name="Banshee.Gui/BansheeDbFormatMigratorMonitor.cs" subtype="Code" buildaction="Compile" />
+    <File name="Banshee.Collection.Gui/BetaReleaseViewOverlay.cs" subtype="Code" buildaction="Compile" />
   </Contents>
   <References>
     <ProjectReference type="Project" localcopy="False" refto="Hyena.Gui" />
@@ -115,7 +116,6 @@
     <ProjectReference type="Gac" localcopy="True" refto="glib-sharp, Version=2.10.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f" />
     <ProjectReference type="Gac" localcopy="True" refto="pango-sharp, Version=2.10.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f" />
   </References>
-  <Deployment.LinuxDeployData generateScript="False" />
   <MonoDevelop.Autotools.MakefileInfo IntegrationEnabled="True" RelativeMakefileName="Makefile.am">
     <BuildFilesVar Sync="True" Name="SOURCES" />
     <DeployFilesVar />
@@ -125,4 +125,5 @@
     <AsmRefVar />
     <ProjectRefVar />
   </MonoDevelop.Autotools.MakefileInfo>
+  <Deployment.LinuxDeployData generateScript="False" />
 </Project>
\ No newline at end of file

Modified: trunk/banshee/src/Core/Banshee.ThickClient/Makefile.am
==============================================================================
--- trunk/banshee/src/Core/Banshee.ThickClient/Makefile.am	(original)
+++ trunk/banshee/src/Core/Banshee.ThickClient/Makefile.am	Sun Mar  2 02:09:05 2008
@@ -13,6 +13,7 @@
 	Banshee.Collection.Gui/ArtistListView.cs \
 	Banshee.Collection.Gui/ArtworkManager.cs \
 	Banshee.Collection.Gui/ArtworkRenderer.cs \
+	Banshee.Collection.Gui/BetaReleaseViewOverlay.cs \
 	Banshee.Collection.Gui/ColumnCellAlbum.cs \
 	Banshee.Collection.Gui/ColumnCellDateTime.cs \
 	Banshee.Collection.Gui/ColumnCellDuration.cs \

Modified: trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Windowing.cs
==============================================================================
--- trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Windowing.cs	(original)
+++ trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Windowing.cs	Sun Mar  2 02:09:05 2008
@@ -40,6 +40,14 @@
         private Gdk.Window footer_window;
         private Gdk.Window left_border_window;
         private Gdk.Window right_border_window;
+
+        protected Gdk.Window ListWindow {
+            get { return list_window; }
+        }
+
+        protected Gdk.Window HeaderWindow {
+            get { return header_window; }
+        }
         
         private Gdk.Rectangle list_alloc;
         private Gdk.Rectangle header_alloc;

Modified: trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Gui.Theatrics/Stage.cs
==============================================================================
--- trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Gui.Theatrics/Stage.cs	(original)
+++ trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Gui.Theatrics/Stage.cs	Sun Mar  2 02:09:05 2008
@@ -145,8 +145,9 @@
             }
             
             Queue<Actor<T>> expired_actors = new Queue<Actor<T>> ();
+            Dictionary<T, Actor<T>> actors_copy = new Dictionary<T, Actor<T>> (actors);
             
-            foreach (KeyValuePair<T, Actor<T>> entry in actors) {
+            foreach (KeyValuePair<T, Actor<T>> entry in actors_copy) {
                 entry.Value.Step ();
                 
                 if (!OnActorStep (entry.Value) || entry.Value.Expired) {

Modified: trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Gui.Theming/GtkTheme.cs
==============================================================================
--- trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Gui.Theming/GtkTheme.cs	(original)
+++ trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Gui.Theming/GtkTheme.cs	Sun Mar  2 02:09:05 2008
@@ -49,6 +49,39 @@
             border_color = Colors.GetWidgetColor (GtkColorClass.Dark, StateType.Active);
         }
 
+        public override void DrawPie (double fraction)
+        {
+            // Calculate the pie path
+            fraction = Theme.Clamp (0.0, 1.0, fraction);
+            double a1 = 3.0 * Math.PI / 2.0;
+            double a2 = a1 + 2.0 * Math.PI * fraction;
+
+            if (fraction == 0.0) {
+                return;
+            }
+
+            Context.Cairo.MoveTo (Context.X, Context.Y);
+            Context.Cairo.Arc (Context.X, Context.Y, Context.Radius, a1, a2);
+            Context.Cairo.LineTo (Context.X, Context.Y);
+
+            // Fill the pie
+            Color color_a = Colors.GetWidgetColor (GtkColorClass.Background, StateType.Selected);
+            Color color_b = CairoExtensions.ColorShade (color_a, 1.4);
+
+            RadialGradient fill = new RadialGradient (Context.X, Context.Y, 0, 
+                Context.X, Context.Y, 2.0 * Context.Radius);
+            fill.AddColorStop (0, color_a);
+            fill.AddColorStop (1, color_b);
+            Context.Cairo.Pattern = fill;
+
+            Context.Cairo.FillPreserve ();
+
+            // Stroke the pie
+            Context.Cairo.Color = CairoExtensions.ColorShade (color_a, 0.8);
+            Context.Cairo.LineWidth = Context.LineWidth;
+            Context.Cairo.Stroke ();
+        }
+
         public override void DrawHeaderSeparator(Cairo.Context cr, Gdk.Rectangle alloc, int x, int bottom_offset)
         {
             Cairo.Color gtk_background_color = Colors.GetWidgetColor(GtkColorClass.Background, StateType.Normal);
@@ -124,6 +157,7 @@
         {
             CairoCorners corners = CairoCorners.All;
         
+            color.A = Context.FillAlpha;
             cr.Color = color;
             CairoExtensions.RoundedRectangle (cr, alloc.X, alloc.Y, alloc.Width, alloc.Height, Context.Radius, corners);
             cr.Fill ();

Modified: trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Gui.Theming/Theme.cs
==============================================================================
--- trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Gui.Theming/Theme.cs	(original)
+++ trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Gui.Theming/Theme.cs	Sun Mar  2 02:09:05 2008
@@ -75,7 +75,9 @@
         }
 
 #region Drawing
-     
+
+        public abstract void DrawPie (double fraction);
+
         public abstract void DrawHeaderSeparator(Cairo.Context cr, Gdk.Rectangle alloc, int x, int bottom_offset);
         
         public abstract void DrawHeaderBackground (Cairo.Context cr, Gdk.Rectangle alloc, int bottom_offset, bool fill);
@@ -177,5 +179,14 @@
 
 #endregion
 
+#region Static Utilities
+
+        public static double Clamp (double min, double max, double value)
+        {
+             return Math.Max (min, Math.Min (max, value)); 
+        }
+
+#endregion
+
     }
 }

Modified: trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Gui.Theming/ThemeContext.cs
==============================================================================
--- trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Gui.Theming/ThemeContext.cs	(original)
+++ trunk/banshee/src/Libraries/Hyena.Gui/Hyena.Gui.Theming/ThemeContext.cs	Sun Mar  2 02:09:05 2008
@@ -27,15 +27,46 @@
 //
 
 using System;
+using Cairo;
 
 namespace Hyena.Gui.Theming
 {
     public class ThemeContext
     {
-        private int radius = 3;
-        public int Radius {
+        private double radius = 3.0;
+        public double Radius {
             get { return radius; }
             set { radius = value; }
         }
+
+        private double fill_alpha = 1.0;
+        public double FillAlpha {
+            get { return fill_alpha; }
+            set { fill_alpha = Theme.Clamp (0.0, 1.0, value); }
+        }
+
+        private double line_width = 1.0;
+        public double LineWidth {
+            get { return line_width; }
+            set { line_width = value; }
+        }
+
+        private double x;
+        public double X {
+            get { return x; }
+            set { x = value; }
+        }
+
+        private double y;
+        public double Y {
+            get { return y; }
+            set { y = value; }
+        }
+
+        private Cairo.Context cairo;
+        public Cairo.Context Cairo {
+            get { return cairo; }
+            set { cairo = value; }
+        }
     }
 }



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