objects.py 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. #!/usr/bin/python3
  2. import gi
  3. gi.require_version('Gtk', '3.0')
  4. gi.require_version('GtkFlow', '0.6')
  5. gi.require_version('GFlow', '0.6')
  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 Node(GFlow.SimpleNode):
  12. def __new__(cls, *args, **kwargs):
  13. x = GFlow.SimpleNode.new()
  14. x.__class__ = cls
  15. return x
  16. class Point(object):
  17. def __init__(self, x=0, y=0):
  18. self.x = x
  19. self.y = y
  20. class PointConstructorNode(Node):
  21. def __init__(self):
  22. self.x_sink = GFlow.SimpleSink.new(float(0))
  23. self.y_sink = GFlow.SimpleSink.new(float(0))
  24. self.x_sink.set_name("X")
  25. self.y_sink.set_name("Y")
  26. self.add_sink(self.x_sink)
  27. self.add_sink(self.y_sink)
  28. self.result = GFlow.SimpleSource.new(Point())
  29. self.result.set_name("result")
  30. self.add_source(self.result)
  31. self.result.set_value(None)
  32. self.x_sink.connect("changed", self.do_calculations)
  33. self.y_sink.connect("changed", self.do_calculations)
  34. self.set_name("Point Constructor")
  35. def do_calculations(self, dock, val=None):
  36. val_x = self.x_sink.get_value(0)
  37. val_y = self.y_sink.get_value(0)
  38. if val_x is None or val_y is None:
  39. self.result.set_value(None)
  40. return
  41. p = Point(x=val_x, y=val_y)
  42. self.result.set_value(p)
  43. class PointSplitterNode(Node):
  44. def __init__(self):
  45. self.p_sink = GFlow.SimpleSink.new(Point())
  46. self.p_sink.set_name("point")
  47. self.add_sink(self.p_sink)
  48. self.result_x = GFlow.SimpleSource.new(float(0))
  49. self.result_y = GFlow.SimpleSource.new(float(0))
  50. self.result_x.set_name("X")
  51. self.result_y.set_name("Y")
  52. self.add_source(self.result_x)
  53. self.add_source(self.result_y)
  54. self.result_x.set_value(None)
  55. self.result_y.set_value(None)
  56. self.p_sink.connect("changed", self.do_calculations)
  57. self.set_name("Point Splitter")
  58. def do_calculations(self, dock, val=None):
  59. val_p = self.p_sink.get_value(0)
  60. if val_p is None:
  61. self.result_x.set_value(None)
  62. self.result_y.set_value(None)
  63. return
  64. self.result_x.set_value(val_p.x)
  65. self.result_y.set_value(val_p.y)
  66. class NumberNode(Node):
  67. def __init__(self, number=0):
  68. self.number = GFlow.SimpleSource.new(float(number))
  69. self.number.set_name("output")
  70. self.add_source(self.number)
  71. adjustment = Gtk.Adjustment.new(0, 0, 100, 1, 10, 0)
  72. self.spinbutton = Gtk.SpinButton()
  73. self.spinbutton.set_adjustment(adjustment)
  74. self.spinbutton.set_size_request(50,20)
  75. self.spinbutton.connect("value_changed", self.do_value_changed)
  76. self.number.set_value(float(self.spinbutton.get_value()))
  77. self.set_name("NumberGenerator")
  78. def do_value_changed(self, widget=None, data=None):
  79. self.number.set_value(float(self.spinbutton.get_value()))
  80. class PrintNode(Node):
  81. def __init__(self):
  82. self.number = GFlow.SimpleSink.new(float(0))
  83. self.number.set_name("input")
  84. self.number.connect("changed", self.do_printing)
  85. self.add_sink(self.number)
  86. self.childlabel = Gtk.Label()
  87. self.set_name("Output")
  88. def do_printing(self, dock):
  89. n = self.number.get_value(0)
  90. if n is not None:
  91. self.childlabel.set_text(str(n))
  92. else:
  93. self.childlabel.set_text("")
  94. class Calculator(object):
  95. def __init__(self):
  96. w = Gtk.Window.new(Gtk.WindowType.TOPLEVEL)
  97. self.nv = GtkFlow.NodeView.new()
  98. self.nv.set_show_types(True)
  99. hbox = Gtk.Box.new(Gtk.Orientation.HORIZONTAL, 0)
  100. create_numbernode_button = Gtk.Button.new_with_label("Create NumberNode")
  101. create_numbernode_button.connect("clicked", self.do_create_numbernode)
  102. hbox.add(create_numbernode_button)
  103. create_constructor_button = Gtk.Button.new_with_label("Create Constructor")
  104. create_constructor_button.connect("clicked", self.do_create_constructor)
  105. hbox.add(create_constructor_button)
  106. create_splitter_button = Gtk.Button.new_with_label("Create Splitter")
  107. create_splitter_button.connect("clicked", self.do_create_splitter)
  108. hbox.add(create_splitter_button)
  109. create_printnode_button = Gtk.Button.new_with_label("Create PrintNode")
  110. create_printnode_button.connect("clicked", self.do_create_printnode)
  111. hbox.add(create_printnode_button)
  112. vbox = Gtk.Box.new(Gtk.Orientation.VERTICAL, 0)
  113. vbox.pack_start(hbox, False, False, 0)
  114. vbox.pack_start(self.nv, True, True, 0)
  115. w.add(vbox)
  116. w.show_all()
  117. w.connect("destroy", self.do_quit)
  118. Gtk.main()
  119. def do_create_constructor(self, widget=None, data=None):
  120. n = PointConstructorNode()
  121. self.nv.add_node(n)
  122. self.nv.set_node_renderer(n, GtkFlow.NodeRendererType.DOCKLINE)
  123. def do_create_splitter(self, widget=None, data=None):
  124. n = PointSplitterNode()
  125. self.nv.add_node(n)
  126. self.nv.set_node_renderer(n, GtkFlow.NodeRendererType.DOCKLINE)
  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()