Ryujinx-GtkSharp/Source/Samples/Sections/Widgets/DrawingAreaSection.cs
2019-07-15 10:58:36 +01:00

139 lines
4.8 KiB
C#

// This is free and unencumbered software released into the public domain.
// Happy coding!!! - GtkSharp Team
// Ported from https://developer.gnome.org/gtkmm-tutorial/3.24/gtkmm-tutorial.html
using Cairo;
using Gtk;
using System;
namespace Samples
{
[Section(ContentType = typeof(DrawingArea), Category = Category.Widgets)]
class DrawingAreaSection : ListSection
{
public DrawingAreaSection()
{
AddItem(DrawCircles());
AddItem(DrawText());
}
public (string, Widget) DrawCircles()
{
DrawingArea drawingArea = new DrawingArea();
drawingArea.SetSizeRequest(50,50);
drawingArea.Drawn += DrawingAreaCirclesOnDrawn;
return ("Draw Circles :", drawingArea);
}
public (string, Widget) DrawText()
{
DrawingArea drawingArea = new DrawingArea();
drawingArea.SetSizeRequest(200,100);
drawingArea.Drawn += DrawingAreaTextOnDrawn;
return ("Draw Pango Text :", drawingArea);
}
private void DrawingAreaCirclesOnDrawn(object o, DrawnArgs args)
{
if (o is DrawingArea da)
{
Context cr = args.Cr;
int width = da.Allocation.Width;
int height = da.Allocation.Height;
cr.LineWidth = 5;
cr.SetSourceRGB(0.8, 0.8, 0.8);
cr.Rectangle(0, 0, width, height);
cr.Fill();
cr.SetSourceRGB(0.9, 0, 0);
cr.Translate(width/2d, height/2d);
cr.Arc(0, 0, (width < height ? width : height) / 2 - 10, 0, 2*Math.PI);
cr.StrokePreserve();
cr.SetSourceRGB(0, 0.9, 0);
cr.Fill();
cr.GetTarget().Dispose();
cr.Dispose();
}
}
private void DrawingAreaTextOnDrawn(object o, DrawnArgs args)
{
if (o is DrawingArea da)
{
Context cr = args.Cr;
int width = da.Allocation.Width;
int height = da.Allocation.Height;
int rectangle_width = width;
int rectangle_height = height / 2;
// Draw a black rectangle
cr.SetSourceRGB(0, 0, 0);
cr.Rectangle(0, 0, rectangle_width, rectangle_height);
cr.Fill();
// and some white text
cr.SetSourceRGB(1.0, 1.0, 1.0);
draw_text(cr, rectangle_width, rectangle_height, "Hi there!");
// flip the image vertically
// see http://www.cairographics.org/documentation/cairomm/reference/classCairo_1_1Matrix.html
// the -1 corresponds to the yy part (the flipping part)
// the height part is a translation (we could have just called cr->translate(0, height) instead)
// it's height and not height / 2, since we want this to be on the second part of our drawing
// (otherwise, it would draw over the previous part)
Cairo.Matrix matrix = new Matrix(1.0, 0.0, 0.0, -1.0, 0.0, height);
// apply the matrix
cr.Transform(matrix);
// white rectangle
cr.SetSourceRGB(1.0, 1.0, 1.0);
cr.Rectangle(0, 0, rectangle_width, rectangle_height);
cr.Fill();
// black text
cr.SetSourceRGB(0, 0, 0);
draw_text(cr, rectangle_width, rectangle_height, "Hi there!");
cr.GetTarget().Dispose();
cr.Dispose();
}
}
private void draw_text(Context cr, int rectangle_width, int rectangle_height, string text)
{
// http://developer.gnome.org/pangomm/unstable/classPango_1_1FontDescription.html
Pango.FontDescription font = new Pango.FontDescription();
font.Family = "Monospace";
font.Weight = Pango.Weight.Bold;
// http://developer.gnome.org/pangomm/unstable/classPango_1_1Layout.html
Pango.Layout layout = CreatePangoLayout(text);
layout.FontDescription = font;
int text_width;
int text_height;
//get the text dimensions (it updates the variables -- by reference)
layout.GetPixelSize(out text_width, out text_height);
// Position the text in the middle
cr.MoveTo((rectangle_width - text_width) / 2d, (rectangle_height - text_height) / 2d);
Pango.CairoHelper.ShowLayout(cr, layout);
}
}
}