Mercurial > MadButterfly
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 |