calculator.gd 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. extends GraphNode
  2. var calculated = false
  3. var expression = ""
  4. var lastresult = 0.0
  5. signal open_help
  6. func _ready() -> void:
  7. #add button to title bar
  8. var titlebar = self.get_titlebar_hbox()
  9. var btn = Button.new()
  10. btn.text = "?"
  11. btn.tooltip_text = "Open help for " + self.title
  12. btn.connect("pressed", Callable(self, "_open_help")) #pass key (process name) when button is pressed
  13. titlebar.add_child(btn)
  14. #this links the buttons, it is stupid but for some reason doing this automatically just would not work reliably
  15. $HBoxContainer/Button.pressed.connect(calculate.bind($HBoxContainer/Button))
  16. $HBoxContainer/Button2.pressed.connect(calculate.bind($HBoxContainer/Button2))
  17. $HBoxContainer/Button3.pressed.connect(calculate.bind($HBoxContainer/Button3))
  18. $HBoxContainer/Button4.pressed.connect(calculate.bind($HBoxContainer/Button4))
  19. $HBoxContainer5/Button.pressed.connect(calculate.bind($HBoxContainer5/Button))
  20. $HBoxContainer5/Button2.pressed.connect(calculate.bind($HBoxContainer5/Button2))
  21. $HBoxContainer5/Button3.pressed.connect(calculate.bind($HBoxContainer5/Button3))
  22. $HBoxContainer5/Button4.pressed.connect(calculate.bind($HBoxContainer5/Button4))
  23. $HBoxContainer2/Button.pressed.connect(calculate.bind($HBoxContainer2/Button))
  24. $HBoxContainer2/Button2.pressed.connect(calculate.bind($HBoxContainer2/Button2))
  25. $HBoxContainer2/Button3.pressed.connect(calculate.bind($HBoxContainer2/Button3))
  26. $HBoxContainer2/Button4.pressed.connect(calculate.bind($HBoxContainer2/Button4))
  27. $HBoxContainer3/Button.pressed.connect(calculate.bind($HBoxContainer3/Button))
  28. $HBoxContainer3/Button2.pressed.connect(calculate.bind($HBoxContainer3/Button2))
  29. $HBoxContainer3/Button3.pressed.connect(calculate.bind($HBoxContainer3/Button3))
  30. $HBoxContainer3/Button4.pressed.connect(calculate.bind($HBoxContainer3/Button4))
  31. $HBoxContainer4/Button.pressed.connect(calculate.bind($HBoxContainer4/Button))
  32. $HBoxContainer4/Button2.pressed.connect(calculate.bind($HBoxContainer4/Button2))
  33. $HBoxContainer4/Button3.pressed.connect(calculate.bind($HBoxContainer4/Button3))
  34. $HBoxContainer4/Button4.pressed.connect(calculate.bind($HBoxContainer4/Button4))
  35. func _open_help():
  36. open_help.emit(self.get_meta("command"), self.title)
  37. func calculate(button: Button):
  38. var label = button.text
  39. var value = button.get_meta("calc")
  40. if calculated == true:
  41. $Screen.text = ""
  42. expression = ""
  43. calculated = false
  44. if value in ["+", "-", "*", "/"]:
  45. $Screen.text += str(lastresult)
  46. expression += str(lastresult)
  47. if value == "clear":
  48. $Screen.text = ""
  49. expression = ""
  50. elif value == "del":
  51. $Screen.text = $Screen.text.substr(0, $Screen.text.length() - 1)
  52. if expression.right(1) == "/":
  53. #remove the whole stupid hack for division
  54. expression = expression.left(expression.length() - 5)
  55. else:
  56. #just remove the last character
  57. expression = expression.left(expression.length() - 1)
  58. elif value == "=":
  59. var expr = Expression.new()
  60. expr.parse(expression)
  61. lastresult = expr.execute()
  62. $Screen.text += "\n= " + str(lastresult)
  63. calculated = true
  64. else:
  65. $Screen.text += label
  66. if value == "/":
  67. #absolutely stupid hack to make it do float division
  68. expression += "*1.0/"
  69. else:
  70. expression += value