Beispiel #1
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)
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
Beispiel #3
0
    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)
Beispiel #6
0
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)
Beispiel #13
0
 def __init__(self, parent):
     QObject.__init__(self, parent)
     self.settings = MySettings()
Beispiel #14
0
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)