erythros/Applications/Accessories/Calculator.app/Run.HC

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;