def __init__(self, parentWidget): QWidget.__init__(self, parentWidget) self.editorWidget = parentWidget.editorWidget # TODO: Review class structure self.searching = False self.ui = Ui_SearchWidget() self.ui.setupUi(self) self.resultListModel = QStandardItemModel(self.ui.resultList) self.ui.resultWidget.setCurrentIndex(0) self.ui.resultList.setModel(self.resultListModel) self.ui.resultList.selectionModel().selectionChanged.connect( self.doResultSelected) self.startIcon = QIcon(':/icons/search-global-start.png') self.stopIcon = QIcon(':/icons/search-global-stop.png') self.ui.startStopButton.setIcon(self.startIcon) self.ui.searchInput.returnPressed.connect(self.doReturnKey) self.ui.startStopButton.clicked.connect(self.doStartStopButton) self.workerThread = QThread() self.worker = SearchWorker() self.worker.moveToThread(self.workerThread) self.startWork.connect(self.worker.startSearch) self.worker.searchDone.connect(self.searchDone) self.worker.addMatch.connect(self.addMatch) # self.stopWork.connect(self.worker.stopSearch) self.workerThread.start()
def __init__(self, parentWidget): QWidget.__init__(self, parentWidget) self.editorWidget = parentWidget.editorWidget # TODO: Review class structure self.searching = False self.ui = Ui_SearchWidget() self.ui.setupUi(self) self.resultListModel = QStandardItemModel(self.ui.resultList) self.ui.resultWidget.setCurrentIndex(0) self.ui.resultList.setModel(self.resultListModel) self.ui.resultList.selectionModel().selectionChanged.connect(self.doResultSelected) self.startIcon = QIcon(':/icons/search-global-start.png') self.stopIcon = QIcon(':/icons/search-global-stop.png') self.ui.startStopButton.setIcon(self.startIcon) self.ui.searchInput.returnPressed.connect(self.doReturnKey) self.ui.startStopButton.clicked.connect(self.doStartStopButton) self.workerThread = QThread() self.worker = SearchWorker() self.worker.moveToThread(self.workerThread) self.startWork.connect(self.worker.startSearch) self.worker.searchDone.connect(self.searchDone) self.worker.addMatch.connect(self.addMatch) # self.stopWork.connect(self.worker.stopSearch) self.workerThread.start()
class SearchWidget(QWidget): startWork = pyqtSignal(str) resultSelected = pyqtSignal(str) def __init__(self, parentWidget): QWidget.__init__(self, parentWidget) self.editorWidget = parentWidget.editorWidget # TODO: Review class structure self.searching = False self.ui = Ui_SearchWidget() self.ui.setupUi(self) self.resultListModel = QStandardItemModel(self.ui.resultList) self.ui.resultWidget.setCurrentIndex(0) self.ui.resultList.setModel(self.resultListModel) self.ui.resultList.selectionModel().selectionChanged.connect(self.doResultSelected) self.startIcon = QIcon(':/icons/search-global-start.png') self.stopIcon = QIcon(':/icons/search-global-stop.png') self.ui.startStopButton.setIcon(self.startIcon) self.ui.searchInput.returnPressed.connect(self.doReturnKey) self.ui.startStopButton.clicked.connect(self.doStartStopButton) self.workerThread = QThread() self.worker = SearchWorker() self.worker.moveToThread(self.workerThread) self.startWork.connect(self.worker.startSearch) self.worker.searchDone.connect(self.searchDone) self.worker.addMatch.connect(self.addMatch) # self.stopWork.connect(self.worker.stopSearch) self.workerThread.start() def doReturnKey(self): if self.searching: self.worker.stopSearch() # must not call trough a slot since it would be queued # ATTENTION! Still a race condition!!! (At least when the search process just finished normally) self.startSearch() def doStartStopButton(self): if self.searching: self.worker.stopSearch() # must not call trough a slot since it would be queued self.searchDone() else: self.startSearch() def startSearch(self): self.searching = True self.ui.startStopButton.setIcon(self.stopIcon) self.resultListModel.clear() queryText = self.ui.searchInput.text() # rootPath = self.editorWidget.page.notepad.getRootpath() # Setup worker with required data self.worker.notepad = self.editorWidget.page.notepad # NOTE: we are querying the page list in this thread, # to avoid concurrency issues with SQLite. self.worker.pageList = self.editorWidget.page.notepad.getAllPages() self.startWork.emit(queryText) def searchDone(self): print("Search Done.") self.searching = False if self.resultListModel.rowCount() == 0: self.ui.resultWidget.setCurrentIndex(1) # show error page self.ui.startStopButton.setIcon(self.startIcon) def addMatch(self, pageId): # print(" Adding: {}".format(pageId)) self.ui.resultWidget.setCurrentIndex(0) # make sure to show the list resultItem = QStandardItem(pageId) resultItem.setEditable(False) self.resultListModel.appendRow(resultItem) def doResultSelected(self, selectedtItem, idx2): indexes = selectedtItem.indexes() if len(indexes) == 1: item = self.resultListModel.itemFromIndex(indexes[0]) pageId = item.text() self.resultSelected.emit(pageId)
class SearchWidget(QWidget): startWork = pyqtSignal(str) resultSelected = pyqtSignal(str) def __init__(self, parentWidget): QWidget.__init__(self, parentWidget) self.editorWidget = parentWidget.editorWidget # TODO: Review class structure self.searching = False self.ui = Ui_SearchWidget() self.ui.setupUi(self) self.resultListModel = QStandardItemModel(self.ui.resultList) self.ui.resultWidget.setCurrentIndex(0) self.ui.resultList.setModel(self.resultListModel) self.ui.resultList.selectionModel().selectionChanged.connect( self.doResultSelected) self.startIcon = QIcon(':/icons/search-global-start.png') self.stopIcon = QIcon(':/icons/search-global-stop.png') self.ui.startStopButton.setIcon(self.startIcon) self.ui.searchInput.returnPressed.connect(self.doReturnKey) self.ui.startStopButton.clicked.connect(self.doStartStopButton) self.workerThread = QThread() self.worker = SearchWorker() self.worker.moveToThread(self.workerThread) self.startWork.connect(self.worker.startSearch) self.worker.searchDone.connect(self.searchDone) self.worker.addMatch.connect(self.addMatch) # self.stopWork.connect(self.worker.stopSearch) self.workerThread.start() def doReturnKey(self): if self.searching: self.worker.stopSearch( ) # must not call trough a slot since it would be queued # ATTENTION! Still a race condition!!! (At least when the search process just finished normally) self.startSearch() def doStartStopButton(self): if self.searching: self.worker.stopSearch( ) # must not call trough a slot since it would be queued self.searchDone() else: self.startSearch() def startSearch(self): self.searching = True self.ui.startStopButton.setIcon(self.stopIcon) self.resultListModel.clear() queryText = self.ui.searchInput.text() # rootPath = self.editorWidget.page.notepad.getRootpath() # Setup worker with required data self.worker.notepad = self.editorWidget.page.notepad # NOTE: we are querying the page list in this thread, # to avoid concurrency issues with SQLite. self.worker.pageList = self.editorWidget.page.notepad.getAllPages() self.startWork.emit(queryText) def searchDone(self): print("Search Done.") self.searching = False if self.resultListModel.rowCount() == 0: self.ui.resultWidget.setCurrentIndex(1) # show error page self.ui.startStopButton.setIcon(self.startIcon) def addMatch(self, pageId): # print(" Adding: {}".format(pageId)) self.ui.resultWidget.setCurrentIndex(0) # make sure to show the list resultItem = QStandardItem(pageId) resultItem.setEditable(False) self.resultListModel.appendRow(resultItem) def doResultSelected(self, selectedtItem, idx2): indexes = selectedtItem.indexes() if len(indexes) == 1: item = self.resultListModel.itemFromIndex(indexes[0]) pageId = item.text() self.resultSelected.emit(pageId)