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:
All dependencies are automatically included in the compiled executable!