From 6174509f2825dcf07485bfc4178ce165fda0ed41 Mon Sep 17 00:00:00 2001 From: Pierre Gueth Date: Fri, 27 Mar 2009 11:46:21 +0100 Subject: [PATCH] path specific action + decorator --- applet | 123 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ applet.py | 93 ----------------------------------------- icon.png | Bin 314 -> 594 bytes 3 files changed, 123 insertions(+), 93 deletions(-) create mode 100755 applet delete mode 100755 applet.py 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 f877fceb595bb4cdd09720b07454173350f8978c..1c799ca69352edb70d91fbd43962f236e70fcc18 100644 GIT binary patch delta 486 zcmVKp+Sk2{jgAX#ru8XeWOGtw}^dR9M5sSG!Kb zFcdwGx^?f?Ei)Sf`IGPv8v{fvh(|kBMM6{{HU!KJ&>w+;t#dZE?2On9b%^8Ij$Pa8 zm8`~&ALpKXeQpYD*ob0`t+6H;0Jih`WnA!iupJZxaXCB&2%*jy01%lfhfb*aLgu|bCLNWk!G0qD`h*%T`gw2nIexaB{V*}_i=D`T* z0$}5vIEPi1Czk-SC0LRe<`qH?Fb|eYcCx}if0)8n4{URwG=#9{>4C@q8AyzXA;}cp zD*?y?q!S|z0|dYoAD=09|fpAD}WPEA^P=YAo1LsZJGfZlK~ci0euoG?mxBA2=5Tco7HU!VA3(?j5qCm z6>lHSnnTkyBml03dq2^X&QyTX^*WCaT*h7`=a_Z;N|LJm}5x*ho c=ecgdA8Jyr>piErg8%>k07*qoM6N<$g45~OP5=M^ delta 204 zcmV;-05kv61iAu{Hwgd$0002_L%V;GKp+Sj3^*QTYf_MrXeWOFl}SWFR9M69mf;G3 zAP|GM@cmzT{m@9H^iBwoPUuH7=)8SS2|!pl5&%fzil39zfyE;VNJg{#pc=Uf3rrT& zy;ON+l^?o4(f1vY@-xzQv4A-UABdeH-?S>BAS>!;R1s(=g7H|T|r9?o#Rl-340000