Noticia Creando una app [Vala + Gtk 3] (2da parte)

En esta segunda parte construiremos la lógica de la aplicación (para ver y analizar el código mejor mirarlo completo que lo pondré abajo del post), pero antes de eso necesitaremos instalar las librerías sqlite3 que usaremos para poder guardar las preguntas y sus respectivas respuestas:

sudo apt-get install libsqlite3-dev
Una ves instaladas las librerías solo necesitaremos un “using Sqlite;” para poder usar sqlite en vala.

Necesitaremos crear una Tabla que contenga:

Pregunta
Respuesta1
Respuesta2
Respuesta3
Respuesta4
correcta

ejemplo:

Pregunta = es desdelinux un buen blog?

Respuesta1 = no existe ese blog
Respuesta2 = no
Respuesta3 = si
Respuesta4 = hola

como todos sabremos la respuesta correcta es la 2 (na la buena es la 3)

correcta = 3

Para crear la tabla y manejarla necesitaremos saber sentencias sql (podéis buscarlo en vuestro buscador favorito), sentencia para crear la tabla:

CREATE TABLE preguntas (pregunta TEXT, respuesta1 TEXT, respuesta2 TEXT, respuesta3 TEXT, respuesta4 TEXT, correcto INT);Insertar preguntas … :

INSERT INTO preguntas (pregunta, respuesta1, respuesta2, respuesta3, respuesta4, correcto) VALUES ('es desdelinux un buen blog', 'no es ningun blog', 'no', 'si', 'hola', 3);

Bien ahora obtener una pregunta (ordenadas de forma random) :

SELECT pregunta, respuesta1, respuesta2, respuesta3, respuesta4, correcto FROM preguntas ORDER BY RANDOM()

Abriendo la base de datos:

int ec = Sqlite.Database.open ("test.db", out db);
if (ec != Sqlite.OK) {
stderr.printf ("Can't open database: %d: %s\n", db.errcode (), db.errmsg ());
}

En caso que no la tengamos ya creada (primera vez que ejecutamos el código) se creara sola.



Crear la tabla y inserir preguntas:

private void bd () {
string errmsg;
// Abre la base de datos / Crea la base de datos
int ec = Sqlite.Database.open ("test.db", out db);
if (ec != Sqlite.OK) {
stderr.printf ("Can't open database: %d: %s\n", db.errcode (), db.errmsg ());
}
if (!FileUtils.test ("test.db", FileTest.IS_REGULAR)) {
string query = """
CREATE TABLE preguntas (
pregunta TEXT,
respuesta1 TEXT,
respuesta2 TEXT,
respuesta3 TEXT,
respuesta4 TEXT,
correcto INT
);

INSERT INTO preguntas (pregunta, respuesta1, respuesta2, respuesta3, respuesta4, correcto) VALUES ('es desdelinux un buen blog', 'no es ningun blog', 'no', 'si', 'hola', 3);
INSERT INTO preguntas (pregunta, respuesta1, respuesta2, respuesta3, respuesta4, correcto) VALUES ('5+5', '25', '10', '3', '5', 2);
""";

ec = db.exec (query, null, out errmsg);
if (ec != Sqlite.OK) {
stderr.printf ("Error: %s\n", errmsg);
}
}
}

Comprobar que no hay error:

if (ec != Sqlite.OK) {
stderr.printf ("Error: %s\n", errmsg);
return -1;
}

Crearemos 6 string que nos ayudaran a hacer la asignación de preguntas y respuestas.

private string p;
private string r1;
private string r2;
private string r3;
private string r4;
private string c;

Colocando una pregunta (que obtenemos de test.db) con un SELECT:

private void bd_select_preguntas () {
string query = "SELECT pregunta, respuesta1, respuesta2, respuesta3, respuesta4, correcto FROM preguntas ORDER BY RANDOM()";
int rc = db.prepare_v2 (query, -1, out stmt, null );
int cols = stmt.column_count();
rc = stmt.step ();
int col;
if ( rc == Sqlite.ROW ) {
for (col = 0; col < cols; col++) {
string txt = stmt.column_text(col);
if(col == 0){
p = txt;
}
else if(col == 1){
r1 = txt;
}
else if(col == 2){
r2 = txt;
}
else if(col == 3){
r3 = txt;
}
else if(col == 4){
r4 = txt;
}
else{
c = txt;
}
//print ("%s = %s\n", stmt.column_name (col), txt);
}
}
}

Colocar la pregunta a los elementos graficos:

private void next_pregunta () {
this.pregunta.set_label(this.p);
this.resposta1.set_label(this.r1);
this.resposta2.set_label(this.r2);
this.resposta3.set_label(this.r3);
this.resposta4.set_label(this.r4);
}

Puntuar:

private void puntua () {
this.punts = this.punts + 50;
this.puntos.set_label(this.punts.to_string());
}

Tratar si es correcta la respuesta:


private void correcto (string cor) {
if (this.c == cor) {
this.puntua ();
this.bd_select_preguntas ();
this.next_pregunta();
}
else{
//incorrecto
}
}



resposta1.clicked.connect (() => {
this.correcto("1");
});
resposta2.clicked.connect (() => {
this.correcto("2");
});
resposta3.clicked.connect (() => {
this.correcto("3");
});
resposta4.clicked.connect (() => {
this.correcto("4");
});

Lógica del tiempo, como ya vimos en el anterior post solo tenemos de añadir un if que compruebe que el tiempo si este llega a 1 damos como incorrecta la respuesta :



Compilar (le añadimos –pkg sqlite3)
valac -v lol.vala --pkg gtk+-3.0 --pkg sqlite3

Creando tres botones (50%, Congelar, Pasar):

Creamos un nuevo Gbox horizontal y le añadimos los tres botones, añadimos este Gbox al que ya teníamos creado:

this.box2 = new Gtk.Box (Gtk.Orientation.HORIZONTAL, 0);
var button1 = new Gtk.Button.with_label ("50%");
var button2 = new Gtk.Button.with_label ("congelar");
var button3 = new Gtk.Button.with_label ("passar");
this.box2.pack_start(button1);
this.box2.pack_start(button2);
this.box2.pack_start(button3);

this.box.pack_start (box2);




Código completo: http://paste.desdelinux.net/4882


mfMUmUyARJo


Continúar leyendo...