canvas_element.xml 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. <class name="CanvasElement">
  2. <relationships>
  3. <association name="parent" class="A" min="1" max="1" />
  4. <inheritance class="SCCDWidget" priority='0'/>
  5. <association name="elements" class="CanvasElement"/>
  6. </relationships>
  7. <constructor>
  8. <parameter name="parent"/>
  9. <parameter name="coordinates"/>
  10. <super class="SCCDWidget">
  11. <parameter expr="True"/>
  12. </super>
  13. <body>
  14. self.containing_canvas = parent
  15. self.coordinates = coordinates
  16. self.elements = {}
  17. self.tmp = {}
  18. </body>
  19. </constructor>
  20. <destructor>
  21. for f in self.elements:
  22. self.containing_canvas.delete(f)
  23. </destructor>
  24. <scxml initial="main">
  25. <state id="main">
  26. <transition event="draw_element" target=".">
  27. <parameter name="element"/>
  28. <script>
  29. elem_x = self.coordinates[0] + element["x"]
  30. elem_y = self.coordinates[1] + element["y"]
  31. if element["type"] == "Rectangle":
  32. result = self.containing_canvas.create_rectangle(elem_x, elem_y, elem_x + element["width"], elem_y + element["height"], fill=element["fillColour"], outline=element["lineColour"])
  33. elif element["type"] == "Text":
  34. result = self.containing_canvas.create_text(elem_x, elem_y, fill=element["lineColour"], text=element["text"], anchor=tk.NW)
  35. elif element["type"] == "Line":
  36. result = self.containing_canvas.create_line(elem_x, elem_y, self.coordinates[0] + element["targetX"], self.coordinates[1] + element["targetY"], fill=element["lineColour"], width=element["lineWidth"], arrow=tk.LAST if element["arrow"] else tk.NONE)
  37. else:
  38. print("Undefined render format: " + str(element))
  39. result = None
  40. if result is not None:
  41. self.elements[result] = element["id"]
  42. self.set_bindable_and_tagorid(self.containing_canvas, result)
  43. </script>
  44. </transition>
  45. <transition event="left-click" cond="id(self) == ID" target="../dragging">
  46. <parameter name="ID"/>
  47. <script>
  48. self.original_coords = self.last_x, self.last_y
  49. self.prev_x = self.last_x
  50. self.prev_y = self.last_y
  51. </script>
  52. </transition>
  53. </state>
  54. <state id="dragging">
  55. <transition event="motion" cond="id(self) == ID" target=".">
  56. <parameter name="ID"/>
  57. <script>
  58. delta_x = self.prev_x - self.last_x
  59. delta_y = self.prev_y - self.last_y
  60. for f in self.elements:
  61. old_coords = self.containing_canvas.coords(f)
  62. new_x = old_coords[0] - delta_x
  63. new_y = old_coords[1] - delta_y
  64. if len(old_coords) == 2:
  65. self.containing_canvas.coords(f, (new_x, new_y))
  66. elif len(old_coords) == 4:
  67. height = old_coords[3] - old_coords[1]
  68. width = old_coords[2] - old_coords[0]
  69. self.containing_canvas.coords(f, (new_x, new_y, new_x + width, new_y + height))
  70. self.prev_x = self.last_x
  71. self.prev_y = self.last_y
  72. </script>
  73. </transition>
  74. <transition event="left-release" cond="id(self) == ID" target="../update_mv">
  75. <parameter name="ID"/>
  76. <script>
  77. delta_x = self.original_coords[0] - self.last_x
  78. delta_y = self.original_coords[1] - self.last_y
  79. self.coordinates = self.coordinates[0] + delta_x, self.coordinates[1] + delta_y
  80. self.to_update = dict(self.elements)
  81. </script>
  82. </transition>
  83. </state>
  84. <state id="update_mv" initial="init">
  85. <state id="init">
  86. <transition cond="len(self.to_update) > 0" target="../x">
  87. <script>
  88. tk_id, self.tmp["mv_id"] = self.to_update.popitem()
  89. self.tmp['x'], self.tmp['y'] = self.containing_canvas.coords(tk_id)[:2]
  90. </script>
  91. </transition>
  92. <transition cond="len(self.to_update) == 0" target="../../main"/>
  93. </state>
  94. <state id="x">
  95. <onentry>
  96. <raise event="mv_request" scope="broad">
  97. <parameter expr="'attr_assign'"/>
  98. <parameter expr="[current_rendered_model, self.tmp['mv_id'], 'x', self.tmp['x']]"/>
  99. </raise>
  100. </onentry>
  101. <transition event="mv_response" target="../y"/>
  102. </state>
  103. <state id="y">
  104. <onentry>
  105. <raise event="mv_request" scope="broad">
  106. <parameter expr="'attr_assign'"/>
  107. <parameter expr="[current_rendered_model, self.tmp['mv_id'], 'y', self.tmp['y']]"/>
  108. </raise>
  109. </onentry>
  110. <transition event="mv_response" target="../init"/>
  111. </state>
  112. </state>
  113. </scxml>
  114. </class>