Commit 72d8c712 authored by Benjamin Jakimow's avatar Benjamin Jakimow
Browse files

update qps


fixed mapcancas info item
refactored map widgets
Signed-off-by: Benjamin Jakimow's avatarBenjamin Jakimow benjamin.jakimow@geo.hu-berlin.de <benjamin.jakimow@geo.hu-berlin.de>
parent 20c1abb0
......@@ -700,9 +700,12 @@ def gdalDataset(dataset: typing.Union[str,
if isinstance(dataset, QgsRasterDataProvider):
return gdalDataset(dataset.dataSourceUri())
if isinstance(dataset, str):
dataset = gdal.Open(dataset, eAccess)
ds = gdal.Open(dataset, eAccess)
assert isinstance(ds, gdal.Dataset), f'Can not read {dataset} as gdal.Dataset'
return ds
else:
raise NotImplementedError(f'Can not open {dataset} as gdal.Dataset')
assert isinstance(dataset, gdal.Dataset), 'Can not read {} as gdal.Dataset'.format(dataset)
return dataset
......
......@@ -257,31 +257,31 @@ class MapCanvasInfoItem(QgsMapCanvasItem):
r.drawText(poo, rotation, hAlign, text, context, textFormat)
def setUpperLeft(self, expression: QgsExpression):
self.setText(expression, Qt.AlignTop | Qt.AlignLeft)
self.setInfoText(expression, Qt.AlignTop | Qt.AlignLeft)
def setMiddleLeft(self, expression: QgsExpression):
self.setText(expression, Qt.AlignVCenter | Qt.AlignLeft)
self.setInfoText(expression, Qt.AlignVCenter | Qt.AlignLeft)
def setLowerLeft(self, expression: QgsExpression):
self.setText(expression, Qt.AlignBottom | Qt.AlignLeft)
self.setInfoText(expression, Qt.AlignBottom | Qt.AlignLeft)
def setUpperCenter(self, expression: QgsExpression):
self.setText(expression, Qt.AlignTop | Qt.AlignHCenter)
self.setInfoText(expression, Qt.AlignTop | Qt.AlignHCenter)
def setMiddleCenter(self, expression: QgsExpression):
self.setText(expression, Qt.AlignVCenter | Qt.AlignHCenter)
self.setInfoText(expression, Qt.AlignVCenter | Qt.AlignHCenter)
def setLowerCenter(self, expression: QgsExpression):
self.setText(expression, Qt.AlignBottom | Qt.AlignHCenter)
self.setInfoText(expression, Qt.AlignBottom | Qt.AlignHCenter)
def setUpperRight(self, expression: QgsExpression):
self.setText(expression, Qt.AlignTop | Qt.AlignRight)
self.setInfoText(expression, Qt.AlignTop | Qt.AlignRight)
def setMiddleRight(self, expression: QgsExpression):
self.setText(expression, Qt.AlignVCenter | Qt.AlignRight)
self.setInfoText(expression, Qt.AlignVCenter | Qt.AlignRight)
def setLowerRight(self, expression: QgsExpression):
self.setText(expression, Qt.AlignBottom | Qt.AlignRight)
self.setInfoText(expression, Qt.AlignBottom | Qt.AlignRight)
def clearInfoText(self):
self.mInfoText.clear()
......
......@@ -34,14 +34,15 @@ import numpy as np
import time
import qgis.utils
from qgis.PyQt.QtCore import \
Qt, QSize, pyqtSignal, QModelIndex, QTimer, QAbstractListModel
Qt, QSize, pyqtSignal, QModelIndex, QTimer, QAbstractListModel, QMargins
from qgis.PyQt.QtGui import \
QColor, QIcon, QGuiApplication, QMouseEvent
from qgis.PyQt.QtWidgets import \
QWidget, QLayoutItem, QFrame, QLabel, QGridLayout, QSlider, QMenu, \
QToolBox, QDialog, QAction, QSpinBox, QCheckBox, QLineEdit
QToolBox, QDialog, QAction, QSpinBox, QCheckBox, QLineEdit, QWidgetItem, QSpacerItem, QLayout
from qgis.PyQt.QtXml import \
QDomDocument, QDomNode, QDomElement
from qgis.core import \
QgsCoordinateReferenceSystem, QgsVectorLayer, QgsTextFormat, QgsProject, \
QgsRectangle, QgsRasterRenderer, QgsMapLayerStore, QgsMapLayerStyle, \
......@@ -53,7 +54,8 @@ from qgis.core import \
from qgis.gui import \
QgsDockWidget, QgsMapCanvas, QgsMapTool, QgsCollapsibleGroupBox, QgsLayerTreeView, \
QgisInterface, QgsLayerTreeViewMenuProvider, QgsLayerTreeMapCanvasBridge, \
QgsProjectionSelectionWidget, QgsMessageBar, QgsFieldExpressionWidget, QgsFilterLineEdit, QgsExpressionLineEdit
QgsProjectionSelectionWidget, QgsMessageBar, QgsFieldExpressionWidget, QgsFilterLineEdit, \
QgsExpressionLineEdit, QgsExpressionBuilderDialog, QgsAttributeForm
from .externals.qps.crosshair.crosshair import getCrosshairStyle, CrosshairStyle, CrosshairMapCanvasItem
from .externals.qps.layerproperties import VectorLayerTools
from .externals.qps.maptools import MapTools
......@@ -82,6 +84,7 @@ class MapViewLayerTreeModel(QgsLayerTreeModel):
def __init__(self, rootNode, parent=None):
super(MapViewLayerTreeModel, self).__init__(rootNode, parent=parent)
class MapViewExpressionContextGenerator(QgsExpressionContextGenerator):
def __init__(self, *args, **kwds):
......@@ -89,7 +92,6 @@ class MapViewExpressionContextGenerator(QgsExpressionContextGenerator):
self.mMapView: MapView = None
def setMapView(self, mapView):
self.mMapView = mapView
def createExpressionContext(self) -> QgsExpressionContext:
......@@ -98,9 +100,10 @@ class MapViewExpressionContextGenerator(QgsExpressionContextGenerator):
if False and isinstance(self.mMapView, MapView):
canvas = self.mMapView.currentMapCanvas()
context.appendScope(canvas.expressionContextScope())
#self._context = context
# self._context = context
return context
class MapView(QFrame):
"""
A MapView defines how a single map canvas visualizes sensor specific EOTS data plus additional vector overlays
......@@ -201,16 +204,16 @@ class MapView(QFrame):
self._fakeLyr: QgsVectorLayer = QgsVectorLayer("point?crs=epsg:4326", "Scratch point layer", "memory")
#self.tbInfoExpression.setLayer(self.mLyr)
# self.tbInfoExpression.setLayer(self.mLyr)
#self.mExpressionContextGenerator = MapViewExpressionContextGenerator()
#self.mExpressionContextGenerator.setMapView(self)
# self.mExpressionContextGenerator = MapViewExpressionContextGenerator()
# self.mExpressionContextGenerator.setMapView(self)
self.tbInfoExpression.setEnabled(self.optionShowInfoExpression.isChecked())
#self.tbInfoExpression.registerExpressionContextGenerator(self.mExpressionContextGenerator)
# self.tbInfoExpression.registerExpressionContextGenerator(self.mExpressionContextGenerator)
self.optionShowInfoExpression.toggled.connect(self.sigCanvasAppearanceChanged)
#self.tbInfoExpression.expressionChanged.connect(self.sigCanvasAppearanceChanged)
# self.tbInfoExpression.expressionChanged.connect(self.sigCanvasAppearanceChanged)
for action in m.actions():
action.toggled.connect(self.sigCanvasAppearanceChanged)
......@@ -218,14 +221,11 @@ class MapView(QFrame):
def onMapInfoExpressionChanged(self, text: str):
self.sigCanvasAppearanceChanged.emit()
s = ""
def onSetInfoExpression(self, *args):
from qgis.gui import QgsExpressionBuilderDialog, QgsAttributeForm
from qgis.core import QgsExpressionContextScope
context = QgsExpressionContext(QgsExpressionContextUtils.globalProjectLayerScopes(self._fakeLyr))
c = self.currentMapCanvas()
if isinstance(c, MapCanvas):
......@@ -236,10 +236,10 @@ class MapView(QFrame):
self,
'generic', context)
dlg.setWindowTitle('Expression Based Filter')
#myDa = QgsDistanceArea()
#myDa.setSourceCrs(self.mLayer.crs(), QgsProject.instance().transformContext())
#myDa.setEllipsoid(QgsProject.instance().ellipsoid())
#dlg.setGeomCalculator(myDa)
# myDa = QgsDistanceArea()
# myDa.setSourceCrs(self.mLayer.crs(), QgsProject.instance().transformContext())
# myDa.setEllipsoid(QgsProject.instance().ellipsoid())
# dlg.setGeomCalculator(myDa)
if dlg.exec() == QDialog.Accepted:
self.tbInfoExpression.setText(dlg.expressionText())
......@@ -267,9 +267,9 @@ class MapView(QFrame):
mapView.setMapBackgroundColor(QColor(nodeMapView.attribute('bg')))
mapView.setVisibility(to_bool(nodeMapView.attribute('visible')))
#mapView.optionShowDate.setChecked(to_bool(nodeMapView.attribute('showDate')))
#mapView.optionShowSensorName.setChecked(to_bool(nodeMapView.attribute('showSensorName')))
#mapView.optionShowMapViewName.setChecked(to_bool(nodeMapView.attribute('showMapViewName')))
# mapView.optionShowDate.setChecked(to_bool(nodeMapView.attribute('showDate')))
# mapView.optionShowSensorName.setChecked(to_bool(nodeMapView.attribute('showSensorName')))
# mapView.optionShowMapViewName.setChecked(to_bool(nodeMapView.attribute('showMapViewName')))
# nodeMapView.setAttribute('showDate', str(self.optionShowDate.checked()))
# nodeMapView.setAttribute('showSensorName', str(self.optionShowSensorName.checked()))
......@@ -1099,10 +1099,9 @@ class MapWidget(QFrame):
loadUi(DIR_UI / 'mapwidget.ui', self)
self.setContentsMargins(1, 1, 1, 1)
self.mGrid: QGridLayout = self.mCanvasGrid
assert isinstance(self.mGrid, QGridLayout)
self.mGrid.setSpacing(0)
self.mGrid.setContentsMargins(0, 0, 0, 0)
self.mGridFrame: QFrame
self.mGrid: QGridLayout = None
self.initEmptyGrid()
self.mSyncLock = False
self.mSyncQGISMapCanvasCenter: bool = False
......@@ -1166,6 +1165,15 @@ class MapWidget(QFrame):
self.mTimeSlider.valueChanged.connect(self.onSliderValueChanged)
self.mTimeSlider.sliderMoved.connect(self.onSliderMoved)
def initEmptyGrid(self):
if isinstance(self.mGrid, QGridLayout):
self.mGrid.setParent(None)
self.mGrid = QGridLayout()
self.mGrid.setSpacing(0)
self.mGrid.setContentsMargins(0, 0, 0, 0)
self.mGridFrame.setLayout(self.mGrid)
def messageBar(self) -> QgsMessageBar:
"""
Returns the QgsMessageBar
......@@ -1351,6 +1359,8 @@ class MapWidget(QFrame):
def setCurrentMapView(self, mapView: MapView):
assert isinstance(mapView, MapView)
lastCurrentMapCanvas = self.currentMapCanvas()
if not isinstance(lastCurrentMapCanvas, MapCanvas):
return
lastCurrentMapView = lastCurrentMapCanvas.mapView()
if mapView != lastCurrentMapView:
......@@ -1545,6 +1555,9 @@ class MapWidget(QFrame):
assert n >= 1
self.mMapViewRows = n
def rowsPerMapView(self) -> int:
return self.mMapViewRows
def setMapsPerMapView(self, cols: int, rows: int) -> int:
"""
Sets the number of maps per map viewe
......@@ -1829,7 +1842,7 @@ class MapWidget(QFrame):
self.mSyncLock = False
def _createMapCanvas(self) -> MapCanvas:
mapCanvas = MapCanvas()
mapCanvas = MapCanvas(parent=self.mGridFrame)
mapCanvas.setMapLayerStore(self.mMapLayerStore)
mapCanvas.mInfoItem.setTextFormat(self.mapTextFormat())
......@@ -1906,25 +1919,25 @@ class MapWidget(QFrame):
nc = self.mMapViewColumns
nr = len(self.mapViews()) * self.mMapViewRows
toRemove = []
for iMV in range(nr, self.mGrid.rowCount()):
for col in range(self.mGrid.columnCount()):
item = self.mGrid.itemAtPosition(iMV, col)
if isinstance(item, QLayoutItem) and isinstance(item.widget(), QWidget):
toRemove.append(item.widget())
for col in range(nc, self.mGrid.columnCount()):
for iMV in range(self.mGrid.rowCount()):
item = self.mGrid.itemAtPosition(iMV, col)
if isinstance(item, QLayoutItem) and isinstance(item.widget(), QWidget):
toRemove.append(item.widget())
for w in toRemove:
self.mGrid.removeWidget(w)
w.setParent(None)
w.setVisible(False)
if True:
toRemove = []
for iMV in range(nr, self.mGrid.rowCount()):
for col in range(self.mGrid.columnCount()):
item = self.mGrid.itemAtPosition(iMV, col)
if isinstance(item, QLayoutItem) and isinstance(item.widget(), QWidget):
toRemove.append(item.widget())
for col in range(nc, self.mGrid.columnCount()):
for iMV in range(self.mGrid.rowCount()):
item = self.mGrid.itemAtPosition(iMV, col)
if isinstance(item, QLayoutItem) and isinstance(item.widget(), QWidget):
toRemove.append(item.widget())
for w in toRemove:
self.mGrid.removeWidget(w)
w.setParent(None)
w.setVisible(False)
# self.initEmptyGrid()
usedCanvases: typing.List[MapCanvas] = []
self.mCanvases.clear()
......@@ -1980,7 +1993,7 @@ class MapWidget(QFrame):
# self.setMaximumSize(self.sizeHint())
# self.setFixedSize(self.sizeHint())
# if False and self.parentWidget():
if True:
if False:
w = self
assert isinstance(w, QWidget)
......@@ -2117,7 +2130,7 @@ class MapWidget(QFrame):
expr = QgsExpression(mapView.mapInfoExpression())
if isinstance(expr, QgsExpression) and expr.expression() != '':
#context = QgsExpressionContext([QgsExpressionContextScope(canvas.expressionContextScope())])
# context = QgsExpressionContext([QgsExpressionContextScope(canvas.expressionContextScope())])
context: QgsExpressionContext = QgsExpressionContext()
context.appendScope(QgsExpressionContextUtils.globalScope())
context.appendScope(QgsExpressionContextScope(canvas.expressionContextScope()))
......@@ -2127,10 +2140,10 @@ class MapWidget(QFrame):
infoText = expr2.evaluate(context)
if not expr2.hasEvalError():
#print(infoText)
# print(infoText)
infoItem.setInfoText(str(infoText))
else:
#print(expr.evalErrorString(), file=sys.stderr)
# print(expr.evalErrorString(), file=sys.stderr)
infoItem.setInfoText('')
canvas.addToRefreshPipeLine(MapCanvas.Command.UpdateMapItems)
......@@ -2438,8 +2451,8 @@ class MapViewDock(QgsDockWidget):
if n == 1:
pass
#mapView.optionShowDate.setChecked(True)
#mapView.optionShowSensorName.setChecked(True)
# mapView.optionShowDate.setChecked(True)
# mapView.optionShowSensorName.setChecked(True)
mapView.setTitle(title)
mapView.sigShowProfiles.connect(self.sigShowProfiles)
......
......@@ -436,6 +436,23 @@ def verifyInputImage(datasource):
class TimeSeriesSource(object):
"""Provides information on source images"""
MIMEDATA_FORMATS = ['text/uri-list']
@classmethod
def fromMimeData(cls, mimeData: QMimeData) -> typing.List:
sources = []
if mimeData.hasUrls():
for url in mimeData.urls():
try:
print(url)
tss = TimeSeriesSource.create(url)
if isinstance(tss, TimeSeriesSource):
sources.append(tss)
except:
pass
return sources
@classmethod
def fromJson(cls, jsonData: str):
"""
......@@ -528,9 +545,10 @@ class TimeSeriesSource(object):
self.mSpatialExtent: SpatialExtent
self.mSpatialExtent = None
self.mTimeSeriesDate = None
dataset = gdalDataset(dataset)
try:
dataset = gdalDataset(dataset)
except:
pass
if isinstance(dataset, gdal.Dataset):
assert dataset.RasterCount > 0
......@@ -1200,7 +1218,7 @@ class TimeSeriesFindOverlapTask(QgsTask):
self.mDates = set([t[1] for t in self.mTSS])
if not isinstance(date_of_interest, np.datetime64):
self.mDOI = date_of_interest
self.mDOI = list(self.mDates)[0]
else:
self.mDOI = date_of_interest
......@@ -1998,7 +2016,7 @@ class TimeSeries(QAbstractItemModel):
if len(task.mInvalidSources) > 0:
info = ['Unable to load {} data source(s):'.format(len(task.mInvalidSources))]
for (s, ex) in task.mInvalidSources:
info.append('Path="{}" Error="{}"'.format(str(s), str(ex).replace('\n', ' ')))
info.append('Path="{}"\nError="{}"'.format(str(s), str(ex).replace('\n', ' ')))
info = '\n'.join(info)
messageLog(info, Qgis.Critical)
......@@ -2495,6 +2513,38 @@ class TimeSeriesTreeView(QTreeView):
def __init__(self, parent=None):
super(TimeSeriesTreeView, self).__init__(parent)
self.setAcceptDrops(True)
self.setDragDropMode(QAbstractItemView.DropOnly)
self.setDropIndicatorShown(True)
def dragEnterEvent(self, event: QDragEnterEvent):
md: QMimeData = event.mimeData()
for format in TimeSeriesSource.MIMEDATA_FORMATS:
if format in md.formats():
event.acceptProposedAction()
def dragMoveEvent(self, event: QDragMoveEvent):
event.acceptProposedAction()
def dropEvent(self, event: QDropEvent):
md: QMimeData = event.mimeData()
local_files = []
local_ts_lists = []
if md.hasUrls():
for url in md.urls():
url: QUrl
if url.isLocalFile():
path = pathlib.Path(url.toLocalFile())
if re.search(r'\.(txt|csv)$', path.name):
local_ts_lists.append(path)
else:
local_files.append(path)
event.acceptProposedAction()
if len(local_files) > 0:
self.timeseries().addSources(local_files)
if len(local_ts_lists) > 0:
for file in local_ts_lists:
self.timeseries().loadFromFile(file)
def contextMenuEvent(self, event: QContextMenuEvent):
"""
......
......@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>602</width>
<height>270</height>
<height>454</height>
</rect>
</property>
<property name="windowTitle">
......@@ -43,7 +43,7 @@
</widget>
</item>
<item>
<widget class="QFrame" name="gridFrame">
<widget class="QFrame" name="mGridFrame">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>2</horstretch>
......@@ -56,44 +56,21 @@
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<property name="spacing">
<number>0</number>
</property>
<item row="1" column="0">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Preferred</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>0</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="0">
<layout class="QGridLayout" name="mCanvasGrid"/>
</item>
</layout>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout" stretch="0,0,0,0,0,0,0,0">
<item>
......@@ -116,7 +93,7 @@
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../../../cpp/QGIS/images/images.qrc">
<iconset>
<normaloff>:/images/themes/default/mActionDoubleArrowLeft.svg</normaloff>:/images/themes/default/mActionDoubleArrowLeft.svg</iconset>
</property>
<property name="autoRaise">
......@@ -130,7 +107,7 @@
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../../../cpp/QGIS/images/images.qrc">
<iconset>
<normaloff>:/images/themes/default/mActionArrowLeft.svg</normaloff>:/images/themes/default/mActionArrowLeft.svg</iconset>
</property>
<property name="autoRaise">
......@@ -167,7 +144,7 @@
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../../../cpp/QGIS/images/images.qrc">
<iconset>
<normaloff>:/images/themes/default/mActionArrowRight.svg</normaloff>:/images/themes/default/mActionArrowRight.svg</iconset>
</property>
<property name="autoRaise">
......@@ -181,7 +158,7 @@
<string>...</string>
</property>
<property name="icon">
<iconset resource="../../../../cpp/QGIS/images/images.qrc">
<iconset>
<normaloff>:/images/themes/default/mActionDoubleArrowRight.svg</normaloff>:/images/themes/default/mActionDoubleArrowRight.svg</iconset>
</property>
<property name="autoRaise">
......@@ -208,7 +185,7 @@
</layout>
<action name="actionForward">
<property name="icon">
<iconset resource="../../../../cpp/QGIS/images/images.qrc">
<iconset>
<normaloff>:/images/themes/default/mActionArrowRight.svg</normaloff>:/images/themes/default/mActionArrowRight.svg</iconset>
</property>
<property name="text">
......@@ -220,7 +197,7 @@
</action>
<action name="actionBackward">
<property name="icon">
<iconset resource="../../../../cpp/QGIS/images/images.qrc">
<iconset>
<normaloff>:/images/themes/default/mActionArrowLeft.svg</normaloff>:/images/themes/default/mActionArrowLeft.svg</iconset>
</property>
<property name="text">
......@@ -250,7 +227,7 @@
</action>
<action name="actionForwardFast">
<property name="icon">
<iconset resource="../../../../cpp/QGIS/images/images.qrc">
<iconset>
<normaloff>:/images/themes/default/mActionDoubleArrowRight.svg</normaloff>:/images/themes/default/mActionDoubleArrowRight.svg</iconset>
</property>
<property name="text">
......@@ -259,7 +236,7 @@
</action>
<action name="actionBackwardFast">
<property name="icon">
<iconset resource="../../../../cpp/QGIS/images/images.qrc">
<iconset>
<normaloff>:/images/themes/default/mActionDoubleArrowLeft.svg</normaloff>:/images/themes/default/mActionDoubleArrowLeft.svg</iconset>
</property>
<property name="text">
......
......@@ -32,7 +32,7 @@ import numpy as np
jp = os.path.join
dn = os.path.dirname
MAP_LAYER_STORES = MAP_LAYER_STORES# [QgsProject.instance()]
MAP_LAYER_STORES = MAP_LAYER_STORES # [QgsProject.instance()]
def qgisInstance():
......@@ -43,7 +43,7 @@ def qgisInstance():
from eotimeseriesviewer.main import EOTimeSeriesViewer
if isinstance(qgis.utils.iface, QgisInterface) and \
not isinstance(qgis.utils.iface, EOTimeSeriesViewer):
not isinstance(qgis.utils.iface, EOTimeSeriesViewer):
return qgis.utils.iface
else:
return None
......@@ -53,9 +53,10 @@ def settings():
return QSettings('HU-Berlin', 'EO Time Series Viewer')
def fixMenuButtons(w:QWidget):
def fixMenuButtons(w: QWidget):
for toolButton in w.findChildren(QToolButton):
assert isinstance(toolButton, QToolButton)
if isinstance(toolButton.defaultAction(), QAction) and isinstance(toolButton.defaultAction().menu(), QMenu)\
if isinstance(toolButton.defaultAction(), QAction) and isinstance(toolButton.defaultAction().menu(), QMenu) \
or isinstance(toolButton.menu(), QMenu):
toolButton.setPopupMode(QToolButton.MenuButtonPopup)
......@@ -14,19 +14,20 @@ WHERE python3 >nul 2>&1 && (
::start %PYTHON% scripts/setup_repository.py
%PYTHON% -m coverage run --rcfile=.coveragec tests/test_stackedbandinput.py
%PYTHON% -m coverage run --rcfile=.coveragec --append tests/test_utils.py
%PYTHON% -m coverage run --rcfile=.coveragec --append tests/test_qgis_interaction.py
%PYTHON% -m coverage run --rcfile=.coveragec --append tests/test_mapcanvas.py
%PYTHON% -m coverage run --rcfile=.coveragec --append tests/test_layerproperties.py
%PYTHON% -m coverage run --rcfile=.coveragec tests/test_fileFormatLoading.py
%PYTHON% -m coverage run --rcfile=.coveragec --append tests/test_gee.py
%PYTHON% -m coverage run --rcfile=.coveragec --append tests/test_labeling.py
%PYTHON% -m coverage run --rcfile=.coveragec --append tests/test_settings.py
%PYTHON% -m coverage run --rcfile=.coveragec --append tests/test_maptools.py
%PYTHON% -m coverage run --rcfile=.coveragec --append tests/test_layerproperties.py
%PYTHON% -m coverage run --rcfile=.coveragec --append tests/test_main.py
%PYTHON% -m coverage run --rcfile=.coveragec --append tests/test_fileFormatLoading.py
%PYTHON% -m coverage run --rcfile=.coveragec --append tests/test_qgis_environment.py
%PYTHON% -m coverage run --rcfile=.coveragec --append tests/test_mapcanvas.py
%PYTHON% -m coverage run --rcfile=.coveragec --append tests/test_maptools.py
%PYTHON% -m coverage run --rcfile=.coveragec --append tests/test_mapvisualization.py
%PYTHON% -m coverage run --rcfile=.coveragec --append tests/test_temporalprofiles.py