init offset = -1 """ In absolute hindsight, this could have been done very similar to bonus flash image instead of the dynamic displayable stuff """ init python: list_langs_buttons = [ {'image': 'gui/flag/USofA.png', 'name': 'English', 'value': None }, {'image': 'gui/flag/spain.png', 'name': 'EspaƱol', 'value': 'test'} ] class LangCave: #todo: think of a better name FPS = 1/60 #todo: fetch the actual target render framerate #GRID_ROWS_COLS_TUPLE = (4, (len(list_langs_buttons)//4)) MAX_ITEMS_IN_ROW = 4 #column as well GRID_ROWS_COLS_TUPLE = (MAX_ITEMS_IN_ROW, len(list_langs_buttons)//MAX_ITEMS_IN_ROW + 1*((len(list_langs_buttons)%MAX_ITEMS_IN_ROW)>0)) lang_buttons = [] final_displayable = None on_disable_interactable = False LARGE_SIZE = (320, 240) LARGE_SPACING = (80, 40) SMALL_SIZE = (LARGE_SIZE[0]//3, LARGE_SIZE[1]//3) SMALL_SPACING = (LARGE_SPACING[0]//2, LARGE_SPACING[1]//2) class LangButton(renpy.Displayable): def __init__(self, v, w, h, *childs, **kwargs): super(LangCave.LangButton, self).__init__(**kwargs) self.childs = [] for ch in childs: child = renpy.displayable(ch) self.childs.append(child) self.width = w self.height = h self.value = v self.hover = True #renpy can't handle not/! self.selected = False def render(self, width, height, st, at): root_render = renpy.Render(self.width, self.height) #canvas args = {} if (self.hover): args = {'matrixcolor': TintMatrix("#AAA")} if (LangCave.on_disable_interactable == False and self.selected): args = {} for ch in self.childs: #draw every child t = Transform(child=ch, **args) child_render = renpy.render(t, self.width, self.height, st, at) root_render.blit(child_render, (0, 0)) return root_render def event(self, ev, ex, ey, st): #getting clicked on global LangCave oldhover = self.hover if ((ex > 0 and ey > 0) and (ex < self.width and ey < self.height)): self.hover = False if (renpy.map_event(ev, 'mouseup_1')): #1026 for lb in LangCave.lang_buttons: lb.selected = False self.selected = True onclick_audio(True) self.value() #todo: change to function, as value doesn't make sense if LangCave.on_disable_interactable: LangCave.on_disable_interactable = False LangCave.recreate_lang_buttons_roulette_style(LangCave.SMALL_SIZE) #mostly going to happen renpy.end_interaction(0) for lb in LangCave.lang_buttons: renpy.redraw(lb, 0) else: self.hover = True pass if self.hover == oldhover: #refresh on change renpy.redraw(self, 0) def visit(self): return self.childs @staticmethod def render(): global LangButton pass @staticmethod def render_langcave(st, at): global LangCave return LangCave.final_displayable, LangCave.FPS pass @staticmethod def procreate_lang_buttons(size, spacing): """ size: tuple """ global LangCave LangCave.lang_buttons.clear() for llb in list_langs_buttons: tfi = Transform(Image(llb['image']), xysize=size, fit='contain', yalign=0.5) #solid = Solid((22,22,22), xysize=size) # = Solid((22,22,22), xysize=size) _button = Fixed(tfi, xysize=size) lang = Language(llb['value']) button = LangCave.LangButton(lang, *size, _button) LangCave.on_disable_interactable = True text = Text(llb['name'], outlines=[(2, "#000", 0, 0)], xalign=0.5) final = VBox(text, button, style_prefix="navigation") LangCave.lang_buttons.append(final) #prevent underfill remainder = len(list_langs_buttons)%LangCave.MAX_ITEMS_IN_ROW for x in range(4-remainder): n = Null(*size) LangCave.lang_buttons.append(n) LangCave.final_displayable = Grid(*LangCave.GRID_ROWS_COLS_TUPLE, *LangCave.lang_buttons, xspacing=spacing[0], yspacing=spacing[1]) pass @staticmethod def recreate_lang_buttons_roulette_style(size, spacing=0): global LangCave LangCave.lang_buttons.clear() LangCave.on_disable_interactable = False for llb in list_langs_buttons: tfi = Transform(Image(llb['image']), xsize=size[0], ysize=size[1], fit='contain', yalign=0.5) #solid = Solid((22,22,22), xysize=(size)) _button = Fixed(tfi, xysize=(size)) text = Text(llb['name'], outlines=[(2, "#000", 0, 0)], xalign=0.5, text_size=16, yalign=0.5) #todo: text_size away penultimate = HBox(text, _button, style_prefix="navigation", spacing=20) #print(dir(penultimate)) lang = Language(llb['value']) button = LangCave.LangButton(lang, *size, penultimate) if (_preferences.language == llb['value']): button.selected = True LangCave.lang_buttons.append(button) LangCave.final_displayable = VBox(*LangCave.lang_buttons, spacing=spacing) pass if (persistent.languaged_up is None): LangCave.procreate_lang_buttons(LangCave.LARGE_SIZE, LangCave.LARGE_SPACING) else: LangCave.recreate_lang_buttons_roulette_style(LangCave.SMALL_SIZE) #mostly going to happen screen lang_buttons(filename_label_functions): for f_l_f in filename_label_functions: use lang_button(f_l_f[0], f_l_f[1], f_l_f[2]) screen lang_button(filename, label, function): button: xsize 360 ysize 240 action [function, Return()] activate_sound "audio/ui/uiClick.wav" #hovered Transform(matrixcolor=TintMatrix('#fff')) fixed: xsize 360 ysize 240 #xfit True #yfit True #fit_first 'height' add "#222" xsize 360 ysize 240 add Transform(Image(filename), xsize=360, fit='contain', yalign=0.5) text label xalign 0.5 yalign 0.0 xanchor 0.5 size 22 style "quick_button_text" screen _translator_popup: tag menu add gui.main_menu_background #add gui.game_menu_background vbox: style_prefix "navigation" hbox: label _("Choose Your Language") grid 2 1: #hardcoded for now spacing 20 use lang_buttons(list_langs_buttons) screen translator_popup: tag menu frame: #background gui.main_menu_background background Transform(gui.main_menu_background, matrixcolor=TintMatrix('#222')) padding (120, 40) vbox: style_prefix "navigation" hbox: label _("Choose Your Language") text_size 80 hbox: add Null(80, 40) add DynamicDisplayable(LangCave.render_langcave) screen translator_roulette: vbox: label _("Language") style_prefix "check" add DynamicDisplayable(LangCave.render_langcave)