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