# -*- coding: utf-8 -*-
#
#Copyright (C) 2010-2012, Yader Velasquez
#
#This program is free software: you can redistribute it and/or modify
#it under the terms of the GNU General Public License as published by
#the Free Software Foundation, either version 3 of the License, or
#(at your option) any later version.
#
#This program is distributed in the hope that it will be useful,
#but WITHOUT ANY WARRANTY; without even the implied warranty of
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
#GNU General Public License for more details.
#
#You should have received a copy of the GNU General Public License
#along with this program. If not, see .
import gtk
import pygtk
import re
from database import DataBase
from model import ComboBoxModel, TasksModel
from sugar.activity import activity, widgets
from gettext import gettext as _
from datetime import date, datetime
import logging
import pango
log = logging.getLogger('Calendario-Log')
class CalendarioActivity(activity.Activity):
def __init__(self, handle):
'''Constructor'''
activity.Activity.__init__(self, handle)
self.main_container = gtk.HBox()
toolbox = widgets.ActivityToolbox(self)
self.set_toolbar_box(toolbox)
toolbox.show()
self.path = self.get_activity_root()
###left side###
self.left_container = gtk.VBox()
d = datetime.today()
self.label_date = gtk.Label(d.strftime("%d %B %Y"))
self.calendar = gtk.Calendar()
self.calendar.connect('day-selected', self._day_selected_cb)
self.calendar.connect('month-changed', self._mark_day_cb)
self.calendar.connect('next-year', self._mark_day_cb)
self.calendar.connect('prev-year', self._mark_day_cb)
self.mark_day()
self.tool_frame = gtk.Frame(_("Tools"))
self.reminder_expander = gtk.Expander(_("Tasks reminder"))
self.query_expander = gtk.Expander(_("View by"))
self.tool_box = gtk.VBox()
#reminder
self.scroll_reminder = gtk.ScrolledWindow()
self.scroll_reminder.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
self.scroll_reminder.set_size_request(-1, 170)
self.reminder_list = gtk.TreeView()
self.scroll_reminder.add(self.reminder_list)
self.reminder_expander.add(self.scroll_reminder)
#query
self.query_box = gtk.VBox()
self.label_q_priority = gtk.Label(_("Priority"))
self.label_q_category = gtk.Label(_("Category"))
comboBoxModel = ComboBoxModel()
cat_model = comboBoxModel.get_category_model()
pri_model = comboBoxModel.get_priority_model()
cell = gtk.CellRendererText()
self.combobox_q_priority = gtk.ComboBox()
self.combobox_q_priority.pack_start(cell, True)
self.combobox_q_priority.add_attribute(cell, 'text', 0)
self.combobox_q_category = gtk.ComboBox()
self.combobox_q_category.pack_start(cell, True)
self.combobox_q_category.add_attribute(cell, 'text', 0)
self.combobox_q_category.set_model(cat_model)
self.combobox_q_priority.set_model(pri_model)
self.filter_button = gtk.Button(_('Filter'))
self.filter_button.connect('clicked', self._filter_query_cb)
self.query_box.pack_start(self.label_q_priority, False)
self.query_box.pack_start(self.combobox_q_priority, False)
self.query_box.pack_start(self.label_q_category, False)
self.query_box.pack_start(self.combobox_q_category, False)
self.query_box.pack_start(self.filter_button, True, True, 5)
self.query_expander.add(self.query_box)
self.tool_box.pack_start(self.reminder_expander, False)
self.tool_box.pack_start(self.query_expander, False)
self.tool_frame.add(self.tool_box)
self.left_container.pack_start(self.label_date, False, False, 5)
self.left_container.pack_start(self.calendar, False)
self.left_container.pack_start(self.tool_frame, True, True, 5)
###right side###
self.right_container = gtk.VBox()
self.tasks_frame = gtk.Frame(_("Tasks list"))
self.scroll_tasks = gtk.ScrolledWindow()
self.scroll_tasks.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
self.tasks_list = gtk.TreeView()
self.get_tasks()
self.add_columns()
self.scroll_tasks.add(self.tasks_list)
self.tasks_frame.add(self.scroll_tasks)
#options
self.options_expander = gtk.Expander(_("Options"))
self.options_box = gtk.HBox()
self.label_b_priority = gtk.Label(_("Priority"))
self.combobox_priority = gtk.ComboBox()
self.combobox_priority.pack_start(cell, True)
self.combobox_priority.add_attribute(cell, 'text', 0)
self.label_b_category = gtk.Label(_("Category"))
self.combobox_category = gtk.ComboBox()
self.combobox_category.pack_start(cell, True)
self.combobox_category.add_attribute(cell, 'text', 0)
self.combobox_category.set_model(cat_model)
self.combobox_priority.set_model(pri_model)
self.priority_box = gtk.VBox()
self.priority_box.pack_start(self.label_b_priority)
self.priority_box.pack_start(self.combobox_priority)
self.category_box = gtk.VBox()
self.category_box.pack_start(self.label_b_category)
self.category_box.pack_start(self.combobox_category)
self.options_box.pack_start(self.category_box, True, True, 5)
self.options_box.pack_start(self.priority_box, True, True, 5)
self.options_expander.add(self.options_box)
#input
self.scroll_text = gtk.ScrolledWindow()
self.scroll_text.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
self.text_input = gtk.TextView()
self.text_input.set_size_request(0, 80)
self.scroll_text.add(self.text_input)
self.save_button = gtk.Button(_("Add new"))
self.save_button.connect('clicked', self._save_cb)
self.remove_button = gtk.Button(_("Remove"))
self.remove_button.connect('clicked', self._delete_row_cb)
self.buttons_box = gtk.VBox()
self.buttons_box.pack_start(self.save_button, False)
self.buttons_box.pack_start(self.remove_button, False)
self.input_box = gtk.HBox()
self.input_box.pack_start(self.scroll_text, True, True, 5)
self.input_box.pack_start(self.buttons_box, False)
self.right_container.pack_start(self.tasks_frame, True, True, 5)
self.right_container.pack_start(self.options_expander, False, False)
self.right_container.pack_start(self.input_box, False, False, 5)
self.main_container.pack_start(self.left_container, False, False, 5)
self.main_container.pack_start(self.right_container, True, True, 5)
self.main_container.show_all()
self.set_canvas(self.main_container)
def get_tasks(self):
'''Get the rows'''
date_formated = date_format(self.calendar.get_date())
db = DataBase(self.path)
data = db.get(date_formated)
reminder = db.get_reminder()
db.close()
tasks_model = TasksModel(data)
reminder_model = TasksModel(reminder)
self.tasks_list.set_model(tasks_model.get_model())
self.reminder_list.set_model(reminder_model.get_model())
def add_columns(self):
'''Add columns to TreeView'''
#for the tasks list
cell_text = gtk.CellRendererText()
titles = (_('Tasks'), _('Category'), _('Priority'))
i = 1
for title in titles:
#if the colum is the first
if i == 1:
column = gtk.TreeViewColumn(title, cell_text, markup=i)
#sizes commented are for emuler testing
#column.set_min_width(300)
column.set_min_width(440)
else:
column = gtk.TreeViewColumn(title, cell_text, text=i)
#column.set_min_width(100)
column.set_min_width(135)
self.tasks_list.append_column(column)
i = i + 1
cell_toggle = gtk.CellRendererToggle()
cell_toggle.connect('toggled', self._toggle_row_cb)
column = gtk.TreeViewColumn('', cell_toggle, active=4)
self.tasks_list.append_column(column)
#for the reminder
column = gtk.TreeViewColumn(titles[0], cell_text, text=1)
self.reminder_list.append_column(column)
column = gtk.TreeViewColumn(titles[2], cell_text, text=3)
self.reminder_list.append_column(column)
def mark_day(self):
'''Mark the days of the month with tasks'''
date = date_format(self.calendar.get_date())
#just the month
data = (date[3:],)
db = DataBase(self.path)
day_list = db.get_days(data)
db.close()
for i in day_list:
self.calendar.mark_day(int(i))
def _save_cb(self, widget, data=None):
'''Save a task'''
input_buffer = self.text_input.get_buffer()
start, end = input_buffer.get_bounds()
text = input_buffer.get_text(start, end, False).strip()
text = strip_tag(text)
if len(text) > 0:
input_buffer.set_text('')
category = self.combobox_category.get_active()
priority = self.combobox_priority.get_active()
self.combobox_category.set_active(-1)
self.combobox_priority.set_active(-1)
date_formated = date_format(self.calendar.get_date())
data = (text, category, priority, 0, date_formated)
db = DataBase(self.path)
db.add(data)
db.close()
self.get_tasks()
self.mark_day()
def _toggle_row_cb(self, widget, path):
'''Toggle button row'''
model = self.tasks_list.get_model()
row_iter = model.get_iter(path)
#row is a gtk.TreeModelRow()
row = model[row_iter]
row[4] = not row[4]
#task, completed, id for the moment category and
#priority are excluded
data = (row[4], row[0])
db = DataBase(self.path)
db.update(data)
db.close()
self.get_tasks()
def _delete_row_cb(self, widget, data=None):
'''Delete a row'''
selection = self.tasks_list.get_selection()
model, row_iter = selection.get_selected()
row = model[row_iter]
data = (row[0],)
db = DataBase(self.path)
db.delete(data)
db.close()
self.get_tasks()
def _day_selected_cb(self, widget, data=None):
'''Select new day'''
date_formated = date_format(self.calendar.get_date())
db = DataBase(self.path)
data = db.get(date_formated)
db.close()
tasks_model = TasksModel(data)
self.tasks_list.set_model(tasks_model.get_model())
def _mark_day_cb(self, widget, data=None):
'''Mark calendar days with bold font'''
self.calendar.clear_marks()
self.mark_day()
def _filter_query_cb(self, widget, data=None):
'''Query for filter the tasks'''
category = self.combobox_q_category.get_active()
priority = self.combobox_q_priority.get_active()
self.combobox_q_category.set_active(-1)
self.combobox_q_priority.set_active(-1)
date_formated = date_format(self.calendar.get_date())
data = (date_formated, category, priority)
db = DataBase(self.path)
tasks = db.filter_tasks(data)
db.close()
tasks_model = TasksModel(tasks)
self.tasks_list.set_model(tasks_model.get_model())
def close(self, skip_save=False):
'''Override the close method'''
activity.Activity.close(self, True)
def read_file(self, filepath):
pass
def write_file(self, filepath):
pass
class Task(object):
'''Class represeting a task object'''
def __init__(self, task_id, task, category, priority, completed):
self.task_id = task_id;
self.task = task
self.category = category
self.priority = priority
self.completed = completed
def get_task_id(self):
return self.task_id
def get_task(self):
return self.task
def get_category(self):
return self.category
def get_priority(self):
return self.priority
def get_complete(self):
return self.completed
def date_format(cal_tuple):
'''create a new format from the
calendar get_date() return'''
d = date(cal_tuple[0], cal_tuple[1] + 1, cal_tuple[2])
return d.strftime("%d/%m/%Y")
def strike_string(string):
'''Add pango markup'''
return '%s' %(string)
def strip_tag(string):
'''Delete all the tags'''
return re.sub(r'<[^>]*?>', '', string)