Skip to content
Snippets Groups Projects
viewmodels.py 6.37 KiB
Newer Older
  • Learn to ignore specific revisions
  • import sys, os
    from qgis.core import *
    from PyQt4.QtCore import *
    from timeseriesviewer import *
    
    
    from timeseriesviewer.ui.widgets import *
    from timeseriesviewer.timeseries import TimeSeries, TimeSeriesDatum, SensorInstrument
    
    
    
    
    class TimeSeriesTableModel(QAbstractTableModel):
    
        columnames = ['date', 'sensor', 'ns', 'nl', 'nb', 'image']
    
    
        def __init__(self, TS, parent=None, *args):
    
            super(TimeSeriesTableModel, self).__init__()
            assert isinstance(TS, TimeSeries)
            self.TS = TS
    
            self.TS.sigTimeSeriesDatesRemoved.connect(self.removeTSDs)
            self.TS.sigTimeSeriesDatesAdded.connect(self.addTSDs)
    
            self.items = []
            self.sortColumnIndex = 0
            self.sortOrder = Qt.AscendingOrder
            self.addTSDs([tsd for tsd in self.TS])
    
        def removeTSDs(self, tsds):
            #self.TS.removeDates(tsds)
            for tsd in tsds:
                if tsd in self.TS:
                    #remove from TimeSeries first.
                    self.TS.removeDates([tsd])
                elif tsd in self.items:
                    idx = self.getIndexFromDate(tsd)
                    self.removeRows(idx.row(), 1)
    
            #self.sort(self.sortColumnIndex, self.sortOrder)
    
    
    
        def tsdChanged(self, tsd):
            idx = self.getIndexFromDate(tsd)
            self.dataChanged.emit(idx, idx)
    
    
        def addTSDs(self, tsds):
            self.items.extend(tsds)
            self.sort(self.sortColumnIndex, self.sortOrder)
    
    
            for tsd in tsds:
                assert isinstance(tsd, TimeSeriesDatum)
                tsd.sigVisibilityChanged.connect(lambda: self.tsdChanged(tsd))
    
    
            for sensor in set([tsd.sensor for tsd in tsds]):
                if sensor not in self.sensors:
                    self.sensors.add(sensor)
                    sensor.sigNameChanged.connect(lambda: self.reset())
    
    
    
    
        def sort(self, col, order):
            if self.rowCount() == 0:
                return
    
            self.layoutAboutToBeChanged.emit()
            colName = self.columnames[col]
            r = order != Qt.AscendingOrder
    
            if colName in ['date','ns','nl','sensor']:
                self.items.sort(key = lambda d:d.__dict__[colName], reverse=r)
    
            self.layoutChanged.emit()
            s = ""
    
    
        def rowCount(self, parent = QModelIndex()):
            return len(self.items)
    
    
        def removeRows(self, row, count , parent=QModelIndex()):
            self.beginRemoveRows(parent, row, row+count-1)
            toRemove = self.items[row:row+count]
            for tsd in toRemove:
                self.items.remove(tsd)
            self.endRemoveRows()
    
        def getIndexFromDate(self, tsd):
            return self.createIndex(self.items.index(tsd),0)
    
        def getDateFromIndex(self, index):
            if index.isValid():
                return self.items[index.row()]
            return None
    
        def getTimeSeriesDatumFromIndex(self, index):
            if index.isValid():
                i = index.row()
                if i >= 0 and i < len(self.items):
                    return self.items[i]
    
            return None
    
        def columnCount(self, parent = QModelIndex()):
            return len(self.columnames)
    
        def data(self, index, role = Qt.DisplayRole):
            if role is None or not index.isValid():
                return None
    
            value = None
            columnName = self.columnames[index.column()]
    
            TSD = self.getTimeSeriesDatumFromIndex(index)
            keys = list(TSD.__dict__.keys())
    
    
            if role == Qt.DisplayRole or role == Qt.ToolTipRole:
                if columnName == 'name':
                    value = os.path.basename(TSD.pathImg)
                elif columnName == 'sensor':
                    if role == Qt.ToolTipRole:
                        value = TSD.sensor.getDescription()
                    else:
    
                        value = TSD.sensor.name()
    
                elif columnName == 'date':
                    value = '{}'.format(TSD.date)
                elif columnName == 'image':
                    value = TSD.pathImg
                elif columnName in keys:
                    value = TSD.__dict__[columnName]
                else:
                    s = ""
            elif role == Qt.CheckStateRole:
                if columnName == 'date':
                    value = Qt.Checked if TSD.isVisible() else Qt.Unchecked
            elif role == Qt.BackgroundColorRole:
                value = None
            elif role == Qt.UserRole:
                value = TSD
    
            return value
    
        def setData(self, index, value, role=None):
            if role is None or not index.isValid():
                return None
    
            if role is Qt.UserRole:
    
                s = ""
    
            columnName = self.columnames[index.column()]
    
            TSD = self.getTimeSeriesDatumFromIndex(index)
            if columnName == 'date' and role == Qt.CheckStateRole:
                TSD.setVisibility(value != Qt.Unchecked)
                return True
            else:
                return False
    
            return False
    
        def flags(self, index):
            if index.isValid():
                columnName = self.columnames[index.column()]
                flags = Qt.ItemIsEnabled | Qt.ItemIsSelectable
                if columnName == 'date': #allow check state
                    flags = flags | Qt.ItemIsUserCheckable
    
                return flags
                #return item.qt_flags(index.column())
            return None
    
        def headerData(self, col, orientation, role):
            if Qt is None:
                return None
            if orientation == Qt.Horizontal and role == Qt.DisplayRole:
                return self.columnames[col]
            elif orientation == Qt.Vertical and role == Qt.DisplayRole:
                return col
            return None
    
    
    
    if __name__ == '__main__':
        import site, sys
        #add site-packages to sys.path as done by enmapboxplugin.py
    
        from timeseriesviewer import DIR_SITE_PACKAGES
        site.addsitedir(DIR_SITE_PACKAGES)
    
        #prepare QGIS environment
        if sys.platform == 'darwin':
            PATH_QGS = r'/Applications/QGIS.app/Contents/MacOS'
            os.environ['GDAL_DATA'] = r'/usr/local/Cellar/gdal/1.11.3_1/share'
        else:
            # assume OSGeo4W startup
            PATH_QGS = os.environ['QGIS_PREFIX_PATH']
        assert os.path.exists(PATH_QGS)
    
        qgsApp = QgsApplication([], True)
        QApplication.addLibraryPath(r'/Applications/QGIS.app/Contents/PlugIns')
        QApplication.addLibraryPath(r'/Applications/QGIS.app/Contents/PlugIns/qgis')
        qgsApp.setPrefixPath(PATH_QGS, True)
        qgsApp.initQgis()
    
        #add component tests here:
    
    
        pixelData = dict()
        pixelData['geo_x'] = 1000
        pixelData['geo_y'] = 2000
    
        px = PixelCollection()
    
        #close QGIS
        qgsApp.exec_()
        qgsApp.exitQgis()