comparison pyink/FSM_window.py @ 1482:3a671e79429a

Hide/show selection for states
author Thinker K.F. Li <thinker@codemud.net>
date Fri, 29 Apr 2011 14:59:40 +0800
parents 28ab64f8581e
children 9df6ed043b87
comparison
equal deleted inserted replaced
1481:28ab64f8581e 1482:3a671e79429a
279 state_g = self.state_g 279 state_g = self.state_g
280 state_g_hdl_id = self._state_g_hdl_id 280 state_g_hdl_id = self._state_g_hdl_id
281 state_g.disconnect(state_g_hdl_id) 281 state_g.disconnect(state_g_hdl_id)
282 pass 282 pass
283 283
284 def _translate_page_xy(self, x, y):
285 doc = self._doc
286 root = doc.root()
287 page_h_txt = root.getAttribute('height')
288 page_h = float(page_h_txt)
289 svgx = x
290 svgy = page_h - y
291 return svgx, svgy
292
284 def show_selected(self): 293 def show_selected(self):
285 if not self._selected_rect: 294 if not self._selected_rect:
286 doc = self._doc 295 doc = self._doc
287 rect = doc.createElement('svg:rect') 296 rect = doc.createElement('svg:rect')
288 control_layer = self._control_layer 297 control_layer = self._control_layer
289 rect.setAttribute('style', 298 rect.setAttribute('style',
290 'stroke: #404040; stroke-width: 1; ' 299 'stroke: #404040; stroke-width: 1; '
291 'stroke-dasharray: 5 3; fill: none') 300 'stroke-dasharray: 6 4; fill: none')
292 control_layer.appendChild(rect) 301 control_layer.appendChild(rect)
293 self._selected_rect = rect 302 self._selected_rect = rect
294 pass 303 pass
295 304
296 state_g = self.state_g 305 state_g = self.state_g
297 rect = self._selected_rect 306 rect = self._selected_rect
298 307
299 x, y, w, h = state_g.getBBox() 308 px, py, pw, ph = state_g.getBBox()
309 x, y = self._translate_page_xy(px, py)
310 y = y - ph # px, py is left-bottom corner
311
300 rect.setAttribute('x', str(x - 2)) 312 rect.setAttribute('x', str(x - 2))
301 rect.setAttribute('y', str(y - 2)) 313 rect.setAttribute('y', str(y - 2))
302 rect.setAttribute('width', str(w + 4)) 314 rect.setAttribute('width', str(pw + 4))
303 rect.setAttribute('height', str(h + 4)) 315 rect.setAttribute('height', str(ph + 4))
304 pass 316 pass
305 317
306 def hide_selected(self): 318 def hide_selected(self):
307 if not self._selected_rect: 319 if not self._selected_rect:
308 return 320 return
309 321
310 state_g = self.state_g 322 control_layer = self._control_layer
311 rect = self._selected_rect 323 rect = self._selected_rect
312 state_g.removeChild(rect) 324 control_layer.removeChild(rect)
325 self._selected_rect = None
313 pass 326 pass
314 327
315 def _draw_state_real(self, parent, state_name, r, x, y): 328 def _draw_state_real(self, parent, state_name, r, x, y):
316 doc = self._doc 329 doc = self._doc
317 330
389 self._update_graph(text_node, text_content, circle_node, state_name, 402 self._update_graph(text_node, text_content, circle_node, state_name,
390 r, x, y) 403 r, x, y)
391 pass 404 pass
392 pass 405 pass
393 406
407
408 class FSM_move_state_mode(object):
409 __metaclass__ = data_monitor.data_monitor
410 __data_monitor_prefix__ = 'on_'
411
412 _window = None
413 _selected_state = None
414
415 def __init__(self, window, domview_ui):
416 self._window = window
417 self._domview = domview_ui
418 self._locker = domview_ui
419 pass
420
421 def on_move_state_background(self, item, evtype, buttons, x, y):
422 pass
423
424 def _select_state(self, state):
425 if self._selected_state:
426 self._selected_state.hide_selected()
427 pass
428 self._selected_state = state
429 state.show_selected()
430 pass
431
432 def _clear_select(self):
433 if self._selected_state:
434 self._selected_state.hide_selected()
435 pass
436 self._selected_state = None
437 pass
438
439 def handle_move_state_state(self, state, evtype, buttons, x, y):
440 import pybInkscape
441
442 def moving_state(item, evtype, buttons, x, y):
443 if evtype == pybInkscape.PYSPItem.PYB_EVENT_BUTTON_RELEASE:
444 window.ungrab_mouse()
445 pass
446 new_state_x = orign_state_x + start_x - x
447 new_state_y = orign_state_y + start_y - y
448
449 domview = self._domview
450 domview.set_state_xy(state.state_name, x, y)
451 state.update()
452 state.show_selected()
453 pass
454
455 window = self._window
456
457 if evtype == pybInkscape.PYSPItem.PYB_EVENT_BUTTON_PRESS:
458 start_x = x
459 start_y = y
460 orign_state_x, orign_state_y = state.xy
461
462 self._select_state(state)
463 window.grab_mouse(moving_state)
464 pass
465
466 if evtype == pybInkscape.PYSPItem.PYB_EVENT_BUTTON_RELEASE:
467 window.ungrab_mouse()
468 pass
469 pass
470
471 def activate(self):
472 window = self._window
473 window._emit_leave_mode()
474 window._clear_leave_mode_cb()
475 window.ungrab_all()
476
477 window.grab_bg(self.on_move_state_background)
478 window.grab_state(self.handle_move_state_state)
479 pass
480
481 def deactivate(self):
482 if self._selected_state:
483 self._clear_select()
484 pass
485 pass
486 pass
487
488
394 class FSM_window(FSM_window_base): 489 class FSM_window(FSM_window_base):
395 __metaclass__ = data_monitor.data_monitor 490 __metaclass__ = data_monitor.data_monitor
396 __data_monitor_prefix__ = 'on_' 491 __data_monitor_prefix__ = 'on_'
397 492
398 _background = None 493 _background = None
405 _bg_hdl = None 500 _bg_hdl = None
406 501
407 _saved_x = 0 502 _saved_x = 0
408 _saved_y = 0 503 _saved_y = 0
409 504
505 _leave_mode_cb = None
506 _move_state_mode = None
410 _state_mouse_event_handler = None 507 _state_mouse_event_handler = None
411 508
412 def __init__(self, domview_ui, close_cb, destroy_cb): 509 def __init__(self, domview_ui, close_cb, destroy_cb):
413 super(FSM_window, self).__init__() 510 super(FSM_window, self).__init__()
414 511
417 self._domview = domview_ui 514 self._domview = domview_ui
418 self._states = {} 515 self._states = {}
419 516
420 self._close_cb = close_cb # callback to close editor window (hide) 517 self._close_cb = close_cb # callback to close editor window (hide)
421 self._destroy_cb = destroy_cb # callback to destroy editor window 518 self._destroy_cb = destroy_cb # callback to destroy editor window
519
520 self._move_state_mode = FSM_move_state_mode(self, domview_ui)
422 pass 521 pass
423 522
424 def _init_layers(self): 523 def _init_layers(self):
425 doc = self._doc() 524 doc = self._doc()
426 root = self._root() 525 root = self._root()
488 self._states[state_name] = state 587 self._states[state_name] = state
489 588
490 state.draw(fsm_layer) 589 state.draw(fsm_layer)
491 pass 590 pass
492 591
592 def _set_leave_mode_cb(self, callback):
593 self._leave_mode_cb = callback
594 pass
595
596 def _clear_leave_mode_cb(self):
597 self._leave_mode_cb = None
598 pass
599
600 def _emit_leave_mode(self):
601 if self._leave_mode_cb:
602 self._leave_mode_cb()
603 pass
604 pass
605
606 def ungrab_all(self):
607 self.ungrab_bg()
608 self.ungrab_mouse()
609 self.ungrab_state()
610 pass
611
493 def on_state_mouse_event(self, state, evtype, buttons, x, y): 612 def on_state_mouse_event(self, state, evtype, buttons, x, y):
494 if self._state_mouse_event_handler: 613 if self._state_mouse_event_handler:
495 self._state_mouse_event_handler(state, evtype, buttons, x, y) 614 self._state_mouse_event_handler(state, evtype, buttons, x, y)
496 pass 615 pass
497 pass 616 pass
547 def on_FSM_main_win_delete_event(self, *args): 666 def on_FSM_main_win_delete_event(self, *args):
548 self._destroy_cb() 667 self._destroy_cb()
549 pass 668 pass
550 669
551 def on_add_state_toggled(self, *args): 670 def on_add_state_toggled(self, *args):
552 self.ungrab_bg() 671 self._emit_leave_mode()
672 self.ungrab_all()
673
553 self.grab_bg(self.on_add_state_background) 674 self.grab_bg(self.on_add_state_background)
554 pass 675 pass
555 676
556 def on_move_state_toggled(self, *args): 677 def on_move_state_toggled(self, *args):
557 self.ungrab_bg() 678 mode = self._move_state_mode
558 self.grab_bg(self.on_move_state_background) 679 mode.activate()
559 self.ungrab_state() 680 self._set_leave_mode_cb(lambda: mode.deactivate())
560 self.grab_state(self.handle_move_state_state)
561 pass 681 pass
562 682
563 def on_add_state_background(self, item, evtype, buttons, x, y): 683 def on_add_state_background(self, item, evtype, buttons, x, y):
564 import pybInkscape 684 import pybInkscape
565 685
566 if evtype == pybInkscape.PYSPItem.PYB_EVENT_BUTTON_RELEASE and \ 686 if evtype == pybInkscape.PYSPItem.PYB_EVENT_BUTTON_RELEASE and \
567 buttons == 1: 687 buttons == 1:
568 self._saved_x = x 688 self._saved_x = x
569 self._saved_y = y 689 self._saved_y = y
570 self.show_state_editor() 690 self.show_state_editor()
571 pass
572 pass
573
574 def on_move_state_background(self, item, evtype, buttons, x, y):
575 pass
576
577 def handle_move_state_state(self, state, evtype, buttons, x, y):
578 import pybInkscape
579
580 def moving_state(item, evtype, buttons, x, y):
581 if evtype == pybInkscape.PYSPItem.PYB_EVENT_BUTTON_RELEASE:
582 self.ungrab_mouse()
583 pass
584 new_state_x = orign_state_x + start_x - x
585 new_state_y = orign_state_y + start_y - y
586
587 domview = self._domview
588 domview.set_state_xy(state.state_name, x, y)
589 state.update()
590 state.show_selected()
591 pass
592
593 if evtype == pybInkscape.PYSPItem.PYB_EVENT_BUTTON_PRESS:
594 start_x = x
595 start_y = y
596 orign_state_x, orign_state_y = state.xy
597
598 state.show_selected()
599
600 self.grab_mouse(moving_state)
601 pass 691 pass
602 pass 692 pass
603 693
604 def on_state_apply_clicked(self, *args): 694 def on_state_apply_clicked(self, *args):
605 import traceback 695 import traceback