コード例 #1
0
 def __init__(self, cal, start=None, end=None, **kwargs):
     """
     Constructor.
     """
     self.table = CanvasMagnetTable(align=CanvasMagnetTable.ALIGN_LEFT)
     self.table.set_row_count(24 * 4)
     self.table.set_homogeneus_rows(True)
     CanvasEventView.__init__(self, cal, start, end, **kwargs)
     self.append(self.table, hippo.PACK_EXPAND)
コード例 #2
0
 def __init__(self, cal, start=None, end=None, **kwargs):
     """
     Constructor.
     """
     CanvasEventView.__init__(self, cal, **kwargs)
     self.table = CanvasMagnetTable(align=CanvasMagnetTable.ALIGN_TOP)
     self.table.set_homogeneus_columns(True)
     self.append(self.table, hippo.PACK_EXPAND)
     self.show_normal = True  # whether to show normal events
     self.overflow_indic = []
     self.columns = 0
コード例 #3
0
ファイル: CanvasVEventView.py プロジェクト: gisce/erpclient
 def __init__(self, cal, start=None, end=None, **kwargs):
     """
     Constructor.
     """
     self.table = CanvasMagnetTable(align=CanvasMagnetTable.ALIGN_LEFT)
     self.table.set_row_count(24 * 4)
     self.table.set_homogeneus_rows(True)
     CanvasEventView.__init__(self, cal, start, end, **kwargs)
     self.append(self.table, hippo.PACK_EXPAND)
コード例 #4
0
ファイル: CanvasHEventView.py プロジェクト: gisce/erpclient
 def __init__(self, cal, start = None, end = None, **kwargs):
     """
     Constructor.
     """
     CanvasEventView.__init__(self, cal, **kwargs)
     self.table = CanvasMagnetTable(align = CanvasMagnetTable.ALIGN_TOP)
     self.table.set_homogeneus_columns(True)
     self.append(self.table, hippo.PACK_EXPAND)
     self.show_normal = True  # whether to show normal events
     self.overflow_indic = []
     self.columns = 0
コード例 #5
0
ファイル: CanvasVEventView.py プロジェクト: gisce/erpclient
class CanvasVEventView(CanvasEventView):
    """
    A canvas item that shows a range of events.
    """

    def __init__(self, cal, start=None, end=None, **kwargs):
        """
        Constructor.
        """
        self.table = CanvasMagnetTable(align=CanvasMagnetTable.ALIGN_LEFT)
        self.table.set_row_count(24 * 4)
        self.table.set_homogeneus_rows(True)
        CanvasEventView.__init__(self, cal, start, end, **kwargs)
        self.append(self.table, hippo.PACK_EXPAND)

    def _add_event(self, event):
        rows, cols = self.table.get_size()
        event_start = max(event.start, self.range[0])
        event_end = min(event.end, self.range[1])
        event_off = (event_start - self.range[0]).seconds
        event_len = (event_end - event_start).seconds
        range_len = self.range[1] - self.range[0]
        seconds = range_len.days * 24 * 60 * 60 + range_len.seconds
        row_seconds = ceil(seconds / float(rows))
        event_off_rows = int(ceil(event_off / float(row_seconds)))
        event_len_rows = int(ceil(event_len / float(row_seconds)))
        event_end_rows = event_off_rows + event_len_rows

        # Create the event.
        item = CanvasEvent(self.cal, event)
        self.event_items[event] = item
        item.connect("button-press-event", self.on_event_button_press_event)
        item.connect("button-release-event", self.on_event_button_release_event)
        self.table.set_column_expand(cols, True)
        self.table.add(item, cols + 1, cols + 2, event_off_rows, event_end_rows)
        item.set_text(event.caption)
        item.set_property("color", color.to_int(event.bg_color))
        if event.text_color is not None:
            item.set_text_color(event.text_color)

        radius_top_left = 10
        radius_top_right = 10
        radius_bottom_left = 10
        radius_bottom_right = 10
        if event.end > self.range[1]:
            radius_bottom_left = 0
            radius_bottom_right = 0
        if event.start < self.range[0]:
            radius_top_left = 0
            radius_top_right = 0
        item.set_properties(
            radius_top_left=radius_top_left,
            radius_top_right=radius_top_right,
            radius_bottom_left=radius_bottom_left,
            radius_bottom_right=radius_bottom_right,
        )

    def update(self):
        # Remove old events.
        for item in self.table.get_children():
            self.table.remove(item)
        self.table.set_column_count(0)

        if self.range is None:
            return
        for event in self.model.get_normal_events(*self.range):
            self._add_event(event)
コード例 #6
0
ファイル: CanvasHEventView.py プロジェクト: gisce/erpclient
class CanvasHEventView(CanvasEventView, hippo.CanvasItem):
    """
    A canvas item that shows a range of events.
    """
    def __init__(self, cal, start = None, end = None, **kwargs):
        """
        Constructor.
        """
        CanvasEventView.__init__(self, cal, **kwargs)
        self.table = CanvasMagnetTable(align = CanvasMagnetTable.ALIGN_TOP)
        self.table.set_homogeneus_columns(True)
        self.append(self.table, hippo.PACK_EXPAND)
        self.show_normal = True  # whether to show normal events
        self.overflow_indic = []
        self.columns = 0


    def _format_time(self, event):
        hour, minute = event.start.timetuple()[3:5]
#        if minute == 0:
#            text = '%d %s' % (hour, event.caption)
#        else:
        text = '%d:%02d %s' % (hour, minute, event.caption)
        return text


    def set_column_count(self, count):
        if count == self.columns:
            return
        self.columns = count

        self.table.set_column_count(count)

        # Hide all overflow indicators.
        for child in self.get_children():
            if child != self.table:
                self.remove(child)

        for col in range(count):
            font = self.cal.font.copy()
            font.set_style(pango.STYLE_ITALIC)
            text = hippo.CanvasText(text   = 'more',
                                    font   = font.to_string(),
                                    xalign = hippo.ALIGNMENT_CENTER)
            self.append(text, hippo.PACK_FIXED)
            self.overflow_indic.append(text)
            text.set_visible(False)
            self.allocs[text] = (0, 0, 0, 0)


    def _add_event(self, event):
        event_start      = max(event.start, self.range[0])
        event_end        = min(event.end,   self.range[1])
        event_off_days   = (event_start - self.range[0]).days
        event_width_days = (event_end - event_start).days + 1

        # Create the event.
        item = CanvasEvent(self.cal, event)
        self.event_items[event] = item
        item.connect('button-press-event',   self.on_event_button_press_event)
        item.connect('button-release-event', self.on_event_button_release_event)
        self.table.add(item,
                       event_off_days,
                       event_off_days + event_width_days,
                       len(self.event_items))
        item.set_text(event.caption)
        item.set_property('color', color.to_int(event.bg_color))
        if self.show_normal and not util.same_day(event.start, event.end):
            item.set_property('color', color.to_int(event.bg_color))
        elif not event.all_day:
            time = self._format_time(event)
            item.set_text(time)
            item.set_text_properties(xalign = hippo.ALIGNMENT_START)
        if event.text_color is not None:
            item.set_text_color(event.text_color)
        radius_top_left     = 10
        radius_top_right    = 10
        radius_bottom_left  = 10
        radius_bottom_right = 10
        if event.end > self.range[1]:
            radius_top_right    = 0
            radius_bottom_right = 0
        if event.start < self.range[0]:
            radius_top_left    = 0
            radius_bottom_left = 0
        item.set_properties(radius_top_left     = radius_top_left,
                            radius_top_right    = radius_top_right,
                            radius_bottom_left  = radius_bottom_left,
                            radius_bottom_right = radius_bottom_right)


    def update(self):
        days = (self.range[1] - self.range[0]).days + 1
        self.table.set_column_count(days)
        self.table.set_row_count(-1)

        # Remove old events.
        for item in self.table.get_children():
            self.table.remove(item)

        # Add events.
        if self.range is None:
            return
        for event in self.model.get_all_day_events(self.range[0],
                                                   self.range[1],
                                                   self.show_normal == True):
            self._add_event(event)
        if self.show_normal:
            for event in self.model.get_normal_events(self.range[0],
                                                      self.range[1],
                                                      False):
                self._add_event(event)

        # Force all children to be visible, to fix 'overflow' positioning.
        for child in self.get_children():
            child.set_visible(True)

        # Change to fixed sizing.
        rows, cols = self.table.get_size()
        self.table.set_size(rows, cols)


    def do_allocate(self, width, height, origin_changed):
        CanvasEventView.do_allocate(self, width, height, origin_changed)

        # Hide all overflow indicators.
        for child in self.get_children():
            if child != self.table:
                child.set_visible(False)

        rows, cols = self.table.get_size()
        if min(rows, width, height) <= 0:
            return

        # Measure the height of the first event.
        children = self.table.get_children()
        if len(children) == 0:
            return
        first = children[0]
        min_row_h, row_h = first.get_height_request(width / cols)
        if row_h <= 0:
            return

        # Hide events that do not fit into the box.
        max_rows = height / row_h
        matrix   = self.table.get_matrix()
        for colnum, col in enumerate(matrix.get_columns()):
            # Count rows that are already hidden.
            hidden = 0
            for child in col:
                if not child.get_visible():
                    hidden += 1

            # No need to hide anything if the box is large enough.
            if len(col) <= max_rows:
                for child in col:
                    child.set_visible(True)
                continue

            # Hide enough rows to make room for an overflow indicator.
            to_hide = len(col) - max_rows + 1
            hidden  = 0
            for row in reversed(col):
                if hidden >= to_hide:
                    row.set_visible(True)
                    continue
                if not row.get_visible():
                    hidden += 1
                    continue
                row.set_visible(False)
                hidden += 1

            # Show overflow indicator
            indic   = self.overflow_indic[colnum]
            caption = '%d more' % hidden
            alloc   = (width / cols * colnum, height - row_h, width / cols, hidden)
            indic.set_visible(True)

            if self.allocs[indic] == alloc:
                continue
            self.allocs[indic] = alloc
            indic.set_properties(text        = caption,
                                 box_width   = alloc[2])
            self.set_position(indic, alloc[0], alloc[1])
        CanvasEventView.do_allocate(self, width, height, origin_changed)
コード例 #7
0
class CanvasHEventView(CanvasEventView, hippo.CanvasItem):
    """
    A canvas item that shows a range of events.
    """
    def __init__(self, cal, start=None, end=None, **kwargs):
        """
        Constructor.
        """
        CanvasEventView.__init__(self, cal, **kwargs)
        self.table = CanvasMagnetTable(align=CanvasMagnetTable.ALIGN_TOP)
        self.table.set_homogeneus_columns(True)
        self.append(self.table, hippo.PACK_EXPAND)
        self.show_normal = True  # whether to show normal events
        self.overflow_indic = []
        self.columns = 0

    def _format_time(self, event):
        hour, minute = event.start.timetuple()[3:5]
        #        if minute == 0:
        #            text = '%d %s' % (hour, event.caption)
        #        else:
        text = '%d:%02d %s' % (hour, minute, event.caption)
        return text

    def set_column_count(self, count):
        if count == self.columns:
            return
        self.columns = count

        self.table.set_column_count(count)

        # Hide all overflow indicators.
        for child in self.get_children():
            if child != self.table:
                self.remove(child)

        for col in range(count):
            font = self.cal.font.copy()
            font.set_style(pango.STYLE_ITALIC)
            text = hippo.CanvasText(text=' ',
                                    font=font.to_string(),
                                    xalign=hippo.ALIGNMENT_CENTER)
            self.append(text, hippo.PACK_FIXED)
            self.overflow_indic.append(text)
            text.set_visible(False)
            self.allocs[text] = (0, 0, 0, 0)

    def _add_event(self, event):
        event_start = max(event.start, self.range[0])
        event_end = min(event.end, self.range[1])
        event_off_days = (event_start - self.range[0]).days
        event_width_days = (event_end - event_start).days + 1

        # Create the event.
        item = CanvasEvent(self.cal, event)
        self.event_items[event] = item
        item.connect('button-press-event', self.on_event_button_press_event)
        item.connect('button-release-event',
                     self.on_event_button_release_event)
        self.table.add(item, event_off_days, event_off_days + event_width_days,
                       len(self.event_items))
        item.set_text(event.caption, event.description)
        item.set_property('color', color.to_int(event.bg_color))
        if self.show_normal and not util.same_day(event.start, event.end):
            item.set_property('color', color.to_int(event.bg_color))
        elif not event.all_day:
            time = self._format_time(event)
            item.set_text(time, event.description)
            item.set_text_properties(xalign=hippo.ALIGNMENT_START)
        if event.text_color is not None:
            item.set_text_color(event.text_color)
        radius_top_left = 10
        radius_top_right = 10
        radius_bottom_left = 10
        radius_bottom_right = 10
        if event.end > self.range[1]:
            radius_top_right = 0
            radius_bottom_right = 0
        if event.start < self.range[0]:
            radius_top_left = 0
            radius_bottom_left = 0
        item.set_properties(radius_top_left=radius_top_left,
                            radius_top_right=radius_top_right,
                            radius_bottom_left=radius_bottom_left,
                            radius_bottom_right=radius_bottom_right)

    def update(self):
        # Don't crash if we didn't have a range now
        if self.range is None:
            return

        days = (self.range[1] - self.range[0]).days + 1
        self.table.set_column_count(days)
        self.table.set_row_count(-1)

        # Remove old events.
        for item in self.table.get_children():
            self.table.remove(item)

        # Add events.
        if self.range is None:
            return
        for event in self.model.get_all_day_events(self.range[0],
                                                   self.range[1],
                                                   self.show_normal == True):
            self._add_event(event)
        if self.show_normal:
            for event in self.model.get_normal_events(self.range[0],
                                                      self.range[1], False):
                self._add_event(event)

        # Force all children to be visible, to fix 'overflow' positioning.
        for child in self.get_children():
            child.set_visible(True)

        # Change to fixed sizing.
        rows, cols = self.table.get_size()
        self.table.set_size(rows, cols)

    def do_allocate(self, width, height, origin_changed):
        CanvasEventView.do_allocate(self, width, height, origin_changed)

        # Hide all overflow indicators.
        for child in self.get_children():
            if child != self.table:
                child.set_visible(False)

        rows, cols = self.table.get_size()
        if min(rows, width, height) <= 0:
            return

        # Measure the height of the first event.
        children = self.table.get_children()
        if len(children) == 0:
            return
        first = children[0]
        min_row_h, row_h = first.get_height_request(width / cols)
        if row_h <= 0:
            return

        # Hide events that do not fit into the box.
        max_rows = height / row_h
        matrix = self.table.get_matrix()
        for colnum, col in enumerate(matrix.get_columns()):
            # Count rows that are already hidden.
            hidden = 0
            for child in col:
                if not child.get_visible():
                    hidden += 1

            # No need to hide anything if the box is large enough.
            if len(col) <= max_rows:
                for child in col:
                    child.set_visible(True)
                continue

            # Hide enough rows to make room for an overflow indicator.
            to_hide = len(col) - max_rows + 1
            hidden = 0
            for row in reversed(col):
                if hidden >= to_hide:
                    row.set_visible(True)
                    continue
                if not row.get_visible():
                    hidden += 1
                    continue
                row.set_visible(False)
                hidden += 1

            # Show overflow indicator
            indic = self.overflow_indic[colnum]
            caption = '%d more' % hidden
            alloc = (width / cols * colnum, height - row_h, width / cols,
                     hidden)
            indic.set_visible(True)

            if self.allocs[indic] == alloc:
                continue
            self.allocs[indic] = alloc
            indic.set_properties(text=caption, box_width=alloc[2])
            self.set_position(indic, alloc[0], alloc[1])
        CanvasEventView.do_allocate(self, width, height, origin_changed)
コード例 #8
0
class CanvasVEventView(CanvasEventView):
    """
    A canvas item that shows a range of events.
    """
    def __init__(self, cal, start=None, end=None, **kwargs):
        """
        Constructor.
        """
        self.table = CanvasMagnetTable(align=CanvasMagnetTable.ALIGN_LEFT)
        self.table.set_row_count(24 * 4)
        self.table.set_homogeneus_rows(True)
        CanvasEventView.__init__(self, cal, start, end, **kwargs)
        self.append(self.table, hippo.PACK_EXPAND)

    def _add_event(self, event):
        rows, cols = self.table.get_size()
        event_start = max(event.start, self.range[0])
        event_end = min(event.end, self.range[1])
        event_off = (event_start - self.range[0]).seconds
        event_len = (event_end - event_start).seconds
        range_len = self.range[1] - self.range[0]
        seconds = range_len.days * 24 * 60 * 60 + range_len.seconds
        row_seconds = ceil(seconds / float(rows))
        event_off_rows = int(ceil(event_off / float(row_seconds)))
        event_len_rows = int(ceil(event_len / float(row_seconds)))
        event_end_rows = event_off_rows + event_len_rows

        # Create the event.
        item = CanvasEvent(self.cal, event)
        self.event_items[event] = item
        item.connect('button-press-event', self.on_event_button_press_event)
        item.connect('button-release-event',
                     self.on_event_button_release_event)
        self.table.set_column_expand(cols, True)
        self.table.add(item, cols + 1, cols + 2, event_off_rows,
                       event_end_rows)
        item.set_text(event.caption)
        item.set_property('color', color.to_int(event.bg_color))
        if event.text_color is not None:
            item.set_text_color(event.text_color)

        radius_top_left = 10
        radius_top_right = 10
        radius_bottom_left = 10
        radius_bottom_right = 10
        if event.end > self.range[1]:
            radius_bottom_left = 0
            radius_bottom_right = 0
        if event.start < self.range[0]:
            radius_top_left = 0
            radius_top_right = 0
        item.set_properties(radius_top_left=radius_top_left,
                            radius_top_right=radius_top_right,
                            radius_bottom_left=radius_bottom_left,
                            radius_bottom_right=radius_bottom_right)

    def update(self):
        # Remove old events.
        for item in self.table.get_children():
            self.table.remove(item)
        self.table.set_column_count(0)

        if self.range is None:
            return
        for event in self.model.get_normal_events(*self.range):
            self._add_event(event)