예제 #1
0
    class MxDataViewWidget(QWidget):
        def __init__(self, parent, **kwargs):
            QWidget.__init__(self, parent)

            self.plugin = parent.get_plugin()
            # self.plugin_actions = []

            #         outer_layout
            #        +----------------------------------------------|-----------+
            #        |   inner_layout                               |           |
            #        |  +---------|-----------------------------+   |           |
            #  upper |  |         | +----------------------+    |   |           |
            # layout |  |obj_radio| |objbox_layout         |    |   |           |
            #        |  |         | +----------------------+    |   |  update   |
            #        |  -----------------------------------------   |  button   |
            #        |  |   expr  |                             |   |           |
            #        |  |   radio |  exprbox                    |   |           |
            #        |  +---------|-----------------------------+   |           |
            #        |                                              |           |
            #        -----------------------------------------------|------------
            #        |                                                          |
            #        |   msgbox                                                 |
            #        |                                                          |
            #        +----------------------------------------------------------+
            #

            button_group = QButtonGroup(parent=self)
            self.object_radio = object_radio = QRadioButton("Object")
            self.expr_radio = expr_radio = QRadioButton("Expression")
            button_group.addButton(object_radio)
            button_group.addButton(expr_radio)

            object_radio.toggled.connect(self.activateObject)
            expr_radio.toggled.connect(self.activateExpression)

            update_button = QPushButton(text="Update", parent=self)
            update_button.clicked.connect(self.update_data)

            # txt = _("Expression")
            # if sys.platform == 'darwin':
            #     expr_label = QLabel("  " + txt)
            # else:
            #     expr_label = QLabel(txt)

            font = self.plugin.get_font()

            self.exprbox = MxPyExprLineEdit(self, font=font)
            self.objbox = QLabel(parent=self)
            self.argbox = MxPyExprLineEdit(self, font=font)
            self.msgbox = QLabel(parent=self)
            self.msgbox.setText("")
            self.msgbox.setWordWrap(True)

            outer_layout = QVBoxLayout()
            upper_layout = QHBoxLayout()
            outer_layout.addLayout(upper_layout)
            outer_layout.addWidget(self.msgbox)

            inner_layout = QGridLayout()
            inner_layout.addWidget(object_radio, 0, 0)
            inner_layout.addWidget(expr_radio, 1, 0)
            inner_layout.addWidget(self.exprbox, 1, 1)
            objbox_layout = QHBoxLayout()
            objbox_layout.addWidget(self.objbox)
            objbox_layout.addWidget(self.argbox)
            objbox_layout.setStretch(0, 3)  # 3:1
            objbox_layout.setStretch(1, 1)
            inner_layout.addLayout(objbox_layout, 0, 1)

            upper_layout.addLayout(inner_layout)
            upper_layout.addWidget(update_button)

            # widget = QWidget(parent=self)
            # widget.setLayout(outer_layout)

            # Create main widget
            self.widget = QWidget(parent=self)  # MxDataFrameViewer(self)

            self.main_layout = main_layout = QVBoxLayout()
            main_layout.addLayout(outer_layout)
            main_layout.addWidget(self.widget)
            main_layout.setStretch(1, 1)

            # Main layout of this widget
            # layout = create_plugin_layout(self.tools_layout)
            # layout.addLayout(main_layout)

            margins = (0, 0, 0, 0)

            for lo in [outer_layout, upper_layout, inner_layout, self.msgbox]:
                lo.setContentsMargins(*margins)

            objbox_layout.setContentsMargins(0, 0, 0, 0)

            self.setLayout(main_layout)

            self.attrdict = None
            object_radio.setChecked(True)

            # self.calc_on_update = create_action(self,
            #     _("Calculate upon update"),
            #     tip=_("Calculate the selected cells if not yet calculated"))
            # self.calc_on_update.setChecked(True)
            #
            # self.actions = [self.calc_on_update]

        def set_shellwidget(self, shellwidget):
            """Bind shellwidget instance to namespace browser"""
            self.shellwidget = shellwidget
            self.shellwidget.set_mxdataview(self)

        def activateObject(self, checked):
            self.argbox.setEnabled(checked)
            self.exprbox.setEnabled(not checked)

        def activateExpression(self, checked):
            self.argbox.setEnabled(not checked)
            self.exprbox.setEnabled(checked)

        def update_object(self, data):
            if data is None:
                return

            self.attrdict = data
            if data["type"] == 'Reference' or (data["type"] == "Cells"
                                               and not data["parameters"]):
                self.argbox.setText("")
                self.argbox.setEnabled(False)
            else:
                self.argbox.setEnabled(True)

            self.objbox.setText(data['_evalrepr'])

        def update_data(self):
            if self.object_radio.isChecked():

                argtxt = self.argbox.get_expr()
                args = "(" + argtxt + ("," if argtxt else "") + ")"
                # assert
                ast.literal_eval(args)

                calc = self.plugin.get_container(
                ).calc_on_update_action.isChecked()

                val, is_calculated = self.shellwidget.update_mxdataview(
                    is_obj=True,
                    obj=self.attrdict["fullname"],
                    args=args,
                    calc=calc)
                self.update_value(val)
                if is_calculated:
                    self.shellwidget.refresh_namespacebrowser()

            elif self.expr_radio.isChecked():
                self.shellwidget.update_mxdataview(
                    is_obj=False, expr=self.exprbox.get_expr())
                self.shellwidget.refresh_namespacebrowser()
            else:
                raise RuntimeError("MxDataViewer: must not happen")

        def update_value(self, data):

            import pandas as pd
            import numpy as np
            import numpy.ma

            if isinstance(data, (pd.DataFrame, pd.Index, pd.Series)):
                self.widget.deleteLater()
                self.widget = MxDataFrameViewer(self)
                self.widget.setup_and_check(data)
                self.msgbox.setText(data.__class__.__name__)
            elif isinstance(data, (np.ndarray, np.ma.MaskedArray)):
                self.widget.deleteLater()
                self.widget = MxArrayViewer(self)
                self.widget.setup_and_check(data, title='', readonly=True)
                self.msgbox.setText(data.__class__.__name__)
            elif isinstance(data, (list, set, tuple, dict)):
                self.widget.deleteLater()
                self.widget = MxCollectionsViewer(self)
                self.widget.setup(data, title='', readonly=True)
                self.msgbox.setText(data.__class__.__name__)
            else:
                txt = data.__class__.__name__ + ": " + repr(data)
                self.widget.deleteLater()
                self.widget = QWidget(parent=self)
                self.msgbox.setText(txt)

            self.main_layout.addWidget(self.widget)
            self.main_layout.setStretchFactor(self.widget, 1)