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 __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 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)
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)
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)
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)