コード例 #1
0
ファイル: world.py プロジェクト: jlegrand62/openalea
    def set_style(self, style):
        if style == self.style:
            return

        world = self.world
        self.clear()
        if self.style == self.StyleTableView:
            view = self._view
        elif self.style == self.StylePanel:
            if self._view and self._view():
                view = self._view()
            else:
                return

        # Remove old view
        view.setAttribute(QtCore.Qt.WA_DeleteOnClose)
        self._layout.removeWidget(view)
        view.close()
        del view
        self._view = None

        self.style = style
        if style == self.StyleTableView:
            self._view = ControlManagerWidget(manager=self._default_manager)
            self._layout.addWidget(self._view)

        self.set_world(world)
コード例 #2
0
ファイル: world.py プロジェクト: revesansparole/openalea
    def set_style(self, style):
        if style == self.style:
            return

        world = self.world
        self.clear()
        if self.style == self.StyleTableView:
            view = self._view
        elif self.style == self.StylePanel:
            if self._view and self._view():
                view = self._view()
            else:
                return

        # Remove old view
        view.setAttribute(QtCore.Qt.WA_DeleteOnClose)
        self._layout.removeWidget(view)
        view.close()
        del view
        self._view = None

        self.style = style
        if style == self.StyleTableView:
            self._view = ControlManagerWidget(manager=self._default_manager)
            self._layout.addWidget(self._view)

        self.set_world(world)
コード例 #3
0
ファイル: world.py プロジェクト: jlegrand62/openalea
    def __init__(self, parent=None, style=None):
        AbstractListener.__init__(self)
        QtGui.QWidget.__init__(self, parent=parent)

        self.world = None
        self.model = WorldModel()

        if style is None:
            style = self.DEFAULT_STYLE
        self.style = style

        self._manager = {}

        self._cb_world_object = QtGui.QComboBox()
        p = QtGui.QSizePolicy
        self._cb_world_object.setSizePolicy(p(p.Expanding, p.Maximum))
        self._cb_world_object.currentIndexChanged.connect(self._selected_object_changed)

        self._current = None
        self._default_manager = self._create_manager()

        self.interpreter = get_interpreter()
        self.interpreter.locals['world_control'] = self

        actionClearWorld = QtGui.QAction(QtGui.QIcon(":/images/resources/plant.png"), "Clear World", self)
        actionClearWorld.triggered.connect(self.clear)
        self._actions = [["Project", "World", actionClearWorld, 0]]

        self._layout = QtGui.QVBoxLayout(self)
        self._layout.addWidget(self._cb_world_object)

        if self.style == self.StyleTableView:
            self._view = ControlManagerWidget(manager=self._default_manager)
            self._layout.addWidget(self._view)
        elif self.style == self.StylePanel:
            self._view = None
            self._set_manager(self._default_manager)
        else:
            raise NotImplementedError('style %s' % self.style)
コード例 #4
0
def sample_controls():
    cm = ControlManager()
    #     cc1 = ControlContainer()
    #     cc2 = ControlContainer()

    cmw = ControlManagerWidget()
    #     cmw.model.set_manager(cc2)
    cp = ControlPanel()

    percent = get_interface('IInt', min=0, max=100)
    c = new_control('i', percent)
    #     cc2.add_control(c)

    c = new_control('f', 'IFloat')
    cm.add_control(c)
コード例 #5
0
ファイル: world.py プロジェクト: revesansparole/openalea
    def __init__(self, parent=None, style=None):
        AbstractListener.__init__(self)
        QtGui.QWidget.__init__(self, parent=parent)

        self.world = None
        self.model = WorldModel()

        if style is None:
            style = self.DEFAULT_STYLE
        self.style = style

        self._manager = {}

        self._cb_world_object = QtGui.QComboBox()
        p = QtGui.QSizePolicy
        self._cb_world_object.setSizePolicy(p(p.Expanding, p.Maximum))
        self._cb_world_object.currentIndexChanged.connect(self._selected_object_changed)

        self._current = None
        self._default_manager = self._create_manager()

        self.interpreter = get_interpreter()
        self.interpreter.locals["world_control"] = self

        actionClearWorld = QtGui.QAction(QtGui.QIcon(":/images/resources/plant.png"), "Clear World", self)
        actionClearWorld.triggered.connect(self.clear)
        self._actions = [["Project", "World", actionClearWorld, 0]]

        self._layout = QtGui.QVBoxLayout(self)
        self._layout.addWidget(self._cb_world_object)

        if self.style == self.StyleTableView:
            self._view = ControlManagerWidget(manager=self._default_manager)
            self._layout.addWidget(self._view)
        elif self.style == self.StylePanel:
            self._view = None
            self._set_manager(self._default_manager)
        else:
            raise NotImplementedError("style %s" % self.style)
コード例 #6
0
ファイル: world.py プロジェクト: revesansparole/openalea
class WorldControlPanel(QtGui.QWidget, AbstractListener):
    StyleTableView = 0
    StylePanel = 1
    DEFAULT_STYLE = StylePanel

    attributeChanged = QtCore.Signal(str, dict)

    def __init__(self, parent=None, style=None):
        AbstractListener.__init__(self)
        QtGui.QWidget.__init__(self, parent=parent)

        self.world = None
        self.model = WorldModel()

        if style is None:
            style = self.DEFAULT_STYLE
        self.style = style

        self._manager = {}

        self._cb_world_object = QtGui.QComboBox()
        p = QtGui.QSizePolicy
        self._cb_world_object.setSizePolicy(p(p.Expanding, p.Maximum))
        self._cb_world_object.currentIndexChanged.connect(self._selected_object_changed)

        self._current = None
        self._default_manager = self._create_manager()

        self.interpreter = get_interpreter()
        self.interpreter.locals["world_control"] = self

        actionClearWorld = QtGui.QAction(QtGui.QIcon(":/images/resources/plant.png"), "Clear World", self)
        actionClearWorld.triggered.connect(self.clear)
        self._actions = [["Project", "World", actionClearWorld, 0]]

        self._layout = QtGui.QVBoxLayout(self)
        self._layout.addWidget(self._cb_world_object)

        if self.style == self.StyleTableView:
            self._view = ControlManagerWidget(manager=self._default_manager)
            self._layout.addWidget(self._view)
        elif self.style == self.StylePanel:
            self._view = None
            self._set_manager(self._default_manager)
        else:
            raise NotImplementedError("style %s" % self.style)

    def set_properties(self, properties):
        if self.style == self.StyleTableView:
            self._view.set_properties(properties)

    def properties(self):
        if self.style == self.StyleTableView:
            return self._view.properties()
        else:
            return []

    def set_style(self, style):
        if style == self.style:
            return

        world = self.world
        self.clear()
        if self.style == self.StyleTableView:
            view = self._view
        elif self.style == self.StylePanel:
            if self._view and self._view():
                view = self._view()
            else:
                return

        # Remove old view
        view.setAttribute(QtCore.Qt.WA_DeleteOnClose)
        self._layout.removeWidget(view)
        view.close()
        del view
        self._view = None

        self.style = style
        if style == self.StyleTableView:
            self._view = ControlManagerWidget(manager=self._default_manager)
            self._layout.addWidget(self._view)

        self.set_world(world)

    def __getitem__(self, key):
        return self._manager[self._current].control(name=key)

    def initialize(self):
        from openalea.core.world.world import World
        from openalea.core.service.ipython import interpreter

        world = World()
        world.update_namespace(interpreter())
        self.set_world(world)

    def actions(self):
        return self._actions

    def toolbar_actions(self):
        return self.actions()

    def notify(self, sender, event=None):
        signal, data = event
        if signal == "world_changed":
            self.refresh()
        elif signal == "world_object_removed":
            self.refresh()
        elif signal == "world_object_changed":
            world, old_object, world_object = data
            self.refresh_manager(world_object)
        elif signal == "world_object_item_changed":
            world, world_object, item, old, new = data
            self.refresh_manager(world_object)
            # self.refresh_item(world_object, item, old, new)
        elif signal == "world_sync":
            self.refresh()

    def clear_managers(self):
        self._current = None
        self._cb_world_object.clear()
        for name, manager in self._manager.items():
            manager.clear_followers()
            del self._manager[name]
        self._set_manager(self._default_manager)

    def clear(self):
        self.clear_managers()
        if self.world:
            self.world.unregister_listener(self)
            self.world = None

    def set_world(self, world):
        self.clear()

        self.world = world
        self.world.register_listener(self)

        if self.style == self.StyleTableView:
            self.model.set_world(world)

        for object_name in world.keys():
            self.refresh_manager(world[object_name])

    def _fill_manager(self, manager, world_object):
        if world_object:
            for attribute in world_object.attributes:
                manager.add(
                    attribute["name"],
                    interface=attribute["interface"],
                    value=attribute["value"],
                    label=attribute["label"],
                    constraints=attribute["constraints"],
                )
                manager.register_follower(attribute["name"], self._attribute_changed(world_object, attribute["name"]))

    def _get_manager(self, world_object):
        object_name = world_object.name
        if object_name not in self._manager:
            manager = self._create_manager(world_object)
            self._manager[object_name] = manager
            self._cb_world_object.addItem(object_name)
        return self._manager[object_name]

    def _create_manager(self, world_object=None):
        from openalea.core.control.manager import ControlContainer

        manager = ControlContainer()
        self._fill_manager(manager, world_object)
        return manager

    def _selected_object_changed(self, idx):
        if idx != -1:
            self.select_world_object(self._cb_world_object.itemText(idx))

    def _set_manager(self, manager):
        if self.style == self.StylePanel:
            view = self._view
            if self._view is not None:
                view = self._view()
            if view:
                self._layout.removeWidget(view)
                view.close()
                del view
            from openalea.oalab.service.qt_control import edit

            view = edit(manager)
            view.setAttribute(QtCore.Qt.WA_DeleteOnClose)
            self._view = weakref.ref(view)
            self._layout.addWidget(view)
            view.show()
            self.repaint()
        elif self.style == self.StyleTableView:
            self._view.model.set_manager(manager)
        else:
            raise NotImplementedError("style %s" % self.style)

    def select_world_object(self, object_name):
        if object_name != self._current:
            self._current = object_name
            object_manager = self._manager[object_name]
            object_manager.disable_followers()
            self._set_manager(object_manager)
            object_manager.enable_followers()

    def refresh_item(self, world_object, item, old, new):
        object_name = world_object.name
        if item == "attribute":
            manager = self._get_manager(world_object)
            attr_name = new["name"]
            attr_value = new["value"]
            control = manager.control(name=attr_name)
            if control:
                control.value = attr_value
        else:
            self.refresh_manager(world_object)

    def refresh_manager(self, world_object):
        object_name = world_object.name
        object_manager = self._get_manager(world_object)

        manager_attr_names = [c.name for c in self._manager[object_name].controls()]
        object_attr_names = [a["name"] for a in world_object.attributes]
        if manager_attr_names != object_attr_names:
            object_manager.clear_followers()
            object_manager.clear()
            self._fill_manager(object_manager, world_object)
            if self._current == object_name:
                self._set_manager(object_manager)
                object_manager.enable_followers()
        else:
            for a in world_object.attributes:
                if a["value"] != self._manager[object_name].control(a["name"]).value:
                    self._manager[object_name].control(a["name"]).set_value(a["value"])

    def refresh(self):
        if self.world is not None:
            self.set_world(self.world)

    def _attribute_changed(self, world_object, attribute_name):
        def _changed(old, new):
            self._object_attribute_changed(world_object.name, attribute_name, old, new)

        return _changed

    def _object_attribute_changed(self, object_name, attribute_name, old, new):
        self.world[object_name].set_attribute(attribute_name, new)
コード例 #7
0
ファイル: world.py プロジェクト: jlegrand62/openalea
class WorldControlPanel(QtGui.QWidget, AbstractListener):
    StyleTableView = 0
    StylePanel = 1
    DEFAULT_STYLE = StylePanel

    attributeChanged = QtCore.Signal(str, dict)

    def __init__(self, parent=None, style=None):
        AbstractListener.__init__(self)
        QtGui.QWidget.__init__(self, parent=parent)

        self.world = None
        self.model = WorldModel()

        if style is None:
            style = self.DEFAULT_STYLE
        self.style = style

        self._manager = {}

        self._cb_world_object = QtGui.QComboBox()
        p = QtGui.QSizePolicy
        self._cb_world_object.setSizePolicy(p(p.Expanding, p.Maximum))
        self._cb_world_object.currentIndexChanged.connect(self._selected_object_changed)

        self._current = None
        self._default_manager = self._create_manager()

        self.interpreter = get_interpreter()
        self.interpreter.locals['world_control'] = self

        actionClearWorld = QtGui.QAction(QtGui.QIcon(":/images/resources/plant.png"), "Clear World", self)
        actionClearWorld.triggered.connect(self.clear)
        self._actions = [["Project", "World", actionClearWorld, 0]]

        self._layout = QtGui.QVBoxLayout(self)
        self._layout.addWidget(self._cb_world_object)

        if self.style == self.StyleTableView:
            self._view = ControlManagerWidget(manager=self._default_manager)
            self._layout.addWidget(self._view)
        elif self.style == self.StylePanel:
            self._view = None
            self._set_manager(self._default_manager)
        else:
            raise NotImplementedError('style %s' % self.style)

    def set_properties(self, properties):
        if self.style == self.StyleTableView:
            self._view.set_properties(properties)

    def properties(self):
        if self.style == self.StyleTableView:
            return self._view.properties()
        else:
            return []

    def set_style(self, style):
        if style == self.style:
            return

        world = self.world
        self.clear()
        if self.style == self.StyleTableView:
            view = self._view
        elif self.style == self.StylePanel:
            if self._view and self._view():
                view = self._view()
            else:
                return

        # Remove old view
        view.setAttribute(QtCore.Qt.WA_DeleteOnClose)
        self._layout.removeWidget(view)
        view.close()
        del view
        self._view = None

        self.style = style
        if style == self.StyleTableView:
            self._view = ControlManagerWidget(manager=self._default_manager)
            self._layout.addWidget(self._view)

        self.set_world(world)

    def __getitem__(self, key):
        return self._manager[self._current].control(name=key)

    def initialize(self):
        from openalea.core.world.world import World
        from openalea.core.service.ipython import interpreter
        world = World()
        world.update_namespace(interpreter())
        self.set_world(world)

    def actions(self):
        return self._actions

    def toolbar_actions(self):
        return self.actions()

    def notify(self, sender, event=None):
        signal, data = event
        if signal == 'world_changed':
            self.refresh()
        elif signal == 'world_object_removed':
            self.refresh()
        elif signal == 'world_object_changed':
            world, old_object, world_object = data
            self.refresh_manager(world_object)
        elif signal == 'world_object_item_changed':
            world, world_object, item, old, new = data
            self.refresh_manager(world_object)
            #self.refresh_item(world_object, item, old, new)
        elif signal == 'world_sync':
            self.refresh()

    def clear_managers(self):
        self._current = None
        self._cb_world_object.clear()
        for name, manager in self._manager.items():
            manager.clear_followers()
            del self._manager[name]
        self._set_manager(self._default_manager)

    def clear(self):
        self.clear_managers()
        if self.world:
            self.world.unregister_listener(self)
            self.world = None

    def set_world(self, world):
        self.clear()

        self.world = world
        self.world.register_listener(self)

        if self.style == self.StyleTableView:
            self.model.set_world(world)

        for object_name in world.keys():
            self.refresh_manager(world[object_name])

    def _fill_manager(self, manager, world_object):
        if world_object:
            for attribute in world_object.attributes:
                manager.add(
                    attribute['name'],
                    interface=attribute['interface'],
                    value=attribute['value'],
                    label=attribute['label'],
                    constraints=attribute['constraints']
                )
                manager.register_follower(attribute['name'], self._attribute_changed(world_object, attribute['name']))

    def _get_manager(self, world_object):
        object_name = world_object.name
        if object_name not in self._manager:
            manager = self._create_manager(world_object)
            self._manager[object_name] = manager
            self._cb_world_object.addItem(object_name)
        return self._manager[object_name]

    def _create_manager(self, world_object=None):
        from openalea.core.control.manager import ControlContainer
        manager = ControlContainer()
        self._fill_manager(manager, world_object)
        return manager

    def _selected_object_changed(self, idx):
        if idx != -1:
            self.select_world_object(self._cb_world_object.itemText(idx))

    def _set_manager(self, manager):
        if self.style == self.StylePanel:
            view = self._view
            if self._view is not None:
                view = self._view()
            if view:
                self._layout.removeWidget(view)
                view.close()
                del view
            from openalea.oalab.service.qt_control import edit
            view = edit(manager)
            view.setAttribute(QtCore.Qt.WA_DeleteOnClose)
            self._view = weakref.ref(view)
            self._layout.addWidget(view)
            view.show()
            self.repaint()
        elif self.style == self.StyleTableView:
            self._view.model.set_manager(manager)
        else:
            raise NotImplementedError('style %s' % self.style)

    def select_world_object(self, object_name):
        if object_name != self._current:
            self._current = object_name
            object_manager = self._manager[object_name]
            object_manager.disable_followers()
            self._set_manager(object_manager)
            object_manager.enable_followers()

    def refresh_item(self, world_object, item, old, new):
        object_name = world_object.name
        if item == 'attribute':
            manager = self._get_manager(world_object)
            attr_name = new['name']
            attr_value = new['value']
            control = manager.control(name=attr_name)
            if control:
                control.value = attr_value
        else:
            self.refresh_manager(world_object)

    def refresh_manager(self, world_object):
        object_name = world_object.name
        object_manager = self._get_manager(world_object)

        manager_attr_names = [c.name for c in self._manager[object_name].controls()]
        object_attr_names = [a['name'] for a in world_object.attributes]
        if manager_attr_names != object_attr_names:
            object_manager.clear_followers()
            object_manager.clear()
            self._fill_manager(object_manager, world_object)
            if self._current == object_name:
                self._set_manager(object_manager)
                object_manager.enable_followers()
        else:
            for a in world_object.attributes:
                if a['value'] != self._manager[object_name].control(a['name']).value:
                    self._manager[object_name].control(a['name']).set_value(a['value'])

    def refresh(self):
        if self.world is not None:
            self.set_world(self.world)

    def _attribute_changed(self, world_object, attribute_name):
        def _changed(old, new):
            self._object_attribute_changed(world_object.name, attribute_name, old, new)
        return _changed

    def _object_attribute_changed(self, object_name, attribute_name, old, new):
        self.world[object_name].set_attribute(attribute_name, new)