feat: add message box dialogs
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user