100 lines
No EOL
3.1 KiB
HolyC
100 lines
No EOL
3.1 KiB
HolyC
Gui.App();
|
|
|
|
#define CALC_OP_ADD 0
|
|
#define CALC_OP_SUB 1
|
|
#define CALC_OP_MUL 2
|
|
#define CALC_OP_DIV 3
|
|
|
|
class @calc_entry
|
|
{
|
|
I64 op;
|
|
F64 entry;
|
|
};
|
|
|
|
Window* win = NULL;
|
|
TextInputWidget* result = NULL;
|
|
|
|
U8* calc_font = "Eight Bit Dragon";
|
|
U8* @calc_button_label[27] = { "Back", "CE", "C", "MC", "7", "8", "9",
|
|
"/", "sqrt", "MR", "4", "5", "6", "*",
|
|
"%", "MS", "1", "2", "3", "-", "1/x",
|
|
"M+", "0", "+/-", ".", "+", "=" };
|
|
|
|
U0 @calc_keypress_callback(Window*, I64 key)
|
|
{
|
|
if (win != Compositor.active_win)
|
|
return;
|
|
U8* res_text = result->text;
|
|
switch (ScanCode2Char(key)) {
|
|
case '0' ... '9':
|
|
StrPrint(res_text + StrLen(res_text), "%c", ScanCode2Char(key));
|
|
break;
|
|
}
|
|
}
|
|
|
|
U0 @calc_btn_callback(ButtonWidget* widget)
|
|
{
|
|
U8* res_text = result->text;
|
|
if (Str2I64(widget->text)) {
|
|
StrCpy(res_text + StrLen(res_text), widget->text);
|
|
}
|
|
if (!StrCmp(widget->text, "0"))
|
|
StrCpy(res_text + StrLen(res_text), widget->text);
|
|
}
|
|
|
|
U0 window_close(Window* win)
|
|
{
|
|
if (win == Compositor.active_win)
|
|
Gui.Window.SetFocus(Compositor.GetWindowByTitle("Wallpaper"));
|
|
Compositor.UnregisterForGlobalInputEvents(win);
|
|
Compositor.DestroyWindow(win);
|
|
}
|
|
|
|
U0 Main()
|
|
{
|
|
I64 i;
|
|
I64 j;
|
|
I64 k;
|
|
U64 flags = WIN_FLAGS_DEFAULT;
|
|
flags &= ~WIN_FLAGS_RESIZABLE;
|
|
flags &= ~WIN_FLAGS_MAX_BUTTON;
|
|
win = Compositor.CreateWindow(224, 224, 233, 240, flags);
|
|
Gui.Window.SetTitle(win, "Calculator");
|
|
Compositor.RegisterForGlobalInputEvents(win);
|
|
Gui.Window.SetIcon(win, Image.FileToContext2D("window_icon_16x16.png"));
|
|
Gui.Window.SetFocus(win);
|
|
Gui.Window.SetCallback(win, "close", &window_close);
|
|
Gui.Window.SetCallback(win, "keypress", &@calc_keypress_callback);
|
|
|
|
result = Gui.CreateWidget(win, WIDGET_TYPE_INPUT, 4, 4, 246, 24);
|
|
Gui.Widget.SetFont(result, calc_font);
|
|
|
|
ButtonWidget* calc_btn[27];
|
|
|
|
for (i = 0; i < 4; i++) {
|
|
if (i < 3) {
|
|
calc_btn[i] = Gui.CreateWidget(win, WIDGET_TYPE_BUTTON, 46 + (60 * i), 32, 56, 32);
|
|
calc_btn[i]->color = Color(255, 0, 0);
|
|
Gui.Widget.SetText(calc_btn[i], @calc_button_label[i]);
|
|
Gui.Widget.SetFont(calc_btn[i], calc_font);
|
|
Gui.Widget.SetCallback(calc_btn[i], "clicked", &@calc_btn_callback);
|
|
}
|
|
j = 3 + (6 * i);
|
|
calc_btn[j] = Gui.CreateWidget(win, WIDGET_TYPE_BUTTON, 4, 68 + (36 * i), 32, 32);
|
|
calc_btn[j]->color = Color(255, 0, 0);
|
|
Gui.Widget.SetText(calc_btn[j], @calc_button_label[j]);
|
|
Gui.Widget.SetFont(calc_btn[j], calc_font);
|
|
Gui.Widget.SetCallback(calc_btn[j], "clicked", &@calc_btn_callback);
|
|
for (k = 1; k < 6; k++) {
|
|
calc_btn[j + k] = Gui.CreateWidget(win, WIDGET_TYPE_BUTTON, 10 + (36 * k),
|
|
68 + (36 * i), 32, 32);
|
|
calc_btn[j + k]->color = T(k == 4 || k == 5 && i == 3, Color(255, 0, 0), Color(0, 0, 255));
|
|
Gui.Widget.SetText(calc_btn[j + k], @calc_button_label[j + k]);
|
|
Gui.Widget.SetFont(calc_btn[j + k], calc_font);
|
|
Gui.Widget.SetCallback(calc_btn[j + k], "clicked", &@calc_btn_callback);
|
|
}
|
|
}
|
|
Suspend;
|
|
}
|
|
|
|
Main; |