def __init__(self, projectFinder, projectSearchModel=None, selectedRows=None): QDialog.__init__(self) self.setupUi(self) self.progressBar.setValue(0) self.settings = MySettings() self.projectFinder = projectFinder self.projectSearchModel = projectSearchModel self.selectedRows = selectedRows if projectSearchModel is None: self.selectionWidget.hide() self.unrecordedCheckBox.hide() self.unevaluatedCheckBox.setChecked(True) self.unevalutedDaysSpinBox.setValue( max(1, self.settings.value("refreshDelay") / 3)) self.progressBar.hide() self.cancelButton.hide() self.cancelButton.clicked.connect(self.cancel) self.refreshButton.clicked.connect(self.refresh) self.projectFinder.recordingSearchProgress.connect(self.setProgress)
class AbstractFinder(QObject): name = '' # to be defined in subclasses continueSearch = False transform = None # to be defined by subclasses # progress = pyqtSignal(QObject, int, int) # total current resultFound = pyqtSignal(QObject, str, str, QgsGeometry, int) limitReached = pyqtSignal(QObject, str) finished = pyqtSignal(QObject) message = pyqtSignal(QObject, str, QgsMessageBar.MessageLevel) def __init__(self, parent): QObject.__init__(self, parent) self.settings = MySettings() def start(self, toFind, bbox=None): self.continueSearch = True def stop(self): self.continueSearch = False def activated(self): return self.settings.value(self.name) def _finish(self): self.continueSearch = False self.finished.emit(self) def isRunning(self): return self.continueSearch
def search(self): if self.running: return toFind = self.lineEdit().text() if not toFind or toFind == '': return self.running = True self.searchStarted.emit() self.clearSelection() self.resultModel.clearResults() self.resultModel.truncateHistory(MySettings().value("historyLength")) self.resultModel.setLoading(True) self.showPopup() QCoreApplication.processEvents(QEventLoop.ExcludeUserInputEvents) self.findersToStart = [] for finder in self.finders.values(): if finder.activated(): self.findersToStart.append(finder) bbox = self.mapCanvas.fullExtent() while len(self.findersToStart) > 0: finder = self.findersToStart[0] self.findersToStart.remove(finder) self.resultModel.addResult(finder.name) finder.start(toFind, bbox=bbox) # For case there is no finder activated self.finished(None)
def __init__(self, iface): QObject.__init__(self) self.iface = iface self.actions = {} self.finders = {} self.settings = MySettings() self._initFinders() self.iface.projectRead.connect(self._reloadFinders) self.iface.newProjectCreated.connect(self._reloadFinders) # translation environment self.plugin_dir = os.path.dirname(__file__) locale = QSettings().value("locale/userLocale")[0:2] localePath = os.path.join(self.plugin_dir, 'i18n', 'quickfinder_{0}.qm'.format(locale)) if os.path.exists(localePath): self.translator = QTranslator() self.translator.load(localePath) QCoreApplication.installTranslator(self.translator)
def __init__(self, iface): QObject.__init__(self) self.iface = iface self.actions = {} self.finders = {} self.settings = MySettings() self._initFinders() # translation environment self.plugin_dir = os.path.dirname(__file__) locale = QSettings().value("locale/userLocale")[0:2] localePath = os.path.join(self.plugin_dir, 'i18n', 'quickfinder_{}.qm'.format(locale)) if os.path.exists(localePath): self.translator = QTranslator() self.translator.load(localePath) if qVersion() > '4.3.3': QCoreApplication.installTranslator(self.translator)
class AbstractFinder(QObject): name = '' # to be defined in subclasses continueSearch = False transform = None # to be defined by subclasses # progress = pyqtSignal(QObject, int, int) # total current resultFound = pyqtSignal(QObject, str, str, QgsGeometry, int) limitReached = pyqtSignal(QObject, str) finished = pyqtSignal(QObject) message = pyqtSignal(str, QgsMessageBar.MessageLevel) def __init__(self, parent): QObject.__init__(self, parent) self.settings = MySettings() def start(self, toFind, bbox=None): self.continueSearch = True def stop(self): self.continueSearch = False def activated(self): return self.settings.value(self.name) def close(self): pass def _finish(self): self.continueSearch = False self.finished.emit(self) def isRunning(self): return self.continueSearch def reload(self): pass
def __init__(self, projectFinder, projectSearchModel=None, selectedRows=None): QDialog.__init__(self) self.setupUi(self) self.progressBar.setValue(0) self.settings = MySettings() self.projectFinder = projectFinder self.projectSearchModel = projectSearchModel self.selectedRows = selectedRows if projectSearchModel is None: self.selectionWidget.hide() self.unrecordedCheckBox.hide() self.unevaluatedCheckBox.setChecked(True) self.unevalutedDaysSpinBox.setValue(max(1,self.settings.value("refreshDelay")/3)) self.progressBar.hide() self.cancelButton.hide() self.cancelButton.clicked.connect(self.cancel) self.refreshButton.clicked.connect(self.refresh) self.projectFinder.recordingSearchProgress.connect(self.setProgress)
def __init__(self): QDialog.__init__(self) self.setupUi(self) self.settings = MySettings() SettingDialog.__init__(self, self.settings) # new declaration of ProjectFinder since changes can be cancelled self.projectFinder = ProjectFinder(self) # table model self.projectSearchModel = ProjectSearchModel(self.projectFinder) self.proxyModel = QSortFilterProxyModel(self) self.proxyModel.setSourceModel(self.projectSearchModel) self.projectSearchTable.setModel(self.proxyModel) header = self.projectSearchTable.horizontalHeader() header.setResizeMode(QHeaderView.ResizeToContents) # open/create QuickFinder file self.createFileButton.clicked.connect(self.createQFTSfile) self.openFileButton.clicked.connect(self.openQFTSfile) self.readQFTSfile() # project search self.addSearchButton.clicked.connect(self.addProjectSearch) self.removeSearchButton.clicked.connect(self.removeProjectSearch) self.editSearchButton.clicked.connect(self.editProjectSearch) self.refreshButton.clicked.connect(self.refreshProjectSearch) self.projectSearchTable.selectionModel().selectionChanged.connect( self.enableButtons) self.enableButtons() # geomapfish self.geomapfishCrsButton.clicked.connect( self.geomapfishCrsButtonClicked)
class quickFinder(QObject): name = u"&Quick Finder" actions = None toolbar = None finders = {} loadingIcon = None def __init__(self, iface): QObject.__init__(self) self.iface = iface self.actions = {} self.finders = {} self.settings = MySettings() self._initFinders() self.iface.projectRead.connect(self._reloadFinders) self.iface.newProjectCreated.connect(self._reloadFinders) # translation environment self.plugin_dir = os.path.dirname(__file__) locale = QSettings().value("locale/userLocale")[0:2] localePath = os.path.join(self.plugin_dir, 'i18n', 'quickfinder_{0}.qm'.format(locale)) if os.path.exists(localePath): self.translator = QTranslator() self.translator.load(localePath) QCoreApplication.installTranslator(self.translator) def initGui(self): self.actions['showSettings'] = QAction( QIcon(":/plugins/quickfinder/icons/settings.svg"), self.tr(u"&Settings"), self.iface.mainWindow()) self.actions['showSettings'].triggered.connect(self.showSettings) self.iface.addPluginToMenu(self.name, self.actions['showSettings']) self.actions['help'] = QAction( QIcon(":/plugins/quickfinder/icons/help.svg"), self.tr("Help"), self.iface.mainWindow()) self.actions['help'].triggered.connect( lambda: QDesktopServices().openUrl( QUrl("http://3nids.github.io/quickfinder"))) self.iface.addPluginToMenu(self.name, self.actions['help']) self._initToolbar() self.rubber = QgsRubberBand(self.iface.mapCanvas()) self.rubber.setColor(QColor(255, 255, 50, 200)) self.rubber.setIcon(self.rubber.ICON_CIRCLE) self.rubber.setIconSize(15) self.rubber.setWidth(4) self.rubber.setBrushStyle(Qt.NoBrush) def unload(self): """ Unload plugin """ for key in self.finders.keys(): self.finders[key].close() for action in self.actions.itervalues(): self.iface.removePluginMenu(self.name, action) if self.toolbar: del self.toolbar if self.rubber: self.iface.mapCanvas().scene().removeItem(self.rubber) del self.rubber def _initToolbar(self): """setup the plugin toolbar.""" self.toolbar = self.iface.addToolBar(self.name) self.toolbar.setObjectName('mQuickFinderToolBar') self.searchAction = QAction(QIcon(":/plugins/quickfinder/icons/magnifier13.svg"), self.tr("Search"), self.toolbar) self.stopAction = QAction( QIcon(":/plugins/quickfinder/icons/wrong2.svg"), self.tr("Cancel"), self.toolbar) self.finderBox = FinderBox(self.finders, self.iface, self.toolbar) self.finderBox.searchStarted.connect(self.searchStarted) self.finderBox.searchFinished.connect(self.searchFinished) self.finderBoxAction = self.toolbar.addWidget(self.finderBox) self.finderBoxAction.setVisible(True) self.searchAction.triggered.connect(self.finderBox.search) self.toolbar.addAction(self.searchAction) self.stopAction.setVisible(False) self.stopAction.triggered.connect(self.finderBox.stop) self.toolbar.addAction(self.stopAction) self.toolbar.setVisible(True) def _initFinders(self): self.finders['geomapfish'] = GeomapfishFinder(self) self.finders['osm'] = OsmFinder(self) self.finders['project'] = ProjectFinder(self) for key in self.finders.keys(): self.finders[key].message.connect(self.displayMessage) self.refreshProject() def _reloadFinders(self): for key in self.finders.keys(): self.finders[key].close() self.finders[key].reload() self.refreshProject() @pyqtSlot(str, QgsMessageBar.MessageLevel) def displayMessage(self, message, level): self.iface.messageBar().pushMessage("QuickFinder", message, level) def showSettings(self): if ConfigurationDialog().exec_(): self._reloadFinders() def searchStarted(self): self.searchAction.setVisible(False) self.stopAction.setVisible(True) def searchFinished(self): self.searchAction.setVisible(True) self.stopAction.setVisible(False) def refreshProject(self): if not self.finders['project'].activated: return if not self.settings.value("refreshAuto"): return nDays = self.settings.value("refreshDelay") # do not ask more ofen than 3 days askLimit = min(3, nDays) recentlyAsked = self.settings.value("refreshLastAsked") >= nDaysAgoIsoDate(askLimit) if recentlyAsked: return threshDate = nDaysAgoIsoDate(nDays) uptodate = True for search in self.finders['project'].searches.values(): if search.dateEvaluated <= threshDate: uptodate = False break if uptodate: return self.settings.setValue("refreshLastAsked", nDaysAgoIsoDate(0)) ret = QMessageBox(QMessageBox.Warning, "Quick Finder", QCoreApplication.translate("Auto Refresh", "Some searches are outdated. Do you want to refresh them ?"), QMessageBox.Cancel | QMessageBox.Yes).exec_() if ret == QMessageBox.Yes: RefreshDialog(self.finders['project']).exec_()
class quickFinder(QObject): name = u"&Quick Finder" actions = None toolbar = None finders = {} loadingIcon = None def __init__(self, iface): QObject.__init__(self) self.iface = iface self.actions = {} self.finders = {} self.settings = MySettings() self._initFinders() self.iface.projectRead.connect(self._reloadFinders) self.iface.newProjectCreated.connect(self._reloadFinders) # translation environment self.plugin_dir = os.path.dirname(__file__) locale = QSettings().value("locale/userLocale")[0:2] localePath = os.path.join(self.plugin_dir, 'i18n', 'quickfinder_{0}.qm'.format(locale)) if os.path.exists(localePath): self.translator = QTranslator() self.translator.load(localePath) QCoreApplication.installTranslator(self.translator) def initGui(self): self.actions['showSettings'] = QAction( QIcon(":/plugins/quickfinder/icons/settings.svg"), self.tr(u"&Settings"), self.iface.mainWindow()) self.actions['showSettings'].triggered.connect(self.showSettings) self.iface.addPluginToMenu(self.name, self.actions['showSettings']) self.actions['help'] = QAction( QIcon(":/plugins/quickfinder/icons/help.svg"), self.tr("Help"), self.iface.mainWindow()) self.actions['help'].triggered.connect(lambda: QDesktopServices( ).openUrl(QUrl("http://3nids.github.io/quickfinder"))) self.iface.addPluginToMenu(self.name, self.actions['help']) self._initToolbar() self.rubber = QgsRubberBand(self.iface.mapCanvas()) self.rubber.setColor(QColor(255, 255, 50, 200)) self.rubber.setIcon(self.rubber.ICON_CIRCLE) self.rubber.setIconSize(15) self.rubber.setWidth(4) self.rubber.setBrushStyle(Qt.NoBrush) def unload(self): """ Unload plugin """ for key in self.finders.keys(): self.finders[key].close() for action in self.actions.itervalues(): self.iface.removePluginMenu(self.name, action) if self.toolbar: del self.toolbar if self.rubber: self.iface.mapCanvas().scene().removeItem(self.rubber) del self.rubber def _initToolbar(self): """setup the plugin toolbar.""" self.toolbar = self.iface.addToolBar(self.name) self.toolbar.setObjectName('mQuickFinderToolBar') self.searchAction = QAction( QIcon(":/plugins/quickfinder/icons/magnifier13.svg"), self.tr("Search"), self.toolbar) self.stopAction = QAction( QIcon(":/plugins/quickfinder/icons/wrong2.svg"), self.tr("Cancel"), self.toolbar) self.finderBox = FinderBox(self.finders, self.iface, self.toolbar) self.finderBox.searchStarted.connect(self.searchStarted) self.finderBox.searchFinished.connect(self.searchFinished) self.finderBoxAction = self.toolbar.addWidget(self.finderBox) self.finderBoxAction.setVisible(True) self.searchAction.triggered.connect(self.finderBox.search) self.toolbar.addAction(self.searchAction) self.stopAction.setVisible(False) self.stopAction.triggered.connect(self.finderBox.stop) self.toolbar.addAction(self.stopAction) self.toolbar.setVisible(True) def _initFinders(self): self.finders['geomapfish'] = GeomapfishFinder(self) self.finders['osm'] = OsmFinder(self) self.finders['project'] = ProjectFinder(self) for key in self.finders.keys(): self.finders[key].message.connect(self.displayMessage) self.refreshProject() def _reloadFinders(self): for key in self.finders.keys(): self.finders[key].close() self.finders[key].reload() self.refreshProject() @pyqtSlot(str, QgsMessageBar.MessageLevel) def displayMessage(self, message, level): self.iface.messageBar().pushMessage("QuickFinder", message, level) def showSettings(self): if ConfigurationDialog().exec_(): self._reloadFinders() def searchStarted(self): self.searchAction.setVisible(False) self.stopAction.setVisible(True) def searchFinished(self): self.searchAction.setVisible(True) self.stopAction.setVisible(False) def refreshProject(self): if not self.finders['project'].activated: return if not self.settings.value("refreshAuto"): return nDays = self.settings.value("refreshDelay") # do not ask more ofen than 3 days askLimit = min(3, nDays) recentlyAsked = self.settings.value( "refreshLastAsked") >= nDaysAgoIsoDate(askLimit) if recentlyAsked: return threshDate = nDaysAgoIsoDate(nDays) uptodate = True for search in self.finders['project'].searches.values(): if search.dateEvaluated <= threshDate: uptodate = False break if uptodate: return self.settings.setValue("refreshLastAsked", nDaysAgoIsoDate(0)) ret = QMessageBox( QMessageBox.Warning, "Quick Finder", QCoreApplication.translate( "Auto Refresh", "Some searches are outdated. Do you want to refresh them ?"), QMessageBox.Cancel | QMessageBox.Yes).exec_() if ret == QMessageBox.Yes: RefreshDialog(self.finders['project']).exec_()
def __init__(self, parent): QObject.__init__(self, parent) self.settings = MySettings()
class RefreshDialog(QDialog, Ui_Refresh): stop = False searchProgress = 0 currentLayerLength = 0 def __init__(self, projectFinder, projectSearchModel=None, selectedRows=None): QDialog.__init__(self) self.setupUi(self) self.progressBar.setValue(0) self.settings = MySettings() self.projectFinder = projectFinder self.projectSearchModel = projectSearchModel self.selectedRows = selectedRows if projectSearchModel is None: self.selectionWidget.hide() self.unrecordedCheckBox.hide() self.unevaluatedCheckBox.setChecked(True) self.unevalutedDaysSpinBox.setValue(max(1,self.settings.value("refreshDelay")/3)) self.progressBar.hide() self.cancelButton.hide() self.cancelButton.clicked.connect(self.cancel) self.refreshButton.clicked.connect(self.refresh) self.projectFinder.recordingSearchProgress.connect(self.setProgress) def refresh(self): searches = self.projectFinder.searches self.stop = False self.cancelButton.show() self.refreshButton.hide() self.progressBar.setMinimum(0) self.progressBar.setMaximum(len(searches)*100) # progressBar only accepts int, so scaling self.progressBar.show() unRecorded = self.unrecordedCheckBox.isChecked() onlySelected = self.selectionComboBox.currentIndex() == 1 unEvaluated = self.unevaluatedCheckBox.isChecked() unEvaluatedDelay = self.unevalutedDaysSpinBox.value() removeDeleted = self.deletedLayersCheckBox.isChecked() limit_date = nDaysAgoIsoDate(unEvaluatedDelay) self.searchProgress = -1 for search in searches.values(): QCoreApplication.processEvents() self.searchProgress += 1 self.currentLayerLength = 0 self.setProgress() # user stop if self.stop: break # delete search if layer has been deleted layer = search.layer() if layer is None and removeDeleted: if self.projectSearchModel is not None: self.projectSearchModel.removeSearches([search.searchId]) else: self.projectFinder.deleteSearch(search.searchId) continue # if specified do not process recently evaluated search if unEvaluated and search.dateEvaluated >= limit_date: continue # if specified only process non evaluated searches if unRecorded and search.dateEvaluated is not None: continue # if specified only do selected rows if onlySelected and self.selectedRows is not None: if search.searchId not in self.selectedRows: continue self.currentLayerLength = layer.featureCount() ok, message = self.projectFinder.recordSearch(search) self.progressBar.hide() self.cancelButton.hide() self.refreshButton.show() def closeEvent(self, e): self.cancel() e.accept() def cancel(self): self.projectFinder.stopRecord() self.stop = True def setProgress(self, value=0): p = self.searchProgress if self.currentLayerLength!=0: p += float(value) / self.currentLayerLength p *= 100 self.progressBar.setValue(p)
class RefreshDialog(QDialog, Ui_Refresh): stop = False searchProgress = 0 currentLayerLength = 0 def __init__(self, projectFinder, projectSearchModel=None, selectedRows=None): QDialog.__init__(self) self.setupUi(self) self.progressBar.setValue(0) self.settings = MySettings() self.projectFinder = projectFinder self.projectSearchModel = projectSearchModel self.selectedRows = selectedRows if projectSearchModel is None: self.selectionWidget.hide() self.unrecordedCheckBox.hide() self.unevaluatedCheckBox.setChecked(True) self.unevalutedDaysSpinBox.setValue( max(1, self.settings.value("refreshDelay") / 3)) self.progressBar.hide() self.cancelButton.hide() self.cancelButton.clicked.connect(self.cancel) self.refreshButton.clicked.connect(self.refresh) self.projectFinder.recordingSearchProgress.connect(self.setProgress) def refresh(self): searches = self.projectFinder.searches self.stop = False self.cancelButton.show() self.refreshButton.hide() self.progressBar.setMinimum(0) self.progressBar.setMaximum( len(searches) * 100) # progressBar only accepts int, so scaling self.progressBar.show() unRecorded = self.unrecordedCheckBox.isChecked() onlySelected = self.selectionComboBox.currentIndex() == 1 unEvaluated = self.unevaluatedCheckBox.isChecked() unEvaluatedDelay = self.unevalutedDaysSpinBox.value() removeDeleted = self.deletedLayersCheckBox.isChecked() limit_date = nDaysAgoIsoDate(unEvaluatedDelay) self.searchProgress = -1 for search in searches.values(): QCoreApplication.processEvents() self.searchProgress += 1 self.currentLayerLength = 0 self.setProgress() # user stop if self.stop: break # delete search if layer has been deleted layer = search.layer() if layer is None and removeDeleted: if self.projectSearchModel is not None: self.projectSearchModel.removeSearches([search.searchId]) else: self.projectFinder.deleteSearch(search.searchId) continue # if specified do not process recently evaluated search if unEvaluated and search.dateEvaluated >= limit_date: continue # if specified only process non evaluated searches if unRecorded and search.dateEvaluated is not None: continue # if specified only do selected rows if onlySelected and self.selectedRows is not None: if search.searchId not in self.selectedRows: continue self.currentLayerLength = layer.featureCount() ok, message = self.projectFinder.recordSearch(search, False) self.projectFinder.optimize() self.progressBar.hide() self.cancelButton.hide() self.refreshButton.show() def closeEvent(self, e): self.cancel() e.accept() def cancel(self): self.projectFinder.stopRecord() self.stop = True def setProgress(self, value=0): p = self.searchProgress if self.currentLayerLength != 0: p += float(value) / self.currentLayerLength p *= 100 self.progressBar.setValue(p)