El lenguaje de programación Vala

Vala es un nuevo lenguaje (2006) de programación muy parecido a C# y Java. Vala fue creado principalmente para el ambiente Linux pero por lo que me han dicho en los comentarios Vala también funciona en Windows, y por lo general sin modificar lineas de código extras. También Vala funciona en todas las plataformas que son soportadas por GLib por lo tanto es multiplataforma.

Al parecer muchos de los programadores de Gnome están cansados de programar aplicaciones grandes en C, por que muchos dicen que son un dolor de cabeza. Pero parece que los desarrolladores de Gnome prefieren Python un lenguaje interpretado en ves de C. El lenguaje Vala posee características de lenguajes modernos como C# y además con el puedes generar código C escribiendo esta linea en la consola:

Código:
valac -o ejemplo ejemplo.vala -C

Y sin la bandera “-C” te genera el ejecutable solamente.

Genera código en C y luego un ejecutable de C. Esto es muy interesante por que un programa que no usa una maquina virtual es mucho más rápido que los que la usan como C# o Java. Con Vala podemos disfrutar de la eficiencia de los lenguajes como C y C++ con las características de lenguajes modernos como C#. También se dice que los compiladores de C/C++ son los mejores compiladores actuales por eso son los más usados para el desarrollo de juegos con efectos gráficos de última generación, el motor de búsqueda de Google esta escrito en C.

Veamos un programa escrito en Vala:

Código:
// ejemplo.vala
using GLib;

public class Test.HelloObject : GLib.Object
{

public static void main (string[] args)
{
stdout.printf(“No hay viento favorable para el que no sabe donde va\n”);
}
}

Se compila con:

Código:
valac -o ejemplo ejemplo.vala

Lo malo es que hay muy poca documentación sobre las APIs para este lenguaje por lo que hay que ir viendo la documentación que esta hecha para otros lenguajes. Pero tampoco es una tarea tan fuerte ya que la diferencia entre lenguajes de programación no es mucha.  No hay mucha diferencia si se busca documentación de las APIs para C++ o C#, por ejemplo.

También los invito a leer los comentarios, hay muy buenas opiniones al respecto.

Agradecimientos, por la corrección de algunos errores de este artículo:

Edwinspire

txasatonga

Algunos link:

http://knocte.blogspot.com/2007/08/vala-lo-mejor-de-los-dos-mundos-c-c.html
http://www.glib.org.mx/article.php?story=20090118173114777&mode=print

http://es.wikipedia.org/wiki/Vala_(lenguaje_de_programaci%C3%B3n)

En ingles:
http://live.gnome.org/Vala

Ejemplo MonoDevelop: GtkDragAndDrop

Drag and drop en MonoDevelop

Hace tiempo estuve buscando pero no encontré documentación en español acerca del Drag And Drop (arrastrar y soltar) en Gtk-Sharp. Al final, consiente de los ejemplo que trae Gtk-Sharp no había encontrado uno que tratase el Drag And Drop, pero después de un tiempo lo volví a revisar y existe un ejemplo que esta en: /usr/share/gtk-sharp2-examples/TestDnd.cs (teniendo instalado Gtk-Sharp). La verdad es que me considero novato en el mundo de Mono y encontré que el ejemplo era demasiado complejo para mi asi que lo acorte, rescate las partes mas importantes del código y elimine lo no tan importante, lo adapte para que funcione en MonoDevelop. Si han leido mi blog sabrán de mi filosofía de los ejemplos, creo que estos deben ser cortos para explicar cosas esenciales.

En el ejemplo GtkDragAndDrop hay solo una ventana que contiene un botón con un label, para mostrar como se arrastra un botón a un label.

Lo mas importante:

Table table;

Label label;

Button button;

table = new Table (1, 2, false);

this.Add (table);

label = new Label (“Drop Here\n”);

// Prototipo: static void DestSet (Widget widget,

// DestDefaults flags, TargetEntry[] targets,

// Gdk.DragAction actions)

Gtk.Drag.DestSet (label, DestDefaults.All, target_table,

DragAction.Copy | DragAction.Move);

// Evento que recibe el boton “button”, para arrastrarlo hacia

// el label “label”

label.DragDataReceived += new DragDataReceivedHandler

(HandleLabelDragDataReceived);

// Posicionar a “label”

table.Attach (label, 0, 1, 0, 1, AttachOptions.Expand |

AttachOptions.Fill, AttachOptions.Expand |

AttachOptions.Fill, 0, 0);

button = new Button (“Drag Here\n”);

// Prototipo: SourceSet(Widget, Gdk.ModifierType, TargetEntry[], Gdk.DragAction)

Gtk.Drag.SourceSet (button, Gdk.ModifierType.Button1Mask |

Gdk.ModifierType.Button3Mask, Table table;

Label label;

Button button;

table = new Table (1, 2, false);

this.Add (table);

label = new Label (“Drop Here\n”);

// Prototipo: static void DestSet (Widget widget,

// DestDefaults flags, TargetEntry[] targets,

// Gdk.DragAction actions)

Gtk.Drag.DestSet (label, DestDefaults.All, target_table,

DragAction.Copy | DragAction.Move);

// Evento que recibe el boton “button”, para arrastrarlo hacia

// el label “label”

label.DragDataReceived += new DragDataReceivedHandler

(HandleLabelDragDataReceived);

// Posicionar a “label”

table.Attach (label, 0, 1, 0, 1, AttachOptions.Expand |

AttachOptions.Fill, AttachOptions.Expand |

AttachOptions.Fill, 0, 0);

button = new Button (“Drag Here\n”);

// Prototipo: SourceSet(Widget, Gdk.ModifierType, TargetEntry[], Gdk.DragAction)

Gtk.Drag.SourceSet (button, Gdk.ModifierType.Button1Mask |

Gdk.ModifierType.Button3Mask,

target_table, DragAction.Copy | DragAction.Move);

// Posiciona a “buton”

table.Attach (button, 0, 1, 1, 2,

AttachOptions.Expand | AttachOptions.Fill,

AttachOptions.Expand | AttachOptions.Fill, 0, 0);

// Conecta el evento que envia un dato desde “button”

button.DragDataGet += new DragDataGetHandler (HandleSourceDragDataGet);

this.ShowAll();

Build ();

target_table, DragAction.Copy | DragAction.Move);

// Posiciona a “buton”

table.Attach (button, 0, 1, 1, 2,

AttachOptions.Expand | AttachOptions.Fill,

AttachOptions.Expand | AttachOptions.Fill, 0, 0);

// Conecta el evento que envia un dato desde “button”

button.DragDataGet += new DragDataGetHandler (HandleSourceDragDataGet);

this.ShowAll();

Build ();

Acá el ejemplo de GtkDragAndDrop y el de tesdnd que viene con los ejemplos de Gtk-Sharp

GtkDragAndDrop
TestDnd

Ejemplo MonoDevelop: CairoEjemplo002

Ahora un ejemplo recién un poco mas interesante en Mono.Cairo, que dibuja una X de colores sobre una ventana, luego esta misma imagen la pasa a un archivo de imagen PNG. Ahora la parte mas interesante:

// MainWindow.cs

using Cairo;
using System;
using Gtk;

public partial class MainWindow: Gtk.Window
{
	public MainWindow (): base (Gtk.WindowType.Toplevel)
	{
		Build ();
	}

	protected void OnDeleteEvent (object sender, DeleteEventArgs a)
	{
		Application.Quit ();
		a.RetVal = true;
	}

	protected virtual void OnButton1Clicked (object sender, System.EventArgs e)
	{
		Cairo.ImageSurface Imsf = new ImageSurface(Format.ARGB32, 200, 200);
		using (Cairo.Context Ctx = new Cairo.Context(Imsf)) {

			Ctx.LineWidth = 20;

			Ctx.SetSourceRGB(0,0,1); //Color Azul
			Ctx.MoveTo(0,0);
			Ctx.LineTo(100,100);
			Ctx.Stroke();

			Ctx.SetSourceRGB(0.66,0.44,0.33); //Color Cafe
			Ctx.MoveTo(100,100);
			Ctx.LineTo(0,200);
			Ctx.Stroke();

			Ctx.SetSourceRGB(0,1,0); //Color Verde
			Ctx.MoveTo(100,100);
			Ctx.LineTo(200,200);
			Ctx.Stroke();

			Ctx.SetSourceRGB(1,0,0); //Color Rojo
			Ctx.MoveTo(100,100);
			Ctx.LineTo(200,0);
			Ctx.Stroke();

			Imsf.WriteToPng("Dibujo.png");
		}
		Gtk.Window Win1 = new Gtk.Window("Dibujo");

		Gtk.Image Img1 = new Image("Dibujo.png");
		Console.WriteLine("Se a creado un archivo Dibujo.png");

		Gtk.HBox hbox = new HBox();
		hbox.Add(Img1);

		Win1.Add(hbox);
		Win1.ShowAll();
	}
}

 

Entonces:

  • Un objeto del tipo Cairo.ImageSurface es en el cual se dibuja.

  • Se podría decir que un objeto Cairo.Context, son las herramientas para dibujar en una surface, como por ejemplo un Cairo.ImageSurface o en un Cairo.Surface.

  • El metodo Cairo.Context.Stroke() dibuja según argumentos establecidos por otros metodos como por ejemplo: MoveTo(), LineTo(), LineWidth()

 

Una así queda:

 

Descarga aqui el ejemplo. [enlace roto]

Por favor avisenme si existe algún error ::)

Ejemplo MonoDevelop: CairoEjemplo01

A continuación voy a presentar un ejemplo simple que muestra como insertar un texto en una clase Cairo.ImageSurface, para luego guardarlo en un archivo PNG. Esta basado en la librería Mono.Cairo versión 2.0.0. Este ejemplo lo copie de MonoDoc y yo solamente lo adapte para que funcionase en MonoDevelop 1.0.

Aquí la parte en la que me quiero enfocar del código:


// Crear una clase Cairo.ImageSurface pasándole como argumentos el formato
// (Format.ARG32), el ancho de la imagen (240) y el alto (80)
Cairo.ImageSurface surface = new Cairo.ImageSurface (Format.ARGB32, 240, 80);

// Primero se crea una clase Cairo.Context y se le añade como parámetro la
// clase creada anteriormente, después se usa el espacio de nombre Cairo.ctx
// solamente dentro de un bloque.
using (Cairo.Context ctx = new Cairo.Context (surface))
{
// Se Selecciona el Font
ctx.SelectFontFace (“serif”, FontSlant.Normal, FontWeight.Bold);
ctx.SetFontSize (32.0); // El tamaño del Font

// Selecciona el color Azul
ctx.SetSourceRGB (0, 0, 1);

// Dibujar
ctx.MoveTo (10, 50);
ctx.ShowText (“Hello, World”);

// Crea una imagen en el directorio del ejecutable o en la carpeta personal (home/usuario)
surface.WriteToPng (“test2.png”);

Console.WriteLine(“Se a creado un archivo test2.png”);
}

Build ();

Esta imagen crea Cairo:

Aquí el código completo: CairoEjemplo01