1 /* nuklear - v1.00 - public domain */
2 static void
calculator(struct nk_context * ctx)3 calculator(struct nk_context *ctx)
4 {
5     if (nk_begin(ctx, "Calculator", nk_rect(10, 10, 180, 250),
6         NK_WINDOW_BORDER|NK_WINDOW_NO_SCROLLBAR|NK_WINDOW_MOVABLE))
7     {
8         static int set = 0, prev = 0, op = 0;
9         static const char numbers[] = "789456123";
10         static const char ops[] = "+-*/";
11         static double a = 0, b = 0;
12         static double *current = &a;
13 
14         size_t i = 0;
15         int solve = 0;
16         {int len; char buffer[256];
17         nk_layout_row_dynamic(ctx, 35, 1);
18         len = snprintf(buffer, 256, "%.2f", *current);
19         nk_edit_string(ctx, NK_EDIT_SIMPLE, buffer, &len, 255, nk_filter_float);
20         buffer[len] = 0;
21         *current = atof(buffer);}
22 
23         nk_layout_row_dynamic(ctx, 35, 4);
24         for (i = 0; i < 16; ++i) {
25             if (i >= 12 && i < 15) {
26                 if (i > 12) continue;
27                 if (nk_button_label(ctx, "C")) {
28                     a = b = op = 0; current = &a; set = 0;
29                 } if (nk_button_label(ctx, "0")) {
30                     *current = *current*10.0f; set = 0;
31                 } if (nk_button_label(ctx, "=")) {
32                     solve = 1; prev = op; op = 0;
33                 }
34             } else if (((i+1) % 4)) {
35                 if (nk_button_text(ctx, &numbers[(i/4)*3+i%4], 1)) {
36                     *current = *current * 10.0f + numbers[(i/4)*3+i%4] - '0';
37                     set = 0;
38                 }
39             } else if (nk_button_text(ctx, &ops[i/4], 1)) {
40                 if (!set) {
41                     if (current != &b) {
42                         current = &b;
43                     } else {
44                         prev = op;
45                         solve = 1;
46                     }
47                 }
48                 op = ops[i/4];
49                 set = 1;
50             }
51         }
52         if (solve) {
53             if (prev == '+') a = a + b;
54             if (prev == '-') a = a - b;
55             if (prev == '*') a = a * b;
56             if (prev == '/') a = a / b;
57             current = &a;
58             if (set) current = &b;
59             b = 0; set = 0;
60         }
61     }
62     nk_end(ctx);
63 }
64 
65