123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- <class name="Canvas">
- <relationships>
- <association name="parent" class="A" min="1" max="1" />
- <inheritance class="SCCDWidget" priority='0'/>
- <inheritance class="tk.Canvas" priority='1'/>
- <association name="elements" class="CanvasElement"/>
- </relationships>
- <constructor>
- <parameter name="parent" />
- <super class="SCCDWidget"/>
- <super class="tk.Canvas">
- <parameter expr="parent" />
- <parameter expr="**{'scrollregion': (0, 0, parent.winfo_screenwidth()*2, parent.winfo_screenheight() * 2)}"/>
- </super>
- <body>
- vbar = tk.Scrollbar(self, orient=tk.VERTICAL)
- vbar.config(command=self.yview)
- vbar.pack(side=tk.RIGHT, fill=tk.Y, pady=(0, 16))
- hbar = tk.Scrollbar(self, orient=tk.HORIZONTAL)
- hbar.config(command=self.xview)
- hbar.pack(side=tk.BOTTOM, fill=tk.X)
- self.config(background='white', yscrollcommand=vbar.set, xscrollcommand=hbar.set)
- self.focus_set()
- self.assoc_links = {}
- self.element_group = {}
- self.group_location = {}
- self.connecting_lines = {}
- self.lines = set()
- </body>
- </constructor>
- <destructor>
- <body>
- self.destroy()
- </body>
- </destructor>
- <scxml initial="main">
- <state id="main">
- <transition target="../ready">
- <raise event="tk_widget" scope="narrow" target="'parent'">
- <parameter expr="self"/>
- </raise>
- </transition>
- </state>
- <state id="ready">
- <transition event="clear_canvas" target=".">
- <raise event="delete_instance" scope="cd">
- <parameter expr="'elements'"/>
- </raise>
- <script>
- self.shift = {}
- for l in self.lines:
- self.delete(l)
- self.connecting_lines = {}
- </script>
- </transition>
- <transition event="define_group" target="../creating_group">
- <parameter name="element"/>
- <script>
- self.creating_id = element["id"]
- self.group_location[element['id']] = (element['x'], element['y'])
- </script>
- <raise event="create_instance" scope="cd">
- <parameter expr="'elements'"/>
- <parameter expr="'CanvasElement'"/>
- <parameter expr="self"/>
- <parameter expr="(element['x'], element['y'])"/>
- <parameter expr="element['id']"/>
- <parameter expr="element['__asid']"/>
- </raise>
- </transition>
- <transition event="define_contains" target=".">
- <parameter name="element"/>
- <script>
- self.element_group[element["__target"]] = element["__source"]
- </script>
- </transition>
- <transition event="draw_canvas" cond="element['type'] != 'ConnectingLine'" target=".">
- <parameter name="element"/>
- <raise event="draw_element" scope="narrow" target="self.assoc_links[self.element_group[element['id']]]">
- <parameter expr="element"/>
- </raise>
- </transition>
- <transition event="draw_canvas" cond="element['type'] == 'ConnectingLine'" target=".">
- <parameter name="element"/>
- <script>
- source_x = self.group_location[element['__source']][0] + element['offsetSourceX']
- source_y = self.group_location[element['__source']][1] + element['offsetSourceY']
- target_x = self.group_location[element['__target']][0] + element['offsetTargetX']
- target_y = self.group_location[element['__target']][1] + element['offsetTargetY']
- self.connecting_lines.setdefault(element['__source'], []).append(element)
- self.connecting_lines.setdefault(element['__target'], []).append(element)
- 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)
- element['elem'] = line
- self.lines.add(line)
- </script>
- </transition>
- <transition event="moved_group" target=".">
- <parameter name="group_element"/>
- <parameter name="new_location"/>
- <script>
- self.group_location[group_element] = new_location
- if group_element in self.connecting_lines:
- lines_to_move = self.connecting_lines[group_element]
- for line_element in lines_to_move:
- source_x, source_y, target_x, target_y = self.coords(line_element['elem'])
- if line_element['__source'] == group_element:
- # Moved source
- source_x = self.group_location[group_element][0] + line_element['offsetSourceX']
- source_y = self.group_location[group_element][1] + line_element['offsetSourceY']
- if line_element['__target'] == group_element:
- # Moved target
- target_x = self.group_location[group_element][0] + line_element['offsetTargetX']
- target_y = self.group_location[group_element][1] + line_element['offsetTargetY']
- self.coords(line_element['elem'], source_x, source_y, target_x, target_y)
- </script>
- </transition>
- </state>
- <state id="creating_group">
- <transition event="instance_created" target="../ready">
- <parameter name="assoc_name"/>
- <raise event="start_instance" scope="cd">
- <parameter expr="assoc_name"/>
- </raise>
- <script>
- self.assoc_links[self.creating_id] = assoc_name
- </script>
- <raise event="group_ready" scope="narrow" target="'parent'"/>
- </transition>
- </state>
- </scxml>
- </class>
|