private void scene_design(DrawingArea area, Cairo.Context cr) { area.AddEvents((int)Gdk.EventMask.ButtonPressMask); area.ButtonPressEvent += delegate(object o, ButtonPressEventArgs arg) { area.GetPointer(out xo, out yo); pressed = true; }; area.AddEvents((int)Gdk.EventMask.ButtonReleaseMask); area.ButtonReleaseEvent += delegate(object o, ButtonReleaseEventArgs args) { pressed = false; UpdateViewSurface(); }; if (pressed) { area.GetPointer(out xt, out yt); if (ventana.circulo.Active) { cr.LineWidth = 2; cr.SetSourceRGBA(0, 0, 1, 0.5); cr.Arc(xo, yo, Constantes.distancia(xt, xo), 0, Math.PI * 2); cr.Stroke(); } else if (ventana.linea.Active) { cr.LineWidth = 2; cr.SetSourceRGBA(0, 1, 0, 0.5); cr.MoveTo(xo, yo); cr.LineTo(xt, yt); cr.Stroke(); } else if (ventana.rectangulo.Active) { cr.LineWidth = 2; cr.SetSourceRGBA(1, 0, 0, 0.5); cr.Rectangle(xo, yo, xt - xo, yt - yo); cr.Stroke(); } } cr.SetSourceSurface(Constantes.viewSurface, 0, 0); cr.Paint(); }
private void UpdateViewSurface() { if (Constantes.escenario) { //whenever we want //draw onto our surface in memory using (Context cr = new Context(Constantes.viewSurface)) { if (ventana.circulo.Active) { if (!Constantes.contiene(Logica.circulos, new Obstaculo(xo, yo, Constantes.distancia(xt, xo), 0, (int)ventana.intermitencia.Value)) && Constantes.distancia(xt, xo) != 0) { Logica.circulos.Add(new Obstaculo(xo, yo, Constantes.distancia(xt, xo), 0, (int)ventana.intermitencia.Value)); } cr.LineWidth = 2; cr.SetSourceRGBA(0, 0, 1, 1); cr.Arc(xo, yo, Constantes.distancia(xt, xo), 0, Math.PI * 2); cr.Stroke(); } else if (ventana.linea.Active) { if (!Constantes.contiene(Logica.lineas, new Obstaculo(xo, yo, xt, yt, (int)ventana.intermitencia.Value)) && Constantes.distancia_dos_puntos(xo, yo, xt, yt) != 0) { Logica.lineas.Add(new Obstaculo(xo, yo, xt, yt, (int)ventana.intermitencia.Value)); } cr.LineWidth = 2; cr.SetSourceRGBA(0, 1, 0, 1); cr.MoveTo(xo, yo); cr.LineTo(xt, yt); cr.Stroke(); } else if (ventana.rectangulo.Active) { if (!Constantes.contiene(Logica.rectangulos, new Obstaculo(xo, yo, xt - xo, yt - yo, (int)ventana.intermitencia.Value)) && (Constantes.distancia(xt, xo) != 0 || Constantes.distancia(yt, yo) != 0)) { Logica.rectangulos.Add(new Obstaculo(xo, yo, xt - xo, yt - yo, (int)ventana.intermitencia.Value)); } cr.Rectangle(xo, yo, xt - xo, yt - yo); cr.LineWidth = 2; cr.SetSourceRGBA(1, 0, 0, 1); cr.Stroke(); } else if (ventana.puntoInicio.Active) { if (!Logica.puntos_inicio.Contains(new System.Drawing.Point(xo, yo))) { Logica.puntos_inicio.Add(new System.Drawing.Point(xo, yo)); } cr.SetSourceRGBA(1, 0, 1, 0.8); cr.Arc(xo, yo, 10, 0, 2 * Math.PI); cr.Fill(); cr.Stroke(); } else if (ventana.puntoObjetivo.Active) { int n = (int)ventana.nivel.Value; if (ventana.nivel.Value == Constantes.max_nivel) { Logica.puntos_objetivo.Add(new Objetivo()); Constantes.max_nivel++; ventana.nivel.SetRange(1, Constantes.max_nivel); } if (!Logica.puntos_objetivo [(int)ventana.nivel.Value - 1].contains(xo, yo)) { Logica.puntos_objetivo [(int)ventana.nivel.Value - 1].add_objetivo(xo, yo); } cr.SetSourceRGBA(1, 0, 0, 0.6); cr.Arc(xo, yo, Constantes.radio_objetivos, 0, 2 * Math.PI); cr.Fill(); cr.Stroke(); cr.SetSourceRGB(0, 0, 0); cr.SelectFontFace("Arial", FontSlant.Normal, FontWeight.Normal); cr.SetFontSize(12); TextExtents t = cr.TextExtents(n.ToString()); cr.MoveTo(xo - 4, yo + 4); cr.ShowText(n.ToString()); } cr.Dispose(); } } }