Exemple #1
0
    def __init__(self,
                 ris_widget,
                 pca,
                 color=Qt.Qt.green,
                 geometry=None,
                 on_geometry_change=None):

        self._width_tck = None
        self._display_path = None
        self.layout = Qt.QFormLayout()
        self.rw = ris_widget
        self.pca_stuff = pca
        self.undo = None
        self.avg_width_tck = self._generate_pca_avg()
        spline_widget = Qt.QWidget()
        spline_widget.setLayout(self.layout)

        self.sv = Qt.QPushButton("View Spline")
        self.pca_button = Qt.QPushButton("Use PCA Average")
        self.undo_button = Qt.QPushButton("Undo")
        self.layout.addRow(self.sv)
        self.layout.addRow(self.pca_button)
        self.layout.addRow(self.undo_button)

        self.rw.flipbook.layout().addWidget(spline_widget)
        self.sv.clicked.connect(self._on_sv_clicked)
        self.pca_button.clicked.connect(self._on_pca_clicked)
        self.undo_button.clicked.connect(self._on_undo_clicked)
        super().__init__(ris_widget, color, geometry, on_geometry_change)
Exemple #2
0
    def __init__(self, rw, pca_stuff, avg_width_tck, save_dir):
        
        self.rw = rw
        self.flipbook = rw.flipbook
        self.flipbook.current_page_changed.connect(self.page_changed)
        self.display_path = None
        self.display_path1 = None
        self.pca_stuff = pca_stuff
        #self.spline_dict = spline_dict
        self.avg_width_tck = avg_width_tck
        self.undo = None

        self.layout = Qt.QFormLayout()
        spline_widget = Qt.QWidget()
        spline_widget.setLayout(self.layout)

        self.sv = Qt.QPushButton("View Spline")
        self.pca_button = Qt.QPushButton("Use PCA Average")
        self.undo_button = Qt.QPushButton("Undo")
        self.save_splines = Qt.QPushButton("Save Splines")
        self.save_dir = save_dir
        self.layout.addRow(self.sv)
        self.layout.addRow(self.pca_button)
        self.layout.addRow(self.undo_button)
        self.rw.flipbook.layout().addWidget(spline_widget)

        self.sv.clicked.connect(self._on_sv_clicked)
        self.pca_button.clicked.connect(self._on_pca_clicked)
        self.undo_button.clicked.connect(self._on_undo_clicked)
Exemple #3
0
 def __init__(self, parent=None):
     Qt.QWidget.__init__(self, parent)
     self.label = Qt.QLabel()
     formLayout = Qt.QFormLayout()
     layout = Qt.QGridLayout()
     layout.addWidget(self.label, 0, 0, 1, 3, QtCore.Qt.AlignCenter)
     self.setLayout(layout)
Exemple #4
0
    def __init__(self, parent=None):
        super(LaueFormWidget, self).__init__(parent)
        layout = Qt.QFormLayout(self)

        self._nCellsSpinBox = Qt.QSpinBox(self)
        self._nCellsSpinBox.setMinimum(2)
        layout.addRow("Number of unit cells:", self._nCellsSpinBox)

        self._oversamplingSpinBox = Qt.QSpinBox(self)
        self._oversamplingSpinBox.setMinimum(2)
        layout.addRow("Oversampling:", self._oversamplingSpinBox)

        self._hDoubleSpinBox = Qt.QDoubleSpinBox(self)
        layout.addRow("H:", self._hDoubleSpinBox)

        self._kDoubleSpinBox = Qt.QDoubleSpinBox(self)
        layout.addRow("K:", self._kDoubleSpinBox)

        pushButton = Qt.QPushButton("Run and Save", self)
        pushButton.clicked.connect(self.compute)
        layout.addRow(pushButton)

        self._sizeLabel = Qt.QLabel('')
        layout.addRow("Output size:", self._sizeLabel)
        self._updateSizeLabel()  # Initialize displayed size

        self._nCellsSpinBox.valueChanged.connect(self._updateSizeLabel)
        self._oversamplingSpinBox.valueChanged.connect(self._updateSizeLabel)
    def __init__(self, parent=None):
        super(LaueFormWidget, self).__init__(parent)
        self._result = None  # Placeholder for results

        layout = Qt.QFormLayout(self)

        self._nCellsLineEdit = Qt.QLineEdit()
        layout.addRow("Number of unit cells:", self._nCellsLineEdit)

        self._oversamplingLineEdit = Qt.QLineEdit()
        layout.addRow("Oversampling:", self._oversamplingLineEdit)

        self._hLineEdit = Qt.QLineEdit()
        layout.addRow("H:", self._hLineEdit)

        self._kLineEdit = Qt.QLineEdit()
        layout.addRow("K:", self._kLineEdit)

        runPushButton = Qt.QPushButton("Run")
        runPushButton.clicked.connect(self.compute)
        layout.addRow(runPushButton)

        self._savePushButton = Qt.QPushButton("Save")
        self._savePushButton.clicked.connect(self.save)
        self._savePushButton.setEnabled(False)
        layout.addRow(self._savePushButton)
Exemple #6
0
    def __init__(self, parent=None):

        Qt.QWidget.__init__(self, parent)

        self.label = Qt.QLabel()

        self.lineEdit = Qt.QLineEdit("ABCDE")
        self.fontComboBox = Qt.QFontComboBox()
        self.sizeSpinBox = Qt.QDoubleSpinBox()
        self.sizeSpinBox.setMinimum(1.0)
        self.sizeSpinBox.setValue(12.0)
        saveButton = Qt.QPushButton(self.tr("Save"))

        self.lineEdit.textChanged.connect(self.updateImage)
        self.fontComboBox.currentFontChanged.connect(self.updateImage)
        self.sizeSpinBox.valueChanged.connect(self.updateImage)
        saveButton.clicked.connect(self.saveImage)

        formLayout = Qt.QFormLayout()
        formLayout.addRow(self.tr("&Text:"), self.lineEdit)
        formLayout.addRow(self.tr("&Font:"), self.fontComboBox)
        formLayout.addRow(self.tr("Font &Size:"), self.sizeSpinBox)

        layout = Qt.QGridLayout()
        layout.addWidget(self.label, 0, 0, 1, 3, QtCore.Qt.AlignCenter)
        layout.addLayout(formLayout, 1, 0, 1, 3)
        layout.addWidget(saveButton, 2, 1)
        self.setLayout(layout)

        self.updateImage()
        self.setWindowTitle(self.tr("Paint Text"))
Exemple #7
0
    def __init__(self, changed_signal, parent=None):
        super().__init__(parent)
        l = Qt.QFormLayout()
        self.setLayout(l)
        self.intervals = None
        self.fpss = None
        self.last_interval = None
        self.last_fps = None
        self._sample_count = None
        self.acquired_sample_count = 0
        self.prev_t = None
        self.sample_count_spinbox = Qt.QSpinBox()
        self.sample_count_spinbox.setRange(2, 1024)
        self.sample_count_spinbox.valueChanged[int].connect(
            self._on_sample_count_spinbox_value_changed)
        l.addRow('Sample count:', self.sample_count_spinbox)
        fps_box = Qt.QHBoxLayout()
        fps_box.setSpacing(3)
        l.addRow(fps_box)
        self.rate_field = Qt.QLabel()
        self.rate_field.setFont(Qt.QFont('Courier'))
        rate_suffix = Qt.QLabel('fps')
        fps_box.addWidget(self.rate_field, alignment=Qt.Qt.AlignRight)
        fps_box.addWidget(rate_suffix, alignment=Qt.Qt.AlignLeft)
        fps_box.addSpacing(12)
        self.interval_field = Qt.QLabel()
        self.interval_field.setFont(Qt.QFont('Courier'))
        self.interval_suffix = Qt.QLabel()
        fps_box.addWidget(self.interval_field, alignment=Qt.Qt.AlignRight)
        fps_box.addWidget(self.interval_suffix, alignment=Qt.Qt.AlignLeft)

        self.sample_count = 60
        changed_signal.connect(self.notify)
    def __init__(self, expt_dir):
        '''
            expt_dir - superfolder for experiment
        '''
        self.rw = RisWidget()
        layout = Qt.QFormLayout()
        ME_widget = Qt.QWidget()
        ME_widget.setLayout(layout)

        self.edit = Qt.QPushButton("Edit Mask")
        layout.addRow(self.edit)
        self.nf = NoteField(parent=self.rw.qt_object)
        layout.addRow(self.nf)
        self.rw.flipbook.layout().addWidget(ME_widget)

        self.edit.clicked.connect(self._on_edit_clicked)
        self.rw.flipbook.pages_view.selectionModel().currentRowChanged.connect(
            self._on_page_change)

        self.file_globs = ['*bf.png', '*mask.png']
        self.expt_dir = pathlib.Path(expt_dir)
        self.work_dir = self.expt_dir / 'work_dir'  # Super folder for masks
        self.all_images, self.worm_positions = self.parse_inputs()

        self.editing = False
        self.working_file = None
        self.current_page = None

        # Search for annotation tsv
        tsvs = list(self.expt_dir.glob('*.tsv'))
        if len(tsvs) > 1: print('Warning: More than one tsv found')
        if len(tsvs) > 0:
            self.ann_fpath = tsvs[0]
        else:
            print('Warning: no tsv found')
            self.ann_fpath = None
        self.load_annotations()

        self.set_index(0)
        self.actions = []
        self._add_action(
            'prev_worm', Qt.Qt.Key_BracketLeft,
            lambda: self.load_next_worm(self.well_index, -1)
        )  # Changed these because I tended to accidentally hit side keys
        self._add_action('next_worm', Qt.Qt.Key_BracketRight,
                         lambda: self.load_next_worm(self.well_index, 1))
        self._add_action('Edit Mask', QtGui.QKeySequence('Ctrl+E'),
                         self._on_edit_clicked)
        self.rw.qt_object.main_view_toolbar.addAction(self.actions[-1])
        self._add_action('Goto Worm', QtGui.QKeySequence('Ctrl+G'),
                         self.goto_label)
        self.rw.qt_object.main_view_toolbar.addAction(self.actions[-1])
        self._add_action(
            'Reload Masks', QtGui.QKeySequence('Ctrl+R'),
            lambda: self.load_next_worm(self.well_index, 0))  # TODO Fix.
        self.rw.qt_object.main_view_toolbar.addAction(self.actions[-1])

        self.rw.show()
 def add_property_rows(self, properties):
     form = Qt.QFormLayout()
     form.setContentsMargins(0, 0, 0, 0)
     form.setVerticalSpacing(5)
     form.setLabelAlignment(Qt.Qt.AlignRight)
     form.setFieldGrowthPolicy(Qt.QFormLayout.ExpandingFieldsGrow)
     self.setLayout(form)
     for row, prop in enumerate(properties):
         self.make_widgets_for_property(row, prop)
Exemple #10
0
 def add_property_rows(self, properties, property_types):
     form = Qt.QFormLayout()
     form.setContentsMargins(0, 0, 0, 0)
     form.setVerticalSpacing(5)
     form.setLabelAlignment(Qt.Qt.AlignRight)
     form.setFieldGrowthPolicy(Qt.QFormLayout.ExpandingFieldsGrow)
     self.setLayout(form)
     for row, property in enumerate(properties):
         type, readonly = property_types.get(
             property, ('String', True)
         )  # if the property type isn't in the dict, assume its a readonly string
         self.make_widgets_for_property(row, property, type, readonly)
    def __init__(self, rw):
        self.rw = rw
        self.rw_warp = ris_widget.RisWidget()
        self.layout = Qt.QFormLayout()
        spline_widget = Qt.QWidget()
        spline_widget.setLayout(self.layout)

        self.warp = Qt.QPushButton("Warp Worm")
        self.clear = Qt.QPushButton("Clear")
        self.layout.addRow(self.warp)
        self.rw.flipbook.layout().addWidget(spline_widget)

        self.warp.clicked.connect(self._on_warp_clicked)
Exemple #12
0
    def __init__(self, rw, image_dir, out_dir):
        """
        Parameters
            rw - RisWidget object to load images into
            image_dir - str/pathlib.Path to directory images for loading
            out_dir - str/pathlib.Path to directory for saving overlays
        """

        self.rw = rw
        self.image_dir = pathlib.Path(image_dir)
        self.out_dir = pathlib.Path(out_dir)
        assert self.image_dir.exists()
        assert self.out_dir.exists()

        self.editing = False

        # To be low-maintenance, just add everything to the flipbook layout
        layout = Qt.QFormLayout()
        widget = Qt.QWidget()
        widget.setLayout(layout)
        self.rw.flipbook.layout().addWidget(widget)

        self.rw.add_painter()
        self.rw.flipbook_pages.clear()

        self.image_list = sorted(list(self.image_dir.glob('*.png')))
        for image_path in self.image_list:
            image = freeimage.read(image_path)
            image_list = flipbook.ImageList()
            image_list.append(rw_image.Image(data=image, name=image_path.name))
            if (self.out_dir / image_path.name).exists():
                image_list.append(
                    freeimage.read((self.out_dir / image_path.name)))
            else:
                image_shape = image.shape
                if len(image_shape) == 3:
                    image_list.append(numpy.zeros_like(image))
                else:
                    new_shape = list(image_shape) + [3]
                    image_list.append(
                        numpy.zeros(shape=new_shape).astype('uint8'))
            rw.flipbook_pages.append(image_list)

        self.rw.painter.brush_size.value = 9

        self.clear = self._add_button(layout, 'Clear All',
                                      self._on_clear_clicked)
        self.reload = self._add_button(layout, 'Reload Overlay',
                                       self._on_reload_clicked)
        self.save = self._add_button(layout, 'Save Overlay',
                                     self._on_save_clicked)
Exemple #13
0
 def __init__(self, scope, parent=None):
     super().__init__(scope, parent)
     self.limit_pixmaps_and_tooltips = LimitPixmapsAndToolTips()
     self.setWindowTitle('Stand')
     form = Qt.QFormLayout(self)
     form.setContentsMargins(0, 0, 0, 0)
     form.setVerticalSpacing(4)
     form.setLabelAlignment(Qt.Qt.AlignRight | Qt.Qt.AlignVCenter)
     form.setFieldGrowthPolicy(Qt.QFormLayout.ExpandingFieldsGrow)
     for property, widget_type, *widget_args in self.PROPERTIES:
         self.make_widgets_for_property(self.PROPERTY_ROOT + property,
                                        widget_type, widget_args)
     if hasattr(scope, 'job_runner'):
         form.addRow(status_widget.StatusWidget(scope))
Exemple #14
0
    def initGui(self):
        self.setWindowTitle("Polygon Solver")
        self._inputLine = Qt.QLineEdit(self)
        self._processButton = Qt.QPushButton(self)
        self._processButton.setText(u"Solve ax² + bx + c = 0")
        self._processButton.clicked.connect(self.processing)
        self._resultWidget = Qt.QLabel(self)

        widget = Qt.QWidget()
        layout = Qt.QFormLayout(widget)
        layout.addRow("Coefs a b c:", self._inputLine)
        layout.addRow("Solutions:", self._resultWidget)
        layout.addRow(self._processButton)
        self.setCentralWidget(widget)
Exemple #15
0
    def __init__(self):
        super().__init__()

        self.setWindowTitle('Widget-Info: exchange rate and weather')

        self.exchange_rate_USD = Qt.QLabel()
        self.exchange_rate_EUR = Qt.QLabel()

        self.weather_1 = Qt.QLabel()
        self.weather_2 = Qt.QLabel()
        self.weather_3 = Qt.QLabel()

        layout = Qt.QFormLayout()
        layout.addRow('USD:', self.exchange_rate_USD)
        layout.addRow('EUR:', self.exchange_rate_EUR)

        line = Qt.QFrame()
        line.setFrameShape(Qt.QFrame.HLine)
        line.setFrameShadow(Qt.QFrame.Sunken)
        line.setLineWidth(1)

        layout.addRow(line)

        layout.addRow('Магнитогорск:', self.weather_1)
        layout.addRow('Челябинск:', self.weather_2)
        layout.addRow('Екатеринбург:', self.weather_3)

        self.setLayout(layout)

        self.thread_exchange_rate_USD = ThreadExchangeRate(self, 'USD')
        self.thread_exchange_rate_USD.about_exchange_rate.connect(
            self.exchange_rate_USD.setText)
        self.thread_exchange_rate_USD.start()

        self.thread_exchange_rate_EUR = ThreadExchangeRate(self, 'EUR')
        self.thread_exchange_rate_EUR.about_exchange_rate.connect(
            self.exchange_rate_EUR.setText)
        self.thread_exchange_rate_EUR.start()

        self.thread_weather_1 = ThreadGetWeather(self, 'Магнитогорск')
        self.thread_weather_1.about_weather.connect(self.weather_1.setText)
        self.thread_weather_1.start()

        self.thread_weather_2 = ThreadGetWeather(self, 'Челябинск')
        self.thread_weather_2.about_weather.connect(self.weather_2.setText)
        self.thread_weather_2.start()

        self.thread_weather_3 = ThreadGetWeather(self, 'Екатеринбург')
        self.thread_weather_3.about_weather.connect(self.weather_3.setText)
        self.thread_weather_3.start()
Exemple #16
0
    def __init__(self, rw):
        '''
        '''
        self.rw = rw
        self.layout = Qt.QFormLayout()
        mask_widget = Qt.QWidget()
        mask_widget.setLayout(self.layout)

        self.edit = Qt.QPushButton("Edit Mask")
        self.layout.addRow(self.edit)
        self.rw.flipbook.layout().addWidget(mask_widget)

        self.edit.clicked.connect(self._on_edit_clicked)

        self.editing = False
Exemple #17
0
    def __init__(self, rw):

        self.rw = rw
        self.flipbook = rw.flipbook
        self.flipbook.current_page_changed.connect(self.page_changed)
        self.display_path = None
        self.display_path1 = None

        self.layout = Qt.QFormLayout()
        spline_widget = Qt.QWidget()
        spline_widget.setLayout(self.layout)

        self.sv = Qt.QPushButton("View Spline")
        self.layout.addRow(self.sv)
        self.rw.flipbook.layout().addWidget(spline_widget)

        self.sv.clicked.connect(self._on_sv_clicked)
    def __init__(self, rw):
        self.rw = rw
        self.layout = Qt.QFormLayout()
        spline_widget = Qt.QWidget()
        spline_widget.setLayout(self.layout)

        self.edit = Qt.QPushButton("Edit Spline Points")
        self.clear = Qt.QPushButton("Clear")
        self.layout.addRow(self.edit)
        self.layout.addRow(self.clear)
        self.clear.setVisible(False)
        self.rw.flipbook.layout().addWidget(spline_widget)

        self.edit.clicked.connect(self._on_edit_clicked)

        self.points = []
        self.editing = False
    def __init__(self, *args, **kwargs):
        super(LaueFormWidget, self).__init__(*args, **kwargs)
        layout = Qt.QFormLayout(self)

        self._nCellsLineEdit = Qt.QLineEdit(self)
        layout.addRow("Number of unit cells:", self._nCellsLineEdit)

        self._oversamplingLineEdit = Qt.QLineEdit(self)
        layout.addRow("Oversampling:", self._oversamplingLineEdit)

        self._hLineEdit = Qt.QLineEdit(self)
        layout.addRow("H:", self._hLineEdit)

        self._kLineEdit = Qt.QLineEdit(self)
        layout.addRow("K:", self._kLineEdit)

        pushButton = Qt.QPushButton("Run and Save", self)
        pushButton.clicked.connect(self._runAndSaveClicked)
        layout.addRow(pushButton)
Exemple #20
0
    def __init__(self, parent=None):
        super(LaueFormWidget, self).__init__(parent)
        layout = Qt.QFormLayout(self)

        self._nCellsLineEdit = Qt.QLineEdit(self)
        layout.addRow("Number of unit cells:", self._nCellsLineEdit)

        self._oversamplingLineEdit = Qt.QLineEdit(self)
        layout.addRow("Oversampling:", self._oversamplingLineEdit)

        self._hLineEdit = Qt.QLineEdit(self)
        layout.addRow("H:", self._hLineEdit)

        self._kLineEdit = Qt.QLineEdit(self)
        layout.addRow("K:", self._kLineEdit)

        pushButton = Qt.QPushButton("Run and Save", self)
        pushButton.clicked.connect(self.compute)
        layout.addRow(pushButton)
    def __init__(self, parent=None):
        super(LaueFormWidget, self).__init__(parent)
        layout = Qt.QFormLayout(self)

        self._nCellsSpinBox = Qt.QSpinBox(self)
        self._nCellsSpinBox.setMinimum(2)
        layout.addRow("Number of unit cells:", self._nCellsSpinBox)

        self._oversamplingSpinBox = Qt.QSpinBox(self)
        self._oversamplingSpinBox.setMinimum(2)
        layout.addRow("Oversampling:", self._oversamplingSpinBox)

        self._hDoubleSpinBox = Qt.QDoubleSpinBox(self)
        layout.addRow("H:", self._hDoubleSpinBox)

        self._kDoubleSpinBox = Qt.QDoubleSpinBox(self)
        layout.addRow("K:", self._kDoubleSpinBox)

        pushButton = Qt.QPushButton("Run and Save", self)
        pushButton.clicked.connect(self.compute)
        layout.addRow(pushButton)
Exemple #22
0
    def __init__(self, *args, **kwargs):
        super(LaueFormWidget, self).__init__(*args, **kwargs)
        self._processingThread = None  # Placeholder for thread

        layout = Qt.QFormLayout(self)

        self._nCellsLineEdit = Qt.QLineEdit(self)
        layout.addRow("Number of unit cells:", self._nCellsLineEdit)

        self._oversamplingLineEdit = Qt.QLineEdit(self)
        layout.addRow("Oversampling:", self._oversamplingLineEdit)

        self._hLineEdit = Qt.QLineEdit(self)
        layout.addRow("H:", self._hLineEdit)

        self._kLineEdit = Qt.QLineEdit(self)
        layout.addRow("K:", self._kLineEdit)

        self._pushButton = Qt.QPushButton(self._RUN_AND_SAVE, self)
        self._pushButton.clicked.connect(self._runAndSaveClicked)
        layout.addRow(self._pushButton)

        self._sigProcessingDone.connect(self._processingDone)
Exemple #23
0
 def __init__(self, ris_widget, fields, parent=None):
     super().__init__(parent)
     self.setAttribute(Qt.Qt.WA_DeleteOnClose)
     layout = Qt.QFormLayout()
     layout.setFieldGrowthPolicy(layout.ExpandingFieldsGrow)
     self.setLayout(layout)
     self.fields = []
     for field in fields:
         if isinstance(field, AnnotationField):
             self.fields.append(field)
             if isinstance(field.widget, Qt.QGroupBox):
                 layout.addRow(field.widget)
             else:
                 layout.addRow(field.name, field.widget)
         else:
             # assume a "group" of fields that has a fields and widget attribute
             self.fields.extend(field.fields)
             layout.addRow(field.widget)
     for field in self.fields:
         field.flipbook = ris_widget.flipbook
     self.flipbook = ris_widget.flipbook
     self.flipbook.current_page_changed.connect(self.update_fields)
     self.update_fields()
    def __init__(self, parent=None):
        super(LaueFormWidget, self).__init__(parent)
        self._processingThread = None  # Placeholder for the thread

        layout = Qt.QFormLayout(self)

        self._nCellsLineEdit = Qt.QLineEdit(self)
        layout.addRow("Number of unit cells:", self._nCellsLineEdit)

        self._oversamplingLineEdit = Qt.QLineEdit(self)
        layout.addRow("Oversampling:", self._oversamplingLineEdit)

        self._hLineEdit = Qt.QLineEdit(self)
        layout.addRow("H:", self._hLineEdit)

        self._kLineEdit = Qt.QLineEdit(self)
        layout.addRow("K:", self._kLineEdit)

        self._pushButton = Qt.QPushButton("Run and Save", self)
        self._pushButton.clicked.connect(self._runClicked)
        layout.addRow(self._pushButton)

        # Connect a method to handle the processing done
        self._sigProcessingDone.connect(self._processingDone)
from PyQt5 import Qt


def get_horizontal_line():
    line = Qt.QFrame()
    line.setFrameShape(Qt.QFrame.HLine)
    line.setFrameShadow(Qt.QFrame.Sunken)
    line.setLineWidth(1)

    return line


app = Qt.QApplication([])

layout = Qt.QFormLayout()
layout.addRow('First', Qt.QLineEdit())
layout.addRow('Last', Qt.QLineEdit())
layout.addRow(get_horizontal_line())

layout.addRow('Phone', Qt.QLineEdit())
layout.addRow(get_horizontal_line())

layout.addRow('Ok?', Qt.QCheckBox())

mw = Qt.QWidget()
mw.setLayout(layout)
mw.show()

app.exec()
Exemple #26
0
    def setupUi(self, MainWindow):
        self.mainwindow = MainWindow
        MainWindow.setWindowTitle("CIL Viewer")
        MainWindow.resize(800, 600)

        # Contains response from open file dialog
        self.fn = None

        # Set linked state
        self.linked = True

        # Create link icon for inital load state.
        link_icon = QtGui.QIcon()
        link_icon.addPixmap(QtGui.QPixmap('icons/link.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off)

        # Set numpy data array for graph
        self.graph_numpy_input_data = None

        # Dockable window flag
        self.hasDockableWindow = False

        self.centralwidget = QtWidgets.QWidget(MainWindow)

        # Central widget layout
        self.main_widget_form_layout = QtWidgets.QGridLayout(self.centralwidget)

        # Add the 2D viewer widget
        self.viewerWidget = QVTKWidget(viewer=CILViewer2D, interactorStyle=vlink.Linked2DInteractorStyle)
        self.centralwidget.setStyleSheet("background-color: rgb(25,51,101)")

        self.linkButton2D = QtWidgets.QPushButton(self.viewerWidget)
        self.linkButton2D.setIcon(link_icon)
        self.linkButton2D.setGeometry(0, 0, 30, 30)
        self.linkButton2D.setStyleSheet("background-color: whitesmoke")
        self.linkButton2D.setToolTip("State: Linked. Toggle status of link between 2D and 3D viewers")

        self.linkButton2D.clicked.connect(self.linkViewers)

        self.main_widget_form_layout.addWidget(self.linkButton2D, 0,0,1,1)
        self.main_widget_form_layout.addItem(QtWidgets.QSpacerItem(1,1,QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Maximum),0,1,1,1)
        self.main_widget_form_layout.addWidget(self.viewerWidget,1,0,1,2)

        # Add the graph widget
        self.graphWidget = QVTKWidget(viewer=UndirectedGraph)

        self.graphDock = QtWidgets.QDockWidget(MainWindow)
        self.graphDock.setMinimumWidth(300)
        self.graphDock.setWidget(self.graphWidget)
        self.graphDock.setWindowTitle("Graph View")

        MainWindow.addDockWidget(QtCore.Qt.LeftDockWidgetArea, self.graphDock)

        # Add the 3D viewer widget
        self.viewer3DWidget = QVTKWidget(viewer=CILViewer, interactorStyle=vlink.Linked3DInteractorStyle)

        self.Dock3DContents = QtWidgets.QWidget()
        self.Dock3DContents.setStyleSheet("background-color: rgb(25,51,101)")
        f_layout3D = Qt.QFormLayout(self.Dock3DContents)

        self.Dock3D = QtWidgets.QDockWidget(MainWindow)
        self.Dock3D.setMinimumWidth(300)
        self.Dock3D.setWindowTitle("3D View")

        self.linkButton3D = QtWidgets.QPushButton(self.viewer3DWidget)
        self.linkButton3D.setIcon(link_icon)
        self.linkButton3D.setGeometry(0,0,30,30)
        self.linkButton3D.setStyleSheet("background-color: whitesmoke")
        self.linkButton3D.setToolTip("State: Linked. Toggle status of link between 2D and 3D viewers")

        self.linkButton3D.clicked.connect(self.linkViewers)

        f_layout3D.addWidget(self.linkButton3D)
        f_layout3D.addWidget(self.viewer3DWidget)
        self.Dock3D.setWidget(self.Dock3DContents)
        MainWindow.addDockWidget(QtCore.Qt.LeftDockWidgetArea, self.Dock3D)

        # Set central widget
        MainWindow.setCentralWidget(self.centralwidget)

        # Create menu actions
        openAction = QtWidgets.QAction("Open", MainWindow)
        openAction.setShortcut("Ctrl+O")
        openAction.triggered.connect(self.openFile)

        closeAction = QtWidgets.QAction("Close", MainWindow)
        closeAction.setShortcut("Ctrl+Q")
        closeAction.triggered.connect(self.close)

        #Create status bar
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        MainWindow.setStatusTip('Open file to begin visualisation...')
        MainWindow.setStatusBar(self.statusbar)

        # Initially link viewers
        self.linkedViewersSetup()
        self.link2D3D.enable()

        # Create the toolbar
        self.toolbar()

        # Add threading
        self.threadpool = QtCore.QThreadPool()
        self.e = ErrorObserver()

        # Add progress bar
        self.progressBar = QtWidgets.QProgressBar()
        self.progressBar.setMaximumWidth(250)
        self.progressBar.hide()
        self.statusbar.addPermanentWidget(self.progressBar)
        
        self.err = vtk.vtkFileOutputWindow()
        self.err.SetFileName("error.log")
        vtk.vtkOutputWindow.SetInstance(self.err)
    def _update_form(self):
        payload = self.session.first_payload
        if not isinstance(payload, aioxmpp.forms.Data):
            self.ui.form_widget.hide()
            return

        self.ui.form_widget.show()
        if payload.title:
            self.ui.title.show()
            self.ui.title.setText(payload.title)
        else:
            self.ui.title.hide()

        if payload.instructions:
            self.ui.instructions.show()
            self.ui.instructions.setText("<p>{}</p>".format("</p><p>".join(
                map(html.escape, payload.instructions))))
        else:
            self.ui.instructions.hide()

        if self.form_area is not None:
            self.ui.form_widget.layout().removeWidget(self.form_area)
            self.ui.form_widget.children().remove(self.form_area)
            self.form_area.deleteLater()

        self.form_area = Qt.QScrollArea()
        layout = Qt.QFormLayout()
        self.form_area.setLayout(layout)
        self.ui.form_widget.layout().addWidget(self.form_area)

        self.fieldmap = {}
        for field in payload.fields:
            if field.var == "FORM_TYPE":
                continue
            label, widget = None, None
            if field.type_ == aioxmpp.forms.FieldType.FIXED:
                label = Qt.QLabel(field.values[0])
                layout.addRow(label)
            elif field.type_ in {
                    aioxmpp.forms.FieldType.LIST_SINGLE,
                    aioxmpp.forms.FieldType.LIST_MULTI
            }:
                label = Qt.QLabel(field.label)
                widget = Qt.QListWidget()
                for opt_value, opt_label in sorted(field.options.items()):
                    item = Qt.QListWidgetItem(opt_label, widget)
                    item.setData(Qt.Qt.UserRole, opt_value)
                    widget.addItem(item)

                if field.type_.is_multivalued:
                    widget.setSelectionMode(
                        Qt.QAbstractItemView.MultiSelection)
                else:
                    widget.setSelectionMode(
                        Qt.QAbstractItemView.SingleSelection)
                layout.addRow(label, widget)

            elif field.type_ in {
                    aioxmpp.forms.FieldType.TEXT_SINGLE,
                    aioxmpp.forms.FieldType.JID_SINGLE
            }:
                label = Qt.QLabel(field.label)
                widget = Qt.QLineEdit()
                if field.values:
                    widget.setText(field.values[0])
                layout.addRow(label, widget)

            elif field.type_ in {aioxmpp.forms.FieldType.TEXT_PRIVATE}:
                label = Qt.QLabel(field.label)
                widget = Qt.QLineEdit()
                widget.setEchoMode(Qt.QLineEdit.Password)
                widget.setInputMethodHints(Qt.Qt.ImhHiddenText
                                           | Qt.Qt.ImhNoPredictiveText
                                           | Qt.Qt.ImhNoAutoUppercase)
                if field.values:
                    widget.setText(field.values[0])
                layout.addRow(label, widget)

            elif field.type_ in {
                    aioxmpp.forms.FieldType.TEXT_MULTI,
                    aioxmpp.forms.FieldType.JID_MULTI
            }:
                label = Qt.QLabel(field.label)
                widget = Qt.QTextEdit()
                widget.setText("\n".join(field.values))
                widget.setAcceptRichText(False)
                layout.addRow(label, widget)

            else:
                self.fail("unhandled field type: {}".format(field.type_))

            self.fieldmap[field.var] = label, widget
    def __init__(self, *args, **kwargs):
        super(LaueMainWindow, self).__init__(*args, **kwargs)
        self._resultData = None
        self._processingThread = None

        self._sigProcessingDone.connect(self._processingDone)

        self.setWindowTitle("Laue simulation of a square 2D cristal")

        menuBar = self.menuBar()
        fileMenu = menuBar.addMenu("File")
        self._saveAction = fileMenu.addAction("Save",
                                              self._save,
                                              shortcut=Qt.QKeySequence.Save)
        self._saveAction.setEnabled(False)
        fileMenu.addSeparator()
        app = Qt.QApplication.instance()
        fileMenu.addAction("Quit", app.quit, shortcut=Qt.QKeySequence.Quit)

        centralWidget = Qt.QWidget(self)
        layout = Qt.QFormLayout(centralWidget)

        self._nCellsLineEdit = IntLineEdit(parent=centralWidget, bottom=1)
        self._nCellsLineEdit.setValue(10)
        self._nCellsLineEdit.setAlignment(Qt.Qt.AlignRight)
        self._nCellsLineEdit.textChanged.connect(
            self._updateOutputSize)  # or editingFinished
        layout.addRow("Number of unit cells:", self._nCellsLineEdit)

        self._oversamplingLineEdit = IntLineEdit(parent=centralWidget,
                                                 bottom=1)
        self._oversamplingLineEdit.setValue(5)
        self._oversamplingLineEdit.setAlignment(Qt.Qt.AlignRight)
        self._oversamplingLineEdit.textChanged.connect(
            self._updateOutputSize)  # or editingFinished
        layout.addRow("Oversampling:", self._oversamplingLineEdit)

        layout.addRow(HorizontalLine())

        self._hLineEdit = IntLineEdit(parent=centralWidget, bottom=0)
        self._hLineEdit.setValue(0)
        self._hLineEdit.setAlignment(Qt.Qt.AlignRight)
        layout.addRow("H:", self._hLineEdit)

        self._kLineEdit = IntLineEdit(parent=centralWidget, bottom=0)
        self._kLineEdit.setValue(0)
        self._kLineEdit.setAlignment(Qt.Qt.AlignRight)
        layout.addRow("K:", self._kLineEdit)

        self._pushButton = Qt.QPushButton("Run", centralWidget)
        self._pushButton.clicked.connect(self._runClicked)
        layout.addRow(self._pushButton)

        layout.addRow(HorizontalLine())

        self._outputSizeLabel = Qt.QLabel(centralWidget)
        self._outputSizeLabel.setTextInteractionFlags(
            Qt.Qt.TextSelectableByMouse)  # Allow copy
        self._outputSizeLabel.setAlignment(Qt.Qt.AlignRight)
        layout.addRow("Output size:", self._outputSizeLabel)

        label = Qt.QLabel("Result preview:", centralWidget)
        layout.addRow(label)

        self._resultLabel = Qt.QLabel(centralWidget)
        self._resultLabel.setText("<i>Press run to generate data</i>")
        self._resultLabel.setAlignment(Qt.Qt.AlignHCenter)
        layout.addRow(self._resultLabel)

        self._saveButton = Qt.QPushButton("Save", centralWidget)
        self._saveButton.clicked.connect(self._save)
        self._saveButton.setEnabled(False)
        layout.addRow(self._saveButton)

        centralWidget.setLayout(layout)
        self.setCentralWidget(centralWidget)

        # Init output size
        self._updateOutputSize()