def init_pychan(): """General pychan initiation for uh""" global STYLES # quick hack to allow up_image/down_image values to be unicode # TODO solve this problem in a better way (e.g. passing str explicitly) # or waiting for a fix of http://github.com/fifengine/fifengine/issues/701 from fife.extensions.pychan.properties import ImageProperty def patch_imageproperty(func): def wrapper(self, obj, image): if isinstance(image, str): image = str(image) return func(self, obj, image) return wrapper ImageProperty.__set__ = patch_imageproperty(ImageProperty.__set__) # register custom widgets from horizons.gui.widgets.inventory import Inventory from horizons.gui.widgets.buysellinventory import BuySellInventory from horizons.gui.widgets.imagefillstatusbutton import ImageFillStatusButton from horizons.gui.widgets.progressbar import ProgressBar, TilingProgressBar # additionally, ImageButton is imported from widgets.imagebutton above from horizons.gui.widgets.imagebutton import CancelButton, DeleteButton, MainmenuButton, OkButton from horizons.gui.widgets.icongroup import TabBG, TilingHBox, hr from horizons.gui.widgets.stepslider import StepSlider from horizons.gui.widgets.unitoverview import HealthWidget, StanceWidget, WeaponStorageWidget from horizons.gui.widgets.tooltip import _Tooltip widgets = [OkButton, CancelButton, DeleteButton, MainmenuButton, Inventory, BuySellInventory, ImageFillStatusButton, ProgressBar, StepSlider, TabBG, HealthWidget, StanceWidget, WeaponStorageWidget, RenameLabel, RenameImageButton, TilingHBox, TilingProgressBar, hr, # This overwrites the ImageButton provided by FIFE! ImageButton] for widget in widgets: pychan.widgets.registerWidget(widget) # add uh styles for name, stylepart in STYLES.items(): pychan.manager.addStyle(name, stylepart) # patch default widgets for name, widget in list(pychan.widgets.WIDGETS.items()): def catch_gcn_exception_decorator(func): @functools.wraps(func) def wrapper(*args, **kwargs): try: # only apply usable args, else it would crash when called through fife timers pychan.tools.applyOnlySuitable(func, *args, **kwargs) except RuntimeError as e: handle_gcn_exception(e) return wrapper widget.hide = catch_gcn_exception_decorator(widget.hide) from fife.extensions.pychan import ABox, HBox, Icon, Label, VBox # this is white list of widgets with tooltip. widgets_with_tooltip = [ABox, HBox, Icon, ImageButton, Label, VBox] for widget in widgets_with_tooltip: # Copy everything we need from the tooltip class (manual mixin). # TODO: Figure out if it is safe to use this instead: # widget.__bases__ += (_Tooltip, ) for key, value in _Tooltip.__dict__.items(): if not key.startswith("__"): setattr(widget, key, value) def add_tooltip_init(func): @functools.wraps(func) def wrapper(self, *args, **kwargs): func(self, *args, **kwargs) self.init_tooltip() return wrapper widget.__init__ = add_tooltip_init(widget.__init__) # these sometimes fail with "No focushandler set (did you add the widget to the gui?)." # see #1597 and #1647 widget.requestFocus = catch_gcn_exception_decorator(widget.requestFocus) # FIXME hack pychan's text2gui function, it does an isinstance check that breaks # the lazy string from horizons.i18n. we should be passing unicode to # widgets all the time, therefore we don't need the additional check. def text2gui(text): # Drop unicode encoding for now. #unicodePolicy = horizons.globals.fife.pychan.manager.unicodePolicy #return text.encode("utf8",*unicodePolicy).replace("\t"," "*4).replace("[br]","\n") return text.replace("\t", " " * 4).replace("[br]", "\n") pychan.widgets.textfield.text2gui = text2gui pychan.widgets.basictextwidget.text2gui = text2gui setup_cursor_change_on_hover() setup_trigger_signals_on_action() setup_trigger_signals_on_hover()