예제 #1
0
def older_bind(interface, key, container=None, attr=None):
    """Ensures consistency between interface[key] and container.attr
    """
    if attr is None:
        attr = key
    if container is None:
        container = interface
    # interface[key].value

    def on_container_attr_set(res, name, value):
        if name != attr:
            return res
        return res

    container.__setattr__ = hook.multi_call_patch(container.__setattr__)
    container.__setattr__.add_call(on_container_attr_set)

    def on_interface_key_set(res, name, sub_if):
        if name != key:
            return res

        def on_set_value(res, new_value):
            return res

        sub_if.set_value = hook.multi_call_patch(sub_if.set_value)
        sub_if.set_value.add_call(on_set_value)
        return res

    interface.__setitem__ = hook.multi_call_patch(interface.__setitem__)
    interface.__setitem__.add_call(on_interface_key_set)
    on_interface_key_set(None, key, interface[key])
예제 #2
0
    def __init__(self, container, key, parent=None, attr=None, unbind=True):
        debug('Bind', container.name, key)
        self.container = container
        self.key = key
        self.parent = self.container if parent is None else parent
        self.attr = self.key if attr is None else attr
        parent.__setattr__ = hook.multi_call_patch(parent.__setattr__)
        parent.__setattr__.add_call(self.on_parent_attr_set)
        container.__setitem__ = hook.multi_call_patch(container.__setitem__)
        container.__setitem__.add_call(self.on_container_key_set)

        self.interface = self.container[self.key]
        self.model = getattr(self.parent, self.attr)
        self.on_container_key_set(None, self.key, self.interface, True)
        self.on_parent_attr_set(None, self.attr, self.model, True)
        self.bind_children(unbind)
예제 #3
0
    def on_interface_key_set(res, name, sub_if):
        if name != key:
            return res

        def on_set_value(res, new_value):
            return res

        sub_if.set_value = hook.multi_call_patch(sub_if.set_value)
        sub_if.set_value.add_call(on_set_value)
        return res
예제 #4
0
 def on_container_key_set(self, res, name, interface, init=False):
     debug('cks', name, interface.name)
     if name != self.key:
         return res
     if interface == self.interface and not init:
         return res
     interface.ui.set_value = interface.set_value = \
         hook.multi_call_patch(interface.ui.set_value)
     interface.set_value.add_call(self.on_interface_value_set)
     self.interface = interface
     self.unbind(False)
     # self.bind_children()
     return res
예제 #5
0
 def on_parent_attr_set(self, res, name, value, init=False):
     debug('pas', name, value)
     if name != self.attr:
         return res
     if value == self.model and not init:
         return res
     try:
         value.__setattr__ = hook.multi_call_patch(value.__setattr__)
         value.__setattr__.add_call(self.on_model_attr_set)
     except AttributeError:
         pass
         # "values" can't have their __setattr__ modified
     self.interface.set_value(value)
     self.model = value
     self.unbind(False)
     self.bind_children()
     return res
예제 #6
0
    def save_as(self):
        with self.prompt('open', hide=True) as prompt:
            prompt.file('file', types=['PPRE Projects (*.pprj)'], new=True)
            # TODO: hook on event and fires
            # TODO: Get rid of this patch
            # TODO: Handle cancel action in dialog
            prompt['file'].set_value = prompt['file'].ui.set_value = \
                hook.multi_call_patch(prompt['file'].set_value)
            prompt['file'].set_value.add_call(
                lambda res, value: res.noop(prompt.fire('okay')))

            @prompt.on('okay')
            def okay(evt):
                target = prompt['file'].get_value()
                self['open'].destroy()
                if not target:
                    return
                self.save_filename = target
                self.save()

            @prompt.on('cancel')
            def cancel(evt):
                self['open'].destroy()
            prompt.focus('file')