From f417fdbe3ee3611d5d1f131d4365a8b5b89c2ea0 Mon Sep 17 00:00:00 2001 From: Max Date: Sat, 11 May 2019 21:37:16 +0200 Subject: [PATCH] Fixed default text padding (cutoff) --- Calendar/AgendaListDesign.py | 17 ++++++++++------- Calendar/AgendaListPanel.py | 2 +- Calendar/DayHeaderDesign.py | 26 ++++++++++++++++---------- Calendar/DayRowDesign.py | 19 ++++++++++--------- Calendar/EventListDesign.py | 2 +- Calendar/HourListDesign.py | 10 ++++++---- Calendar/MonthBlockDesign.py | 9 +++++---- Calendar/MonthOvPanel.py | 25 ++++++++++++------------- Calendar/RssPostListDesign.py | 2 +- Calendar/SingelDayEventListDesign.py | 2 +- Calendar/TableDesign.py | 8 +++++--- Calendar/TextDesign.py | 10 +++++++--- Calendar/WeatherColumnDesign.py | 7 ++++--- 13 files changed, 79 insertions(+), 60 deletions(-) diff --git a/Calendar/AgendaListDesign.py b/Calendar/AgendaListDesign.py index 6569b80..096c66d 100644 --- a/Calendar/AgendaListDesign.py +++ b/Calendar/AgendaListDesign.py @@ -1,15 +1,15 @@ from DesignEntity import DesignEntity -from Assets import defaultfontsize, colors +from Assets import defaultfontsize, colors, defaultfont, path from datetime import datetime, date, timedelta from TableDesign import TableDesign -from PIL import ImageDraw +from PIL import ImageDraw, ImageFont from TextFormatter import date_summary_str, event_prefix_str -line_width = 1 +separator_width = 1 class AgendaListDesign (DesignEntity): '''Lists upcoming events in chronological order and groups them by days''' - def __init__ (self, size, calendar, line_spacing = 3, col_spacing = 8, text_size = defaultfontsize, start_date = date.today(), always_add_start_row = True): + def __init__ (self, size, calendar, line_spacing = 0, col_spacing = 8, text_size = defaultfontsize, start_date = date.today(), always_add_start_row = True): super(AgendaListDesign, self).__init__(size) self.calendar = calendar self.line_spacing = line_spacing @@ -25,7 +25,7 @@ class AgendaListDesign (DesignEntity): self.__draw_lines__() def __calculate_parameter__ (self): - self.__line_height__ = self.line_spacing + int(self.text_size) + self.__line_height__ = self.line_spacing + self.__get_text_height__() self.__event_number__ = int(int(self.size[1]) // self.__line_height__) self.__date_fontsize__ = self.text_size self.__date_linespace__ = self.line_spacing @@ -72,7 +72,7 @@ class AgendaListDesign (DesignEntity): pos = (0, ypos) positions = [ pos, (self.size[0], ypos) ] - ImageDraw.Draw(self.__image__).line(positions, fill=colors["fg"], width=line_width) + ImageDraw.Draw(self.__image__).line(positions, fill=colors["fg"], width=separator_width) def __get_row_props__ (self, event = None): color = colors["fg"] @@ -87,4 +87,7 @@ class AgendaListDesign (DesignEntity): "color" : color, "background_color" : bg_color } - return [default_cell, default_cell, cell, cell ] \ No newline at end of file + return [default_cell, default_cell, cell, cell ] + + def __get_text_height__(self): + return ImageFont.truetype(path + defaultfont, self.text_size).font.height \ No newline at end of file diff --git a/Calendar/AgendaListPanel.py b/Calendar/AgendaListPanel.py index 0cc618d..9cf8b6c 100644 --- a/Calendar/AgendaListPanel.py +++ b/Calendar/AgendaListPanel.py @@ -10,7 +10,7 @@ agenda_ypadding = 5 weatherheader_height = 0.113 seperator_width = 3 infolist_size = (1, 0.24) -infolist_padding = 5 +infolist_padding = 2 class AgendaListPanel (PanelDesign): '''Lists upcoming events in chronological order and groups them by days''' diff --git a/Calendar/DayHeaderDesign.py b/Calendar/DayHeaderDesign.py index a3b0f81..4e69792 100644 --- a/Calendar/DayHeaderDesign.py +++ b/Calendar/DayHeaderDesign.py @@ -11,14 +11,17 @@ from BoxDesign import BoxDesign numberbox_ypos = 0.15 numberbox_height = 1 - 2 * numberbox_ypos number_height = numberbox_height * 0.83 +number_boxypos = 0.17 month_height = numberbox_height / 4 monthbox_xpadding = 0.013 +monthbox_ypadding = -0.05 monthbox_width = 1 - numberbox_ypos - monthbox_xpadding -weekday_height = numberbox_height * 0.19 weathercolumn_y_size = (0.4, 1) -weekdaybox_height = 0.22 +weekday_height = numberbox_height * 0.19 +weekdaybox_height = (weekday_height / numberbox_height) * 1.5 eventlist_static_fontsize = defaultfontsize -eventlist_padding = monthbox_xpadding +eventlist_xpadding = monthbox_xpadding +eventlist_ypadding = 0.01 numberbox_font_color = colors["bg"] numberbox_background_color = colors["hl"] @@ -64,9 +67,10 @@ class DayHeaderDesign (DesignEntity): box_ypos = numberbox_ypos * self.size[1] box_xpos = numberbox_ypos * self.size[1] box_height = numberbox_height * self.size[1] - padding = eventlist_padding * self.size[0] - monthbox_height = month_height * self.size[1] - pos = (box_xpos + box_height + padding, box_ypos + monthbox_height + padding) + xpadding = eventlist_xpadding * self.size[0] + ypadding = eventlist_ypadding * self.size[1] + monthbox_height = (monthbox_ypadding + month_height) * self.size[1] + pos = (box_xpos + box_height + xpadding, box_ypos + monthbox_height + ypadding) size = (self.size[0] - pos[0] - self.weather_column_width, self.size[1] - pos[1] - box_ypos) fontsize = eventlist_static_fontsize @@ -77,10 +81,11 @@ class DayHeaderDesign (DesignEntity): def __draw_month__ (self): font_size = int(month_height * self.size[1]) - padding = int(monthbox_xpadding * self.size[0]) + xpadding = int(monthbox_xpadding * self.size[0]) + ypadding = int(monthbox_ypadding * self.size[1]) box_ypos = int(numberbox_ypos * self.size[1]) box_height = int(numberbox_height * self.size[1]) - box_pos = (box_ypos + box_height + padding, box_ypos) + box_pos = (box_ypos + box_height + xpadding, box_ypos + ypadding) box_size = (int(monthbox_width * self.size[0]), box_height) month_name = self.date.strftime("%B") @@ -105,8 +110,9 @@ class DayHeaderDesign (DesignEntity): font_size = number_height * self.size[1] box_height = numberbox_height * self.size[1] box_ypos = numberbox_ypos * self.size[1] - size = (box_height, box_height) - pos = (box_ypos, box_ypos) + ypadding = number_boxypos * box_height + size = (box_height, box_height - ypadding) + pos = (box_ypos, box_ypos + ypadding) day_text = self.__get_day_text__() number = TextDesign(size, text=day_text, background_color=numberbox_background_color, color=numberbox_font_color, fontsize=font_size, horizontalalignment="center", verticalalignment="center") diff --git a/Calendar/DayRowDesign.py b/Calendar/DayRowDesign.py index 81364d6..84fc631 100644 --- a/Calendar/DayRowDesign.py +++ b/Calendar/DayRowDesign.py @@ -6,16 +6,17 @@ from datetime import datetime from Assets import weathericons, wpath, fonts, colors, defaultfontsize from SingelDayEventListDesign import SingelDayEventListDesign -daynumber_y_size = (1, 0.65) +daynumber_y_size = (1, 0.60) weekday_y_size = (daynumber_y_size[0], 1 - daynumber_y_size[1]) weekday_ypos = daynumber_y_size[1] -daynumber_fontsize = daynumber_y_size[1] * 0.8 -weekday_fontsize = weekday_y_size[1] * 0.75 +daynumber_fontsize = daynumber_y_size[1] * 0.85 +daynumber_ypadding = 0.1 +weekday_fontsize = weekday_y_size[1] * 0.65 weathericon_ypos = 0.1 weathericon_height = 1 - 2 * weathericon_ypos eventlist_xpadding = 5 -eventlist_ypos = 0.1 -eventlist_y_fontsize = 0.2 * defaultfontsize / 14 +eventlist_ypos = 0.02 +eventlist_y_fontsize = 0.2 font = fonts["light"] @@ -49,7 +50,7 @@ class DayRowDesign (DesignEntity): events = calendar.get_day_events(self.date) rel_dates = [self.date for _ in range(len(events))] - event_list = SingelDayEventListDesign(size, events, fontsize, line_spacing=0, event_prefix_rel_dates = rel_dates) + event_list = SingelDayEventListDesign(size, events, fontsize, event_prefix_rel_dates = rel_dates) event_list.pos = pos self.draw_design(event_list) @@ -68,8 +69,8 @@ class DayRowDesign (DesignEntity): self.draw(resized_icon, pos) def __finish_image__ (self): - self.__draw_day_number__() self.__draw_weekday__() + self.__draw_day_number__() def __draw_weekday__ (self): font_size = int(weekday_fontsize * self.size[1]) @@ -87,15 +88,15 @@ class DayRowDesign (DesignEntity): def __draw_day_number__ (self): font_size = int(daynumber_fontsize * self.size[1]) + ypadding = daynumber_ypadding * self.size[1] size = (daynumber_y_size[0] * self.size[1], daynumber_y_size[1] * self.size[1]) - pos = (0, 0) + pos = (0, ypadding) day_text = self.__get_day_text__() color = self.__get_day_color__() number = TextDesign(size, text=day_text, font=font, color=color, fontsize=font_size, horizontalalignment="center", verticalalignment="bottom") number.pos = pos - number.mask = False self.draw_design(number) def __abs_co__ (self, coordinates): diff --git a/Calendar/EventListDesign.py b/Calendar/EventListDesign.py index e4ae575..13b602c 100644 --- a/Calendar/EventListDesign.py +++ b/Calendar/EventListDesign.py @@ -8,7 +8,7 @@ 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 = 2, 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): + 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__ = [] diff --git a/Calendar/HourListDesign.py b/Calendar/HourListDesign.py index 24a4afc..d139509 100644 --- a/Calendar/HourListDesign.py +++ b/Calendar/HourListDesign.py @@ -7,9 +7,10 @@ from BoxDesign import BoxDesign from datetime import timedelta, datetime hourbox_y_width = 1 -hour_box_fontsize = 0.8 -hoursubtext_fontsize = 0.8 -hoursubtext_height = 0.38 +hour_box_fontsize = 0.85 +hour_ypadding = 0.1 +hoursubtext_fontsize = 0.7 +hoursubtext_height = 0.45 event_title_fontsize = defaultfontsize event_title_xpadding = 3 event_title_ypadding = 5 @@ -81,10 +82,11 @@ class HourListDesign (DesignEntity): def __draw_row__ (self, hour): subtext_height = self.row_size[1] * hoursubtext_height sub_fontsize = subtext_height * hoursubtext_fontsize + ypadding = hour_ypadding * self.row_size[1] width = hourbox_y_width * self.row_size[1] height = self.row_size[1] - subtext_height size = (width, height) - pos = (0, self.__get_ypos_for_time__(hour)) + pos = (0, self.__get_ypos_for_time__(hour) + ypadding) fontsize = size[1] * hour_box_fontsize txt = TextDesign(size, text=self.__get_hour_text__(hour), fontsize=fontsize, verticalalignment="bottom", horizontalalignment="center") diff --git a/Calendar/MonthBlockDesign.py b/Calendar/MonthBlockDesign.py index 53d9295..d0e6beb 100644 --- a/Calendar/MonthBlockDesign.py +++ b/Calendar/MonthBlockDesign.py @@ -6,9 +6,10 @@ from Assets import colors from settings import week_starts_on from BoxDesign import BoxDesign -daynumberboxsize = (0.143, 0.2) #(0.143, 0.286) +daynumberboxsize = (0.143, 0.2) dayhighlightboxsize = (0.143, 0.14) -daynumbersize = 25 +daynumbersize = daynumberboxsize[0] * 0.45 +day_number_ypadding = -0.002 class MonthBlockDesign (DesignEntity): """Creates a view containing one week of the month in @@ -42,8 +43,8 @@ class MonthBlockDesign (DesignEntity): def __draw_day_number__ (self, number, pos): if number <= 0: return - txt = TextDesign(self.__abs_pos__(daynumberboxsize), fontsize=daynumbersize, text=str(number), verticalalignment="center", horizontalalignment="center") - txt.pos = pos + txt = TextDesign(self.__abs_pos__(daynumberboxsize), fontsize=daynumbersize * self.size[0], text=str(number), verticalalignment="center", horizontalalignment="center") + txt.pos = (pos[0], pos[1] + day_number_ypadding * self.size[1]) self.draw_design(txt) def get_day_pos (self, week_in_month, day_of_week, rel_pos=(0,0)): diff --git a/Calendar/MonthOvPanel.py b/Calendar/MonthOvPanel.py index 1d6ff1e..b935b8f 100644 --- a/Calendar/MonthOvPanel.py +++ b/Calendar/MonthOvPanel.py @@ -14,18 +14,18 @@ from RssPostListDesign import RssPostListDesign from settings import general_settings weatherheadersize = (1,0.113) -monthtextsize = 40 +monthboxsize = (1, 0.085) +monthtextsize = monthboxsize[1] * 0.75 +monthplace = (0, 0.11 - weatherheadersize[1]) monthovsize = (1, 0.48) monthovposition = (0, 0.25 - weatherheadersize[1]) seperatorplace = (0, 0.113) -monthplace = (0, 0.12 - weatherheadersize[1]) -monthboxsize = (1, 0.085) weekdayrowpos = (0, 0.209 - weatherheadersize[1]) weekrowboxsize = (1, 0.044) -weekdaytextsize = 18 +weekdaytextsize = 0.7 * weekrowboxsize[1] +weekdaytextpadding = -0.001 weekrownameboxsize = (0.143, 0.044) eventcirclehorizontalsize = 0.100 -infolistsize = (1, 0.77 + weatherheadersize[1]) class MonthOvPanel (PanelDesign): """Overview that focuses on the current month and @@ -77,17 +77,15 @@ class MonthOvPanel (PanelDesign): def __draw_rss_post_list_to_bottom__ (self, rss): month_pos = self.__abs_pos__(monthovposition) month_height = self.month_block.get_real_height() - size = self.__abs_pos__(infolistsize) - size = (size[0], size[1] - month_height - self.weather_header_height) + size = (self.size[0], self.size[1] - (month_pos[1] + month_height + self.weather_header_height)) info_list = RssPostListDesign(size, rss) - info_list.pos = (int(month_pos[0]), int(month_pos[1] + month_height + self.weather_header_height)) + info_list.pos = (int(month_pos[0]), month_pos[1] + month_height + self.weather_header_height) self.draw_design(info_list) def __draw_event_list_to_bottom__ (self, calendar): month_pos = self.__abs_pos__(monthovposition) month_height = self.month_block.get_real_height() - size = self.__abs_pos__(infolistsize) - size = (size[0], size[1] - month_height - self.weather_header_height) + size = (self.size[0], self.size[1] - (month_pos[1] + month_height + self.weather_header_height)) events = calendar.get_upcoming_events() info_list = EventListDesign(size, events) @@ -117,15 +115,16 @@ class MonthOvPanel (PanelDesign): def __draw_month_name__ (self): """Draw the icon with the current month's name""" month = datetime.now().strftime("%B") - txt = TextDesign(self.__abs_pos__(monthboxsize), fontsize=monthtextsize, text=month, verticalalignment="center", horizontalalignment="center") + txt = TextDesign(self.__abs_pos__(monthboxsize), fontsize=monthtextsize * self.size[1], text=month, verticalalignment="center", horizontalalignment="center") pos = self.__abs_pos__(monthplace) txt.pos = (pos[0], pos[1] + self.weather_header_height) self.draw_design(txt) def __draw_week_row__ (self): for day_of_week, day in enumerate(self.__week_days__): - txt = TextDesign(self.__abs_pos__(weekrownameboxsize), fontsize=weekdaytextsize, text=str(day), verticalalignment="center", horizontalalignment="center") - txt.pos = self.__get_week_day_pos__(day_of_week) + txt = TextDesign(self.__abs_pos__(weekrownameboxsize), fontsize=weekdaytextsize * self.size[1], text=str(day), verticalalignment="center", horizontalalignment="center") + pos = self.__get_week_day_pos__(day_of_week) + txt.pos = (pos[0], pos[1] + weekdaytextpadding * self.size[1]) self.draw_design(txt) self.__draw_highlight_box__(self.__abs_pos__(weekrownameboxsize), self.__get_week_day_pos__(self.__get_day_of_week__(datetime.now())), width=1) diff --git a/Calendar/RssPostListDesign.py b/Calendar/RssPostListDesign.py index 0ebaefd..724c915 100644 --- a/Calendar/RssPostListDesign.py +++ b/Calendar/RssPostListDesign.py @@ -14,7 +14,7 @@ class RssPostListDesign (DesignEntity): def __finish_image__ (self): self.__fill_post_matrix__() - table_design = TableDesign(self.size, line_spacing=5, col_spacing=3, matrix=self.__post_matrix__, fontsize = self.text_size, mask=False, truncate_cols=False, wrap=True) + table_design = TableDesign(self.size, line_spacing=2, col_spacing=3, matrix=self.__post_matrix__, fontsize = self.text_size, mask=False, wrap=True, truncate_rows=True) self.draw_design(table_design) def __get_formatted_post__ (self, post): diff --git a/Calendar/SingelDayEventListDesign.py b/Calendar/SingelDayEventListDesign.py index 1e05663..90f3547 100644 --- a/Calendar/SingelDayEventListDesign.py +++ b/Calendar/SingelDayEventListDesign.py @@ -7,6 +7,6 @@ font = fonts["regular"] class SingelDayEventListDesign (EventListDesign): """Specialized event list for day list design.""" - def __init__ (self, size, events, font_size = defaultfontsize, line_spacing=2, event_prefix_rel_dates = [], col_spacing=5, general_color=colors["fg"], background_color=colors["bg"], highlight_color=colors["hl"]): + def __init__ (self, size, events, font_size = defaultfontsize, line_spacing=0, event_prefix_rel_dates = [], col_spacing=5, general_color=colors["fg"], background_color=colors["bg"], highlight_color=colors["hl"]): prefix_func = lambda x, rel_date : event_prefix_str_sum(x, rel_date) super().__init__(size, events, text_size=font_size, line_spacing=line_spacing, col_spacing=col_spacing, event_prefix_rel_dates = event_prefix_rel_dates, event_prefix_func=prefix_func, font_family=font, show_more_info=True, general_color=general_color, background_color=background_color, highlight_color = highlight_color) \ No newline at end of file diff --git a/Calendar/TableDesign.py b/Calendar/TableDesign.py index d4f9c26..5672604 100644 --- a/Calendar/TableDesign.py +++ b/Calendar/TableDesign.py @@ -88,7 +88,8 @@ class TableDesign (TextDesign): width = font.getsize(self.matrix[r][c])[0] #get width of text in that row/col if self.wrap and self.max_col_size != None: content = wrap_text_with_font(content, self.max_col_size[c], font) - height = font.getsize_multiline(content)[1] #get height of text in that col/row + line_count = content.count('\n') + 1 + height = font.font.height * line_count #get height of text in that col/row size = (width, height) else: #DesignEntity size = content.size @@ -177,7 +178,8 @@ class TableDesign (TextDesign): def __get_cell_prop__(self, r, c, prop): if self.cell_properties is None: return default_props[prop] - try: + + if r < len(self.cell_properties) and c < len(self.cell_properties[r]) and prop in self.cell_properties[r][c].keys(): return self.cell_properties[r][c][prop] - except: + else: return default_props[prop] \ No newline at end of file diff --git a/Calendar/TextDesign.py b/Calendar/TextDesign.py index 3f339b9..9c44e70 100644 --- a/Calendar/TextDesign.py +++ b/Calendar/TextDesign.py @@ -3,7 +3,6 @@ from PIL import ImageFont, ImageDraw, ImageOps from Assets import path, defaultfont, colors, defaultfontsize from TextWraper import wrap_text_with_font -paddingcorrection = -3 truncateerror_fontsize = 0.5 class TextDesign (DesignEntity): @@ -49,7 +48,7 @@ class TextDesign (DesignEntity): self.text += self.truncate_suffix def __pos_from_alignment__ (self): - width, height = self.__font__.getsize_multiline(self.text) + width, height = self.__get_text_size__() x, y = 0, 0 if self.vertical_alignment == "center": @@ -62,7 +61,12 @@ class TextDesign (DesignEntity): elif self.horizontal_alignment == "right": x = int(self.size[0] - width) - return (x, y + paddingcorrection) + return (x, y) + + def __get_text_size__(self): + widht = self.__font__.getsize_multiline(self.text)[0] + height = (self.text.count('\n') + 1) * self.__font__.font.height + return widht, height def __wrap_text__ (self): self.text = wrap_text_with_font(self.text, self.size[0], self.__font__) diff --git a/Calendar/WeatherColumnDesign.py b/Calendar/WeatherColumnDesign.py index eff51b6..ae7f7b4 100644 --- a/Calendar/WeatherColumnDesign.py +++ b/Calendar/WeatherColumnDesign.py @@ -9,6 +9,7 @@ icon_xpos = 0.1 icon_x_ypos = 0 icon_width = 1 - 2 * icon_xpos info_x_ypos = icon_x_ypos + icon_width +info_yresize = -0.05 fontsize_static = defaultfontsize max_symbol_y_width = 0.15 @@ -34,14 +35,14 @@ class WeatherColumnDesign (DesignEntity): numbers_list = [ [ forecast.short_description ], [ temperature ], [ humidity ], - [ windspeed ] ] + [ windspeed ]] ypos = info_x_ypos * self.size[0] pos = (0, ypos) - size = (self.size[0], self.size[1] - pos[1]) + size = (self.size[0], self.size[1] + info_yresize * self.size[1] - pos[1]) line_spacing = (size[1] - len(numbers_list) * fontsize_static) / (len(numbers_list) + 1) - table = TableDesign(size, numbers_list, fontsize=fontsize_static, line_spacing=line_spacing, column_horizontal_alignments=[ "center" ], max_col_size=[ size[0] ], truncate_text=False) + table = TableDesign(size, numbers_list, fontsize=fontsize_static, line_spacing=line_spacing, column_horizontal_alignments=[ "center" ], max_col_size=[ size[0] ], truncate_text=False, truncate_rows=False) table.pos = pos self.draw_design(table)