custom_title.py 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. #!/usr/bin/python3
  2. import gi
  3. gi.require_version('Gtk', '3.0')
  4. gi.require_version('GtkFlow', '0.10')
  5. gi.require_version('GFlow', '0.10')
  6. from gi.repository import GLib
  7. from gi.repository import Gtk
  8. from gi.repository import GFlow
  9. from gi.repository import GtkFlow
  10. import sys
  11. class CalculatorNode(GFlow.SimpleNode):
  12. def __new__(cls, *args, **kwargs):
  13. x = GFlow.SimpleNode.new()
  14. x.__class__ = cls
  15. return x
  16. class OperationNode(CalculatorNode):
  17. def __init__(self):
  18. self.titlestack = Gtk.Stack.new()
  19. self.title_entry = Gtk.Entry.new()
  20. self.title_entry.set_text("Custom Title")
  21. self.title_label = Gtk.Label.new("asdf")
  22. self.title_eventbox = Gtk.EventBox()
  23. self.title_eventbox.add(self.title_label)
  24. self.titlestack.add_named(self.title_entry, "titleentry")
  25. self.titlestack.add_named(self.title_eventbox, "titlelabel")
  26. self.title_entry.connect("activate", self.cb_save_title)
  27. self.title_eventbox.connect("button_press_event", self.cb_edit_title)
  28. self.titlestack.set_visible_child_name("titlelabel")
  29. self.summand_a = GFlow.SimpleSink.new(float(0))
  30. self.summand_b = GFlow.SimpleSink.new(float(0))
  31. self.summand_a.set_name("operand A")
  32. self.summand_b.set_name("operand B")
  33. self.add_sink(self.summand_a)
  34. self.add_sink(self.summand_b)
  35. self.val_a = None
  36. self.val_b = None
  37. self.result = GFlow.SimpleSource.with_type(float)
  38. self.result.set_name("result")
  39. self.add_source(self.result)
  40. self.result.set_value(None)
  41. operations = ["+", "-", "*", "/"]
  42. self.combobox = Gtk.ComboBoxText()
  43. self.combobox.connect("changed", self.do_calculations)
  44. self.combobox.set_entry_text_column(0)
  45. for op in operations:
  46. self.combobox.append_text(op)
  47. self.summand_a.connect("changed", self.do_calculations, "a")
  48. self.summand_b.connect("changed", self.do_calculations, "b")
  49. self.set_name("Operation")
  50. def cb_edit_title(self, *args, **kwargs):
  51. self.titlestack.set_visible_child_name("titleentry")
  52. def cb_save_title(self, *args, **kwargs):
  53. self.titlestack.set_visible_child_name("titlelabel")
  54. self.title_label.set_text(self.title_entry.get_text())
  55. def do_calculations(self, dock, val=None, flow_id=None, data=None):
  56. op = self.combobox.get_active_text()
  57. if data == "a":
  58. self.val_a = val
  59. if data == "b":
  60. self.val_b = val
  61. if self.val_a is None or self.val_b is None:
  62. self.result.set_value(None)
  63. return
  64. if op == "+":
  65. self.result.set_value(self.val_a+self.val_b)
  66. elif op == "-":
  67. self.result.set_value(self.val_a-self.val_b)
  68. elif op == "*":
  69. self.result.set_value(self.val_a*self.val_b)
  70. elif op == "/":
  71. self.result.set_value(self.val_a/self.val_b)
  72. else:
  73. self.result.set_value(None)
  74. class NumberNode(CalculatorNode):
  75. def __init__(self, number=0):
  76. self.number = GFlow.SimpleSource.with_type(float)
  77. self.number.set_name("output")
  78. self.add_source(self.number)
  79. adjustment = Gtk.Adjustment.new(0, 0, 100, 1, 10, 0)
  80. self.spinbutton = Gtk.SpinButton()
  81. self.spinbutton.set_adjustment(adjustment)
  82. self.spinbutton.set_size_request(50,20)
  83. self.spinbutton.connect("value_changed", self.do_value_changed)
  84. self.number.set_value(float(self.spinbutton.get_value()))
  85. self.set_name("NumberGenerator")
  86. def do_value_changed(self, widget=None, data=None, flow_id=None):
  87. self.number.set_value(float(self.spinbutton.get_value()))
  88. class PrintNode(CalculatorNode):
  89. def __init__(self):
  90. self.number = GFlow.SimpleSink.new(float(0))
  91. self.number.set_name("input")
  92. self.number.connect("changed", self.do_printing)
  93. self.add_sink(self.number)
  94. self.childlabel = Gtk.Label()
  95. self.set_name("Output")
  96. def do_printing(self, dock, val=None, flow_id=None):
  97. if val is not None:
  98. self.childlabel.set_text(str(val))
  99. else:
  100. self.childlabel.set_text("")
  101. class Calculator(object):
  102. def __init__(self):
  103. w = Gtk.Window.new(Gtk.WindowType.TOPLEVEL)
  104. self.nv = GtkFlow.NodeView.new()
  105. self.nv.set_placeholder("Please click the buttons above to spawn nodes.")
  106. hbox = Gtk.Box.new(Gtk.Orientation.HORIZONTAL, 0)
  107. create_numbernode_button = Gtk.Button.new_with_label("Create NumberNode")
  108. create_numbernode_button.connect("clicked", self.do_create_numbernode)
  109. hbox.add(create_numbernode_button)
  110. create_addnode_button = Gtk.Button.new_with_label("Create OperationNode")
  111. create_addnode_button.connect("clicked", self.do_create_addnode)
  112. hbox.add(create_addnode_button)
  113. create_printnode_button = Gtk.Button.new_with_label("Create PrintNode")
  114. create_printnode_button.connect("clicked", self.do_create_printnode)
  115. hbox.add(create_printnode_button)
  116. vbox = Gtk.Box.new(Gtk.Orientation.VERTICAL, 0)
  117. vbox.pack_start(hbox, False, False, 0)
  118. vbox.pack_start(self.nv, True, True, 0)
  119. w.add(vbox)
  120. w.show_all()
  121. w.connect("destroy", self.do_quit)
  122. Gtk.main()
  123. def do_create_addnode(self, widget=None, data=None):
  124. n = OperationNode()
  125. self.nv.add_with_child(n, n.combobox, title=n.titlestack)
  126. self.nv.set_node_renderer(n, GtkFlow.NodeRendererType.DEFAULT)
  127. def do_create_numbernode(self, widget=None, data=None):
  128. n = NumberNode()
  129. self.nv.add_with_child(n, n.spinbutton)
  130. self.nv.set_node_renderer(n, GtkFlow.NodeRendererType.DOCKLINE)
  131. def do_create_printnode(self, widget=None, data=None):
  132. n = PrintNode()
  133. self.nv.add_with_child(n, n.childlabel)
  134. def do_quit(self, widget=None, data=None):
  135. Gtk.main_quit()
  136. sys.exit(0)
  137. if __name__ == "__main__":
  138. Calculator()