Пример #1
0
 def __setUpInputOutputLayout(self) -> QFormLayout:
     # Add input and output boxes
     self._inputComboBox = QComboBox(self.editor)
     self._inputComboBox.setModel(self.operation.workbench)
     self._outputNameBox = TextOptionWidget(parent=self.editor)
     self._outputNameBox.widget.textChanged.connect(
         self._validateOutputName)
     self._inputComboBox.currentTextChanged.connect(self._changeInputFrame)
     ioLayout = QFormLayout()
     ioLayout.addRow('Input data:', self._inputComboBox)
     ioLayout.addRow('Output name:', self._outputNameBox)
     completer = QCompleter(self._outputNameBox)
     completer.setModel(self.operation.workbench)
     completer.setFilterMode(Qt.MatchContains)
     completer.setModelSorting(QCompleter.CaseInsensitivelySortedModel)
     completer.setCompletionMode(QCompleter.UnfilteredPopupCompletion)
     self._outputNameBox.widget.setCompleter(completer)
     if self.selectedFrame:
         if self.selectedFrame == self._inputComboBox.currentText():
             # Manually trigger the slot to change input
             self._changeInputFrame(self.selectedFrame)
         else:
             # Set the frame (will trigger _changeInputFrame)
             self._inputComboBox.setCurrentText(self.selectedFrame)
     else:
         # Default to whatever input name is set
         self._changeInputFrame(self._inputComboBox.currentText())
     return ioLayout
Пример #2
0
class LibraryItems(QObject):
    item_selected = Signal(object)
    item_activated = Signal(object)

    def __init__(self, app, window, lib_tree):
        QObject.__init__(self)
        self.app = app
        self.lib_tree = lib_tree
        self.library = app.library
        self.input = window.search_query_input
        self.view = window.lib_items
        self.tree_conditions = []
        self.items = []
        self.items_incomplete = False
        self.model = ItemModel(self.app)
        self.model.setColumnCount(1)
        self.compl_model = QStandardItemModel()
        self.compl_model.setColumnCount(1)
        self.completer = QCompleter(self.compl_model)
        self.completer.setCaseSensitivity(Qt.CaseInsensitive)
        self.completer.setModelSorting(QCompleter.CaseSensitivelySortedModel)
        self.input.setCompleter(self.completer)
        self.view.setHeaderHidden(True)
        self.view.setIndentation(0)
        self.view.setModel(self.model)
        self.view.sortByColumn(0, Qt.AscendingOrder)
        self.view.setDragEnabled(True)
        self.view.setAcceptDrops(True)
        self.view.setSelectionMode(QAbstractItemView.ExtendedSelection)
        self.view.setEditTriggers(QAbstractItemView.NoEditTriggers)
        selection_model = self.view.selectionModel()
        selection_model.selectionChanged.connect(self.selection_changed)
        tree_selection_model = window.lib_tree.selectionModel()
        tree_selection_model.selectionChanged.connect(
            self.tree_selection_changed)
        self.input.editingFinished.connect(self.query_entered)
        self.input.textChanged.connect(self.query_changed)
        self.view.doubleClicked.connect(self.double_clicked)
        self.run_query()

    def reload(self):
        self.model.clear()
        self.item_selected.emit(None)
        icon = QIcon.fromTheme("audio-x-generic")
        for item in self.items:
            s_item = QStandardItem(icon, item.name)
            s_item.setDragEnabled(True)
            s_item.setDropEnabled(False)
            s_item.setData(item)
            self.model.appendRow([s_item])
        if self.items_incomplete:
            s_item = QStandardItem("…and more")
            s_item.setDragEnabled(False)
            s_item.setDropEnabled(False)
            self.model.appendRow([s_item])

    @Slot(QItemSelection)
    def selection_changed(self, selection):
        logger.debug("selection changed")
        indexes = selection.indexes()
        if indexes:
            index = selection.indexes()[0]
            s_item = self.model.itemFromIndex(index)
            metadata = s_item.data()
        else:
            metadata = None
        self.item_selected.emit(metadata)

    @Slot(QModelIndex)
    def double_clicked(self, index):
        s_item = self.model.itemFromIndex(index)
        metadata = s_item.data()
        self.item_activated.emit(metadata)

    @Slot(QItemSelection)
    def tree_selection_changed(self, selection):
        logger.debug("tree selection changed")
        self.tree_conditions = self.lib_tree.get_current_conditions()
        self.run_query()

    def run_query(self):
        text_query = self.input.text()
        query = SearchQuery.from_string(text_query)
        query.add_conditions(self.tree_conditions)
        items = self.library.get_items(query, limit=ITEM_LIMIT + 1)
        if len(items) > ITEM_LIMIT:
            self.items_incomplete = True
            self.items = items[:ITEM_LIMIT]
        else:
            self.items_incomplete = False
            self.items = items
        self.reload()

    @Slot()
    def query_entered(self):
        self.run_query()

    @Slot()
    def query_changed(self, text):
        compl_query = CompletionQuery.from_string(text)
        if compl_query:
            columns = ["offsets(compl_fts.fts)", "compl_fts.content"]
            compl_query.add_conditions(self.tree_conditions)
            sql_query, params = compl_query.as_sql(columns=columns)
            logger.debug("completing %r with query %r %r", compl_query.prefix,
                         sql_query, params)
            matches = self.library.get_completions(compl_query,
                                                   limit=COMPLETION_LIMIT)
            self.compl_model.clear()
            for match in sorted(matches):
                match = text[:compl_query.start_index] + match
                logger.debug("Adding match: %r", match)
                s_item = QStandardItem(match)
                self.compl_model.appendRow([s_item])
        else:
            self.model.clear()