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 }