changeset 1488:757c5626d15d

Show context menu for states
author Thinker K.F. Li <thinker@codemud.net>
date Sat, 30 Apr 2011 15:22:45 +0800
parents 3aba29609607
children 1e607ce4bf7d
files pyink/FSM_window.glade pyink/FSM_window.py
diffstat 2 files changed, 77 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/pyink/FSM_window.glade	Sat Apr 30 11:18:44 2011 +0800
+++ b/pyink/FSM_window.glade	Sat Apr 30 15:22:45 2011 +0800
@@ -471,4 +471,34 @@
       <action-widget response="0">error_dialog_ok</action-widget>
     </action-widgets>
   </object>
+  <object class="GtkMenu" id="state_menu">
+    <property name="visible">True</property>
+    <child>
+      <object class="GtkMenuItem" id="add_transition">
+        <property name="visible">True</property>
+        <property name="tooltip_text" translatable="yes">Add a transition to the state</property>
+        <property name="label" translatable="yes">Add Transition</property>
+        <property name="use_underline">True</property>
+        <signal name="activate" handler="on_add_transition_activate"/>
+      </object>
+    </child>
+    <child>
+      <object class="GtkMenuItem" id="del_state">
+        <property name="visible">True</property>
+        <property name="tooltip_text" translatable="yes">Delete selecting state</property>
+        <property name="label" translatable="yes">Del State</property>
+        <property name="use_underline">True</property>
+        <signal name="activate" handler="on_del_state_activate"/>
+      </object>
+    </child>
+    <child>
+      <object class="GtkMenuItem" id="edit_state">
+        <property name="visible">True</property>
+        <property name="tooltip_text" translatable="yes">Edit properties of the state.</property>
+        <property name="label" translatable="yes">Edit State</property>
+        <property name="use_underline">True</property>
+        <signal name="activate" handler="on_edit_state_activate"/>
+      </object>
+    </child>
+  </object>
 </interface>
--- a/pyink/FSM_window.py	Sat Apr 30 11:18:44 2011 +0800
+++ b/pyink/FSM_window.py	Sat Apr 30 15:22:45 2011 +0800
@@ -3,12 +3,17 @@
 import data_monitor
 
 class FSM_window_base(object):
+    _add_state_button = None
+    _move_state_button = None
+    
     _state_editor = None
     _state_name = None
     _state_radius = None
 
     _error_dialog = None
     _error_dialog_label = None
+
+    _state_menu = None
     
     def __init__(self):
         super(FSM_window_base, self).__init__()
@@ -31,6 +36,8 @@
         error_dialog = builder.get_object('error_dialog')
         error_dialog_label = builder.get_object('error_dialog_label')
 
+        state_menu = builder.get_object('state_menu')
+
         builder.connect_signals(self)
         
         self._builder = builder
@@ -45,6 +52,8 @@
 
         self._error_dialog = error_dialog
         self._error_dialog_label = error_dialog_label
+
+        self._state_menu = state_menu
         pass
 
     def show_error(self, msg):
@@ -75,6 +84,11 @@
         state_editor.hide()
         pass
 
+    def popup_state_menu(self):
+        menu = self._state_menu
+        menu.popup(None, None, None, 0, 0)
+        pass
+    
     def show(self):
         self._main_win.show()
         self._add_state_button.set_active(True)
@@ -127,6 +141,15 @@
         error_dialog = self._error_dialog
         error_dialog.hide()
         pass
+
+    def on_add_transition_activate(self, *args):
+        pass
+
+    def on_del_state_activate(self, *args):
+        pass
+
+    def on_edit_state_activate(self, *args):
+        pass
     pass
 
 class FSM_transition(object):
@@ -511,7 +534,7 @@
         self._locker = domview_ui
         pass
 
-    def on_move_state_background(self, item, evtype, buttons, x, y):
+    def on_move_state_background(self, item, evtype, button, x, y):
         pass
 
     def _select_state(self, state):
@@ -529,13 +552,13 @@
         self._selected_state = None
         pass
 
-    def handle_move_state_state(self, state, evtype, buttons, x, y):
+    def handle_move_state_state(self, state, evtype, button, x, y):
         import pybInkscape
 
         window = self._window
         states = window._states
 
-        def moving_state(item, evtype, buttons, x, y):
+        def moving_state(item, evtype, button, x, y):
             if evtype == pybInkscape.PYSPItem.PYB_EVENT_BUTTON_RELEASE:
                 window.ungrab_mouse()
                 pass
@@ -551,7 +574,8 @@
         
         window = self._window
         
-        if evtype == pybInkscape.PYSPItem.PYB_EVENT_BUTTON_PRESS:
+        if evtype == pybInkscape.PYSPItem.PYB_EVENT_BUTTON_PRESS and \
+                button == 1:
             start_x = x
             start_y = y
             orign_state_x, orign_state_y = state.xy
@@ -560,7 +584,8 @@
             window.grab_mouse(moving_state)
             pass
         
-        if evtype == pybInkscape.PYSPItem.PYB_EVENT_BUTTON_RELEASE:
+        if evtype == pybInkscape.PYSPItem.PYB_EVENT_BUTTON_RELEASE and \
+                button == 1:
             window.ungrab_mouse()
             pass
         pass
@@ -630,19 +655,29 @@
         window.hide_state_editor()
         pass
     
-    def on_add_state_background(self, item, evtype, buttons, x, y):
+    def on_add_state_background(self, item, evtype, button, x, y):
         import pybInkscape
 
         window = self._window
         
         if evtype == pybInkscape.PYSPItem.PYB_EVENT_BUTTON_RELEASE and \
-                buttons == 1:
+                button == 1:
             self._saved_x = x
             self._saved_y = y
             window.show_state_editor()
             pass
         pass
 
+    def _handle_state_mouse_events(self, state, evtype, button, x, y):
+        import pybInkscape
+        
+        if evtype == pybInkscape.PYSPItem.PYB_EVENT_BUTTON_RELEASE and \
+                button == 3:
+            window = self._window
+            window.popup_state_menu()
+            pass
+        pass
+
     def activate(self):
         window = self._window
         
@@ -650,6 +685,7 @@
         window.ungrab_all()
         
         window.grab_bg(self.on_add_state_background)
+        window.grab_state(self._handle_state_mouse_events)
         pass
 
     def deactivate(self):
@@ -777,15 +813,15 @@
         self.ungrab_state()
         pass
 
-    def on_state_mouse_event(self, state, evtype, buttons, x, y):
+    def on_state_mouse_event(self, state, evtype, button, x, y):
         if self._state_mouse_event_handler:
-            self._state_mouse_event_handler(state, evtype, buttons, x, y)
+            self._state_mouse_event_handler(state, evtype, button, x, y)
             pass
         pass
 
     def _install_state_event_handler(self, state):
-        def mouse_event_handler(item, evtype, buttons, x, y):
-            self.on_state_mouse_event(state, evtype, buttons, x, y)
+        def mouse_event_handler(item, evtype, button, x, y):
+            self.on_state_mouse_event(state, evtype, button, x, y)
             pass
         state.grab(mouse_event_handler)
         pass