import sys
from gettext import gettext as _
import gtk
import deskbar.interfaces.Module
import deskbar.interfaces.Match
import deskbar.interfaces.Action
from deskbar.core.Utils import load_icon, url_show
from deskbar.core.GconfStore import GconfStore
import todotxt.TodoTask as tasklib
from todotxt.TodoManager import TodoManager
from todotxt.gtk import TodoAddTextView, TodoEditTextView, TodoListView
HANDLERS = ["TodotxtHandler"]
TODOTXT_ICON = [
"16 16 25 1",
" c None",
". c #000000",
"+ c #858585",
"@ c #393939",
"# c #0C0C0C",
"$ c #1D1D1D",
"% c #9E9E9E",
"& c #363636",
"* c #020202",
"= c #F3F3F3",
"- c #FFFFFF",
"; c #313131",
"> c #BABABA",
", c #7A7A7A",
"' c #4F4F4F",
") c #BFBFBF",
"! c #545454",
"~ c #727272",
"{ c #FAFAFA",
"] c #E6E6E6",
"^ c #141414",
"/ c #909090",
"( c #212121",
"_ c #343434",
": c #959595",
" .+.+.+.+ ",
" .@#@.@$@@ ",
" %.&*=.-;+>+ ",
" +---------+ ",
" +-,>------+ ",
" +-.'------+ ",
" +---------+ ",
" +-)...!)--+ ",
" +---------+ ",
" +-)....~--+ ",
" +---------+ ",
" +-).....--+ ",
" +-{{{-----+ ",
" +-%----],^+ ",
" /(.._:++++ ",
" "]
class Todotxt:
"""
Main class for Todotxt
"""
GCONF_DIRECTORY = GconfStore.GCONF_DIR + "/todotxt/directory"
def __init__(self):
# self._gconf = GconfStore.get_instance().get_client()
# self._gconf.notify_add(todotxt.GCONF_DIRECTORY, self.__on_directory_changed)
# self._directory_token = self._gconf.get_string(todotxt.GCONF_DIRECTORY)
self._icon = gtk.gdk.pixbuf_new_from_xpm_data(TODOTXT_ICON)
self._todo_manager = TodoManager()
pass
def __on_directory_changed(self, x, y, z, a):
if z != None:
self.set_directory_token(z.value.get_string())
def set_directory_token(self, token):
self._directory_token = token
def get_directory_token(self):
return self._directory_token
def get_icon(self):
"""
Return the icon
"""
return self._icon
def tasks_get_list(self):
"""
Return the task list.
"""
return tasklib.sort_list(
self._todo_manager.getTaskList())
def tasks_list_view(self,taskslist,patterns=None):
"""
Display a list of tasks corresponding to the patterns
"""
if patterns is not None:
t = tasklib.filter_list(taskslist,[patterns])
return TodoListView(t)
else:
return TodoListView(taskslist)
def task_view(self,todotask):
"""
Display only one task
"""
return TodoListView([todotask])
def task_edit(self,todotask):
"""
Display only one task
"""
return TodoEditTextView(todotask.line,todotask.description)
def tasks_add(self, name):
"""
Add a new task
"""
return TodoAddTextView(name)
def task_done(self,todotask):
"""
Mark a task as done.
"""
self._todo_manager.do([todotask.line])
return self._todo_manager.cleanup()
def task_delete(self,todotask):
"""
Suppress a task.
"""
return self._todo_manager.suppress(todotask.line)
TODOTXT_CLIENT = Todotxt()
class TodotxtViewTaskAction(deskbar.interfaces.Action):
"""
Display one task.
"""
def __init__(self, todotask):
deskbar.interfaces.Action.__init__(self,
name="view-%s" % todotask.description)
self._task = todotask
def get_verb(self):
return _("View task: %s" % self._task.description)
def get_icon(self):
return "gtk-find"
def activate(self, text=None):
TODOTXT_CLIENT.task_view(self._task)
def skip_history(self):
"""
Dont save this action please.
"""
return True
class TodotxtEditTaskAction(deskbar.interfaces.Action):
"""
Make it possible to edit a task's description.
"""
def __init__(self, todotask):
deskbar.interfaces.Action.__init__(self,name="edit-%s"%todotask.description)
self._task = todotask
def get_verb(self):
return _("Edit task: %s"%self._task.description)
def get_icon(self):
return "gtk-find"
def activate(self, text=None):
TODOTXT_CLIENT.task_edit(self._task)
def skip_history(self):
"""
Dont save this action please.
"""
return True
class TodotxtMarkCompleteAction(deskbar.interfaces.Action):
"""
Mark one task as done.
"""
def __init__(self,todotask):
deskbar.interfaces.Action.__init__(self, name="complete-%s"%todotask.description)
self._task = todotask
def get_verb(self):
return _("Do task: %s"%self._task.description)
def get_icon(self):
return gtk.STOCK_APPLY
def activate(self, text=None):
TODOTXT_CLIENT.task_done(self._task)
def skip_history(self):
"""
Dont save this action please.
"""
return True
class TodotxtDeleteAction(deskbar.interfaces.Action):
"""
To suppress a todo task.
"""
def __init__(self, todotask):
deskbar.interfaces.Action.__init__(self,name="delete-%s"%todotask.description)
self._task = todotask
def get_verb(self):
return _("Delete task: %s"%self._task.description)
def get_icon(self):
return gtk.STOCK_DELETE
def activate(self, text=None):
TODOTXT_CLIENT.task_delete(self._task)
def skip_history(self):
"""
Dont save this action please.
"""
return True
class TodotxtAddTaskAction(deskbar.interfaces.Action):
"""
The action that handles task addition.
"""
def __init__(self, description):
deskbar.interfaces.Action.__init__(self, description)
def get_verb(self):
return _("Create a task for %(name)s")
def get_icon(self):
return "gtk-add"
def activate(self, text=None):
return TODOTXT_CLIENT.tasks_add(self._name)
def skip_history(self):
"""
Dont save this action please.
"""
return True
class TodotxtListTasksAction(deskbar.interfaces.Action):
"""
The action that handles the display of tasks matching a pattern.
"""
def __init__(self, taskslist, description):
deskbar.interfaces.Action.__init__(self, description)
self._taskslist = taskslist
def get_verb(self):
return _("View tasks matching %(name)s")
def get_icon(self):
return "gtk-index"
def activate(self, text=None):
return TODOTXT_CLIENT.tasks_list_view(self._taskslist,self._name)
def skip_history(self):
"""
Dont save this action please.
"""
return True
class TodotxtListAllTasksAction(deskbar.interfaces.Action):
"""
The action that handles the display of all tasks.
"""
def __init__(self,taskslist):
deskbar.interfaces.Action.__init__(self,
name="View all tasks")
self._taskslist = taskslist
def get_verb(self):
return _("View all tasks")
def get_icon(self):
return "gtk-index"
def activate(self, text=None):
return TODOTXT_CLIENT.tasks_list_view(self._taskslist)
def skip_history(self):
"""
Dont save this action please.
"""
return True
class TodotxtHandler(deskbar.interfaces.Module):
"""
The handler that will find, return a respond to queries.
"""
INFOS = {'icon': TODOTXT_CLIENT.get_icon(),
'name': "Todotxt",
'description': _("Search and administer your todo tasks, the todotxt way (http://todotxt.org)"),
'version': '0.1.0.0',
"categories" : {
"tasks": {
"name": _("Tasks"),
}
}
}
def __init__(self):
deskbar.interfaces.Module.__init__(self)
def _create_generic_matches(self,taskslist,qstring):
"""
Create matches that do not will always be displayed since they
correspond to a actions and not to a real matches.
"""
matches=[]
# add a task linked to the action of adding a new task
m = deskbar.interfaces.Match(name="Add '%s' as a todo task" % qstring,
category="actions",
pixbuf=TODOTXT_CLIENT.get_icon())
m.add_action(TodotxtAddTaskAction(qstring),is_default=True)
matches.append(m)
# add a task linked to the action of listing all the tasks
m = deskbar.interfaces.Match(name="List todo tasks matching %s" % qstring,
category="actions",
pixbuf=TODOTXT_CLIENT.get_icon())
m.add_action(TodotxtListTasksAction(taskslist,qstring),is_default=True)
matches.append(m)
# now if qstring matches a keyword refering to viewing or
# listing, then do it for every task
m = deskbar.interfaces.Match(name="List all todo tasks",
category="actions",
pixbuf=TODOTXT_CLIENT.get_icon())
if qstring.lower() in ["list","view",_("list"),_("view")]:
m.add_action(TodotxtListAllTasksAction(taskslist),is_default=True)
matches.append(m)
# return the whole stuff
return matches
def _create_task_match(self,taskslist,qstring):
"""
Create a match for a specific task.
"""
matches2 = []
for t in taskslist:
if qstring.lower() in t.description.lower():
m = deskbar.interfaces.Match(name="%s" % t.description,
category="tasks",
pixbuf=TODOTXT_CLIENT.get_icon())
m.add_action(TodotxtViewTaskAction(t), is_default=True )
m.add_action(TodotxtEditTaskAction(t) )
m.add_action(TodotxtMarkCompleteAction(t) )
m.add_action(TodotxtDeleteAction(t) )
matches2.append(m)
return matches2
def query(self, qstring):
"""
Respond to a deskbar query
"""
taskslist = TODOTXT_CLIENT.tasks_get_list()
# send all the results
self._emit_query_ready(qstring,
self._create_generic_matches(taskslist,qstring))
# send all the results
matches = self._create_task_match(taskslist,qstring)
if len(matches)!=0:
self._emit_query_ready(qstring, matches)
def has_config(self):
return False
# def show_config(self, parent):
# dialog = RTMSettingsDialog(parent)
# dialog.run()
# dialog.destroy()
if __name__ == '__main__':
pass
# r = RTM_CLIENT
# print r.get_auth_url('write')
# bla = raw_input("Press enter if ready")
# print r.auth_get_token()
# for list in r.tasks_get_list():
# print "List id:", list.id
# for taskseries in list.taskseries:
# print "\tTaskseries:", taskseries.id
# print "\t", taskseries.name
# for task in taskseries.task:
# print "\t\tTask id:", task.id
# print "\t\t",task.added
# for list in r.lists_get_list():
# print list.id, list.name
# timeline = r.timelines_create()
# print r.tasks_add(timeline, "Rule the world on 15.10.2007 at 15:00", parse=True)