diff --git a/examples/basic/calculator.c b/examples/basic/calculator.c new file mode 100644 index 0000000..27f7ad4 --- /dev/null +++ b/examples/basic/calculator.c @@ -0,0 +1,185 @@ +#include + +MwWidget widgets[18]; +MwWidget inp; + +/* probably enough for most tasks */ +double stack[512]; +int sp = 0; + +static void resize(MwWidget handle, void* client, void* user) { + int ww = MwGetInteger(handle, MwNwidth); + int wh = MwGetInteger(handle, MwNheight) - MwGetInteger(inp, MwNheight); + int i; + + MwVaApply(inp, + MwNwidth, ww, + NULL); + + for(i = 0; i < sizeof(widgets) / sizeof(widgets[0]); i++) { + int x = i % 4; + int y = i / 4; + if(widgets[i] != NULL) { + MwVaApply(widgets[i], + MwNwidth, ww / 4, + MwNheight, wh / 5, + MwNx, ww / 4 * x, + MwNy, wh / 5 * y + MwGetInteger(inp, MwNheight), + NULL); + } + } +} + +static void activate(MwWidget handle, void* client, void* user) { + const char* n = MwGetText(handle, MwNtext); + + if(('0' <= n[0] && n[0] <= '9') || n[0] == '.') { + const char* s = MwGetText(inp, MwNtext); + char* r; + + if(n[0] == '.' && s != NULL) { + int i; + for(i = 0; s[i] != 0; i++) { + if(s[i] == '.') return; + } + } + + if(s == NULL) s = ""; + + r = MwStringConcat(s, n); + MwVaApply(inp, + MwNtext, r, + NULL); + free(r); + } else if(n[0] == 'E') { + const char* s = MwGetText(inp, MwNtext); + + if(s != NULL) { + stack[sp++] = atof(s); + + MwVaApply(inp, + MwNtext, "", + NULL); + } + } else if(n[0] == 'C') { + MwVaApply(inp, + MwNtext, "", + NULL); + } else if(n[0] == '+' || n[0] == '-' || n[0] == '*' || n[0] == '/') { + if(sp >= 2) { + double sv = stack[--sp]; + double fv = stack[--sp]; + double v; + char buf[256]; + + if(n[0] == '+') { + v = fv + sv; + } else if(n[0] == '-') { + v = fv - sv; + } else if(n[0] == '*') { + v = fv * sv; + } else if(n[0] == '/') { + v = fv / sv; + } + + sprintf(buf, "%g", v); + + MwVaApply(inp, + MwNtext, buf, + NULL); + } + } +} + +int main() { + MwWidget w; + int i; + + for(i = 0; i < sizeof(widgets) / sizeof(widgets[0]); i++) widgets[i] = NULL; + + MwLibraryInit(); + + w = MwVaCreateWidget(MwWindowClass, "main", NULL, MwDEFAULT, MwDEFAULT, 150, 150, + MwNtitle, "Calculator", + NULL); + + inp = MwCreateWidget(MwEntryClass, "entry", w, 0, 0, 0, 24); + + widgets[0] = MwVaCreateWidget(MwButtonClass, "7", w, 0, 0, 0, 0, + MwNtext, "7", + NULL); + + widgets[1] = MwVaCreateWidget(MwButtonClass, "8", w, 0, 0, 0, 0, + MwNtext, "8", + NULL); + + widgets[2] = MwVaCreateWidget(MwButtonClass, "9", w, 0, 0, 0, 0, + MwNtext, "9", + NULL); + + widgets[3] = MwVaCreateWidget(MwButtonClass, "/", w, 0, 0, 0, 0, + MwNtext, "/", + NULL); + + widgets[4] = MwVaCreateWidget(MwButtonClass, "4", w, 0, 0, 0, 0, + MwNtext, "4", + NULL); + + widgets[5] = MwVaCreateWidget(MwButtonClass, "5", w, 0, 0, 0, 0, + MwNtext, "5", + NULL); + + widgets[6] = MwVaCreateWidget(MwButtonClass, "6", w, 0, 0, 0, 0, + MwNtext, "6", + NULL); + + widgets[7] = MwVaCreateWidget(MwButtonClass, "*", w, 0, 0, 0, 0, + MwNtext, "*", + NULL); + + widgets[8] = MwVaCreateWidget(MwButtonClass, "1", w, 0, 0, 0, 0, + MwNtext, "1", + NULL); + + widgets[9] = MwVaCreateWidget(MwButtonClass, "2", w, 0, 0, 0, 0, + MwNtext, "2", + NULL); + + widgets[10] = MwVaCreateWidget(MwButtonClass, "3", w, 0, 0, 0, 0, + MwNtext, "3", + NULL); + + widgets[11] = MwVaCreateWidget(MwButtonClass, "-", w, 0, 0, 0, 0, + MwNtext, "-", + NULL); + + widgets[12] = MwVaCreateWidget(MwButtonClass, "0", w, 0, 0, 0, 0, + MwNtext, "0", + NULL); + + widgets[13] = MwVaCreateWidget(MwButtonClass, ".", w, 0, 0, 0, 0, + MwNtext, ".", + NULL); + + widgets[16] = MwVaCreateWidget(MwButtonClass, "E", w, 0, 0, 0, 0, + MwNtext, "E", + NULL); + + widgets[15] = MwVaCreateWidget(MwButtonClass, "+", w, 0, 0, 0, 0, + MwNtext, "+", + NULL); + + widgets[17] = MwVaCreateWidget(MwButtonClass, "C", w, 0, 0, 0, 0, + MwNtext, "C", + NULL); + + for(i = 0; i < sizeof(widgets) / sizeof(widgets[0]); i++) { + if(widgets[i] != NULL) MwAddUserHandler(widgets[i], MwNactivateHandler, activate, NULL); + } + + MwAddUserHandler(w, MwNresizeHandler, resize, NULL); + + resize(w, NULL, NULL); + + MwLoop(w); +} diff --git a/pl/rules.pl b/pl/rules.pl index 73f4c61..59605a8 100644 --- a/pl/rules.pl +++ b/pl/rules.pl @@ -128,6 +128,7 @@ new_example("examples/basic/treeview"); new_example("examples/basic/box"); new_example("examples/basic/clipboard"); new_example("examples/basic/sevensegment"); +new_example("examples/basic/calculator"); if (param_get("opengl")) { new_example("examples/gldemos/boing", $gl_libs);