Exemple #1
0
    def createEditor(self, parent: QWidget, option: QStyleOptionViewItem,
                     index: QModelIndex) -> QWidget:
        """
        The set of editors that we have defined here are only good for small-dimensioned registers with a few values.
        They are not good for unstructured data and large arrays. For that, shall the need arise, we'll need to define
        dedicated complex widgets. Luckily, it is very easy to do, just not really necessary at the moment.
        The framework doesn't care what kind of widget we're displaying when editing, it's just a basic pop-up that
        appears on top of the view.
        """
        register = self._get_register_from_index(index)
        _logger.info("Constructing editor for %r", register)

        if self._can_use_bool_switch(register):
            editor = QComboBox(parent)
            editor.setEditable(False)
            editor.addItem(get_icon("cancel"), "False (0)")
            editor.addItem(get_icon("ok"), "True (1)")
        elif self._can_use_spinbox(register):
            minimum, maximum = register.min_value[0], register.max_value[0]

            try:
                dtype = Register.get_numpy_type(register.type_id)
                float_decimals = (
                    int(abs(math.log10(numpy.finfo(dtype).resolution)) + 0.5) +
                    1)
            except ValueError:
                float_decimals = None

            if float_decimals is not None:
                step = (maximum -
                        minimum) / _MIN_PREFERRED_NUMBER_OF_STEPS_IN_FULL_RANGE
                try:
                    step = 10**round(math.log10(step))
                except ValueError:
                    step = 1  # Math domain error corner case

                step = min(
                    1.0, step)  # Step can't be greater than one for UX reasons
                _logger.info(
                    "Constructing QDoubleSpinBox with single step set to %r",
                    step)
                editor = QDoubleSpinBox(parent)
                editor.setSingleStep(step)
                editor.setDecimals(float_decimals)
            else:
                editor = QSpinBox(parent)

            editor.setMinimum(minimum)
            editor.setMaximum(maximum)
        else:
            editor = QPlainTextEdit(parent)
            editor.setFont(get_monospace_font())
            editor.setMinimumWidth(
                QFontMetrics(editor.font()).width("9" * (MAX_LINE_LENGTH + 5)))

        editor.setFont(Model.get_font())

        self._message_display_callback("Press Esc to cancel editing")

        return editor
Exemple #2
0
    def createEditor(self):
        # setup data model
        self._model = QSqlTableModel()
        self._model.setTable(self.table)
        self._col = self._model.fieldIndex(self.column)

        # setup filter model for sorting and filtering
        self._proxy = QSortFilterProxyModel()
        self._proxy.setFilterCaseSensitivity(Qt.CaseInsensitive)
        self._proxy.setSourceModel(self._model)
        self._proxy.setFilterKeyColumn(self._col)

        # setup completer
        self._completer = QCompleter()
        self._completer.setModel(self._proxy)
        self._completer.setCompletionColumn(self._col)
        self._completer.setCompletionMode(QCompleter.UnfilteredPopupCompletion)

        # setup combobox
        editor = QComboBox()
        editor.setModel(self._proxy)
        editor.setModelColumn(self._col)
        editor.setEditable(True)
        editor.setFocusPolicy(Qt.StrongFocus)
        editor.setInsertPolicy(QComboBox.NoInsert)
        editor.setCompleter(self._completer)

        # setup connections
        editor.currentTextChanged[str].connect(self.onActivated)

        # setup editor appearence
        style = self.style()
        editor.setStyleSheet(style)
        editor.lineEdit().setStyleSheet(style)
        font = editor.font()
        self._completer.popup().setFont(font)

        return editor
    def __init__(self):
        super().__init__()

        self.setWindowTitle("My app")

        widget = QComboBox()

        # font
        font = widget.font()
        font.setPointSize(10)
        widget.setFont(font)

        # set if the number of tabs are changed.
        widget.currentIndexChanged.connect(self.index_changed)
        # set if the text of the tabs are changed.
        widget.currentTextChanged.connect(self.text_changed)

        # set editable - bool
        widget.setEditable(True)
        widget.setInsertPolicy(QComboBox.InsertAlphabetically)

        # set widget policy - IF EXISTS
        self.setCentralWidget(widget)
    def __init__(self, parent=None):
        super(GUI_OSC, self).__init__(parent)
        self.setWindowTitle("Interactive Music Generation")
        self.font_size = 14

        self.verbose = 1  # 2 = too much, 1 = enough, 0 will be silent
        self.last = None

        # Init OSC - output
        address = "127.0.0.1"
        port = 8008
        self.osc = OSCClient(address, port, encoding='utf8')
        self.text = ""

        # Init MIDI controller - input
        device_id = 1
        import platform
        if 'linux' in platform.system().lower():  # linux / windows
            device_id = 3

        print_device_info()
        function_to_call_pad_click = self.midi_bound_pad_click
        function_to_call_xy_pad = self.midi_bound_xy_pad
        midi_controller = MIDI_Input_Handler(device_id,
                                             function_to_call_pad_click,
                                             function_to_call_xy_pad)

        threading.Thread(target=midi_controller.input_loop, args=[]).start()
        print("Initiated midi controller! device_id=", device_id)

        # empty saved positions for midi bound clicks
        self.saved_positions = {}
        self.load_midi_positions()

        import settings
        import cooked_files_handler

        self.settings = settings.Settings()
        self.songs_models = cooked_files_handler.CookedFilesHandler(
            self.settings)
        self.songs_models.prepare_songs_models_paths()

        # Init on screen GUI - input
        layout = QVBoxLayout()
        style = "QWidget {font-size: " + str(self.font_size) + "pt;}"

        hbox_model_select = QHBoxLayout()
        text_model_select = QLabel()
        text_model_select.setText("Model selection:")
        text_model_select.setStyleSheet(style)
        model_select = QComboBox()
        for model_path in self.songs_models.model_paths:
            just_model = model_path.split("/")[-1]
            just_model = just_model[0:min(len(just_model), 30)]
            model_select.addItem(just_model)

        self.model_select = model_select
        model_select.currentIndexChanged.connect(
            self.onChangeSend)  # <<< On change function
        font = model_select.font()
        font.setPointSize(self.font_size)
        model_select.setFont(font)

        hbox_model_select.addWidget(text_model_select)
        hbox_model_select.addWidget(model_select)

        layout.addLayout(hbox_model_select)

        # Sliders
        percentage, self.percentage_slider = self.add_slider(
            "Relative position in audio:",
            style,
            value=self.DEFAULT_POSITION,
            maximum=1000)
        length, self.length_slider = self.add_slider("Length:",
                                                     style,
                                                     value=self.DEFAULT_LENGTH,
                                                     maximum=124,
                                                     minimum=4)
        change_speed, self.change_speed_slider = self.add_slider(
            "Transition speed:",
            style,
            value=self.DEFAULT_CHANGESPEED,
            maximum=200)
        volume, self.volume_slider = self.add_slider("Volume:",
                                                     style,
                                                     value=self.DEFAULT_VOLUME,
                                                     maximum=300)
        weights_multiplier, self.weights_multiplier = self.add_double_slider(
            "Weights Multiplier:", style, minimum=-1, value=1, maximum=2)

        layout.addLayout(percentage)
        layout.addLayout(length)
        layout.addLayout(change_speed)
        layout.addLayout(volume)
        layout.addLayout(weights_multiplier)

        # Record button
        hbox_record = QHBoxLayout()
        recButton = QPushButton("Save!")
        recButton.setStyleSheet(style)
        hbox_record.addWidget(recButton)
        recButton.setCheckable(True)

        file_textbox = QLineEdit()
        file_textbox.setText("tmp_recording1")
        hbox_record.addWidget(file_textbox)

        self.file_textbox = file_textbox
        self.recButton = recButton
        self.recButton_state = False
        recButton.clicked.connect(self.recording_toggle)

        layout.addLayout(hbox_record)

        self.setLayout(layout)
    def __init__(self, parent=None):
        super(GUI_OSC, self).__init__(parent)
        self.setWindowTitle("Interactive Music Generation")
        self.font_size = 14

        address = "127.0.0.1"
        port = 8008
        self.osc = OSCClient(address, port, encoding='utf8')
        self.text = ""

        import settings
        import cooked_files_handler

        self.settings = settings.Settings()
        self.songs_models = cooked_files_handler.CookedFilesHandler(
            self.settings)
        self.songs_models.prepare_songs_models_paths()

        layout = QVBoxLayout()
        style = "QWidget {font-size: " + str(self.font_size) + "pt;}"

        hbox_model_select = QHBoxLayout()
        text_model_select = QLabel()
        text_model_select.setText("Model selection:")
        text_model_select.setStyleSheet(style)
        model_select = QComboBox()
        for model_path in self.songs_models.model_paths:
            just_model = model_path.split("/")[-1]
            just_model = just_model[0:min(len(just_model), 30)]
            model_select.addItem(just_model)

        self.model_select = model_select
        model_select.currentIndexChanged.connect(
            self.onChangeSend)  # <<< On change function
        font = model_select.font()
        font.setPointSize(self.font_size)
        model_select.setFont(font)

        hbox_model_select.addWidget(text_model_select)
        hbox_model_select.addWidget(model_select)

        layout.addLayout(hbox_model_select)

        # Sliders
        percentage, self.percentage_slider = self.add_slider(
            "Relative position in audio:", style, value=200, maximum=1000)
        length, self.length_slider = self.add_slider("Length:",
                                                     style,
                                                     value=64,
                                                     maximum=124,
                                                     minimum=4)
        change_speed, self.change_speed_slider = self.add_slider(
            "Transition speed:", style, value=80, maximum=200)
        volume, self.volume_slider = self.add_slider("Volume:",
                                                     style,
                                                     value=100,
                                                     maximum=300)
        weights_multiplier, self.weights_multiplier = self.add_double_slider(
            "Weights Multiplier:", style, minimum=-1, value=1, maximum=2)

        layout.addLayout(percentage)
        layout.addLayout(length)
        layout.addLayout(change_speed)
        layout.addLayout(volume)
        layout.addLayout(weights_multiplier)

        # Record button
        hbox_record = QHBoxLayout()
        recButton = QPushButton("Save!")
        recButton.setStyleSheet(style)
        hbox_record.addWidget(recButton)
        recButton.setCheckable(True)

        file_textbox = QLineEdit()
        file_textbox.setText("tmp_recording1")
        hbox_record.addWidget(file_textbox)

        self.file_textbox = file_textbox
        self.recButton = recButton
        self.recButton_state = False
        recButton.clicked.connect(self.recording_toggle)

        layout.addLayout(hbox_record)

        self.setLayout(layout)
Exemple #6
0
class MainWidget(QWidget):
    def __init__(self, url):
        super().__init__()
        fontDB = QFontDatabase()
        fontDB.addApplicationFont(':/mono-font')
        # fontDB.addApplicationFont(':/Taipei-font')
        screen = QDesktopWidget().screenGeometry()
        self.width, self.height = screen.width(), screen.height()
        self.html = ''
        self.url = url
        self.GI = None
        self.DL = None
        self.web_view = QWebEngineView(self)
        self.web_view.load(QUrl(self.url))
        self.web_view.page().titleChanged.connect(self.get_html)
        btnExit = QPushButton('', self)
        btnExit.setIcon(QIcon(':/exit-icon'))
        btnExit.setIconSize(QSize(32, 32))
        btnExit.setToolTip('Exit')
        btnExit.clicked.connect(QApplication.quit)
        self.btnHome = QPushButton('', self)
        self.btnHome.setIcon(QIcon(':/home-icon'))
        self.btnHome.setIconSize(QSize(32, 32))
        self.btnHome.setToolTip('Home')
        self.btnHome.clicked.connect(self.goHome)
        self.btnBack = QPushButton('', self)
        self.btnBack.setIcon(QIcon(':/go_back-icon'))
        self.btnBack.setIconSize(QSize(32, 32))
        self.btnBack.setToolTip('Backward')
        self.btnBack.clicked.connect(self.goBack)
        self.btnBack.setDisabled(True)
        self.btnNext = QPushButton('', self)
        self.btnNext.setIcon(QIcon(':/go_forward-icon'))
        self.btnNext.setIconSize(QSize(32, 32))
        self.btnNext.setToolTip('Forward')
        self.btnNext.clicked.connect(self.goForward)
        self.btnNext.setDisabled(True)
        self.cmbDownList = QComboBox(self)
        self.cmbDownList.setMinimumHeight(40)
        # font = self.cmbDownList.font()
        font = QFont('Liberation Mono')
        font.setPointSize(14)
        self.cmbDownList.setFont(font)
        self.cmbDownList.setIconSize(QSize(24, 24))
        self.cmbDownList.currentIndexChanged.connect(self.onIndexChanged)
        self.cmbDownList.setToolTip('Select a stream to download')
        self.cmbCapsList = QComboBox(self)
        self.cmbCapsList.setMinimumHeight(40)
        # font = QFont('Taipei Sans TC Beta')
        font = self.cmbCapsList.font()
        font.setPointSize(14)
        self.cmbCapsList.setFont(font)
        self.cmbCapsList.setToolTip('Select a caption/subtitle to download')
        btnSettings = QPushButton('', self)
        btnSettings.setIcon(QIcon(':/settings-icon'))
        btnSettings.setIconSize(QSize(32, 32))
        btnSettings.setToolTip('Settings')
        btnSettings.clicked.connect(self.onSettings)
        self.btnDLoad = QPushButton('', self)
        self.btnDLoad.setIcon(QIcon(':/download-icon'))
        self.btnDLoad.setIconSize(QSize(32, 32))
        self.btnDLoad.setToolTip('Download')
        self.btnDLoad.clicked.connect(self.goDownload)
        self.btnDLoad.setDisabled(True)
        self.progressBar = QProgressBar(self)
        self.progressBar.setMinimum(0)
        self.progressBar.setMaximum(100)

        hBox1 = QHBoxLayout()
        hBox1.addWidget(btnExit, 0)
        hBox1.addWidget(self.btnHome, 0)
        hBox1.addWidget(self.btnBack, 0)
        hBox1.addWidget(self.btnNext, 0)
        hBox1.addWidget(self.cmbDownList, 1)
        hBox1.addWidget(self.cmbCapsList, 0)
        hBox1.addWidget(btnSettings, 0)
        hBox1.addWidget(self.btnDLoad, 0)
        vBox = QVBoxLayout()
        vBox.addLayout(hBox1)
        vBox.addWidget(self.web_view)
        vBox.addWidget(self.progressBar)
        self.setLayout(vBox)
        self.setWindowTitle('Youtube Download Helper')
        self.setGeometry(QRect(round((self.width - 760) / 2), round((self.height - 550) / 2), 760, 550))
        self.setMinimumSize(QSize(760, 550))

    def store_html(self, html):
        # print('store_html()')
        self.html = html
        if self.web_view.page().action(QWebEnginePage.Back).isEnabled():
            self.btnBack.setEnabled(True)
        else:
            self.btnBack.setDisabled(True)
        if self.web_view.page().action(QWebEnginePage.Forward).isEnabled():
            self.btnNext.setEnabled(True)
        else:
            self.btnNext.setDisabled(True)
        if self.web_view.title() != 'YouTube' and self.web_view.title() != 'https://www.youtube.com':
            # print(self.web_view.title())
            self.btnHome.setEnabled(True)
        else:
            self.btnHome.setDisabled(True)
        self.cmbDownList.clear()
        self.cmbCapsList.clear()
        url = self.web_view.page().url().url()
        if 'video-id' in self.html and '?v=' in url:
            # fp = open(self.web_view.title() + '.html', 'w')
            # fp.write(self.html)
            # fp.close()
            self.GI = GetItem(url)
            self.GI.addItem.connect(self.onAddItem)
            self.GI.addCaption.connect(self.onAddCaption)
            self.GI.finished.connect(self.onAddItemFinished)
            self.GI.start()
        else:
            self.btnDLoad.setDisabled(True)

    def get_html(self):
        # print('get_html')
        self.web_view.page().toHtml(self.store_html)

    def goHome(self):
        self.web_view.setUrl(QUrl(self.url))

    def goBack(self):
        self.web_view.back()

    def goForward(self):
        self.web_view.forward()

    def goDownload(self):
        global download_ongoing
        download_ongoing = True
        self.btnDLoad.setDisabled(True)
        self.progressBar.setValue(0)
        self.DL = DownLoad(self.web_view.page().url().url(), self.cmbDownList.currentIndex(),
                           self.cmbCapsList.currentIndex())
        self.DL.valueChanged.connect(self.onValueChanged)
        self.DL.dlCompleted.connect(self.onDlCompleted)
        self.DL.start()

    def onAddItem(self, icon, item):
        self.cmbDownList.addItem(QIcon(icon), item)

    def onAddCaption(self, cap):
        self.cmbCapsList.addItem(cap)

    def onAddItemFinished(self):
        if not download_ongoing:
            self.btnDLoad.setEnabled(True)

    def onValueChanged(self, per):
        self.progressBar.setValue(round(per))
        # print('%.2f%% completed' % per)

    def onDlCompleted(self):
        global download_ongoing
        download_ongoing = False
        self.btnDLoad.setDisabled(True)
        self.progressBar.setValue(0)

    def onIndexChanged(self):
        if not download_ongoing:
            self.btnDLoad.setEnabled(True)

    def onSettings(self):
        sWnd = SettingsDlg(self.width, self.height)
        sWnd.exec()
        if sWnd.SettingsChanged:
            # print('Settings saved!')
            if self.web_view.title() != 'YouTube' and self.web_view.title() != 'https://www.youtube.com':
                self.web_view.reload()