canvas.xml 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. <class name="Canvas">
  2. <relationships>
  3. <association name="parent" class="A" min="1" max="1" />
  4. <inheritance class="SCCDWidget" priority='0'/>
  5. <inheritance class="tk.Canvas" priority='1'/>
  6. <association name="elements" class="CanvasElement"/>
  7. </relationships>
  8. <constructor>
  9. <parameter name="parent" />
  10. <super class="SCCDWidget"/>
  11. <super class="tk.Canvas">
  12. <parameter expr="parent" />
  13. <parameter expr="**{'scrollregion': (0, 0, parent.winfo_screenwidth()*2, parent.winfo_screenheight() * 2)}"/>
  14. </super>
  15. <body>
  16. vbar = tk.Scrollbar(self, orient=tk.VERTICAL)
  17. vbar.config(command=self.yview)
  18. vbar.pack(side=tk.RIGHT, fill=tk.Y, pady=(0, 16))
  19. hbar = tk.Scrollbar(self, orient=tk.HORIZONTAL)
  20. hbar.config(command=self.xview)
  21. hbar.pack(side=tk.BOTTOM, fill=tk.X)
  22. self.config(background='white', yscrollcommand=vbar.set, xscrollcommand=hbar.set)
  23. self.focus_set()
  24. self.assoc_links = {}
  25. self.element_group = {}
  26. self.group_location = {}
  27. self.connecting_lines = {}
  28. self.lines = set()
  29. </body>
  30. </constructor>
  31. <destructor>
  32. <body>
  33. self.destroy()
  34. </body>
  35. </destructor>
  36. <scxml initial="main">
  37. <state id="main">
  38. <transition target="../ready">
  39. <raise event="tk_widget" scope="narrow" target="'parent'">
  40. <parameter expr="self"/>
  41. </raise>
  42. </transition>
  43. </state>
  44. <state id="ready">
  45. <transition event="clear_canvas" target=".">
  46. <raise event="delete_instance" scope="cd">
  47. <parameter expr="'elements'"/>
  48. </raise>
  49. <script>
  50. self.shift = {}
  51. for l in self.lines:
  52. self.delete(l)
  53. self.connecting_lines = {}
  54. </script>
  55. </transition>
  56. <transition event="define_group" target="../creating_group">
  57. <parameter name="element"/>
  58. <script>
  59. self.creating_id = element["id"]
  60. self.group_location[element['id']] = (element['x'], element['y'])
  61. </script>
  62. <raise event="create_instance" scope="cd">
  63. <parameter expr="'elements'"/>
  64. <parameter expr="'CanvasElement'"/>
  65. <parameter expr="self"/>
  66. <parameter expr="(element['x'], element['y'])"/>
  67. <parameter expr="element['id']"/>
  68. <parameter expr="element['__asid']"/>
  69. </raise>
  70. </transition>
  71. <transition event="define_contains" target=".">
  72. <parameter name="element"/>
  73. <script>
  74. self.element_group[element["__target"]] = element["__source"]
  75. </script>
  76. </transition>
  77. <transition event="draw_canvas" cond="element['type'] != 'ConnectingLine'" target=".">
  78. <parameter name="element"/>
  79. <raise event="draw_element" scope="narrow" target="self.assoc_links[self.element_group[element['id']]]">
  80. <parameter expr="element"/>
  81. </raise>
  82. </transition>
  83. <transition event="draw_canvas" cond="element['type'] == 'ConnectingLine'" target=".">
  84. <parameter name="element"/>
  85. <script>
  86. source_x = self.group_location[element['__source']][0] + element['offsetSourceX']
  87. source_y = self.group_location[element['__source']][1] + element['offsetSourceY']
  88. target_x = self.group_location[element['__target']][0] + element['offsetTargetX']
  89. target_y = self.group_location[element['__target']][1] + element['offsetTargetY']
  90. self.connecting_lines.setdefault(element['__source'], []).append(element)
  91. self.connecting_lines.setdefault(element['__target'], []).append(element)
  92. line = self.create_line(source_x, source_y, target_x, target_y, fill=element['lineColour'], width=element['lineWidth'], arrow=tk.LAST if element['arrow'] else tk.NONE)
  93. element['elem'] = line
  94. self.lines.add(line)
  95. </script>
  96. </transition>
  97. <transition event="moved_group" target=".">
  98. <parameter name="group_element"/>
  99. <parameter name="new_location"/>
  100. <script>
  101. self.group_location[group_element] = new_location
  102. if group_element in self.connecting_lines:
  103. lines_to_move = self.connecting_lines[group_element]
  104. for line_element in lines_to_move:
  105. source_x, source_y, target_x, target_y = self.coords(line_element['elem'])
  106. if line_element['__source'] == group_element:
  107. # Moved source
  108. source_x = self.group_location[group_element][0] + line_element['offsetSourceX']
  109. source_y = self.group_location[group_element][1] + line_element['offsetSourceY']
  110. if line_element['__target'] == group_element:
  111. # Moved target
  112. target_x = self.group_location[group_element][0] + line_element['offsetTargetX']
  113. target_y = self.group_location[group_element][1] + line_element['offsetTargetY']
  114. self.coords(line_element['elem'], source_x, source_y, target_x, target_y)
  115. </script>
  116. </transition>
  117. </state>
  118. <state id="creating_group">
  119. <transition event="instance_created" target="../ready">
  120. <parameter name="assoc_name"/>
  121. <raise event="start_instance" scope="cd">
  122. <parameter expr="assoc_name"/>
  123. </raise>
  124. <script>
  125. self.assoc_links[self.creating_id] = assoc_name
  126. </script>
  127. <raise event="group_ready" scope="narrow" target="'parent'"/>
  128. </transition>
  129. </state>
  130. </scxml>
  131. </class>