from DesignEntity import DesignEntity from TableDesign import TableDesign from Assets import defaultfontsize, colors from TextFormatter import date_str from DictionaryMapper import get_text from Dictionary import more_events class EventListDesign (DesignEntity): """Creates a TableDesign filled with event begin date and title""" def __init__(self, size, events, text_size=defaultfontsize, line_spacing=0, col_spacing=10, event_prefix_rel_dates=[], event_prefix_func=None, font_family=None, general_color=colors["fg"], background_color=colors["bg"], highlight_color=colors["hl"], show_more_info=False): super(EventListDesign, self).__init__(size) self.events = events self.__event_matrix__ = [] self.__props_matrix__ = [] self.show_more_info = show_more_info self.text_size = text_size self.line_spacing = line_spacing self.col_spacing = col_spacing self.font_family = font_family self.general_color = general_color self.background_color = background_color self.highlight_color = highlight_color self.event_prefix_func = event_prefix_func self.event_prefix_rel_dates = event_prefix_rel_dates if self.event_prefix_func is None: self.event_prefix_func = lambda x, y: date_str(x.begin_datetime) def __finish_image__(self): self.visible_event_count = int(int( self.size[1] + self.line_spacing) // (self.line_spacing + int(self.text_size))) self.__fill_event_matrix__() col_hori_alignment = ['right', 'left'] table_design = TableDesign(self.size, background_color=self.background_color, font=self.font_family, line_spacing=self.line_spacing, col_spacing=self.col_spacing, matrix=self.__event_matrix__, fontsize=self.text_size, column_horizontal_alignments=col_hori_alignment, mask=False, truncate_cols=False, cell_properties=self.__props_matrix__) self.draw_design(table_design) def __get_formatted_event__(self, event, index): rel_date = None if index < 0 or index >= len( self.event_prefix_rel_dates) else self.event_prefix_rel_dates[index] prefix = self.event_prefix_func(event, rel_date) return [prefix, event.title] def __fill_event_matrix__(self): visible_events = self.events if self.show_more_info and len(visible_events) > self.visible_event_count: visible_events = visible_events[:self.visible_event_count - 1] for i, event in enumerate(visible_events): row = self.__get_formatted_event__(event, i) self.__event_matrix__.append(row) self.__props_matrix__.append(self.__get_row_props__(event)) if self.show_more_info is False: return additional_events_count = len(self.events) - len(visible_events) more_text = " " + get_text(more_events, additional_events_count) if additional_events_count > 0: self.__event_matrix__.append(["", more_text]) self.__props_matrix__.append(self.__get_row_props__()) def __get_row_props__(self, event=None): color = self.general_color bg_color = self.background_color if event is not None and event.highlight: color = self.highlight_color cell = { "color": color, "background_color": bg_color } return [cell, cell]