Hello community,

here is the log from the commit of package python-GooCalendar for 
openSUSE:Factory checked in at 2020-02-24 15:54:45
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-GooCalendar (Old)
 and      /work/SRC/openSUSE:Factory/.python-GooCalendar.new.26092 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-GooCalendar"

Mon Feb 24 15:54:45 2020 rev:6 rq:778700 version:0.7.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-GooCalendar/python-GooCalendar.changes    
2019-10-07 14:14:27.110834514 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-GooCalendar.new.26092/python-GooCalendar.changes
 2020-02-24 15:57:12.628097253 +0100
@@ -1,0 +2,9 @@
+Mon Feb 24 08:49:48 UTC 2020 - Axel Braun <[email protected]>
+
+- version 0.7
+ * Use Gtk default font as font by default
+ * Manage non editable event
+ * Add support for Python 3.8
+ * Replace font-desc properties by font
+
+-------------------------------------------------------------------

Old:
----
  GooCalendar-0.6.tar.gz

New:
----
  GooCalendar-0.7.0.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-GooCalendar.spec ++++++
--- /var/tmp/diff_new_pack.3rNExC/_old  2020-02-24 15:57:14.092100280 +0100
+++ /var/tmp/diff_new_pack.3rNExC/_new  2020-02-24 15:57:14.092100280 +0100
@@ -2,7 +2,7 @@
 # spec file for package python-GooCalendar
 #
 # Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
-# Copyright (c) 2016-19 Dr. Axel Braun
+# Copyright (c) 2016-2020 Dr. Axel Braun
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -20,7 +20,7 @@
 %{?!python_module:%define python_module() python-%{**} python3-%{**}}
 %define         skip_python2 1
 Name:           python-GooCalendar
-Version:        0.6
+Version:        0.7.0
 Release:        0
 Summary:        A calendar widget for GTK using PyGoocanvas
 License:        GPL-2.0-only

++++++ GooCalendar-0.6.tar.gz -> GooCalendar-0.7.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/GooCalendar-0.6/.hgtags new/GooCalendar-0.7.0/.hgtags
--- old/GooCalendar-0.6/.hgtags 2019-10-05 23:21:32.000000000 +0200
+++ new/GooCalendar-0.7.0/.hgtags       2020-02-23 16:49:59.000000000 +0100
@@ -4,3 +4,4 @@
 66ceeaa15674495de2792c790c2ee4eacf32a341 0.4
 fb5fc95a2f043fd985332b3044858913667f5fa7 0.5
 5a820de88fb33d1a8648d9f0862c275bd9d719bc 0.6
+2863da4bcf0fccf2ca705ff7ff40d8611bf2d534 0.7.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/GooCalendar-0.6/CHANGELOG 
new/GooCalendar-0.7.0/CHANGELOG
--- old/GooCalendar-0.6/CHANGELOG       2019-10-05 23:21:19.000000000 +0200
+++ new/GooCalendar-0.7.0/CHANGELOG     2020-02-23 16:49:43.000000000 +0100
@@ -1,3 +1,10 @@
+Version 0.7.0 - 2020-02-23
+* Bug fixes (see mercurial logs for details)
+* Use Gtk default font as font by default
+* Manage non editable event
+* Add support for Python 3.8
+* Replace font-desc properties by font
+
 Version 0.6 - 2019-10-05
 * Add support for Python 3.7
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/GooCalendar-0.6/COPYRIGHT 
new/GooCalendar-0.7.0/COPYRIGHT
--- old/GooCalendar-0.6/COPYRIGHT       2019-02-22 18:34:31.000000000 +0100
+++ new/GooCalendar-0.7.0/COPYRIGHT     2020-02-23 16:46:30.000000000 +0100
@@ -1,5 +1,5 @@
 Copyright (C) 2012 Antoine Smolders
-Copyright (C) 2012-2019 Cédric Krier
+Copyright (C) 2012-2020 Cédric Krier
 Copyright (C) 2007 Samuel Abels <http://debain.org>
 
 This program is free software; you can redistribute it and/or
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/GooCalendar-0.6/GooCalendar.egg-info/PKG-INFO 
new/GooCalendar-0.7.0/GooCalendar.egg-info/PKG-INFO
--- old/GooCalendar-0.6/GooCalendar.egg-info/PKG-INFO   2019-10-05 
23:22:46.000000000 +0200
+++ new/GooCalendar-0.7.0/GooCalendar.egg-info/PKG-INFO 2020-02-23 
16:50:12.000000000 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 1.2
 Name: GooCalendar
-Version: 0.6
+Version: 0.7.0
 Summary: A calendar widget for GTK using PyGoocanvas
 Home-page: https://goocalendar.tryton.org/
 Author: Cédric Krier
@@ -31,10 +31,7 @@
 Classifier: Intended Audience :: Developers
 Classifier: License :: OSI Approved :: GNU General Public License v2 (GPLv2)
 Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python :: 3.4
-Classifier: Programming Language :: Python :: 3.5
-Classifier: Programming Language :: Python :: 3.6
-Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3
 Classifier: Topic :: Software Development :: Libraries :: Python Modules
 Classifier: Topic :: Software Development :: Widget Sets
 Requires-Python: >=3.4
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/GooCalendar-0.6/PKG-INFO 
new/GooCalendar-0.7.0/PKG-INFO
--- old/GooCalendar-0.6/PKG-INFO        2019-10-05 23:22:47.000000000 +0200
+++ new/GooCalendar-0.7.0/PKG-INFO      2020-02-23 16:50:12.000000000 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 1.2
 Name: GooCalendar
-Version: 0.6
+Version: 0.7.0
 Summary: A calendar widget for GTK using PyGoocanvas
 Home-page: https://goocalendar.tryton.org/
 Author: Cédric Krier
@@ -31,10 +31,7 @@
 Classifier: Intended Audience :: Developers
 Classifier: License :: OSI Approved :: GNU General Public License v2 (GPLv2)
 Classifier: Operating System :: OS Independent
-Classifier: Programming Language :: Python :: 3.4
-Classifier: Programming Language :: Python :: 3.5
-Classifier: Programming Language :: Python :: 3.6
-Classifier: Programming Language :: Python :: 3.7
+Classifier: Programming Language :: Python :: 3
 Classifier: Topic :: Software Development :: Libraries :: Python Modules
 Classifier: Topic :: Software Development :: Widget Sets
 Requires-Python: >=3.4
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/GooCalendar-0.6/doc/conf.py 
new/GooCalendar-0.7.0/doc/conf.py
--- old/GooCalendar-0.6/doc/conf.py     2019-04-06 14:49:37.000000000 +0200
+++ new/GooCalendar-0.7.0/doc/conf.py   2019-10-05 23:27:37.000000000 +0200
@@ -46,9 +46,9 @@
 # built documents.
 #
 # The short X.Y version.
-version = '0.6'
+version = '0.7'
 # The full version, including alpha/beta/rc tags.
-release = '0.6'
+release = '0.7.0'
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/GooCalendar-0.6/doc/index.rst 
new/GooCalendar-0.7.0/doc/index.rst
--- old/GooCalendar-0.6/doc/index.rst   2019-09-29 22:57:44.000000000 +0200
+++ new/GooCalendar-0.7.0/doc/index.rst 2020-02-05 12:24:43.000000000 +0100
@@ -274,7 +274,7 @@
 
     The color of the today body. Default: ivory
 
-``font-desc``
+``font``
 
     The attributes specifying which font to use.
 
@@ -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 -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/GooCalendar-0.6/examples/simple.py 
new/GooCalendar-0.7.0/examples/simple.py
--- old/GooCalendar-0.6/examples/simple.py      2019-09-29 23:21:47.000000000 
+0200
+++ new/GooCalendar-0.7.0/examples/simple.py    2020-02-23 16:36:49.000000000 
+0100
@@ -57,6 +57,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 -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/GooCalendar-0.6/goocalendar/__init__.py 
new/GooCalendar-0.7.0/goocalendar/__init__.py
--- old/GooCalendar-0.6/goocalendar/__init__.py 2019-03-22 15:56:54.000000000 
+0100
+++ new/GooCalendar-0.7.0/goocalendar/__init__.py       2019-10-05 
23:26:33.000000000 +0200
@@ -8,4 +8,4 @@
 from ._event import Event, EventStore
 
 __all__ = ['Calendar', 'EventStore', 'Event']
-__version__ = '0.6'
+__version__ = '0.7.0'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/GooCalendar-0.6/goocalendar/_calendar.py 
new/GooCalendar-0.7.0/goocalendar/_calendar.py
--- old/GooCalendar-0.6/goocalendar/_calendar.py        2019-10-05 
23:21:19.000000000 +0200
+++ new/GooCalendar-0.7.0/goocalendar/_calendar.py      2020-02-23 
16:38:42.000000000 +0100
@@ -32,8 +32,7 @@
             "The color of the body", GObject.ParamFlags.READWRITE),
         'today-body-color': (GObject.TYPE_STRING, 'ivory', "Today Body Color",
             "The color of the today body", GObject.ParamFlags.READWRITE),
-        # TODO font
-        'font-desc': (GObject.TYPE_PYOBJECT, "Font Description",
+        'font': (GObject.TYPE_STRING, '', "Font",
             "The attributes specifying which font to use",
             GObject.ParamFlags.READWRITE),
         }
@@ -41,6 +40,7 @@
     def __init__(self, event_store=None, view="month", time_format="%H:%M",
             firstweekday=calendar.SUNDAY):
         super(Calendar, self).__init__()
+        settings = Gtk.Settings.get_default()
         self.__props = {
             'text-color': '#2E3634',
             'inactive-text-color': '#8B8F8E',
@@ -49,8 +49,8 @@
             'inactive-border-color': '#E8E7E8',
             'body-color': 'white',
             'today-body-color': 'ivory',
+            'font': settings.get_property('gtk-font-name'),
             }
-        self._font_desc = None
         self._selected_day = None
         self._bg_rect = None
         self._timeline = None
@@ -109,19 +109,15 @@
             self.days.append(box)
 
     def do_set_property(self, prop, value):
-        if prop.name == 'font-desc':
-            self._font_desc = value
-        else:
-            self.__props[prop.name] = value
+        self.__props[prop.name] = value
 
     def do_get_property(self, prop):
-        if prop.name == 'font-desc':
-            if self._font_desc is None:
-                self._font_desc = self.get_style_context().get_property(
-                    'font', Gtk.StateFlags.NORMAL).copy()
-            return self._font_desc
-        else:
-            return self.__props[prop.name]
+        return self.__props[prop.name]
+
+    @property
+    def font_size(self):
+        return self.get_style_context().get_property(
+            'font', Gtk.StateFlags.NORMAL).get_size()
 
     def select(self, new_date):
         cal = calendar.Calendar(self.firstweekday)
@@ -136,7 +132,9 @@
         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)
-            page_changed = old_first_weekday != new_first_weekday
+            page_changed = (
+                old_first_weekday != new_first_weekday
+                or old_date.month != new_date.month)
         elif self.view == "day":
             page_changed = old_date != new_date
 
@@ -205,7 +203,7 @@
         if self._event_store:
             self._event_store.disconnect(self._event_removed_sigid)
             self._event_store.disconnect(self._event_added_sigid)
-            self._event_store_disconnect(self._events_cleared_sigid)
+            self._event_store.disconnect(self._events_cleared_sigid)
 
         # Set and connect new event_store
         self._event_store = event_store
@@ -253,14 +251,13 @@
         """
         Draws the currently selected day.
         """
-        pango_size = self.props.font_desc.get_size()
         x, y, w, h = self.get_bounds()
         timeline_w = self._timeline.width
         dayno = self.selected_date.weekday()
         day_name = calendar.day_name[dayno]
         # Sum the needed space for the date before the day_name
         caption_size = len(day_name) + 3
-        day_width_min = caption_size * pango_size / Pango.SCALE
+        day_width_min = caption_size * self.font_size / Pango.SCALE
         day_width_max = (w - timeline_w)
         self._day_width = max(day_width_min, day_width_max)
         self._day_height = h
@@ -274,11 +271,11 @@
         weeks = util.my_monthdatescalendar(cal, self.selected_date)
         for weekno, week in enumerate(weeks):
             # Hide all days that are not part of the current day
+            for i, date in enumerate(week):
+                box = self.days[weekno * 7 + i]
+                box.set_property(
+                    'visibility', GooCanvas.CanvasItemVisibility.INVISIBLE)
             if self.selected_date not in week:
-                for dayno, date in enumerate(week):
-                    box = self.days[weekno * 7 + dayno]
-                    box.set_property(
-                        'visibility', GooCanvas.CanvasItemVisibility.INVISIBLE)
                 continue
 
             if self.selected_date == datetime.date.today():
@@ -307,12 +304,11 @@
         """
         Draws the currently selected week.
         """
-        pango_size = self.props.font_desc.get_size()
         x, y, w, h = self.get_bounds()
         timeline_w = self._timeline.width
         caption_size = max(len(day_name) for day_name in calendar.day_name)
         caption_size += 3  # The needed space for the date before the day_name
-        day_width_min = caption_size * pango_size / Pango.SCALE
+        day_width_min = caption_size * self.font_size / Pango.SCALE
         day_width_max = (w - timeline_w) / 7
         self._day_width = max(day_width_min, day_width_max)
         self._day_height = h
@@ -372,10 +368,9 @@
         Draws the currently selected month.
         """
         x1, y1, w, h = self.get_bounds()
-        pango_size = self.props.font_desc.get_size()
         caption_size = max(len(day_name) for day_name in calendar.day_name)
         caption_size += 3  # The needed space for the date before the day_name
-        day_width_min = caption_size * pango_size / Pango.SCALE
+        day_width_min = caption_size * self.font_size / Pango.SCALE
         day_width_max = w / 7
         self._day_width = max(day_width_min, day_width_max)
         self._day_height = h / 6
@@ -441,7 +436,7 @@
 
     def _get_day_item(self, find_date):
         cal = calendar.Calendar(self.firstweekday)
-        weeks = util.my_monthdatescalendar(cal, find_date)
+        weeks = util.my_monthdatescalendar(cal, self.selected_date)
         for weekno, week in enumerate(weeks):
             for dayno, date in enumerate(week):
                 if date == find_date:
@@ -474,8 +469,8 @@
             return days
         raise Exception('Days not found: %s %s' % (event.start, end))
 
-    def _find_free_line(self, days):
-        for line in range(days[0].n_lines):
+    def _find_free_line(self, days, n_lines):
+        for line in range(n_lines):
             free = True
             for day in days:
                 if line in day.lines:
@@ -487,7 +482,6 @@
 
     def draw_events(self):
         _, _, bound_width, _ = self.get_bounds()
-        timeline_witdh = self._timeline.width
         # Clear previous events.
         for item in self._event_items:
             item.remove()
@@ -522,7 +516,7 @@
         events.sort(key=util.event_days, reverse=True)
 
         # Draw all-day events, longest event first.
-        max_y = self._selected_day.line_height
+        max_y = 0
         non_all_day_events = []
         for event in events:
             event.event_items = []
@@ -534,7 +528,10 @@
 
             # Find a line that is free in all of the days.
             days = self._get_day_items(event)
-            free_line = self._find_free_line(days)
+            n_lines = days[0].n_lines
+            if self.view in {"week", "day"}:
+                n_lines = min(n_lines // 2, max(n_lines - 24, 0))
+            free_line = self._find_free_line(days, n_lines)
             if free_line is None:
                 for day in days:
                     day.show_indic = True
@@ -547,7 +544,9 @@
             all_day_events_height += 1  # 1px padding-top
             max_y = max(all_day_events_height, max_y)
             for day in days:
-                day.lines[free_line] = 1
+                for i in range(free_line,
+                        free_line + len(event.caption.splitlines())):
+                    day.lines[i] = 1
 
             # Split days into weeks.
             weeks = []
@@ -578,8 +577,8 @@
                 self._event_items.append(event_item)
                 self.get_root_item().add_child(event_item, -1)
                 if self.view == "day":
-                    x_start = timeline_witdh
-                    width = bound_width
+                    x_start = self._timeline.width
+                    width = bound_width - self._timeline.width
                 else:
                     x_start = day.x
                     width = (day.width + 2) * len(week)
@@ -609,6 +608,9 @@
                     event_item.width -= 6
                     event_item.type = 'leftright'
                 event_item.update()
+        # Add the day title
+        if self._selected_day:
+            max_y += self._selected_day.line_height
 
         if self.view == "month":
             return
@@ -689,8 +691,8 @@
                     y_off1 = top_offset_mins * self.minute_height
                     y_off2 = bottom_offset_mins * self.minute_height
                     if self.view == "day":
-                        x_start = timeline_witdh
-                        column_width = w / parallel
+                        x_start = self._timeline.width
+                        column_width = (w - self._timeline.width) / parallel
                     else:
                         column_width = day.width / parallel
                         x_start = day.x
@@ -793,81 +795,86 @@
     @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
-
-        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)
-
-                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
-                    minutes = nb_minutes % 60
-                    hours = 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:
+        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
-                    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
+                else:
+                    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
+                        # 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
-        event_item.update()
+            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()
         self.emit('event-pressed', event_item.event)
 
         if self._is_double_click(event):
@@ -1040,7 +1047,7 @@
         week_day = self.date.weekday()
         day_name = calendar.day_name[week_day]
         caption = '%s %s' % (self.date.day, day_name)
-        self.text.set_property('font-desc', self._cal.props.font_desc)
+        self.text.set_property('font', self._cal.props.font)
         self.text.set_property('text', caption)
         logical_height = self.text.get_natural_extents()[1].height
         line_height = int(math.ceil(float(logical_height) / Pango.SCALE))
@@ -1132,7 +1139,7 @@
         # Create canvas items.
         self.box = GooCanvas.CanvasRect(parent=self)
         self.text = GooCanvas.CanvasText(parent=self)
-        self.text.set_property('font-desc', self._cal.props.font_desc)
+        self.text.set_property('font', self._cal.props.font)
         logical_height = self.text.get_natural_extents()[1].height
         self.line_height = logical_height / Pango.SCALE
 
@@ -1315,6 +1322,8 @@
 
         if self.x is not None:
             self.update()
+        else:
+            self._compute_width()
 
     @property
     def min_line_height(self):
@@ -1333,21 +1342,20 @@
     def line_height(self):
         self.padding_top = 0
         line_height = self.min_line_height
-        if line_height < self.height / 24:
-            line_height = self.height / 24
-            pango_size = self._cal.props.font_desc.get_size()
-            padding_top = (line_height - pango_size / Pango.SCALE) / 2
+        if line_height < self.height // 24:
+            line_height = self.height // 24
+            padding_top = (line_height - self._cal.font_size / Pango.SCALE) / 2
             padding_top -= int(math.ceil(
                     float(self.ink_padding_top) / Pango.SCALE))
             self.padding_top = padding_top
         return line_height
 
     def _compute_width(self):
-        font_desc = self._cal.props.font_desc
+        font = self._cal.props.font
         ink_padding_left = 0
         ink_max_width = 0
         for n in range(24):
-            self._timeline_text[n].set_property('font-desc', font_desc)
+            self._timeline_text[n].set_property('font', font)
             natural_extents = self._timeline_text[n].get_natural_extents()
             ink_rect = natural_extents[0]
             ink_padding_left = max(ink_padding_left, ink_rect.x)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/GooCalendar-0.6/goocalendar/_event.py 
new/GooCalendar-0.7.0/goocalendar/_event.py
--- old/GooCalendar-0.6/goocalendar/_event.py   2019-02-22 17:34:29.000000000 
+0100
+++ new/GooCalendar-0.7.0/goocalendar/_event.py 2020-02-05 12:24:43.000000000 
+0100
@@ -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')
@@ -35,13 +36,17 @@
 
     def __eq__(self, other_event):
         if not isinstance(other_event, Event):
-            raise NotImplemented
-        return (self.start, self.end) == (other_event.start, other_event.start)
+            return NotImplemented
+        return (self.start, self.end) == (other_event.start, other_event.end)
 
     def __lt__(self, other_event):
+        def convert(event):
+            start = event.start
+            end = event.end if event.end is not None else event.start
+            return start, end
         if not isinstance(other_event, Event):
-            raise NotImplemented
-        return (self.start, self.end) < (other_event.start, other_event.start)
+            return NotImplemented
+        return convert(self) < convert(other_event)
 
 
 class EventStore(GObject.GObject):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/GooCalendar-0.6/setup.py 
new/GooCalendar-0.7.0/setup.py
--- old/GooCalendar-0.6/setup.py        2019-03-28 22:26:21.000000000 +0100
+++ new/GooCalendar-0.7.0/setup.py      2019-12-26 10:29:08.000000000 +0100
@@ -5,6 +5,7 @@
 
 import io
 import os
+import re
 from setuptools import setup, find_packages
 
 
@@ -14,8 +15,13 @@
         'r', encoding='utf-8').read()
 
 
+def get_version():
+    init = read(os.path.join('goocalendar', '__init__.py'))
+    return re.search("__version__ = '([0-9.]*)'", init).group(1)
+
+
 setup(name='GooCalendar',
-    version='0.6',
+    version=get_version(),
     author='Cédric Krier',
     author_email='[email protected]',
     url='https://goocalendar.tryton.org/',
@@ -28,10 +34,7 @@
         'Intended Audience :: Developers',
         'License :: OSI Approved :: GNU General Public License v2 (GPLv2)',
         'Operating System :: OS Independent',
-        'Programming Language :: Python :: 3.4',
-        'Programming Language :: Python :: 3.5',
-        'Programming Language :: Python :: 3.6',
-        'Programming Language :: Python :: 3.7',
+        'Programming Language :: Python :: 3',
         'Topic :: Software Development :: Libraries :: Python Modules',
         'Topic :: Software Development :: Widget Sets',
         ],


Reply via email to