OSDN Git Service

Updates of popup menu(2)
authorShyouzou Sugitani <shy@users.sourceforge.jp>
Mon, 28 Nov 2011 13:08:26 +0000 (22:08 +0900)
committerShyouzou Sugitani <shy@users.sourceforge.jp>
Mon, 28 Nov 2011 13:08:26 +0000 (22:08 +0900)
ChangeLog
lib/ninix/menu.py
lib/ninix/sakura.py
lib/ninix_main.py

index cba3f6c..50e45ac 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Mon November 28 2011   Shyouzou Sugitani <shy@users.sourceforge.jp>
+       * シェル選択のメニュー項目も各ゴーストを管理しているデータ構造に
+         一緒に格納するようにした.
+       * ゴーストが消滅した場合にも当該ゴーストのメニュー項目が有効になる
+         (選択した場合には落ちる)バグを修正した.
+
 Sun November 27 2011   Shyouzou Sugitani <shy@users.sourceforge.jp>
        * ゴーストの交代/召喚のメニュー項目は各ゴーストを管理している
          データ構造内に格納し, ゴーストの起動/終了の際に無効/有効を
@@ -5,6 +11,7 @@ Sun November 27 2011   Shyouzou Sugitani <shy@users.sourceforge.jp>
          ゴースト(A)と(B)が起動した状態で(A)に終了の指示を出してから
          (A)が終了する前に(B)の上でメニューを開くと(A)のメニュー項目は
          無効になっているが, (A)が終了した時点で有効に切り替わるようになった.
+         (これまではメニューを閉じて再度開かないと有効に切り替わらなかった.)
 
 Sat November 26 2011   Shyouzou Sugitani <shy@users.sourceforge.jp>
        * メニューを管理するデータ構造をリストから辞書に変更した.
index cac99c6..83192e4 100644 (file)
@@ -572,7 +572,7 @@ class Menu(object):
         if len(shell_list) <= 1:
             shell_name, value = shell_list[0]
             item.connect(
-                'activate', lambda a, v: handler(value), (value))
+                'activate', lambda a, v: handler(v), (value))
         else:
             submenu = gtk.Menu()
             submenu.set_name('popup menu')
@@ -581,7 +581,7 @@ class Menu(object):
                 subitem = gtk.MenuItem(shell_name)
                 subitem.set_name('popup menu item')
                 subitem.connect(
-                    'activate', lambda a, v: handler(value), (value))
+                    'activate', lambda a, v: handler(v), (value))
                 subitem.show()
                 submenu.append(subitem)
         return item
@@ -599,21 +599,21 @@ class Menu(object):
             menuitem = self.ui_manager.get_widget(''.join(('/popup/', path)))
             menuitem.set_submenu(ghost_menu)
 
+    def create_shell_menuitem(self, shell_name, value, handler):
+        item = gtk.MenuItem(shell_name)
+        item.set_name('popup menu item')
+        item.connect('activate', lambda a, v: handler(v), (value))
+        item.show()
+        return item
+
     def __set_shell_menu(self):
-        shell_list = self.request_parent('GET', 'get_shell_list')
+        shell_menulist = self.request_parent('GET', 'get_shell_menulist')
         shell_menu = gtk.Menu()
-        for i in range(len(shell_list)):
-            shell_name, value, working = shell_list[i]
-            item = gtk.MenuItem(shell_name)
-            item.set_name('popup menu item')
-            item.connect(
-                'activate',
-                lambda a, v: self.request_parent('NOTIFY', 'select_shell', v),
-                (value))
-            item.show()
-            if working:
-                item.set_sensitive(False)
-            shell_menu.append(item)
+        for item in shell_menulist:
+            if item.get_parent():
+                item.reparent(shell_menu)
+            else:
+                shell_menu.append(item)
         menuitem = self.ui_manager.get_widget(''.join(('/popup/', 'Shell')))
         menuitem.set_submenu(shell_menu)
 
index 16748b8..e48a3af 100644 (file)
@@ -142,12 +142,6 @@ class Sakura(object):
         if event_type == 'GET':
             return result
 
-    def select_sakura(self, item):
-        if self.busy():
-            gtk.gdk.beep()
-            return
-        self.request_parent('NOTIFY', 'change_sakura', self, item, 'manual')
-
     def attach_observer(self, observer):
         if observer not in self.__observers:
             self.__observers[observer] = 1
@@ -804,25 +798,13 @@ class Sakura(object):
     def get_prefix(self):
         return self.prefix
 
-    def get_shell_list(self):
-        shell_list = []
-        set_type, i, j = self.current
-        assert set_type == 'g'
-        keys = sorted(self.surface_set.keys())
-        for key in keys:
-            name = self.surface_set[key][0]
-            value = (set_type, i, key)
-            working = 1 if key == j else 0 
-            shell_list.append((name, value, working))
-        return shell_list
-
     def stick_window(self, flag):
         self.surface.window_stick(flag)
 
-    def toggle_bind(self, args): ## FIXME
+    def toggle_bind(self, args):
         self.surface.toggle_bind(args)
 
-    def get_menu_pixmap(self): ## FIXME
+    def get_menu_pixmap(self):
         path_background, path_sidebar, path_foreground = \
             self.surface.get_menu_pixmap()
         top_dir = os.path.join(self.get_prefix(), 'ghost', 'master')
@@ -880,22 +862,14 @@ class Sakura(object):
         self.enqueue_event('OnShellChanging', surface_name, surface_dir,
                            proc=proc)
 
-    def select_balloon(self, widget, item):
-        if not widget.active:
-            return
+    def select_balloon(self, item, desc, balloon):
+        self.balloon_directory = item # save user's choice
         if item == self.get_current_balloon_directory(): # no change
-            # need reloadning?
-            if self.balloon_directory != item:
-                self.balloon_directory = item # save user's choice
-            return
-        desc, balloon = self.request_parent(
-            'GET', 'get_balloon_description', item)
-        subdir = balloon['balloon_dir'][0]
-        path = os.path.join(get_ninix_home(), 'balloon', subdir)
+            return # need reloadning?
+        assert item == balloon['balloon_dir'][0]
+        path = os.path.join(get_ninix_home(), 'balloon', item)
         self.balloon.hide_all()
         self.set_balloon(desc, balloon)
-        if item == subdir:
-            self.balloon_directory = subdir # save user's choice
         self.balloon.set_balloon_default()
         self.position_balloons()
         name = desc.get('name', '')
index 416805b..b5cc6da 100644 (file)
@@ -441,8 +441,10 @@ class Application(object):
         self.ghosts = OrderedDict()
         odict_baseinfo = ninix.home.search_ghosts()
         for key, value in odict_baseinfo.items():
+            ## FIXME: this should be class object
             item = {'baseinfo': value,
                     'menuitem': None,
+                    'shell_menuitem': None,
                     'instance': None,}
             self.ghosts[key] = item
         self.balloons = ninix.home.search_balloons()
@@ -540,44 +542,47 @@ class Application(object):
                                 if sakura.cantalk]
         return working_list
 
-    def getstring(self, name): ## FIXME
+    def getstring(self, name):
         return self.__menu_owner.getstring(name)
 
-    def stick_window(self): ## FIXME
+    def stick_window(self):
         stick = self.__menu.get_stick()
         self.__menu_owner.stick_window(stick)
 
-    def toggle_bind(self, args): ## FIXME
+    def toggle_bind(self, args):
         self.__menu_owner.toggle_bind(args)
 
-    def select_shell(self, item): ## FIXME
+    def select_shell(self, item):
         self.__menu_owner.select_shell(item)
 
-    def select_balloon(self, widget, item): ## FIXME
-        self.__menu_owner.select_balloon(widget, item)
+    def select_balloon(self, widget, item):
+        if not widget.active:
+            return
+        desc, balloon = self.get_balloon_description(item)
+        self.__menu_owner.select_balloon(item, desc, balloon)
 
     def get_current_balloon_directory(self): ## FIXME
         return self.__menu_owner.get_current_balloon_directory()
 
-    def get_shell_list(self): ## FIXME
-        return self.__menu_owner.get_shell_list()
-
-    def select_sakura(self, item): ## FIXME
-        self.__menu_owner.select_sakura(item)
+    def select_sakura(self, item):
+        if self.__menu_owner.busy():
+            gtk.gdk.beep()
+            return
+        self.change_sakura(self.__menu_owner, item, 'manual')
 
-    def notify_site_selection(self, args): ## FIXME
+    def notify_site_selection(self, args):
         self.__menu_owner.notify_site_selection(args)
 
-    def close_sakura(self): ## FIXME
+    def close_sakura(self):
         self.__menu_owner.close()
 
-    def about(self): ## FIXME
+    def about(self):
         self.__menu_owner.about()
 
-    def vanish(self): ## FIXME
+    def vanish(self):
         self.__menu_owner.vanish()
 
-    def network_update(self): ## FIXME
+    def network_update(self):
         self.__menu_owner.network_update()
 
     def open_popup_menu(self, sakura, button, side):
@@ -594,6 +599,13 @@ class Application(object):
     def get_ghost_menulist(self):
         return [value['menuitem'] for value in self.ghosts.values()]
 
+    def get_shell_menulist(self):
+        set_type, i, j = self.__menu_owner.current
+        shell_menuitems = self.ghosts[i]['shell_menuitem']
+        for key, item in shell_menuitems.items():
+            item.set_sensitive(not bool(key == j)) # not working
+        return list(shell_menuitems.values())
+
     def __create_menuitem(self, i):
         assert i in self.ghosts
         set_type = 'g'
@@ -610,10 +622,14 @@ class Application(object):
         name = desc.get('name', i)
         shell_list = []
         surface_set = baseinfo[3]
+        shell_menuitems = OrderedDict()
         for j in surface_set.keys():
             value = (set_type, i, j)
             shell_name = surface_set[j][0]
             shell_list.append((shell_name, value))
+            menuitem = self.__menu.create_shell_menuitem(
+                shell_name, value, self.select_shell)
+            shell_menuitems[j] = menuitem
         if not shell_list: # XXX
             return None
         start_menuitem = self.__menu.create_ghost_menuitem(
@@ -623,15 +639,18 @@ class Application(object):
             name, icon_path, shell_list, self.select_sakura)
         menuitem = {
             'Summon': start_menuitem,
-            'Change': select_menuitem
+            'Change': select_menuitem,
             }
-        return menuitem
+        return menuitem, shell_menuitems
 
     def update_ghost_odict(self, i, sakura):
         self.ghosts[i]['instance'] = sakura
-        self.ghosts[i]['menuitem'] = self.__create_menuitem(i)
-        if self.ghosts[i]['menuitem'] is None:
+        menuitem = self.__create_menuitem(i)
+        if menuitem is None:
             del self.ghosts[i]
+            return
+        self.ghosts[i]['menuitem'] = menuitem[0]
+        self.ghosts[i]['shell_menuitem'] = menuitem[1]
 
     def get_balloon_list(self):
         balloon_list = []
@@ -825,7 +844,6 @@ class Application(object):
             self.quit()
         elif self.current_sakura == sakura.current:
             self.select_current_sakura()
-        self.set_menu_sensitive(i, True)
 
     def close_all_ghosts(self):
         for sakura in self.get_working_ghost():
@@ -897,9 +915,11 @@ class Application(object):
             sakura.enqueue_event('OnGhostChanging', name, method, proc=proc)
 
     def stop_sakura(self, sakura, starter=None, *args):
+        set_type, i, j = sakura.current
         sakura.finalize()
         if starter is not None:
             starter(*args)
+        self.set_menu_sensitive(i, True)
         self.close_ghost(sakura)
 
     def start_sakura(self, item, prev=None, vanished=0, init=0, temp=0):
@@ -973,8 +993,10 @@ class Application(object):
             if exists:
                 self.ghosts[ghost_dir]['baseinfo'] = ghost_conf[ghost_dir]
             else:
+                ## FIXME: this should be class object
                 item = {'baseinfo': ghost_conf[ghost_dir],
                         'menuitem': None,
+                        'shell_menuitem': None,
                         'instance': None,}
                 self.ghosts[ghost_dir] = item
             sakura = self.create_ghost(ghost_conf[ghost_dir])