diff --git a/applet b/applet new file mode 100755 index 0000000..f8c6b36 --- /dev/null +++ b/applet @@ -0,0 +1,123 @@ +#!/usr/bin/env python + +import subprocess +import cPickle +import os.path +import os +import sys +import pygtk +pygtk.require('2.0') +import gtk + +#decorator truff +actions={} + +def action(validator,name=None): + if name is None: + def wrapper(action): + actions[action.__name__]=(action,validator) + else: + def wrapper(action): + actions[name]=(action,validator) + return wrapper + +#validator helper +always=lambda x: True + +def has_child_dir(dirname): + def wrapper(path): + return os.path.isdir(os.path.join(path,dirname)) + return wrapper + + +def has_child_file(filename): + def wrapper(path): + return os.path.isfile(os.path.join(path,filename)) + return wrapper + +#do the work +def load_paths(filename="~/.autojump_py",maxpath=10): + dic_file=os.path.expanduser(filename) + + try: + aj_file=open(dic_file) + path_dict=cPickle.load(aj_file) + aj_file.close() + except IOError: + pass + + path_dict=path_dict.items() + path_dict.sort(key=lambda x: x[1],reverse=True) + + return [path for path,score in path_dict[:maxpath]] + +def get_actions(path): + return [(name,action) for name,(action,validator) in actions.items() if validator(path)] + +def popup(sender,button,activation): + paths=load_paths() + + menu=gtk.Menu() + for path in paths: + actions=get_actions(path) + if not actions: continue + + item=gtk.MenuItem(path) + submenu=gtk.Menu() + item.set_submenu(submenu) + for name,action in actions: + subitem=gtk.MenuItem(name) + subitem.connect("activate",action,path) + submenu.append(subitem) + menu.append(item) + + menu.append(gtk.SeparatorMenuItem()) + + item=gtk.MenuItem("quit") + item.connect("activate",quit) + menu.append(item) + + menu.show_all() + menu.popup(None,None,gtk.status_icon_position_menu,button,activation,sender) + +def init(): + icon=gtk.status_icon_new_from_file("icon.png") + icon.set_visible(True) + icon.connect("popup-menu",popup) + +def quit(sender): + gtk.main_quit() + +###################################################### +#insert other actions here using the action decorator# +###################################################### +@action(has_child_dir(".git")) +def gitk(sender,path): + if not os.fork(): + os.chdir(path) + subprocess.Popen(['gitk']).wait() + sys.exit() + +@action(has_child_file("CMakeCache.txt"),"configure") +def cmake(sender,path): + if not os.fork(): + os.chdir(path) + subprocess.Popen(['cmake-gui','.']).wait() + sys.exit() + +@action(always) +def terminal(sender,path): + if not os.fork(): + os.chdir(path) + subprocess.Popen(['gnome-terminal']).wait() + sys.exit() + +@action(always,"navigateur") +def nautilus(sender,path): + if not os.fork(): + subprocess.Popen(['nautilus',path]).wait() + sys.exit() + +if __name__=='__main__': + init() + gtk.main() diff --git a/applet.py b/applet.py deleted file mode 100755 index 096ee2d..0000000 --- a/applet.py +++ /dev/null @@ -1,93 +0,0 @@ -#!/usr/bin/env python - -import subprocess -import cPickle -import os.path -import os -import sys -import pygtk -pygtk.require('2.0') -import gtk - -def load_paths(filename="~/.autojump_py",maxpath=10): - dic_file=os.path.expanduser("~/.autojump_py") - - try: - aj_file=open(dic_file) - path_dict=cPickle.load(aj_file) - aj_file.close() - except IOError: - pass - - path_dict=path_dict.items() - path_dict.sort(key=lambda x: x[1],reverse=True) - - return [path for path,score in path_dict[:maxpath]] - -class Action: - def __init__(self,name,path): - self.name=name - self.path=path - - #insert other actions here - def _unknown(self): - print "unknown action %s for %s" % (self.name,self.path) - def terminal(self): - if not os.fork(): - os.chdir(self.path) - subprocess.Popen(['gnome-terminal']).wait() - sys.exit() - def nautilus(self): - if not os.fork(): - subprocess.Popen(['nautilus',self.path]).wait() - sys.exit() - def gitk(self): - if not os.fork(): - os.chdir(self.path) - subprocess.Popen(['gitk']).wait() - sys.exit() - - def __call__(self): - getattr(self,self.name,self._unknown)() - -def get_actions(): - return [name for name,value in Action.__dict__.items() if callable(value) and name[0]!='_' ] - -def popup(sender,button,activation): - paths=load_paths() - - actions=get_actions() - menu=gtk.Menu() - for path in paths: - item=gtk.MenuItem(path) - submenu=gtk.Menu() - item.set_submenu(submenu) - for action in actions: - subitem=gtk.MenuItem(action) - subitem.connect("activate",menuitem,Action(action,path)) - submenu.append(subitem) - menu.append(item) - - menu.append(gtk.SeparatorMenuItem()) - - item=gtk.MenuItem("quit") - item.connect("activate",quit) - menu.append(item) - - menu.show_all() - menu.popup(None,None,gtk.status_icon_position_menu,button,activation,sender) - -def menuitem(sender,functionnality): - functionnality() - -def init(): - icon=gtk.status_icon_new_from_file("icon.png") - icon.set_visible(True) - icon.connect("popup-menu",popup) - -def quit(sender): - gtk.main_quit() - -if __name__=='__main__': - init() - gtk.main() diff --git a/icon.png b/icon.png index f877fce..1c799ca 100644 Binary files a/icon.png and b/icon.png differ