Mercurial > MadButterfly
comparison pyink/FSM_window.py @ 1476:eddec4543761
Install layers for FSM_window.
- Create background, fsm_layer and control_layer for FSM_window.
- All states and transitions are placed in fsm_layer.
- All controls (resize, control points, ...) are placed in control_layer.
author | Thinker K.F. Li <thinker@codemud.net> |
---|---|
date | Sun, 24 Apr 2011 18:52:55 +0800 |
parents | 8c6078c17f2d |
children | 6fe773e62b2a |
comparison
equal
deleted
inserted
replaced
1475:8c6078c17f2d | 1476:eddec4543761 |
---|---|
59 pass | 59 pass |
60 | 60 |
61 class FSM_transition(object): | 61 class FSM_transition(object): |
62 _doc = None | 62 _doc = None |
63 _domview = None | 63 _domview = None |
64 _fsm_layer = None | |
65 _control_layer = None | |
64 _state = None | 66 _state = None |
65 trn_cond = None | 67 trn_cond = None |
66 trn_g = None | 68 trn_g = None |
67 _arrow_node = None | 69 _arrow_node = None |
68 _path_node = None | 70 _path_node = None |
69 | 71 |
70 def __init__(self, trn_cond): | 72 def __init__(self, trn_cond): |
71 self.trn_cond = trn_cond | 73 self.trn_cond = trn_cond |
72 pass | 74 pass |
73 | 75 |
74 def init(self, doc, domview, state): | 76 def init(self, doc, domview, state, fsm_layer, control_layer): |
75 self._doc = doc | 77 self._doc = doc |
76 self._domview = domview | 78 self._domview = domview |
77 self._state = state | 79 self._state = state |
80 self._fsm_layer = fsm_layer | |
81 self._control_layer = control_layer | |
78 pass | 82 pass |
79 | 83 |
80 @staticmethod | 84 @staticmethod |
81 def _update_graph(path, arrow_node, path_node): | 85 def _update_graph(path, arrow_node, path_node): |
82 import math | 86 import math |
149 pass | 153 pass |
150 | 154 |
151 class FSM_state(object): | 155 class FSM_state(object): |
152 _doc = None | 156 _doc = None |
153 _domview = None | 157 _domview = None |
158 _fsm_layer = None | |
159 _control_layer = None | |
154 state_name = None | 160 state_name = None |
155 state_g = None | 161 state_g = None |
156 _text_node = None | 162 _text_node = None |
157 _circle_node = None | 163 _circle_node = None |
158 transitions = None | 164 transitions = None |
160 def __init__(self, state_name): | 166 def __init__(self, state_name): |
161 self.state_name = state_name | 167 self.state_name = state_name |
162 self.transitions = {} | 168 self.transitions = {} |
163 pass | 169 pass |
164 | 170 |
165 def init(self, doc, domview): | 171 def init(self, doc, domview, fsm_layer, control_layer): |
166 self._doc = doc | 172 self._doc = doc |
167 self._domview = domview | 173 self._domview = domview |
174 self._fsm_layer = fsm_layer | |
175 self._control_layer = control_layer | |
168 pass | 176 pass |
169 | 177 |
170 @staticmethod | 178 @staticmethod |
171 def _update_graph(text_node, text_content, circle_node, | 179 def _update_graph(text_node, text_content, circle_node, |
172 state_name, r, x, y): | 180 state_name, r, x, y): |
238 self._text_content = text_content | 246 self._text_content = text_content |
239 self._circle_node = circle_node | 247 self._circle_node = circle_node |
240 | 248 |
241 for trn_cond in self.all_transitions: | 249 for trn_cond in self.all_transitions: |
242 trn = FSM_transition(trn_cond) | 250 trn = FSM_transition(trn_cond) |
243 trn.init(self._doc, domview, self) | 251 trn.init(self._doc, domview, self, |
252 self._fsm_layer, self._control_layer) | |
244 trn.draw(parent) | 253 trn.draw(parent) |
245 self.transitions[trn_cond] = trn | 254 self.transitions[trn_cond] = trn |
246 pass | 255 pass |
247 pass | 256 pass |
248 | 257 |
265 pass | 274 pass |
266 | 275 |
267 class FSM_window(FSM_window_base): | 276 class FSM_window(FSM_window_base): |
268 __metaclass__ = data_monitor.data_monitor | 277 __metaclass__ = data_monitor.data_monitor |
269 __data_monitor_prefix__ = 'on_' | 278 __data_monitor_prefix__ = 'on_' |
279 | |
280 _background = None | |
281 _fsm_layer = None | |
282 _control_layer = None | |
283 width = 1024 | |
284 height = 768 | |
270 | 285 |
271 def __init__(self, domview_ui, close_cb, destroy_cb): | 286 def __init__(self, domview_ui, close_cb, destroy_cb): |
272 super(FSM_window, self).__init__() | 287 super(FSM_window, self).__init__() |
273 | 288 |
274 self._locker = domview_ui | 289 self._locker = domview_ui |
276 self._domview = domview_ui | 291 self._domview = domview_ui |
277 self._states = {} | 292 self._states = {} |
278 | 293 |
279 self._close_cb = close_cb # callback to close editor window (hide) | 294 self._close_cb = close_cb # callback to close editor window (hide) |
280 self._destroy_cb = destroy_cb # callback to destroy editor window | 295 self._destroy_cb = destroy_cb # callback to destroy editor window |
296 pass | |
297 | |
298 def _init_layers(self): | |
299 doc = self._doc() | |
300 root = self._root() | |
301 | |
302 root.setAttribute('inkscape:groupmode', 'layer') | |
303 | |
304 background = doc.createElement('svg:rect') | |
305 background.setAttribute('x', '0') | |
306 background.setAttribute('y', '0') | |
307 background.setAttribute('width', str(self.width)) | |
308 background.setAttribute('height', str(self.height)) | |
309 background.setAttribute('style', 'fill: #ffffff') | |
310 root.appendChild(background) | |
311 self._background = background | |
312 | |
313 fsm_layer = doc.createElement('svg:g') | |
314 fsm_layer.setAttribute('inkscape:groupmode', 'layer') | |
315 root.appendChild(fsm_layer) | |
316 self._fsm_layer = fsm_layer | |
317 | |
318 control_layer = doc.createElement('svg:g') | |
319 control_layer.setAttribute('inkscape:groupmode', 'layer') | |
320 root.appendChild(control_layer) | |
321 self._control_layer = control_layer | |
281 pass | 322 pass |
282 | 323 |
283 def _doc(self): | 324 def _doc(self): |
284 view_widget = self._view_widget | 325 view_widget = self._view_widget |
285 view = view_widget.view | 326 view = view_widget.view |
290 doc = self._doc() | 331 doc = self._doc() |
291 root = doc.root() | 332 root = doc.root() |
292 return root | 333 return root |
293 | 334 |
294 def _clear_view(self): | 335 def _clear_view(self): |
295 root = self._root() | 336 if not self._background: |
296 root.setAttribute('inkscape:groupmode', 'layer') | 337 self._init_layers() |
297 | 338 return |
298 children = [child for child in root.childList() | 339 |
299 if child.name() == 'svg:g'] | 340 children = [child for child in self._fsm_layer.childList()] + \ |
341 [child for child in self._control_layer.childList()] | |
300 for child in children: | 342 for child in children: |
301 root.removeChild(child) | 343 parent = child.parent() |
344 parent.removeChild(child) | |
302 pass | 345 pass |
303 | 346 |
304 self._states = {} | 347 self._states = {} |
305 pass | 348 pass |
306 | 349 |
307 def _update_view(self): | 350 def _update_view(self): |
308 self._clear_view() | 351 self._clear_view() |
309 | 352 |
310 domview = self._domview | 353 domview = self._domview |
311 doc = self._doc() | 354 doc = self._doc() |
312 root = self._root() | 355 fsm_layer = self._fsm_layer |
313 | 356 |
314 state_names = domview.all_state_names() | 357 state_names = domview.all_state_names() |
315 for state_name in state_names: | 358 for state_name in state_names: |
316 state = FSM_state(state_name) | 359 state = FSM_state(state_name) |
317 state.init(doc, domview) | 360 state.init(doc, domview, self._fsm_layer, self._control_layer) |
318 self._states[state_name] = state | 361 self._states[state_name] = state |
319 | 362 |
320 state.draw(root) | 363 state.draw(fsm_layer) |
321 pass | 364 pass |
322 pass | 365 pass |
323 | 366 |
324 def set_svg_view(self, view): | 367 def set_svg_view(self, view): |
325 self._view_box.add(view) | 368 self._view_box.add(view) |
340 | 383 |
341 def on_add_state_toggled(self, *args): | 384 def on_add_state_toggled(self, *args): |
342 pass | 385 pass |
343 | 386 |
344 def _install_test_data(self): | 387 def _install_test_data(self): |
388 self._init_layers() | |
389 | |
345 domview = self._domview | 390 domview = self._domview |
346 | 391 |
347 view = self._view_widget.view | 392 view = self._view_widget.view |
348 doc = view.doc() | 393 doc = view.doc() |
349 rdoc = doc.rdoc | 394 rdoc = doc.rdoc |
354 line_node.setAttribute('y1', '10') | 399 line_node.setAttribute('y1', '10') |
355 line_node.setAttribute('x2', '100') | 400 line_node.setAttribute('x2', '100') |
356 line_node.setAttribute('y2', '100') | 401 line_node.setAttribute('y2', '100') |
357 line_node.setAttribute('style', 'stroke: #000000; stroke-width:2') | 402 line_node.setAttribute('style', 'stroke: #000000; stroke-width:2') |
358 | 403 |
359 print root_node.name() | |
360 print root_node.childList()[-1].name() | |
361 root_node.appendChild(line_node) | 404 root_node.appendChild(line_node) |
362 | 405 |
363 def show_msg(*args, **kws): | 406 def show_msg(*args, **kws): |
364 print 'mouse_event' | 407 print 'mouse_event' |
365 print args | 408 print args |
379 domview.add_transition(state1, 'event1', state2) | 422 domview.add_transition(state1, 'event1', state2) |
380 domview.set_transition_path(state1, 'event1', (200, 150, | 423 domview.set_transition_path(state1, 'event1', (200, 150, |
381 240, 180, | 424 240, 180, |
382 260, 180, | 425 260, 180, |
383 300, 130)) | 426 300, 130)) |
384 state = FSM_state('test1') | |
385 state.init(rdoc, domview) | |
386 state._draw_state_real(root_node, 'test1', 40, 100, 50) | |
387 | |
388 trn = FSM_transition('event1') | |
389 trn.init(rdoc, domview, state) | |
390 trn._draw_transition_real(root_node, (100, 100, | |
391 140, 120, | |
392 160, 120, | |
393 200, 100)) | |
394 pass | 427 pass |
395 | 428 |
396 def show(self): | 429 def show(self): |
397 self._install_test_data() | 430 self._install_test_data() |
398 self._install_test_data = lambda: None | 431 self._install_test_data = lambda: None |