Example #1
0
class OnlineTesting(QWidget):
    def __init__(self):
        super().__init__()

        self.init_ui()

    def init_ui(self):

        top_layout = QVBoxLayout()
        top_layout.setContentsMargins(10, 10, 10, 10)
        top_layout.setSpacing(15)

        #
        # Top "message box" / time remaining
        #
        message_layout = QHBoxLayout()
        self.status_label = QLabel("Waiting for Preparation...")
        self.status_label.setStyleSheet(" font-weight: bold; font-size: 18pt; "
                                        "   color: red;")
        self.status_label.setAlignment(Qt.AlignCenter)
        self.progress_label = QLabel("0.0s (1 / 1)")
        self.progress_label.setStyleSheet(" font-size: 16pt; color: black;")
        self.progress_label.setAlignment(Qt.AlignCenter)
        message_layout.addWidget(self.status_label)
        message_layout.addWidget(self.progress_label)
        message_layout.setStretch(0, 66)
        message_layout.setStretch(1, 33)
        top_layout.addLayout(message_layout)

        #
        # Video player
        #
        video_layout = QHBoxLayout()
        self.video_player = QMediaPlayer(None, QMediaPlayer.VideoSurface)
        video_widget = QVideoWidget()
        self.video_player.setVideoOutput(video_widget)

        video_layout.addWidget(video_widget)

        descrip_layout = QVBoxLayout()
        self.desc_title = QLabel("No Movement")
        self.desc_title.setStyleSheet(
            "border: 4px solid gray; font-weight: bold; font-size: 14pt;")
        self.desc_title.setAlignment(Qt.AlignCenter)
        self.desc_explain = QTextEdit("No description available.")
        self.desc_explain.setStyleSheet(
            "border: 4px solid gray; font-size: 12pt; border-color: black;")
        self.desc_explain.setReadOnly(True)
        descrip_layout.addWidget(self.desc_title)
        descrip_layout.addWidget(self.desc_explain)
        video_layout.addLayout(descrip_layout)

        video_layout.setStretch(0, 66)
        video_layout.setStretch(1, 33)
        top_layout.addLayout(video_layout)

        #
        # Preparation Box
        #
        parameters_box = QGroupBox()
        parameters_box.setTitle("Preparation Phase")
        parameters_box.setObjectName("CollecParamBox")
        parameters_box.setStyleSheet(
            "QGroupBox#CollecParamBox { border: 1px solid gray; border-radius: 7px; margin-top: 2em;"
            "                              font-weight: bold; background-color: #dddddd;}"
            "QGroupBox#CollecParamBox::title { subcontrol-origin: margin; subcontrol-position: top center; "
            " border: 1px solid gray; border-radius: 7px;"
            "padding-left: 10px; "
            "padding-right: 10px;}")
        font = parameters_box.font()
        font.setPointSize(16)
        parameters_box.setFont(font)
        parameters_box.setSizePolicy(QSizePolicy.Expanding,
                                     QSizePolicy.Expanding)
        top_layout.addWidget(parameters_box)

        prep_layout = QHBoxLayout()
        prep_layout.setSpacing(10)
        parameters_box.setLayout(prep_layout)

        #
        # Preparation Box: Model Selection
        #
        model_select = QGridLayout()
        model_select.setContentsMargins(0, 0, 10, 0)
        model_button = QPushButton("Select Model")
        model_button.setStyleSheet("font-weight: bold")
        model_select.addWidget(model_button, 0, 0, 1, 2)

        hline = QFrame()
        hline.setFrameShape(QFrame.HLine)
        hline.setFrameShadow(QFrame.Sunken)
        model_select.addWidget(hline, 1, 0, 1, 2)

        name_title = QLabel("Name")
        model_select.addWidget(name_title, 2, 0)
        samples_title = QLabel("Samples")
        model_select.addWidget(samples_title, 3, 0)

        self.model_name = QLineEdit()
        self.model_name.setReadOnly(True)
        model_select.addWidget(self.model_name, 2, 1)
        self.samples_field = QLineEdit()
        self.samples_field.setReadOnly(True)
        model_select.addWidget(self.samples_field, 3, 1)
        prep_layout.addLayout(model_select)

        model_select.setRowStretch(0, 2)
        model_select.setRowStretch(1, 1)
        model_select.setRowStretch(2, 2)
        model_select.setRowStretch(3, 2)

        # Note: No copy constructors for Qt5 objects...
        vline = QFrame()
        vline.setFrameShape(QFrame.VLine)
        vline.setFrameShadow(QFrame.Sunken)
        vline2 = QFrame()
        vline2.setFrameShape(QFrame.VLine)
        vline2.setFrameShadow(QFrame.Sunken)
        vline3 = QFrame()
        vline3.setFrameShape(QFrame.VLine)
        vline3.setFrameShadow(QFrame.Sunken)
        prep_layout.addWidget(vline)

        #
        # Preparation Box: Generate Noise Model
        #
        noise_layout = QVBoxLayout()
        noise_button = QPushButton("Collect Noise")
        noise_button.setStyleSheet("font-weight: bold")
        noise_layout.addWidget(noise_button)
        collect_title = QLabel("Duration")
        collect_title.setAlignment(Qt.AlignCenter | Qt.AlignBottom)

        hline2 = QFrame()
        hline2.setFrameShape(QFrame.HLine)
        hline2.setFrameShadow(QFrame.Sunken)
        noise_layout.addWidget(hline2)
        noise_layout.addWidget(collect_title)

        self.noise_duration = QLineEdit("15.0")
        self.noise_duration.setAlignment(Qt.AlignCenter)
        noise_layout.addWidget(self.noise_duration)

        prep_layout.addLayout(noise_layout)
        prep_layout.addWidget(vline2)
        noise_layout.setStretch(0, 2)
        noise_layout.setStretch(1, 1)
        noise_layout.setStretch(2, 2)
        noise_layout.setStretch(3, 2)

        #
        # Preparation Box: Devices Connected
        #
        connected_layout = QVBoxLayout()
        connected_title = QLabel("Devices Connected")
        connected_title.setAlignment(Qt.AlignCenter)
        connected_title.setStyleSheet("font-weight: bold")
        connected_layout.addWidget(connected_title)
        self.devices_connected = QPushButton()
        #self.devices_connected.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)

        hline3 = QFrame()
        hline3.setFrameShape(QFrame.HLine)
        hline3.setFrameShadow(QFrame.Sunken)
        connected_layout.addWidget(hline3)
        connected_layout.setStretchFactor(connected_title, 2)
        connected_layout.setStretchFactor(hline3, 1)
        connected_layout.setStretchFactor(self.devices_connected, 4)

        connected_layout.addWidget(self.devices_connected)
        prep_layout.addLayout(connected_layout)
        prep_layout.addWidget(vline3)

        #
        # Online Testing Parameters
        #
        param_layout = QGridLayout()
        test_title = QLabel("Test Parameters")
        test_title.setAlignment(Qt.AlignCenter)
        test_title.setStyleSheet("font-weight: bold")
        param_layout.addWidget(test_title, 0, 0, 1, 2)

        hline4 = QFrame()
        hline4.setFrameShape(QFrame.HLine)
        hline4.setFrameShadow(QFrame.Sunken)
        param_layout.addWidget(hline4, 1, 0, 1, 2)

        self.pred_min_duration = QLineEdit("2.0")
        self.pred_max_duration = QLineEdit("4.0")
        self.min_title = QLabel("<b>(Min)</b> Duration")
        self.max_title = QLabel("<b>(Max)</b> Duration")

        param_layout.addWidget(self.min_title, 2, 0)
        param_layout.addWidget(self.max_title, 3, 0)
        param_layout.addWidget(self.pred_min_duration, 2, 1)
        param_layout.addWidget(self.pred_max_duration, 3, 1)
        prep_layout.addLayout(param_layout)

        #
        # Preparation Phase formatting
        #
        prep_layout.setStretchFactor(model_select, 4)
        prep_layout.setStretchFactor(noise_layout, 2)
        prep_layout.setStretchFactor(connected_layout, 5)
        prep_layout.setStretchFactor(param_layout, 4)

        top_layout.setStretch(0, 1)
        top_layout.setStretch(1, 15)
        top_layout.setStretch(2, 3)

        self.setLayout(top_layout)

    def device_connected(self, address, rssi, battery):

        new_device = MyoConnectedWidget(address, rssi, battery)
        temp_widget = QListWidgetItem()
        temp_widget.setBackground(Qt.gray)
        size_hint = new_device.sizeHint()
        size_hint.setHeight(40)
        temp_widget.setSizeHint(size_hint)
        self.devices_connected.addItem(temp_widget)
        self.devices_connected.setItemWidget(temp_widget, new_device)

    def device_disconnected(self, address):

        num_widgets = self.devices_connected.count()

        for idx in range(num_widgets):
            # Ignore port widgets (only interested in Myo device rows)
            list_widget = self.devices_connected.item(idx)
            myo_widget = self.devices_connected.itemWidget(list_widget)

            if myo_widget.address.endswith(address):
                self.devices_connected.takeItem(idx)
                break