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