mirror of
https://github.com/wting/autojump
synced 2024-10-27 20:34:07 +00:00
path specific action + decorator
This commit is contained in:
parent
40cfad04d3
commit
6174509f28
123
applet
Executable file
123
applet
Executable file
@ -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()
|
93
applet.py
93
applet.py
@ -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()
|
|
Loading…
Reference in New Issue
Block a user