Viewing file: menutreemodel.py (5.85 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
#!/usr/bin/env python
# # Copyright (C) 2005 Red Hat, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #
import os import os.path import gtk import gtk.gdk import gmenu
def lookup_system_menu_file (menu_file): conf_dirs = None if os.environ.has_key ("XDG_CONFIG_DIRS"): conf_dirs = os.environ["XDG_CONFIG_DIRS"] if not conf_dirs: conf_dirs = "/etc/xdg"
for conf_dir in conf_dirs.split (":"): menu_file_path = os.path.join (conf_dir, "menus", menu_file) if os.path.isfile (menu_file_path): return menu_file_path return None
def load_icon_from_path (icon_path): if os.path.isfile (icon_path): try: return gtk.gdk.pixbuf_new_from_file_at_size (icon_path, 24, 24) except: pass return None
def load_icon_from_data_dirs (icon_value): data_dirs = None if os.environ.has_key ("XDG_DATA_DIRS"): data_dirs = os.environ["XDG_DATA_DIRS"] if not data_dirs: data_dirs = "/usr/local/share/:/usr/share/"
for data_dir in data_dirs.split (":"): retval = load_icon_from_path (os.path.join (data_dir, "pixmaps", icon_value)) if retval: return retval retval = load_icon_from_path (os.path.join (data_dir, "icons", icon_value)) if retval: return retval return None
def load_icon (icon_theme, icon_value): if not icon_value: return
if os.path.isabs (icon_value): icon = load_icon_from_path (icon_value) if icon: return icon icon_name = os.path.basename (icon_value) else: icon_name = icon_value if icon_name.endswith (".png"): icon_name = icon_name[:-len (".png")] elif icon_name.endswith (".xpm"): icon_name = icon_name[:-len (".xpm")] elif icon_name.endswith (".svg"): icon_name = icon_name[:-len (".svg")] try: return icon_theme.load_icon (icon_name, 24, 0) except: return load_icon_from_data_dirs (icon_value)
class MenuTreeModel (gtk.TreeStore): ( COLUMN_IS_ENTRY, COLUMN_ID, COLUMN_NAME, COLUMN_ICON, COLUMN_MENU_FILE, COLUMN_SYSTEM_VISIBLE, COLUMN_USER_VISIBLE ) = range (7)
def __init__ (self, menu_files): gtk.TreeStore.__init__ (self, bool, str, str, gtk.gdk.Pixbuf, str, bool, bool)
self.entries_list_iter = None self.icon_theme = gtk.icon_theme_get_default ()
if (len (menu_files) < 1): menu_files = ["applications.menu", "settings.menu"]
for menu_file in menu_files: tree = gmenu.lookup_tree (menu_file, gmenu.FLAGS_INCLUDE_EXCLUDED) self.__append_directory (tree.root, None, False, menu_file)
system_file = lookup_system_menu_file (menu_file) if system_file: system_tree = gmenu.lookup_tree (system_file, gmenu.FLAGS_INCLUDE_EXCLUDED) self.__append_directory (system_tree.root, None, True, menu_file)
def __append_directory (self, directory, parent_iter, system, menu_file): if not directory: return iter = self.iter_children (parent_iter) while iter: if self[iter][self.COLUMN_ID] == directory.menu_id: break iter = self.iter_next (iter)
if not iter: iter = self.append (parent_iter)
self[iter][self.COLUMN_IS_ENTRY] = False self[iter][self.COLUMN_ID] = directory.menu_id self[iter][self.COLUMN_NAME] = directory.name self[iter][self.COLUMN_ICON] = load_icon (self.icon_theme, directory.icon)
if not menu_file is None: self[iter][self.COLUMN_MENU_FILE] = menu_file
if system: self[iter][self.COLUMN_SYSTEM_VISIBLE] = True else: self[iter][self.COLUMN_USER_VISIBLE] = True for child_item in directory.contents: if isinstance (child_item, gmenu.Directory): self.__append_directory (child_item, iter, system, None) if not isinstance (child_item, gmenu.Entry): continue child_iter = self.iter_children (iter) while child_iter: if child_item.type == gmenu.TYPE_ENTRY and \ self[child_iter][self.COLUMN_IS_ENTRY] and \ self[child_iter][self.COLUMN_ID] == child_item.desktop_file_id: break child_iter = self.iter_next (child_iter)
if not child_iter: child_iter = self.append (iter)
self[child_iter][self.COLUMN_IS_ENTRY] = True self[child_iter][self.COLUMN_ID] = child_item.desktop_file_id self[child_iter][self.COLUMN_NAME] = child_item.name self[child_iter][self.COLUMN_ICON] = load_icon (self.icon_theme, child_item.icon)
if system: self[child_iter][self.COLUMN_SYSTEM_VISIBLE] = not child_item.is_excluded else: self[child_iter][self.COLUMN_USER_VISIBLE] = not child_item.is_excluded
|