Skip to content

GUI Application Examples

Complete examples of GUI applications built with CacaoLang.

Counter Application

A simple counter with increment and decrement buttons.

// counter.choco
gui_init("com.chocolang.counter");

let window = gui_window("Counter", 300, 200, "main");
let box = gui_box("vertical", 10, "main_box");

let label = gui_label("Count: 0", "count_label");
let btn_inc = gui_button("Increment", "btn_inc");
let btn_dec = gui_button("Decrement", "btn_dec");
let btn_reset = gui_button("Reset", "btn_reset");

let count = 0;

fn increment() {
    count = count + 1;
    let text = "Count: #{count}";
    gui_set_text("count_label", text);
}

fn decrement() {
    count = count - 1;
    let text = "Count: #{count}";
    gui_set_text("count_label", text);
}

fn reset() {
    count = 0;
    gui_set_text("count_label", "Count: 0");
}

gui_on("btn_inc", "clicked", "increment");
gui_on("btn_dec", "clicked", "decrement");
gui_on("btn_reset", "clicked", "reset");

gui_add("main_box", "count_label");
gui_add("main_box", "btn_inc");
gui_add("main_box", "btn_dec");
gui_add("main_box", "btn_reset");
gui_add("main", "main_box");

gui_run();

Text Editor

A simple text editor with save and load functionality.

// editor.choco
gui_init("com.chocolang.editor");

let window = gui_window("Text Editor", 600, 400);
let box = gui_box("vertical", 5);

// Toolbar
let toolbar = gui_box("horizontal", 5);
let btn_save = gui_button("Save");
let btn_load = gui_button("Load");
let entry_filename = gui_entry("filename.txt");

gui_add(toolbar, entry_filename);
gui_add(toolbar, btn_save);
gui_add(toolbar, btn_load);

// Text area
let textview = gui_textview();

fn save_file() {
    let filename = gui_get_text(entry_filename);
    let content = gui_get_text(textview);
    write_file(filename, content);
    print "Saved to #{filename}";
}

fn load_file() {
    let filename = gui_get_text(entry_filename);
    if file_exists(filename) == true {
        let content = read_file(filename);
        gui_set_text(textview, content);
        print "Loaded #{filename}";
    } else {
        print "File not found: #{filename}";
    }
}

gui_on(btn_save, "clicked", "save_file");
gui_on(btn_load, "clicked", "load_file");

gui_add(box, toolbar);
gui_add(box, textview);
gui_add(window, box);

gui_run();

Todo List

A todo list application with add, complete, and delete functionality.

// todo.choco
gui_init("com.chocolang.todo");

let window = gui_window("Todo List", 400, 500);
let main_box = gui_box("vertical", 10);

// Input area
let input_box = gui_box("horizontal", 5);
let entry = gui_entry("New task...");
let btn_add = gui_button("Add");

gui_add(input_box, entry);
gui_add(input_box, btn_add);

// Todo items container
let todo_container = gui_box("vertical", 5);

// Store todos
let todos = [];
let todo_widgets = [];

fn add_todo() {
    let task = gui_get_text(entry);

    if len(task) > 0 {
        // Add to data
        todos = push(todos, task);

        // Create UI elements
        let item_box = gui_box("horizontal", 5);
        let checkbox = gui_checkbox(task);
        let btn_delete = gui_button("Delete");

        gui_add(item_box, checkbox);
        gui_add(item_box, btn_delete);
        gui_add(todo_container, item_box);

        // Clear input
        gui_set_text(entry, "");

        print "Added: #{task}";
    }
}

gui_on(btn_add, "clicked", "add_todo");
gui_on(entry, "changed", "add_todo");  // Add on Enter

gui_add(main_box, input_box);
gui_add(main_box, todo_container);
gui_add(window, main_box);

gui_run();

Calculator

A basic calculator with number pad and operations.

// calculator.choco
gui_init("com.chocolang.calculator");

let window = gui_window("Calculator", 300, 400);
let main_box = gui_box("vertical", 5);

// Display
let display = gui_entry("0");
gui_set_sensitive(display, false);

// Current calculation state
let current = "";
let operation = "";
let operand1 = 0;

fn append_digit(digit) {
    if current == "0" {
        current = str(digit);
    } else {
        current = current + str(digit);
    }
    gui_set_text(display, current);
}

fn set_operation(op) {
    operand1 = float(current);
    operation = op;
    current = "0";
}

fn calculate() {
    let operand2 = float(current);
    let result = 0;

    if operation == "+" {
        result = operand1 + operand2;
    } else {
        if operation == "-" {
            result = operand1 - operand2;
        } else {
            if operation == "*" {
                result = operand1 * operand2;
            } else {
                if operation == "/" {
                    if operand2 != 0 {
                        result = operand1 / operand2;
                    }
                }
            }
        }
    }

    current = str(result);
    gui_set_text(display, current);
    operation = "";
}

fn clear() {
    current = "0";
    operation = "";
    operand1 = 0;
    gui_set_text(display, "0");
}

// Number buttons
fn btn_0() { append_digit(0); }
fn btn_1() { append_digit(1); }
fn btn_2() { append_digit(2); }
fn btn_3() { append_digit(3); }
fn btn_4() { append_digit(4); }
fn btn_5() { append_digit(5); }
fn btn_6() { append_digit(6); }
fn btn_7() { append_digit(7); }
fn btn_8() { append_digit(8); }
fn btn_9() { append_digit(9); }

// Operation buttons
fn btn_add() { set_operation("+"); }
fn btn_sub() { set_operation("-"); }
fn btn_mul() { set_operation("*"); }
fn btn_div() { set_operation("/"); }

// Create button grid
let b0 = gui_button("0"); gui_on(b0, "clicked", "btn_0");
let b1 = gui_button("1"); gui_on(b1, "clicked", "btn_1");
let b2 = gui_button("2"); gui_on(b2, "clicked", "btn_2");
let b3 = gui_button("3"); gui_on(b3, "clicked", "btn_3");
let b4 = gui_button("4"); gui_on(b4, "clicked", "btn_4");
let b5 = gui_button("5"); gui_on(b5, "clicked", "btn_5");
let b6 = gui_button("6"); gui_on(b6, "clicked", "btn_6");
let b7 = gui_button("7"); gui_on(b7, "clicked", "btn_7");
let b8 = gui_button("8"); gui_on(b8, "clicked", "btn_8");
let b9 = gui_button("9"); gui_on(b9, "clicked", "btn_9");

let b_add = gui_button("+"); gui_on(b_add, "clicked", "btn_add");
let b_sub = gui_button("-"); gui_on(b_sub, "clicked", "btn_sub");
let b_mul = gui_button("*"); gui_on(b_mul, "clicked", "btn_mul");
let b_div = gui_button("/"); gui_on(b_div, "clicked", "btn_div");
let b_eq = gui_button("="); gui_on(b_eq, "clicked", "calculate");
let b_clr = gui_button("C"); gui_on(b_clr, "clicked", "clear");

// Layout
let row1 = gui_box("horizontal", 5);
gui_add(row1, b7); gui_add(row1, b8); gui_add(row1, b9); gui_add(row1, b_div);

let row2 = gui_box("horizontal", 5);
gui_add(row2, b4); gui_add(row2, b5); gui_add(row2, b6); gui_add(row2, b_mul);

let row3 = gui_box("horizontal", 5);
gui_add(row3, b1); gui_add(row3, b2); gui_add(row3, b3); gui_add(row3, b_sub);

let row4 = gui_box("horizontal", 5);
gui_add(row4, b0); gui_add(row4, b_clr); gui_add(row4, b_eq); gui_add(row4, b_add);

gui_add(main_box, display);
gui_add(main_box, row1);
gui_add(main_box, row2);
gui_add(main_box, row3);
gui_add(main_box, row4);
gui_add(window, main_box);

gui_run();

Form Application

A data entry form with validation.

// form.choco
gui_init("com.chocolang.form");

let window = gui_window("Registration Form", 400, 500);
let main_box = gui_box("vertical", 10);

// Form fields
let name_label = gui_label("Name:");
let name_entry = gui_entry("Enter your name");

let email_label = gui_label("Email:");
let email_entry = gui_entry("your@email.com");

let age_label = gui_label("Age:");
let age_entry = gui_entry("0");

let terms_check = gui_checkbox("I agree to terms and conditions");

let btn_submit = gui_button("Submit");
let result_label = gui_label("");

fn submit_form() {
    let name = gui_get_text(name_entry);
    let email = gui_get_text(email_entry);
    let age_str = gui_get_text(age_entry);
    let age = int(age_str);
    let agreed = gui_get_checked(terms_check);

    // Validation
    if len(name) == 0 {
        gui_set_text(result_label, "Error: Name required");
        return 0;
    }

    if len(email) == 0 {
        gui_set_text(result_label, "Error: Email required");
        return 0;
    }

    if age < 18 {
        gui_set_text(result_label, "Error: Must be 18+");
        return 0;
    }

    if agreed == false {
        gui_set_text(result_label, "Error: Must agree to terms");
        return 0;
    }

    // Success
    let msg = "Registered: #{name}, #{email}, Age #{age}";
    gui_set_text(result_label, msg);
    print msg;
}

gui_on(btn_submit, "clicked", "submit_form");

// Add all to main box
gui_add(main_box, name_label);
gui_add(main_box, name_entry);
gui_add(main_box, email_label);
gui_add(main_box, email_entry);
gui_add(main_box, age_label);
gui_add(main_box, age_entry);
gui_add(main_box, terms_check);
gui_add(main_box, btn_submit);
gui_add(main_box, result_label);

gui_add(window, main_box);
gui_run();

Compiling GUI Apps

Compile any of these examples:

./choco compile calculator.choco -o calculator
./calculator

All dependencies are automatically included in the compiled executable!