# -*- coding: utf-8 -*-
# date: 17 Apr 2009
import pygtk
pygtk.require('2.0')
import gtk
import gtk.glade
import gobject
import item
import time
import inspect
import os
from license import version, gpl_3
class ui_pygtk:
def __init__(self, itemList):
self.itemList = itemList
# load ui from glade file
c=inspect.currentframe()
glade = gtk.glade.XML (os.path.dirname(c.f_code.co_filename) + "/todolist.glade")
self.main_window = glade.get_widget('main_window')
self.edit_dialog = glade.get_widget('edit_dialog')
self.edit_dialog.title_field = glade.get_widget('title_field')
self.edit_dialog.priority_field = glade.get_widget('priority_field')
self.edit_dialog.desc_field = glade.get_widget('description_field')
self.main_window.todolist = glade.get_widget('todolist')
# connect the defined signales
dic = {"on_menu_about_clicked" : self.about_clicked_callback,
"on_menu_quit_clicked" : gtk.main_quit,
"on_main_window_destroy" : gtk.main_quit,
"on_treeview_row_activated" : self.item_double_clicked_callback,
"on_edit_clicked" : self.edit_clicked_callback,
"on_remove_clicked" : self.remove_clicked_callback,
"on_add_clicked" : self.add_clicked_callback}
glade.signal_autoconnect(dic)
# fill the treeview with data
liststore = gtk.ListStore(object)
for items in self.itemList:
liststore.append([items])
self.main_window.todolist.set_model(liststore)
self.main_window.todolist.append_column(self.create_column(0, 'Finished', 'getCompleted', liststore, gtk.CellRendererToggle()))
for column in ([['Id', 'getId'],
['ToDo', 'getTitle'],
['...', 'getDescription'],
['Erstellt am', ['getCreatedAt',
(lambda x: time.strftime('%d.%m.%Y %H:%M:%S', time.localtime(x)))]]
]):
self.main_window.todolist.append_column(self.create_column(len(self.main_window.todolist.get_columns())+1, column[0], column[1], liststore))
# start ui
self.main_window.show_all()
gtk.main()
return
def create_column(self, id, title, data, treemodel, cellRenderer=gtk.CellRendererText()):
# abstract mmethod to create a column for the data
# from the item objects in the treeview
column = gtk.TreeViewColumn(title, cellRenderer)
column.set_cell_data_func(cellRenderer, self.item_data_callback, data)
column.set_reorderable(True)
column.set_resizable(True)
column.set_sort_column_id(id)
treemodel.set_sort_func(id, (lambda model, iter1, iter2, userdata=None:
apply(cmp,
map((lambda x: self.item_data_callback(column, None, model, x, data)),
[iter1, iter2]))))
return column
#########################################################
# callbacks
#########################################################
def item_data_callback(self, column, cell, model, iter, userdata=None):
# method to get the data from the item object for one column
data=''
if (userdata == None):
# try to convert the object to string
data = model.get_value(iter, 0)
else:
if type(userdata) is type([]):
data = getattr(model.get_value(iter, 0), userdata[0])()
# modify data with the given functions
for i in xrange (1, len(userdata)):
data = userdata[i](data)
else:
data = getattr(model.get_value(iter, 0), userdata)()
# set the data as cell content
if isinstance(cell, gtk.CellRendererText) :
cell.set_property('text', data)
elif isinstance(cell, gtk.CellRendererToggle) :
cell.set_property('active', data)
else:
return data
def about_clicked_callback(self, widget, data=None):
# show the about dialog
about_window = gtk.AboutDialog()
about_window.set_name('Todolist')
about_window.set_version(version)
about_window.set_copyright('2009 Alexander Sulfrian')
about_window.set_license(gpl_3)
about_window.set_website('http://git.animux.de/todolist.git')
about_window.run()
about_window.hide()
return
def edit_clicked_callback(self, widget, data=None):
# edit btn click
treeview = self.main_window.todolist
if (treeview.get_selection().count_selected_rows() == 1):
item = treeview.get_model().get_value(treeview.get_selection().get_selected()[1], 0)
if self.edit_item(item):
sort = list(treeview.get_model().get_sort_column_id())
treeview.get_model().set_sort_column_id(0, gtk.SORT_ASCENDING)
apply( treeview.get_model(), sort)
def item_double_clicked_callback(self, treeview, path, view_column, user_data=None):
# dbl click on treeview row to edit item
model = treeview.get_model()
item = model.get_value(model.get_iter(path), 0)
if self.edit_item(item):
sort = list(model.get_sort_column_id())
model.set_sort_column_id(0, gtk.SORT_ASCENDING)
apply(model.set_sort_column_id, sort)
return
def remove_clicked_callback(self, widget, data=None):
# remove the selected element
treeview = self.main_window.todolist
if (treeview.get_selection().count_selected_rows() == 1):
item = treeview.get_model().get_value(treeview.get_selection().get_selected()[1], 0)
self.main_window.todolist.get_model().remove(treeview.get_selection().get_selected()[1])
self.itemList.remove(item)
return
def add_clicked_callback(self, widget, data=None):
# add a new element
new_item = item.item()
if self.edit_item(new_item):
self.main_window.todolist.get_model().append([new_item])
self.itemList.append(new_item)
return
#########################################################
# helper methods
#########################################################
def edit_item(self, item):
# helper method to edit item
self.edit_dialog.title_field.set_text(item.getTitle())
self.edit_dialog.priority_field.set_text(item.getPriority().__str__())
text_buffer = gtk.TextBuffer()
if item.getDescription() != None:
text_buffer.set_text(item.getDescription())
self.edit_dialog.desc_field.set_buffer(text_buffer)
successfull = self.edit_dialog.run()
self.edit_dialog.hide()
if (successfull):
item.title = self.edit_dialog.title_field.get_text()
item.priority = self.edit_dialog.priority_field.get_text()
item.description = text_buffer.get_text(text_buffer.get_start_iter(), text_buffer.get_end_iter())
return successfull