calculator.c 2.1 KB

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