public override void Draw(CairoContextEx gr, int area_width, int area_height, bool rtl) { double x = X, y = Y; this.rtl = rtl; #if DESIGN_MODE gr.Save (); gr.Color = new Cairo.Color (0, 0, 1); gr.Rectangle (X, Y, Width, Height); gr.Stroke (); gr.Restore (); ValidateDimensions (); #endif // // Coordinates are stored right to left // if (rtl == false) { for (int i = 0; i < children.Count; i++) { gr.Save (); gr.Translate (x, y); children[i].Draw (gr, area_width, area_height, rtl); gr.Restore (); x += children[i].Width; } } else { x += Width; for (int i = 0; i < children.Count; i++) { x -= children[i].Width; gr.Save (); gr.Translate (x, y); children[i].Draw (gr, area_width, area_height, rtl); gr.Restore (); } } }
public override void Draw(CairoContextEx gr, int area_width, int area_height, bool rtl) { double x = X, y = Y; this.rtl = rtl; #if DESIGN_MODE gr.Save (); gr.Color = new Cairo.Color (0, 0, 1); gr.Rectangle (X, Y, Width, Height); gr.Stroke (); gr.Restore (); double width = 0; foreach (Widget child in children) { width += child.Width; if (Height < child.Height) throw new InvalidOperationException (String.Format ("Container height too small {0} < {1}", Height, child.Height)); } if (Width < width) throw new InvalidOperationException (String.Format ("Container witdh too small {0} < {1}", Width, width)); #endif // // Coordinates are stored right to left // if (rtl == false) { for (int i = 0; i < children.Count; i++) { gr.Save (); gr.Translate (x, y); children[i].Draw (gr, area_width, area_height, rtl); gr.Restore (); x += children[i].Width; } } else { x += Width; for (int i = 0; i < children.Count; i++) { x -= children[i].Width; gr.Save (); gr.Translate (x, y); children[i].Draw (gr, area_width, area_height, rtl); gr.Restore (); } } }
static void GenerateQuestions(CairoContextEx cr, Game [] games, int columns, int rows) { int x, y, page; Game puzzle; string str; x = y = page = 0; for (int i = 0; i < games.Length; i++) { puzzle = games [i]; puzzle.Begin (); page++; cr.Save (); cr.Translate (x, y); cr.Rectangle (0, 0, width, height + question_height); cr.Clip (); // Translators: {0} is the game number and {1} the game question or answer // The number is used as reference when looking for the game solution in the PDF str = String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Game #{0}. {1}"), i + 1, puzzle.Question); // Draw question cr.SetPangoFontSize (12); cr.UseMarkup = true; cr.DrawStringWithWrapping (margin, 10, str, width - margin); cr.Stroke (); cr.UseMarkup = false; // Draw from question_height up height since from 0 to question_height is the question // Translate adds always to previous matrix's transformation cr.Translate (0, question_height); puzzle.DrawPreview (cr, width, height, false); if (i == 0) { cr.Save (); cr.SetPangoFontSize (0.02); cr.MoveTo (0.05, 0.95); cr.ShowPangoText (String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Created by gbrainy {0}"), Defines.VERSION)); cr.Stroke (); cr.Restore (); } x += width + margin; if (x > width + margin) { x = 0; y += height + margin + question_height; } cr.Restore (); cr.Stroke (); if (page >= columns * rows) { cr.ShowPage (); page = x = y = 0; } } if (y > 0) cr.ShowPage (); }
protected override bool OnDrawn(Cairo.Context cc) { if(!IsRealized) return false; int w, h, nw, nh; double x = 0, y = 0; CairoContextEx cr = new CairoContextEx (cc.Handle); cr.PangoFontDescription = PangoContext.FontDescription; w = Window.Width; h = Window.Height; nh = nw = Math.Min (w, h); if (nw < w) { x = (w - nw) / 2d; } if (nh < h) { y = (h - nh) / 2d; } cr.Translate (x, y); cr.Scale (nw, nh); view.Draw (cr, nw, nh, Direction == Gtk.TextDirection.Rtl); ((IDisposable)cr).Dispose(); return true; }
protected override bool OnExposeEvent(Gdk.EventExpose args) { if(!IsRealized) return false; int w, h, nw, nh; double x = 0, y = 0; Cairo.Context cc = Gdk.CairoHelper.Create (args.Window); CairoContextEx cr = new CairoContextEx (cc.Handle, this); args.Window.GetSize (out w, out h); nh = nw = Math.Min (w, h); if (nw < w) { x = (w - nw) / 2d; } if (nh < h) { y = (h - nh) / 2d; } cr.Translate (x, y); cr.Scale (nw, nh); view.Draw (cr, nw, nh, Direction == Gtk.TextDirection.Rtl); ((IDisposable)cc).Dispose(); ((IDisposable)cr).Dispose(); return base.OnExposeEvent(args); }
void GenerateQuestions(CairoContextEx cr, Game [] games, int columns, int rows) { int x, y, page; Game puzzle; string str; x = y = page = 0; for (int i = 0; i < games.Length; i++) { puzzle = games [i]; puzzle.Begin(); page++; cr.Save(); cr.Translate(x, y); cr.Rectangle(0, 0, width, height + question_height); cr.Clip(); // Translators: {0} is the game number and {1} the game question or answer // The number is used as reference when looking for the game solution in the PDF str = String.Format(Translations.GetString("Game #{0}. {1}"), i + 1, puzzle.Question); // Draw question cr.SetPangoFontSize(12); cr.UseMarkup = true; cr.DrawStringWithWrapping(margin, 10, str, width - margin); cr.Stroke(); cr.UseMarkup = false; // Draw from question_height up height since from 0 to question_height is the question // Translate adds always to previous matrix's transformation cr.Translate(0, question_height); puzzle.DrawPreview(cr, width, height, false); if (i == 0) { cr.Save(); cr.SetPangoFontSize(0.02); cr.MoveTo(0.05, 0.95); cr.ShowPangoText(String.Format(Translations.GetString("Created by gbrainy {0}"), Defines.VERSION)); cr.Stroke(); cr.Restore(); } x += width + margin; if (x > width + margin) { x = 0; y += height + margin + question_height; } cr.Restore(); cr.Stroke(); if (page >= columns * rows) { cr.ShowPage(); page = x = y = 0; } } if (y > 0) { cr.ShowPage(); } }
protected override bool OnExposeEvent(Gdk.EventExpose args) { if (!IsRealized) return false; int w, h, total_w, total_h; Cairo.Context cc = Gdk.CairoHelper.Create (args.Window); CairoContextEx cr = new CairoContextEx (cc.Handle, this); args.Window.GetSize (out total_w, out total_h); h = total_h - question_high; if (UseSolutionArea) h -= solution_high; w = total_w; // We want a square drawing area for the puzzles then the figures are shown as designed. // For example, squares are squares. This also makes sure that proportions are kept when resizing DrawingSquare = Math.Min (w, h); if (DrawingSquare < w) OffsetX = (w - DrawingSquare) / 2d; else OffsetX = 0; if (DrawingSquare < h) OffsetY = (h - DrawingSquare) / 2d; else OffsetY = 0; OffsetY += question_high; // Draw a background taking all the window area cr.Save (); cr.Scale (total_w, total_h); cr.DrawBackground (); if (Paused == false) { DrawQuestionAndAnswer (cr, total_h); } else { cr.SetPangoFontSize (0.08); cr.DrawTextCentered (0.5, 0.5, Catalog.GetString ("Paused")); cr.Stroke (); } cr.Restore (); if (Paused == false) { // Draw the game area cr.Translate (OffsetX, OffsetY); cr.SetPangoNormalFontSize (); cr.Color = new Color (1, 1, 1, 0.5); Drawable.Draw (cr, DrawingSquare, DrawingSquare, Direction == Gtk.TextDirection.Rtl); cr.Stroke (); } ((IDisposable)cc).Dispose(); ((IDisposable)cr).Dispose(); return true; }
public override void Draw(CairoContextEx gr, int area_width, int area_height, bool rtl) { #if DESIGN_MODE gr.Save (); gr.Color = new Cairo.Color (0, 0, 1); gr.Rectangle (X, Y, Width, Height); gr.Stroke (); gr.Restore (); #endif foreach (Widget child in children) { gr.Save (); gr.Translate (child.X, child.Y); child.Draw (gr, area_width, area_height, rtl); gr.Restore (); } }