Ejemplo n.º 1
0
class VariableTreeBox(QGroupBox):

    class VariableTreeButton(QToolButton):
        def __init__(self, *args, **kwargs):
            QToolButton.__init__(self, *args, **kwargs)
            baseIcon = QIcon(":go-next.svg")
            secondIcon = QIcon(":go-previous.svg")
            self.__icons__ = [baseIcon, secondIcon]
            self.setIcon(baseIcon)
            
        def switchIcon(self):
            self.__icons__.reverse()
            self.setIcon(self.__icons__[0])
            
    def __init__(self, id, name="Choose Variables", model=None):
        QGroupBox.__init__(self)
        if model is None:
            model = TreeModel()
        self.setTitle(name)
        self.setToolTip("<p>Select variables for analysis</p>")
        self.id = id
        self.pairs = {}

        layout = HBoxLayout()
        self.variableTreeView = QTreeView()
        self.variableTreeView.setModel(model)
        self.variableTreeView.setToolTip("Select variables from here")
        self.variableTreeView.setSelectionMode(QAbstractItemView.ExtendedSelection)
        self.variableTreeView.installEventFilter(self)
        layout.addWidget(self.variableTreeView)
        self.widgetsLayout = VBoxLayout()
        layout.addLayout(self.widgetsLayout)
        self.setLayout(layout)
        
    def addItem(self, widget):
        hbox = HBoxLayout()
        button = self.VariableTreeButton()
        button.setToolTip("Specify variable")
        self.connect(button, SIGNAL("clicked()"), self.move)
        widget.widget.installEventFilter(self)
        hbox.addWidget(button)
        hbox.addWidget(widget)
        self.widgetsLayout.addLayout(hbox)
        self.widgetsLayout.addStretch()
        self.pairs[button] = widget

    def eventFilter(self, object, event):
        if event.type() == QEvent.FocusIn:
            self.switchButton(object)
        return False

    def move(self):
        sender = self.sender()
        receiver = self.pairs[sender]
        path = QString()
        if isinstance(receiver, VariableLineEdit):
            if receiver.widget.text().isEmpty():
                indexes = self.variableTreeView.selectedIndexes()
                if len(indexes) < 1:
                    return
                path = self.variableTreeView.model().parentTree(indexes[0])
            sender.switchIcon()
            receiver.widget.setText(path)
        elif isinstance(receiver, VariableListBox):
            add = self.variableTreeView.hasFocus()
            if add:
                indexes = self.variableTreeView.selectedIndexes()
                paths = [self.variableTreeView.model().parentTree(index) for index in indexes if index.column() == 0]
                receiver.widget.addItems(paths)
            else:
                indexes = receiver.widget.selectedItems()
                for index in indexes:
                    item = receiver.widget.takeItem(receiver.widget.row(index))
                    del item

    def switchButton(self, sender):
        if not isinstance(sender, QLineEdit):
            for key, value in self.pairs.iteritems():
                if value.widget == sender:
                    key.setIcon(QIcon(":go-previous.svg"))
                else:
                    key.setIcon(QIcon(":go-next.svg"))

    def parameterValues(self):
        params = {}
        for button, widget in self.pairs.iteritems():
            params.update(widget.parameterValues())
        return params