From 87bdffacc7bdc273fedd956e505e7e4ed6a0bbd4 Mon Sep 17 00:00:00 2001 From: lytico Date: Tue, 21 Apr 2020 18:51:12 +0200 Subject: [PATCH] Samples: add CustomCellRenderer, adopted from https://github.com/mono/gtk-sharp/blob/master/sample/CustomCellRenderer.cs --- .../Sections/Widgets/CellRendererSection.cs | 53 +++++++++++++ .../CustomWidgets/CustomCellRenderer.cs | 77 +++++++++++++++++++ 2 files changed, 130 insertions(+) create mode 100644 Source/Samples/Sections/Widgets/CellRendererSection.cs create mode 100644 Source/Samples/Sections/Widgets/CustomWidgets/CustomCellRenderer.cs diff --git a/Source/Samples/Sections/Widgets/CellRendererSection.cs b/Source/Samples/Sections/Widgets/CellRendererSection.cs new file mode 100644 index 000000000..4df97157b --- /dev/null +++ b/Source/Samples/Sections/Widgets/CellRendererSection.cs @@ -0,0 +1,53 @@ +using Gtk; +using System; +namespace Samples +{ + + [Section (ContentType = typeof(CustomCellRenderer), Category = Category.Widgets)] + class CellRendererSection : ListSection + { + public CellRendererSection () + { + AddItem (CreateCellRenderer ()); + + } + ListStore liststore; + + public (string, Widget) CreateCellRenderer () + { + liststore = new ListStore (typeof (float), typeof (string)); + liststore.AppendValues (0.5f, "50%"); + + TreeView view = new TreeView (liststore); + + view.AppendColumn ("Progress", new CellRendererText (), "text", 1); + view.AppendColumn ("Progress", new CustomCellRenderer (), "percent", 0); + GLib.Timeout.Add (50, new GLib.TimeoutHandler (update_percent)); + + return (nameof(CustomCellRenderer), view); + } + + bool increasing = true; + bool update_percent () + { + TreeIter iter; + liststore.GetIterFirst (out iter); + float perc = (float) liststore.GetValue (iter, 0); + + if ((perc > 0.99) || (perc < 0.01 && perc > 0)) { + increasing = !increasing; + } + + if (increasing) + perc += 0.01f; + else + perc -= 0.01f; + + liststore.SetValue (iter, 0, perc); + liststore.SetValue (iter, 1, Convert.ToInt32 (perc * 100) + "%"); + + return true; + } + } + +} \ No newline at end of file diff --git a/Source/Samples/Sections/Widgets/CustomWidgets/CustomCellRenderer.cs b/Source/Samples/Sections/Widgets/CustomWidgets/CustomCellRenderer.cs new file mode 100644 index 000000000..3810927e7 --- /dev/null +++ b/Source/Samples/Sections/Widgets/CustomWidgets/CustomCellRenderer.cs @@ -0,0 +1,77 @@ +// CustomCellRenderer.cs : C# implementation of an example custom cellrenderer +// from http://scentric.net/tutorial/sec-custom-cell-renderers.html +// +// Author: Todd Berman +// +// (c) 2004 Todd Berman + +// adopted from: https://github.com/mono/gtk-sharp/commits/2.99.3/sample/CustomCellRenderer.cs + +using System; +using Gtk; +using Gdk; +using GLib; + +namespace Samples +{ + + public class CustomCellRenderer : CellRenderer + { + + private float percent; + + [GLib.Property ("percent")] + public float Percentage { + get { return percent; } + set { percent = value; } + } + + protected override void OnGetSize (Widget widget, ref Rectangle cell_area, out int x_offset, out int y_offset, out int width, out int height) + { + base.OnGetSize (widget, ref cell_area, out x_offset, out y_offset, out width, out height); + + int calc_width = (int) this.Xpad * 2 + 100; + int calc_height = (int) this.Ypad * 2 + 10; + + width = calc_width; + height = calc_height; + + x_offset = 0; + y_offset = 0; + if (!cell_area.Equals (Rectangle.Zero)) { + x_offset = (int) (this.Xalign * (cell_area.Width - calc_width)); + x_offset = Math.Max (x_offset, 0); + + y_offset = (int) (this.Yalign * (cell_area.Height - calc_height)); + y_offset = Math.Max (y_offset, 0); + } + } + + protected override void OnRender (Cairo.Context cr, Widget widget, Rectangle background_area, Rectangle cell_area, CellRendererState flags) + { + int x = (int) (cell_area.X + this.Xpad); + int y = (int) (cell_area.Y + this.Ypad); + int width = (int) (cell_area.Width - this.Xpad * 2); + int height = (int) (cell_area.Height - this.Ypad * 2); + + widget.StyleContext.Save (); + widget.StyleContext.AddClass ("trough"); + widget.StyleContext.RenderBackground (cr, x, y, width, height); + widget.StyleContext.RenderFrame (cr, x, y, width, height); + + Border padding = widget.StyleContext.GetPadding (StateFlags.Normal); + x += padding.Left; + y += padding.Top; + width -= padding.Left + padding.Right; + height -= padding.Top + padding.Bottom; + + widget.StyleContext.Restore (); + + widget.StyleContext.Save (); + widget.StyleContext.AddClass ("progressbar"); + widget.StyleContext.RenderActivity (cr, x, y, (int) (width * Percentage), height); + widget.StyleContext.Restore (); + } + } + +} \ No newline at end of file