Source code for schrodinger.ui.qt.appframework2.appmethods

from schrodinger.infra import util

START = 'start'
PRESTART = 'preStart'
WRITE = 'write'
PREWRITE = 'preWrite'
READ = 'read'
RESET = 'reset'
CLOSE = 'close'
SHOW = 'show'
CUSTOM = 'custom'
CUSTOM_MENU_ITEM = 'custom_menu_item'

STD_TARGETS = [START, PRESTART, WRITE, PREWRITE, READ, RESET, CLOSE, SHOW]

APPMETHODS_MAP = {
    START: '_start',
    PRESTART: '_prestart',
    WRITE: '_write',
    PREWRITE: '_prewrite',
    READ: '_read',
    RESET: '_reset',
    CLOSE: '_close'
}

#=========================================================================
# Decorators
#=========================================================================


[docs]def custom(button_text=None, order=0, tooltip=None): def setCustom(method): nonlocal button_text if button_text is None: button_text = method.__name__ _setup_button_method(method, CUSTOM, button_text, tooltip) method.button_order = order return method return setCustom
[docs]def custom_menu_item(menu_text='Custom Menu Text', order=0, tooltip=None): """ Decorator function used to add a custom menu item to the gear box options. """ def setCustom(method): _setup_button_method(method, CUSTOM_MENU_ITEM, menu_text, tooltip) method.button_order = order return method return setCustom
[docs]def start(button_text='Run', tooltip='Click to run panel', add_write=True): """ Decorator function for the 'Start' method. :param button_text: Label for the start button :type button_text: str :param tooltip: Tooltip for the start button :type tooltip: str :param add_write: Whether the start method should double as a write method. This is possible if using af2 launch methods or if the start method respects the state of the start_mode member variable. :type add_write: bool """ def decorate(method): method.add_write = add_write return _setup_button_method(method, START, button_text, tooltip) return decorate
[docs]def prestart(): def decorate(method): return _setup_button_method(method, PRESTART) return decorate
[docs]def write(button_text='Write', tooltip=None): def decorate(method): return _setup_button_method(method, WRITE, button_text, tooltip) return decorate
[docs]def prewrite(): def decorate(method): return _setup_button_method(method, PREWRITE) return decorate
[docs]def read(button_text='Read', tooltip=None): def decorate(method): return _setup_button_method(method, READ, button_text, tooltip) return decorate
[docs]def reset(button_text='Reset', tooltip='Reset the panel'): def decorate(method): return _setup_button_method(method, RESET, button_text, tooltip) return decorate
[docs]def close(button_text='Close', tooltip=None): def decorate(method): return _setup_button_method(method, CLOSE, button_text, tooltip) return decorate
[docs]def show(): """ A decorator for methods that are called when the panel is shown (both the initial launch and later re-showings). """ def decorate(method): return _setup_button_method(method, SHOW) return decorate
#========================================================================= # Decorator helpers #========================================================================= def _setup_button_method(method, button_target, button_text=None, tooltip=None): method.button_target = button_target if button_text is not None: method.button_text = button_text method.tooltip = tooltip return method
[docs]def sort_order(method): return method.button_order
#========================================================================= # MethodsDict Class #=========================================================================
[docs]class MethodsDict(dict):
[docs] def __init__(self, source_obj): dict.__init__(self) self.custom_methods = [] self.custom_menu_items = [] self.source_obj = source_obj self.setButtonMethods(source_obj) self.setSelfMethods()
[docs] def setButtonMethods(self, source_obj): for method in util.find_decorated_methods(source_obj, "button_target"): target = method.button_target if target in APPMETHODS_MAP: slotmethod = APPMETHODS_MAP[target] if not getattr(source_obj, slotmethod, None): raise ValueError("Super class does not support app" "method %s" % target) if method.button_target == CUSTOM: self.custom_methods.append(method) elif method.button_target == CUSTOM_MENU_ITEM: self.custom_menu_items.append(method) else: self[method.button_target] = method if (method.button_target == START and method.add_write and not (WRITE in self) and hasattr(source_obj, '_write')): self[WRITE] = method self.custom_menu_items.sort(key=sort_order) self.custom_methods.sort(key=sort_order)
def __nonzero__(self): # nopy3migrate return self.__bool__() def __bool__(self): return bool(self.custom_methods or len(self))
[docs] def setSelfMethods(self): for target in STD_TARGETS: setattr(self, target, self.get(target, self.emptyMethod))
[docs] def emptyMethod(self): return