feat: add message box dialogs

This commit is contained in:
2026-04-22 18:44:25 +02:00
parent 6c2796f8bd
commit 15a092d0b4
10 changed files with 695 additions and 17 deletions
+84 -11
View File
@@ -15,6 +15,7 @@
#include "main.hpp"
#include "filedialog.hpp"
#include "printdialog.hpp"
#include "messagebox.hpp"
using namespace gui;
namespace dlg = gui::dialogs;
@@ -41,6 +42,8 @@ void dialog_cancel(const char* message) {
void cleanup() {
if (g_app.is_print) {
printdialog::cleanup();
} else if (g_app.is_message) {
messagebox::cleanup();
} else {
filedialog::cleanup();
}
@@ -54,20 +57,26 @@ static void set_error_result(dlg::Result* result, const char* message) {
dlg::safe_copy(result->message, sizeof(result->message), message);
}
static bool ensure_fonts(dlg::Result* result) {
if (g_fonts_ready) return true;
if (!fonts::init()) {
if (result)
set_error_result(result, "failed to initialize dialog fonts");
return false;
}
g_fonts_ready = true;
return true;
}
extern "C" bool dialogs_run_request(const dlg::Request* request, dlg::Result* out_result) {
if (!request || !out_result) return false;
set_error_result(out_result, "dialog failed");
if (!g_fonts_ready) {
if (!fonts::init()) {
set_error_result(out_result, "failed to initialize dialog fonts");
return true;
}
g_fonts_ready = true;
}
if (!ensure_fonts(out_result)) return true;
if (request->kind != dlg::REQUEST_KIND_FILE && request->kind != dlg::REQUEST_KIND_PRINT) {
if (request->kind != dlg::REQUEST_KIND_FILE &&
request->kind != dlg::REQUEST_KIND_PRINT) {
set_error_result(out_result, "unsupported dialog request");
return true;
}
@@ -78,9 +87,16 @@ extern "C" bool dialogs_run_request(const dlg::Request* request, dlg::Result* ou
dlg::reset_result(&g_app.result);
g_app.is_print = g_app.request.kind == dlg::REQUEST_KIND_PRINT;
const int init_w = g_app.is_print ? printdialog::PRINT_INIT_W : filedialog::FILE_INIT_W;
const int init_h = g_app.is_print ? printdialog::PRINT_INIT_H : filedialog::FILE_INIT_H;
const char* title = g_app.request.title[0] ? g_app.request.title : (g_app.is_print ? "Print" : "Open");
int init_w = filedialog::FILE_INIT_W;
int init_h = filedialog::FILE_INIT_H;
if (g_app.is_print) {
init_w = printdialog::PRINT_INIT_W;
init_h = printdialog::PRINT_INIT_H;
}
const char* default_title = g_app.is_print ? "Print" : "Open";
const char* title = g_app.request.title[0] ? g_app.request.title : default_title;
if (g_app.is_print) printdialog::init(g_app.request);
else filedialog::init(g_app.request);
@@ -136,3 +152,60 @@ extern "C" bool dialogs_run_request(const dlg::Request* request, dlg::Result* ou
*out_result = g_app.result;
return true;
}
extern "C" uint8_t dialogs_message_box(const char* title,
const char* message,
uint8_t buttons) {
if (!ensure_fonts(nullptr))
return dlg::MESSAGE_BOX_RESULT_NONE;
g_app = AppState {};
g_app.running = true;
g_app.is_message = true;
const char* window_title = title && title[0] ? title : "Message";
messagebox::init(message ? message : "", buttons);
if (!g_app.win.create(window_title, messagebox::MESSAGE_INIT_W, messagebox::MESSAGE_INIT_H)) {
cleanup();
return dlg::MESSAGE_BOX_RESULT_NONE;
}
messagebox::draw();
g_app.win.present();
while (g_app.running) {
messagebox::draw();
g_app.win.present();
Montauk::WinEvent ev;
int rc = g_app.win.poll(&ev);
if (rc < 0) {
messagebox::dismiss();
break;
}
if (rc == 0) {
montauk::sleep_ms(16);
continue;
}
if (ev.type == 3) {
messagebox::dismiss();
break;
}
if (ev.type == 2 || ev.type == 4) {
continue;
}
if (ev.type == 1) {
messagebox::handle_mouse(ev);
continue;
}
if (ev.type == 0) {
messagebox::handle_key(ev.key);
}
}
uint8_t choice = messagebox::selected_choice();
cleanup();
return choice ? choice : (uint8_t)dlg::MESSAGE_BOX_RESULT_NONE;
}