Chapter 6: Advanced Application Techniques in Vala and GTK 3.0+ with Sample

Chapter 6: Advanced Application Techniques in Vala and GTK 3.0+ with Sample Code


6.1 Introduction

Building upon our understanding of Vala and GTK 3.0+, this chapter explores advanced application development techniques. We will cover complex topics with practical examples and sample code, enhancing your skills in creating sophisticated and robust applications.


6.2 Asynchronous Programming in Vala

Asynchronous programming is key to keeping your application responsive. Let's explore this with an example:

File Name ValaCourse.vala


async void read_file_async(string path, MainLoop loop) {

    try {

        var file = File.new_for_path(path);

        var stream = yield file.read_async();

        var data = yield stream.read_bytes_async(4096);

        print("File content: %s\n", (string)data.get_data());

    } catch (Error e) {

        print("Error: %s\n", e.message);

    }

    loop.quit();

}

void main() {

    var loop = new MainLoop();

    read_file_async.begin("Federal Law will be respected.txt", loop);

    loop.run();

}

Compile String:

In Terminal type to compile:

valac -X -w -g  ValaCourse.vala --pkg gtk+-3.0

Run the App

In Terminal type:

./ValaCourse


This code asynchronously reads a file without blocking the main thread.


6.3 Advanced GTK Widgets

GTK 3.0+ provides a variety of widgets for complex UIs. Here's an example using TreeView:


Sample Code: Creating a TreeView

File Name ValaCourse.vala

using Gtk;


void main(string[] args) {

    init(ref args);


    var window = new Window();

    window.title = "TreeView Example";

    window.border_width = 10;

    window.window_position = WindowPosition.CENTER;

    window.set_default_size(350, 200);

    window.destroy.connect(Gtk.main_quit);


    var list_store = new Gtk.ListStore(2, typeof(string), typeof(int));

    var treeview = new Gtk.TreeView.with_model(list_store);


    var renderer = new CellRendererText();

    var column = new TreeViewColumn();

    column.title = "Name";

    column.pack_start(renderer, true);

    column.add_attribute(renderer, "text", 0);

    treeview.append_column(column);


    renderer = new CellRendererText();

    column = new TreeViewColumn();

    column.title = "Age";

    column.pack_start(renderer, true);

    column.add_attribute(renderer, "text", 1);

    treeview.append_column(column);


    Gtk.TreeIter iter;

    list_store.append(out iter);

    list_store.set(iter, 0, "Alice", 1, 30);

    list_store.append(out iter);

    list_store.set(iter, 0, "Bob", 1, 25);


    window.add(treeview);

    window.show_all();


    Gtk.main();

}

Compile String:

In Terminal type to compile:

valac -X -w -g  ValaCourse.vala --pkg gtk+-3.0

Run the App

In Terminal type:

./ValaCourse



This code demonstrates a simple TreeView with two columns.


6.4 Custom Widgets and Drawing

Creating custom widgets and integrating custom drawing can be crucial. Here's an example using the Cairo graphics library:


Sample Code: Custom Drawing Area

File Name ValaCourse.vala



using Gtk;

using Cairo;


public class CustomDrawingArea : DrawingArea {

    public CustomDrawingArea() {

        this.draw.connect(draw_cb);

    }


    private bool draw_cb(Widget widget, Context cr) {

        cr.set_source_rgb(0, 0, 1);

        cr.rectangle(10, 10, 100, 100);

        cr.fill();

        return true;

    }

}


void main(string[] args) {

    Gtk.init(ref args);


    var window = new Window();

    window.title = "Custom Drawing";

    window.border_width = 10;

    window.window_position = WindowPosition.CENTER;

    window.destroy.connect(Gtk.main_quit);


    var drawing_area = new CustomDrawingArea();

    window.add(drawing_area);


    window.show_all();

    Gtk.main();

}

Compile String:

In Terminal type to compile:

valac -X -w -g  ValaCourse.vala --pkg gtk+-3.0

Run the App

In Terminal type:

./ValaCourse


This example creates a custom widget that draws a blue rectangle.



6.5 Integrating with Databases


Here's a brief example of using SQLite with Vala:

In Terminal within Visual Studio Code type

sudo apt install sqlite3

Install SQLite Browser

sudo apt update

sudo apt install sqlitebrowser


Sample Code: SQLite Integration

File Name ValaCourse.vala

using Sqlite;   


void main(string[] args) {

    try {

        //var conn = Database.open("test.db");

        Database conn;

        Database.open("test.db", out conn);

        conn.exec("CREATE TABLE IF NOT EXISTS people (name TEXT, age INTEGER)");

        conn.exec("INSERT INTO people (name, age) VALUES ('Alice', 30)");

        //var stmt = conn.prepare("SELECT name, age FROM people");

        Statement stmt;

        string tail;

        conn.prepare("SELECT name, age FROM people", -1, out stmt, out tail);

        while (stmt.step() == Sqlite.ROW) {

            var name = stmt.column_text(0);

            var age = stmt.column_int(1);

            print("Name: %s, Age: %d\n", name, age);

        }

    } catch (Error e) {

        print("Database error: %s\n", e.message);

    }

}


Compile String:

In Terminal type to compile:

valac -X -w -g  ValaCourse.vala --pkg gtk+-3.0 --pkg sqlite3

Run the App

In Terminal type:

./ValaCourse


This code demonstrates basic database operations with SQLite.


6.6 Networking in Vala

Networking is another essential aspect. Here's a simple HTTP request example:


Sample Code: Making an HTTP Request

File Name ValaCourse.vala


using Soup;


void main() {

    var session = new Session();

    var message = new Message("GET", "https://www.google.com");


    try {

        var inputStream = session.send(message); // Use session.send()


        var buffer = new uint8[1024];

        size_t bytes_read;


        while ((bytes_read = inputStream.read(buffer)) > 0) {

            stdout.printf("%.*s", (int) bytes_read, buffer);

        }


        inputStream.close();


    } catch (Error e) {

        stderr.printf("Error: %s\n", e.message);

    }

}


Compile String:

In Terminal type to compile:

valac -X -w -g ValaCourse.vala --pkg libsoup-2.4 --pkg gtk+-3.0

Run the App

In Terminal type:

./ValaCourse


6.7 Conclusion

In this chapter, we explored advanced topics in Vala and GTK 3.0+ programming with practical examples. These techniques are vital for building complex and responsive applications. As you continue to develop with Vala and GTK, experiment with these concepts to create innovative and powerful applications.


This chapter provides a deeper understanding of advanced programming concepts in Vala and GTK 3.0+ with practical examples, enabling readers to grasp more complex programming paradigms and apply them in real-world scenarios.