diff --git a/examples/simple.py b/examples/simple.py index e7126ef8a1bc1d32d2c0b310d0321d429905da68_ZXhhbXBsZXMvc2ltcGxlLnB5..75e4ab8730940cfecbffee6bfdcada1d1bd2a681_ZXhhbXBsZXMvc2ltcGxlLnB5 100644 --- a/examples/simple.py +++ b/examples/simple.py @@ -73,7 +73,7 @@ text_color='white') event_store.add(event) -calendar.select_from_tuple((2007, 10, 8)) +calendar.select(datetime.date(2007, 10, 8)) window.add(calendar) window.set_size_request(400, 400) window.show_all() diff --git a/goocalendar/_calendar.py b/goocalendar/_calendar.py index e7126ef8a1bc1d32d2c0b310d0321d429905da68_Z29vY2FsZW5kYXIvX2NhbGVuZGFyLnB5..75e4ab8730940cfecbffee6bfdcada1d1bd2a681_Z29vY2FsZW5kYXIvX2NhbGVuZGFyLnB5 100644 --- a/goocalendar/_calendar.py +++ b/goocalendar/_calendar.py @@ -1,6 +1,5 @@ #This file is part of GooCalendar. The COPYRIGHT file at the top level of #this repository contains the full copyright notices and license terms. -import time import datetime import calendar import math @@ -22,7 +21,6 @@ def __init__(self, event_store=None, view="month", time_format="%H:%M", firstweekday=calendar.SUNDAY): super(Calendar, self).__init__() - self._today = time.localtime(time.time())[:3] self._selected_day = None self._bg_rect = None self._timeline = None @@ -47,7 +45,7 @@ self._event_items = [] assert view in self.AVAILABLE_VIEWS self.view = view - self.selected_date = self._today + self.selected_date = datetime.date.today() self.time_format = time_format self.set_bounds(0, 0, 200, 200) self.set_flags(gtk.CAN_FOCUS) @@ -81,5 +79,5 @@ self.on_day_item_button_press_event) self.days.append(box) - def select_from_tuple(self, new_date): + def select(self, new_date): cal = calendar.Calendar(self.firstweekday) @@ -85,3 +83,5 @@ cal = calendar.Calendar(self.firstweekday) + if hasattr(new_date, 'date'): + new_date = new_date.date() old_date = self.selected_date old_day = self._selected_day @@ -86,5 +86,5 @@ old_date = self.selected_date old_day = self._selected_day - self.selected_date = new_date[:3] + self.selected_date = new_date page_changed = False if self.view == "month": @@ -89,6 +89,6 @@ page_changed = False if self.view == "month": - page_changed = old_date[:2] != new_date[:2] + page_changed = not util.same_month(old_date, new_date) elif self.view == "week": old_first_weekday = util.first_day_of_week(cal, old_date) new_first_weekday = util.first_day_of_week(cal, new_date) @@ -104,7 +104,7 @@ # This is fast: Update only the old and newly selected days. # Find the canvas item that corresponds to the new date. - weeks = cal.monthdayscalendar(*new_date[:2]) + weeks = cal.monthdayscalendar(new_date.year, new_date.month) found = -1 for weekno, week in enumerate(weeks): for dayno, day in enumerate(week): @@ -108,7 +108,7 @@ found = -1 for weekno, week in enumerate(weeks): for dayno, day in enumerate(week): - if day == new_date[2]: + if day == new_date.day: found = weekno * 7 + dayno break if found != -1: @@ -129,8 +129,5 @@ if old_day != new_day: self.emit('day-selected', self.get_selected_date()) - def select(self, new_time): - self.select_from_tuple(new_time.timetuple()) - def previous_page(self): cal = calendar.Calendar(self.firstweekday) @@ -135,4 +132,3 @@ def previous_page(self): cal = calendar.Calendar(self.firstweekday) - date = datetime.datetime(*self.selected_date) if self.view == "month": @@ -138,4 +134,3 @@ if self.view == "month": - selected_date = \ - util.previous_month(cal, date).timetuple()[:3] + new_date = util.previous_month(cal, self.selected_date) elif self.view == "week": @@ -141,6 +136,6 @@ elif self.view == "week": - selected_date = util.previous_week(cal, date).timetuple()[:3] - self.select_from_tuple(selected_date) + new_date = util.previous_week(cal, self.selected_date) + self.select(new_date) def next_page(self): cal = calendar.Calendar(self.firstweekday) @@ -144,5 +139,4 @@ def next_page(self): cal = calendar.Calendar(self.firstweekday) - date = datetime.datetime(*self.selected_date) if self.view == "month": @@ -148,3 +142,3 @@ if self.view == "month": - date = util.next_month(cal, date) + new_date = util.next_month(cal, self.selected_date) elif self.view == "week": @@ -150,6 +144,6 @@ elif self.view == "week": - date = util.next_week(cal, date) - self.select(date) + new_date = util.next_month(cal, self.selected_date) + self.select(new_date) def set_view(self, level): if level == self.view: @@ -160,7 +154,7 @@ self.emit('view_changed', self.view) def get_selected_date(self): - return datetime.datetime(*self.selected_date) + return self.selected_date @property def event_store(self): @@ -241,6 +235,6 @@ # Redraw all days. cal = calendar.Calendar(self.firstweekday) - weeks = util.my_monthdatescalendar(cal, *self.selected_date) + weeks = util.my_monthdatescalendar(cal, self.selected_date) for weekno, week in enumerate(weeks): # Hide all days that are not part of the current week. @@ -245,10 +239,9 @@ for weekno, week in enumerate(weeks): # Hide all days that are not part of the current week. - weekdays = [date.timetuple()[:3] for date in week] - if self.selected_date[:3] not in weekdays: + if self.selected_date not in week: for dayno, date in enumerate(week): box = self.days[weekno * 7 + dayno] box.set_property('visibility', goocanvas.ITEM_INVISIBLE) continue # Draw the days that are part of the current week. @@ -249,8 +242,8 @@ for dayno, date in enumerate(week): box = self.days[weekno * 7 + dayno] box.set_property('visibility', goocanvas.ITEM_INVISIBLE) continue # Draw the days that are part of the current week. - for dayno, date in enumerate(week): + for dayno, current_date in enumerate(week): # Highlight the day according to it's selection. @@ -256,7 +249,6 @@ # Highlight the day according to it's selection. - current_date = date.timetuple()[:3] selected = current_date == self.selected_date if selected: the_border_color = selected_border_color else: the_border_color = border_color @@ -258,9 +250,9 @@ selected = current_date == self.selected_date if selected: the_border_color = selected_border_color else: the_border_color = border_color - if current_date == self._today: + if current_date == datetime.date.today(): the_body_color = today_body_color else: the_body_color = body_color @@ -316,8 +308,8 @@ # Draw the grid. y_pos = 0 cal = calendar.Calendar(self.firstweekday) - weeks = util.my_monthdatescalendar(cal, *self.selected_date) + weeks = util.my_monthdatescalendar(cal, self.selected_date) for weekno, week in enumerate(weeks): for dayno, date in enumerate(week): # The color depends on whether each day is part of the # current month. @@ -320,9 +312,8 @@ for weekno, week in enumerate(weeks): for dayno, date in enumerate(week): # The color depends on whether each day is part of the # current month. - year, month, day = date.timetuple()[:3] - if (year, month) != self.selected_date[:2]: + if (not util.same_month(date, self.selected_date)): the_border_color = inactive_border_color the_text_color = inactive_text_color else: @@ -330,7 +321,6 @@ the_text_color = text_color # Highlight the day according to it's selection. - current_date = date.timetuple()[:3] - selected = current_date == self.selected_date + selected = date == self.selected_date if selected: the_border_color = selected_border_color @@ -335,6 +325,6 @@ if selected: the_border_color = selected_border_color - if current_date == self._today: + if date == datetime.date.today(): the_body_color = today_body_color else: the_body_color = body_color @@ -370,7 +360,7 @@ def _get_day_item(self, find_date): cal = calendar.Calendar(self.firstweekday) - weeks = util.my_monthdatescalendar(cal, *find_date.timetuple()) + weeks = util.my_monthdatescalendar(cal, find_date) for weekno, week in enumerate(weeks): for dayno, date in enumerate(week): if date == find_date: @@ -385,11 +375,10 @@ Days that are currently not in the view are not returned. """ cal = calendar.Calendar(self.firstweekday) - weeks = util.my_monthdatescalendar(cal, *self.selected_date) - start = event.start.timetuple()[:3] - end = event.end if event.end else event.start - end = end.timetuple()[:3] + weeks = util.my_monthdatescalendar(cal, self.selected_date) + start = event.start.date() + end = event.end.date() if event.end else event.start.date() assert start <= end days = [] for weekno, week in enumerate(weeks): if self.view == "week": @@ -392,8 +381,7 @@ assert start <= end days = [] for weekno, week in enumerate(weeks): if self.view == "week": - weekdays = [date.timetuple()[:3] for date in week] - if self.selected_date not in weekdays: + if self.selected_date not in week: continue for dayno, date in enumerate(week): @@ -398,6 +386,5 @@ continue for dayno, date in enumerate(week): - date = date.timetuple()[:3] if date >= start and date <= end: days.append(self.days[weekno * 7 + dayno]) if date == end: @@ -432,8 +419,8 @@ cal = calendar.Calendar(self.firstweekday) if self.view == "month": - weeks = util.my_monthdatescalendar(cal, *self.selected_date) + weeks = util.my_monthdatescalendar(cal, self.selected_date) dates = [] for week in weeks: dates += week else: @@ -436,10 +423,10 @@ dates = [] for week in weeks: dates += week else: - dates = util.my_weekdatescalendar(cal, *self.selected_date) + dates = util.my_weekdatescalendar(cal, self.selected_date) # Retrieve a list of all events in the current time span, # and sort them by event length. onedaydelta = (datetime.timedelta(days=1) - datetime.timedelta(microseconds=1)) @@ -441,10 +428,11 @@ # Retrieve a list of all events in the current time span, # and sort them by event length. onedaydelta = (datetime.timedelta(days=1) - datetime.timedelta(microseconds=1)) - start = datetime.datetime(*dates[0].timetuple()[:3]) - end = datetime.datetime(*dates[-1].timetuple()[:3]) + onedaydelta + start = datetime.datetime.combine(dates[0], datetime.time()) + end = datetime.datetime.combine(dates[-1], datetime.time()) \ + + onedaydelta events = self._event_store.get_events(start, end) events.sort(util.event_days, reverse=True) @@ -558,8 +546,9 @@ # Draw non-all-day events. for date in dates: - date_start = datetime.datetime(*date.timetuple()[:3]) - date_end = date_start + datetime.timedelta(1) + date_start = datetime.datetime.combine(date, datetime.time()) + date_end = (datetime.datetime.combine(date_start, datetime.time()) + + datetime.timedelta(days=1)) day = self._get_day_item(date) day_events = util.get_intersection_list(non_all_day_events, date_start, date_end) @@ -681,6 +670,6 @@ """ # Get current week cal = calendar.Calendar(self.firstweekday) - weeks = util.my_monthdatescalendar(cal, *self.selected_date) + weeks = util.my_monthdatescalendar(cal, self.selected_date) if self.view == 'week': cur_week, = (week for week in weeks for date in week @@ -685,6 +674,6 @@ if self.view == 'week': cur_week, = (week for week in weeks for date in week - if self.selected_date[:3] == date.timetuple()[:3]) + if self.selected_date == date) elif self.view == 'month': max_height = 6 * self._day_height if y < 0: @@ -856,7 +845,7 @@ return # Apply vertical translation - midnight = datetime.time(0) + midnight = datetime.time() old_start_midnight = datetime.datetime.combine(old_start, midnight) onedaydelta = datetime.timedelta(days=1) next_day_midnight = old_start_midnight + onedaydelta @@ -952,6 +941,5 @@ if not self.date: return - date_tuple = self.date.timetuple()[:3] - week_day = calendar.weekday(*date_tuple) + week_day = self.date.weekday() day_name = calendar.day_name[week_day] @@ -957,5 +945,5 @@ day_name = calendar.day_name[week_day] - caption = '%s %s' % (date_tuple[2], day_name) + caption = '%s %s' % (self.date.day, day_name) style = self._cal.get_style() font_descr = style.font_desc.copy() font = font_descr.to_string() diff --git a/goocalendar/util.py b/goocalendar/util.py index e7126ef8a1bc1d32d2c0b310d0321d429905da68_Z29vY2FsZW5kYXIvdXRpbC5weQ==..75e4ab8730940cfecbffee6bfdcada1d1bd2a681_Z29vY2FsZW5kYXIvdXRpbC5weQ== 100644 --- a/goocalendar/util.py +++ b/goocalendar/util.py @@ -2,6 +2,5 @@ #this repository contains the full copyright notices and license terms. import sys import datetime -import calendar @@ -6,6 +5,6 @@ -def my_weekdatescalendar(cal, *date): - weeks = cal.monthdatescalendar(*date[:2]) +def my_weekdatescalendar(cal, date): + weeks = cal.monthdatescalendar(date.year, date.month) for weekno, week in enumerate(weeks): # Hide all days that are not part of the current week. @@ -10,8 +9,7 @@ for weekno, week in enumerate(weeks): # Hide all days that are not part of the current week. - weekdays = [d.timetuple()[:3] for d in week] - if date[:3] in weekdays: + if date in week: return week raise Exception('No such week') @@ -14,7 +12,7 @@ return week raise Exception('No such week') -def my_monthdatescalendar(cal, *args): +def my_monthdatescalendar(cal, date): # Months that have only five weeks are filled with another week from # the following month. @@ -19,6 +17,6 @@ # Months that have only five weeks are filled with another week from # the following month. - weeks = cal.monthdatescalendar(*args[:2]) + weeks = cal.monthdatescalendar(date.year, date.month) if len(weeks) < 6: last_day = weeks[-1][-1] offset = datetime.timedelta(1) @@ -32,9 +30,8 @@ def first_day_of_week(cal, date): firstweekday = cal.firstweekday - year, month, day = date[:3] - day_shift = (calendar.weekday(year, month, day) + 7 - firstweekday) % 7 - return datetime.datetime(year, month, day) - datetime.timedelta(day_shift) + day_shift = (date.weekday() + 7 - firstweekday) % 7 + return date - datetime.timedelta(day_shift) def previous_month(cal, date): @@ -63,6 +60,10 @@ return datetime.datetime(year, month, day) +def same_month(date1, date2): + return (date1.year == date2.year and date1.month == date2.month) + + def previous_week(cal, date): return date - datetime.timedelta(7)