forked from pyrite-dev/milsko
131 lines
3.1 KiB
C
131 lines
3.1 KiB
C
#include <Mw/Milsko.h>
|
|
|
|
#include "../external/stb_ds.h"
|
|
|
|
typedef struct msgbox {
|
|
int key;
|
|
MwWidget value;
|
|
} msgbox_t;
|
|
|
|
static void spawn_button(MwWidget handle, int x, int y, int id, const char* text) {
|
|
msgbox_t* mb = handle->opaque;
|
|
MwWidget widget = MwVaCreateWidget(MwButtonClass, text, handle, x, y, 80, 24,
|
|
MwNtext, text,
|
|
NULL);
|
|
|
|
hmput(mb, id, widget);
|
|
|
|
handle->opaque = mb;
|
|
}
|
|
|
|
static void messagebox_destroy_inject(MwWidget handle) {
|
|
void* px;
|
|
|
|
if((px = MwGetVoid(handle, MwNpixmap)) != NULL) MwLLDestroyPixmap(px);
|
|
}
|
|
|
|
static void messagebox_close(MwWidget handle, void* user, void* call) {
|
|
(void)user;
|
|
(void)call;
|
|
MwDestroyWidget(handle);
|
|
}
|
|
|
|
MwWidget MwMessageBox(MwWidget handle, const char* text, const char* title, unsigned int flag) {
|
|
MwWidget window;
|
|
int w, h;
|
|
int left = 8;
|
|
int th;
|
|
int x = 0;
|
|
int wx;
|
|
int wy;
|
|
MwSizeHints sh;
|
|
|
|
w = 512;
|
|
h = 32 * 4;
|
|
|
|
if(handle == NULL) {
|
|
wx = wy = MwDEFAULT;
|
|
} else {
|
|
wx = MwGetInteger(handle, MwNx) + (MwGetInteger(handle, MwNwidth) - w) / 2;
|
|
wy = MwGetInteger(handle, MwNy) + (MwGetInteger(handle, MwNheight) - h) / 2;
|
|
}
|
|
|
|
sh.min_width = sh.max_width = w;
|
|
sh.min_height = sh.max_height = h;
|
|
|
|
window = MwVaCreateWidget(MwWindowClass, "messagebox", NULL, wx, wy, w, h,
|
|
MwNtitle, title,
|
|
MwNsizeHints, &sh,
|
|
NULL);
|
|
if(handle != NULL) MwReparent(window, handle);
|
|
|
|
window->opaque = NULL;
|
|
|
|
if(flag & MwMB_BUTTONOK) spawn_button(window, w - (x += 8 + 80), h - 8 - 24, MwMB_BUTTONOK, "OK");
|
|
if(flag & MwMB_BUTTONCANCEL) spawn_button(window, w - (x += 8 + 80), h - 8 - 24, MwMB_BUTTONCANCEL, "Cancel");
|
|
|
|
if(flag & MwMB_BUTTONNO) spawn_button(window, w - (x += 8 + 80), h - 8 - 24, MwMB_BUTTONNO, "No");
|
|
if(flag & MwMB_BUTTONYES) spawn_button(window, w - (x += 8 + 80), h - 8 - 24, MwMB_BUTTONYES, "Yes");
|
|
|
|
if((flag & MwMB_ICONMASK) != 0) {
|
|
MwWidget icon;
|
|
MwLLPixmap px;
|
|
unsigned int* data = NULL;
|
|
|
|
icon = MwCreateWidget(MwImageClass, "image", window, 8, (h - 48) / 2, 48, 48);
|
|
|
|
switch(flag & MwMB_ICONMASK) {
|
|
case MwMB_ICONWARNING: {
|
|
data = MwIconWarning;
|
|
break;
|
|
}
|
|
case MwMB_ICONINFO: {
|
|
data = MwIconInfo;
|
|
break;
|
|
}
|
|
case MwMB_ICONNOTE: {
|
|
data = MwIconNote;
|
|
break;
|
|
}
|
|
case MwMB_ICONNEWS: {
|
|
data = MwIconNews;
|
|
break;
|
|
}
|
|
case MwMB_ICONERROR: {
|
|
data = MwIconError;
|
|
break;
|
|
}
|
|
case MwMB_ICONCLOCK: {
|
|
data = MwIconClock;
|
|
break;
|
|
}
|
|
}
|
|
|
|
px = MwLoadIcon(icon, data);
|
|
|
|
MwSetVoid(icon, MwNpixmap, px);
|
|
|
|
left = 8 + 48 + 8;
|
|
}
|
|
|
|
th = MwTextHeight(handle, NULL, text);
|
|
(void)MwVaCreateWidget(MwLabelClass, "label", window, left, (h - th) / 2, w - left - 8, th,
|
|
MwNtext, text,
|
|
MwNalignment, MwALIGNMENT_BEGINNING,
|
|
NULL);
|
|
|
|
MwLLBeginStateChange(window->lowlevel);
|
|
MwLLMakePopup(window->lowlevel, handle == NULL ? NULL : handle->lowlevel);
|
|
MwLLEndStateChange(window->lowlevel);
|
|
|
|
MwAddUserHandler(window, MwNcloseHandler, messagebox_close, NULL);
|
|
window->destroy_inject = messagebox_destroy_inject;
|
|
|
|
return window;
|
|
}
|
|
|
|
MwWidget MwMessageBoxGetChild(MwWidget handle, int child) {
|
|
msgbox_t* mb = handle->opaque;
|
|
|
|
return hmget(mb, child);
|
|
}
|