diff --git a/CHANGELOG b/CHANGELOG index e90d732c046d8a12b389af5e069017337883e55b_Q0hBTkdFTE9H..78cbc9fe311c3a272e3e73a0e0aaa4df7290ea0f_Q0hBTkdFTE9H 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,4 @@ +* Manage non editable event * Add support for Python 3.8 * Replace font-desc properties by font diff --git a/doc/index.rst b/doc/index.rst index e90d732c046d8a12b389af5e069017337883e55b_ZG9jL2luZGV4LnJzdA==..78cbc9fe311c3a272e3e73a0e0aaa4df7290ea0f_ZG9jL2luZGV4LnJzdA== 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -377,7 +377,7 @@ :class:`Calendar <goocalendar.Calendar>`. .. class:: goocalendar.Event(caption, start[, end[, all_day[, text_color \ - [, bg_color]]]]) + [, bg_color[, editable]]]]]) *caption* argument is mandatory and will be the string displayed on the event. *start* argument is mandatory and determines the starting time of @@ -387,7 +387,8 @@ All other arguments are optional. *end* argument may be a datetime, all_day a boolean value. An event will be considered as all day event if no *end* argument is supplied. *text_color* and *bg_color* - arguments are supposed to be color strings. + arguments are supposed to be color strings. *editable* determines if the + event can be modified. Instance attributes: @@ -421,6 +422,11 @@ String determining background color. +.. attribute:: editable + + Boolean determining if the event can be modified. + Default value is `True`. + .. attribute:: multidays Boolean property determining if the event is longer than one day. diff --git a/examples/simple.py b/examples/simple.py index e90d732c046d8a12b389af5e069017337883e55b_ZXhhbXBsZXMvc2ltcGxlLnB5..78cbc9fe311c3a272e3e73a0e0aaa4df7290ea0f_ZXhhbXBsZXMvc2ltcGxlLnB5 100644 --- a/examples/simple.py +++ b/examples/simple.py @@ -58,6 +58,13 @@ bg_color='yellow') event_store.add(event) +# A non editable event. +event = Event("Non editable", + datetime.datetime(2007, 10, 9, 10), + datetime.datetime(2007, 10, 9, 11), + editable=False) +event_store.add(event) + # A singularity event. event = Event('Singularity', datetime.datetime(2007, 10, 7, 12), diff --git a/goocalendar/_calendar.py b/goocalendar/_calendar.py index e90d732c046d8a12b389af5e069017337883e55b_Z29vY2FsZW5kYXIvX2NhbGVuZGFyLnB5..78cbc9fe311c3a272e3e73a0e0aaa4df7290ea0f_Z29vY2FsZW5kYXIvX2NhbGVuZGFyLnB5 100644 --- a/goocalendar/_calendar.py +++ b/goocalendar/_calendar.py @@ -792,13 +792,31 @@ @util.left_click def on_event_item_button_press_event(self, event_item, rect, event): - # Drag and drop starting coordinates - self._drag_x = event.x - self._drag_y = event.y - self._drag_height = 0 - self._drag_start_date = self.get_cur_pointed_date(event.x, event.y) - self._drag_date = self._drag_start_date - self.set_has_tooltip(False) - event_item.raise_(None) - event_item.transparent = True + if event_item.event.editable: + # Drag and drop starting coordinates + self._drag_x = event.x + self._drag_y = event.y + self._drag_height = 0 + self._drag_start_date = self.get_cur_pointed_date(event.x, event.y) + self._drag_date = self._drag_start_date + self.set_has_tooltip(False) + event_item.raise_(None) + event_item.transparent = True + + event_item.width = self._day_width - 6 # Biggest event width + event_date = event_item.event.start.date() + daysdelta = self._drag_start_date - event_date + if self.view == 'week': + event_item.x = event_item.left_border + if ((event_item.event.all_day or event_item.event.multidays) + and self._drag_start_date != event_date): + event_item.x += daysdelta.days * self._day_width + event_item.event.start += daysdelta + if event_item.event.end: + event_item.event.end += daysdelta + else: + for item in event_item.event.event_items: + if item != event_item: + item.remove() + self._event_items.remove(item) @@ -804,17 +822,35 @@ - event_item.width = self._day_width - 6 # Biggest event width - event_date = event_item.event.start.date() - daysdelta = self._drag_start_date - event_date - if self.view == 'week': - event_item.x = event_item.left_border - if ((event_item.event.all_day or event_item.event.multidays) - and self._drag_start_date != event_date): - event_item.x += daysdelta.days * self._day_width - event_item.event.start += daysdelta - if event_item.event.end: - event_item.event.end += daysdelta - else: + event_item.height = 2 * self._line_height + day_no = (int((event.x - self._timeline.width) + / self._day_width)) + day_off = day_no * self._day_width + 2 + event_item.x = self._timeline.width + day_off + if (event_item.no_caption or event.y < event_item.y + or event.y > (event_item.y + event_item.height)): + # click was not performed inside the new day item + level_height = self.minute_height * self.MIN_PER_LEVEL + cur_level = int((event.y - self._timeline.y) + / level_height) + nb_levels_per_hour = 60 / self.MIN_PER_LEVEL + # click is in the middle + cur_level -= nb_levels_per_hour + if cur_level < 0: + cur_level = 0 + event_item.y = ( + self._timeline.y + cur_level * level_height) + nb_minutes = cur_level * self.MIN_PER_LEVEL + hours, minutes = map(int, divmod(nb_minutes, 60)) + old_start = event_item.event.start + new_start = \ + datetime.datetime.combine(self._drag_start_date, + datetime.time(hours, minutes)) + event_item.event.start = new_start + delta = new_start - old_start + if event_item.event.end: + event_item.event.end += delta + event_item.no_caption = False + elif self.view == 'month': for item in event_item.event.event_items: if item != event_item: item.remove() self._event_items.remove(item) @@ -817,55 +853,25 @@ for item in event_item.event.event_items: if item != event_item: item.remove() self._event_items.remove(item) - - event_item.height = 2 * self._line_height - day_no = (int((event.x - self._timeline.width) - / self._day_width)) - day_off = day_no * self._day_width + 2 - event_item.x = self._timeline.width + day_off - if (event_item.no_caption or event.y < event_item.y - or event.y > (event_item.y + event_item.height)): - # click was not performed inside the new day item - level_height = self.minute_height * self.MIN_PER_LEVEL - cur_level = int((event.y - self._timeline.y) - / level_height) - nb_levels_per_hour = 60 / self.MIN_PER_LEVEL - cur_level -= nb_levels_per_hour # click is in the middle - if cur_level < 0: - cur_level = 0 - event_item.y = self._timeline.y + cur_level * level_height - nb_minutes = cur_level * self.MIN_PER_LEVEL - hours, minutes = map(int, divmod(nb_minutes, 60)) - old_start = event_item.event.start - new_start = \ - datetime.datetime.combine(self._drag_start_date, - datetime.time(hours, minutes)) - event_item.event.start = new_start - delta = new_start - old_start - if event_item.event.end: - event_item.event.end += delta - event_item.no_caption = False - elif self.view == 'month': - for item in event_item.event.event_items: - if item != event_item: - item.remove() - self._event_items.remove(item) - else: - event_item.event.start += daysdelta - if event_item.event.end: - event_item.event.end += daysdelta - weekno = int(event.y / self._day_height) - day_no = int(event.x / self._day_width) - event_item.y = weekno * self._day_height - event_item.y += int(self._line_height) + 1 # padding-top - event_item.x = day_no * self._day_width + 2 # padding-left - item_height = self._line_height + 2 # 2px between items - while event_item.y < event.y: - event_item.y += item_height - event_item.y -= item_height - event_item.no_caption = False - event_item.update() + else: + event_item.event.start += daysdelta + if event_item.event.end: + event_item.event.end += daysdelta + weekno = int(event.y / self._day_height) + day_no = int(event.x / self._day_width) + event_item.y = weekno * self._day_height + event_item.y += ( + int(self._line_height) + 1) # padding-top + event_item.x = ( + day_no * self._day_width + 2) # padding-left + item_height = ( + self._line_height + 2) # 2px between items + while event_item.y < event.y: + event_item.y += item_height + event_item.y -= item_height + event_item.no_caption = False + event_item.update() self.emit('event-pressed', event_item.event) if self._is_double_click(event): diff --git a/goocalendar/_event.py b/goocalendar/_event.py index e90d732c046d8a12b389af5e069017337883e55b_Z29vY2FsZW5kYXIvX2V2ZW50LnB5..78cbc9fe311c3a272e3e73a0e0aaa4df7290ea0f_Z29vY2FsZW5kYXIvX2V2ZW50LnB5 100644 --- a/goocalendar/_event.py +++ b/goocalendar/_event.py @@ -20,6 +20,7 @@ self.caption = caption self.start = start self.end = end + self.editable = kwargs.get('editable', True) self.all_day = kwargs.get('all_day', False) self.text_color = kwargs.get('text_color', None) self.bg_color = kwargs.get('bg_color', 'orangered')