Commit 02118e0c authored by Benjamin Jakimow's avatar Benjamin Jakimow
Browse files

Enables the EOTSV to open multiple Spectral Libraries

parent 77f529af
Pipeline #12997 failed
from qgis.PyQt.QtGui import QIcon
from qgis.PyQt.QtWidgets import QAction, QToolBar
from qgis.core import QgsVectorLayer, QgsVectorLayerTools
from qgis.gui import QgsDockWidget
from eotimeseriesviewer.externals.qps.vectorlayertools import VectorLayerTools
from eotimeseriesviewer.externals.qps.speclib.core import SpectralLibrary
from eotimeseriesviewer.externals.qps.speclib.gui import SpectralLibraryWidget, SpectralLibraryPanel
from eotimeseriesviewer.labeling import LabelWidget, gotoNextFeature, gotoPreviousFeature
class SpectralLibraryDockWidget(SpectralLibraryPanel):
def __init__(self, speclib: SpectralLibrary, *args, **kwds):
super().__init__(*args, **kwds)
assert isinstance(self.SLW, SpectralLibraryWidget)
self.mActionNextFeature = QAction('Next Feature', parent=self)
self.mActionNextFeature.setIcon(QIcon(':/images/themes/default/mActionAtlasNext.svg'))
self.mActionNextFeature.triggered.connect(
lambda *args,
lyr=self.speclib(),
vlt=self.SLW.vectorLayerTools():
gotoNextFeature(lyr, vlt)
)
self.mActionPreviousFeature = QAction('Previous Feature', parent=self)
self.mActionPreviousFeature.setIcon(QIcon(':/images/themes/default/mActionAtlasPrev.svg'))
self.mActionPreviousFeature.triggered.connect(
lambda *args,
lyr=self.speclib(),
vlt=self.SLW.vectorLayerTools():
gotoPreviousFeature(lyr, vlt))
self.SLW.mToolbar: QToolBar
self.SLW.mToolbar.insertActions(self.SLW.mActionToggleEditing,
[self.mActionPreviousFeature, self.mActionNextFeature])
self.SLW.mToolbar.insertSeparator(self.SLW.mActionToggleEditing)
def setVectorLayerTools(self, tools: QgsVectorLayerTools):
self.SLW.setVectorLayerTools(tools)
def spectralLibrary(self) -> SpectralLibrary:
return self.SLW.spectralLibrary()
class LabelDockWidget(QgsDockWidget):
def __init__(self, layer, *args, **kwds):
super().__init__(*args, **kwds)
self.mLabelWidget = LabelWidget(layer)
self.setWidget(self.mLabelWidget)
self.setWindowTitle(self.mLabelWidget.windowTitle())
self.mLabelWidget.windowTitleChanged.connect(self.setWindowTitle)
def setVectorLayerTools(self, tools: QgsVectorLayerTools):
self.mLabelWidget.setVectorLayerTools(tools)
def vectorLayer(self) -> QgsVectorLayer:
if isinstance(self.mLabelWidget.mLayer, QgsVectorLayer):
return self.mLabelWidget.mLayer
return None
......@@ -2143,8 +2143,6 @@ class SpectralLibrary(QgsVectorLayer):
s = ""
return None
sigNameChanged = pyqtSignal(str)
@classmethod
def instances(cls) -> list:
warnings.warn('SpectraLibrary.instances() Will be removed', DeprecationWarning)
......
......@@ -2681,8 +2681,10 @@ class SpectralLibraryPanel(QgsDockWidget):
def __init__(self, *args, speclib: SpectralLibrary = None, **kwds):
super(SpectralLibraryPanel, self).__init__(*args, **kwds)
self.setObjectName('spectralLibraryPanel')
self.setWindowTitle('Spectral Library')
self.SLW = SpectralLibraryWidget(speclib=speclib)
self.setWindowTitle(self.speclib().name())
self.speclib().nameChanged.connect(lambda *args: self.setWindowTitle(self.speclib().name()))
self.setWidget(self.SLW)
def spectralLibraryWidget(self) -> SpectralLibraryWidget:
......
......@@ -130,6 +130,7 @@ def cleanDir(d):
for p in dirs + files: rm(jp(root, p))
break
# a QPS internal map layer store
QPS_MAPLAYER_STORE = QgsMapLayerStore()
......@@ -455,7 +456,6 @@ LUT_WAVELENGTH = dict({'B': 480,
'SWIR2': 2150
})
NEXT_COLOR_HUE_DELTA_CON = 10
NEXT_COLOR_HUE_DELTA_CAT = 100
......@@ -681,9 +681,11 @@ def gdalDataset(dataset: typing.Union[str,
pathlib.Path,
QgsRasterLayer,
QgsRasterDataProvider,
gdal.Dataset], eAccess=gdal.GA_ReadOnly) -> gdal.Dataset:
gdal.Dataset],
eAccess:int = gdal.GA_ReadOnly) -> gdal.Dataset:
"""
Returns a gdal.Dataset object instance
:param dataset:
:param pathOrDataset: path | gdal.Dataset | QgsRasterLayer | QgsRasterDataProvider
:return: gdal.Dataset
"""
......@@ -921,6 +923,7 @@ def qgsMapLayer(value: typing.Any) -> QgsMapLayer:
return None
def loadUi(uifile, baseinstance=None, package='', resource_suffix='_rc', remove_resource_references=True,
loadUiType=False):
"""
......@@ -1393,9 +1396,9 @@ def defaultBands(dataset) -> list:
elif isinstance(dataset, QgsRasterDataProvider):
return defaultBands(dataset.dataSourceUri())
elif isinstance(dataset, QgsRasterLayer) and \
isinstance(dataset.dataProvider(), QgsRasterDataProvider) and \
dataset.dataProvider().name() == 'gdal':
return defaultBands(dataset.source())
isinstance(dataset.dataProvider(), QgsRasterDataProvider) and \
dataset.dataProvider().name() == 'gdal':
return defaultBands(dataset.source())
elif isinstance(dataset, gdal.Dataset):
# check ENVI style metadata default band definition
......@@ -1518,7 +1521,7 @@ def parseFWHM(dataset) -> typing.Tuple[np.ndarray]:
# search band by band
values = []
for b in range(dataset.RasterCount):
band: gdal.Band = dataset.GetRasterBand(b+1)
band: gdal.Band = dataset.GetRasterBand(b + 1)
for key, domain in key_positions:
value = dataset.GetMetadataItem(key, domain)
if value not in ['', None]:
......@@ -1528,6 +1531,7 @@ def parseFWHM(dataset) -> typing.Tuple[np.ndarray]:
return np.asarray(values)
return None
def parseWavelength(dataset) -> typing.Tuple[np.ndarray, str]:
"""
Returns the wavelength + wavelength unit of a raster
......@@ -1895,6 +1899,7 @@ class SpatialPoint(QgsPointXY):
"""
Object to keep QgsPoint and QgsCoordinateReferenceSystem together
"""
@staticmethod
def readXml(node: QDomNode):
wkt = node.firstChildElement('SpatialPointCrs').text()
......@@ -2087,6 +2092,7 @@ class SpatialExtent(QgsRectangle):
"""
Object that combines a QgsRectangle and QgsCoordinateReferenceSystem
"""
@staticmethod
def readXml(node: QDomNode):
wkt = node.firstChildElement('SpatialExtentCrs').text()
......@@ -2095,7 +2101,7 @@ class SpatialExtent(QgsRectangle):
return SpatialExtent(crs, rectangle)
@staticmethod
def fromMapCanvas(mapCanvas, fullExtent:bool=False):
def fromMapCanvas(mapCanvas, fullExtent: bool = False):
assert isinstance(mapCanvas, QgsMapCanvas)
if fullExtent:
......@@ -2341,6 +2347,7 @@ def setToolButtonDefaultActionMenu(toolButton: QToolButton, actions: list):
menu.triggered.connect(toolButton.setDefaultAction)
toolButton.setMenu(menu)
class SelectMapLayersDialog(QgsDialog):
class LayerDescription(object):
......
......@@ -534,6 +534,35 @@ class LabelAttributeTypeWidgetDelegate(QStyledItemDelegate):
model.setData(index, w.currentData(Qt.UserRole), Qt.EditRole)
def gotoNextFeature(layer: QgsVectorLayer, tools: QgsVectorLayerTools):
assert isinstance(tools, QgsVectorLayerTools)
if isinstance(layer, QgsVectorLayer) and layer.hasFeatures():
allIDs = sorted(layer.allFeatureIds())
fids = layer.selectedFeatureIds()
if len(fids) == 0:
nextFID = allIDs[0]
else:
i = min(allIDs.index(max(fids)) + 1, len(allIDs) - 1)
nextFID = allIDs[i]
layer.selectByIds([nextFID])
tools.panToSelected(layer)
def gotoPreviousFeature(layer: QgsVectorLayer, tools: QgsVectorLayerTools):
assert isinstance(tools, QgsVectorLayerTools)
if isinstance(layer, QgsVectorLayer) and layer.hasFeatures():
allIDs = sorted(layer.allFeatureIds())
fids = layer.selectedFeatureIds()
if len(fids) == 0:
nextFID = allIDs[0]
else:
i = max(allIDs.index(min(fids)) - 1, 0)
nextFID = allIDs[i]
layer.selectByIds([nextFID])
tools.panToSelected(layer)
class LabelWidget(AttributeTableWidget):
def __init__(self, *args, **kwds):
......@@ -542,64 +571,19 @@ class LabelWidget(AttributeTableWidget):
self.mActionNextFeature = QAction('Next Feature', parent=self)
self.mActionNextFeature.setIcon(QIcon(':/images/themes/default/mActionAtlasNext.svg'))
self.mActionNextFeature.triggered.connect(self.nextFeature)
self.mActionNextFeature.triggered.connect(
lambda *args, lyr=self.mLayer, vlt=self.vectorLayerTools(): gotoNextFeature(lyr, vlt)
)
self.mActionPreviousFeature = QAction('Previous Feature', parent=self)
self.mActionPreviousFeature.setIcon(QIcon(':/images/themes/default/mActionAtlasPrev.svg'))
self.mActionPreviousFeature.triggered.connect(self.previousFeature)
self.mActionPreviousFeature.triggered.connect(
lambda *args, lyr=self.mLayer, vlt=self.vectorLayerTools(): gotoPreviousFeature(lyr, vlt))
self.mToolbar: QToolBar
self.mToolbar.insertActions(self.mActionToggleEditing, [self.mActionPreviousFeature, self.mActionNextFeature])
self.mToolbar.insertSeparator(self.mActionToggleEditing)
def nextFeature(self):
"""
Selects the next feature and moves the map extent to.
"""
if isinstance(self.mLayer, QgsVectorLayer) and self.mLayer.hasFeatures():
allIDs = sorted(self.mLayer.allFeatureIds())
fids = self.mLayer.selectedFeatureIds()
if len(fids) == 0:
nextFID = allIDs[0]
else:
i = min(allIDs.index(max(fids)) + 1, len(allIDs) - 1)
nextFID = allIDs[i]
self.mLayer.selectByIds([nextFID])
self.mVectorLayerTools.panToSelected(self.mLayer)
def previousFeature(self):
"""
Selects the previous feature and moves the map extent to.
"""
if isinstance(self.mLayer, QgsVectorLayer) and self.mLayer.hasFeatures():
allIDs = sorted(self.mLayer.allFeatureIds())
fids = self.mLayer.selectedFeatureIds()
if len(fids) == 0:
nextFID = allIDs[0]
else:
i = max(allIDs.index(min(fids)) - 1, 0)
nextFID = allIDs[i]
self.mLayer.selectByIds([nextFID])
self.mVectorLayerTools.panToSelected(self.mLayer)
class LabelDockWidget(QgsDockWidget):
def __init__(self, layer, *args, **kwds):
super().__init__(*args, **kwds)
self.mLabelWidget = LabelWidget(layer)
self.setWidget(self.mLabelWidget)
self.setWindowTitle(self.mLabelWidget.windowTitle())
self.mLabelWidget.windowTitleChanged.connect(self.setWindowTitle)
def setVectorLayerTools(self, tools: QgsVectorLayerTools):
self.mLabelWidget.setVectorLayerTools(tools)
def vectorLayer(self) -> QgsVectorLayer:
if isinstance(self.mLabelWidget.mLayer, QgsVectorLayer):
return self.mLabelWidget.mLayer
return None
class LabelShortcutEditorConfigWidget(QgsEditorConfigWidget):
......@@ -682,10 +666,6 @@ class LabelShortcutEditorWidgetWrapper(QgsEditorWidgetWrapper):
def __init__(self, vl: QgsVectorLayer, fieldIdx: int, editor: QWidget, parent: QWidget):
super(LabelShortcutEditorWidgetWrapper, self).__init__(vl, fieldIdx, editor, parent)
#self.mEditor = None
#self.mValidator = None
def configLabelType(self) -> LabelShortcutType:
return self.config().get(CONFKEY_LABELTYPE)
......@@ -729,7 +709,6 @@ class LabelShortcutEditorWidgetWrapper(QgsEditorWidgetWrapper):
editor.valueChanged.connect(self.onValueChanged)
else:
s = ""
#self.mEditor = editor
def onValueChanged(self, *args):
self.valueChanged.emit(self.value())
......
This diff is collapsed.
......@@ -43,7 +43,7 @@ from qgis.PyQt.QtWidgets import \
from qgis.PyQt.QtXml import \
QDomDocument, QDomNode, QDomElement
from qgis.core import \
QgsCoordinateReferenceSystem, QgsVector, QgsTextFormat, \
QgsCoordinateReferenceSystem, QgsVectorLayer, QgsTextFormat, \
QgsRectangle, QgsRasterRenderer, QgsMapLayerStore, QgsMapLayerStyle, \
QgsLayerTreeModel, QgsLayerTreeGroup, QgsPointXY, \
QgsLayerTree, QgsLayerTreeLayer, QgsReadWriteContext, \
......@@ -186,6 +186,9 @@ class MapView(QFrame):
fixMenuButtons(self)
def __iter__(self) -> typing.Iterator[TimeSeriesDate]:
return iter(self.mapCanvases())
@staticmethod
def readXml(node: QDomNode):
if node.nodeName() == 'MapView':
......@@ -332,14 +335,14 @@ class MapView(QFrame):
c.setCurrentLayer(layer)
return True
def addSpectralProfileLayer(self):
"""Adds the EOTSV Spectral Profile Layer"""
def addSpectralProfileLayers(self):
"""Adds the EOTSV Spectral Profile Layers"""
from eotimeseriesviewer.main import EOTimeSeriesViewer
tsv = EOTimeSeriesViewer.instance()
if isinstance(tsv, EOTimeSeriesViewer):
lyr = tsv.spectralLibrary()
if lyr not in self.layers():
self.addLayer(lyr)
for lyr in tsv.spectralLibraries():
if lyr not in self.layers():
self.addLayer(lyr)
def addTemporalProfileLayer(self):
"""Adds the EOTSV Temporal Profile Layer"""
......@@ -816,7 +819,7 @@ class MapViewLayerTreeViewMenuProvider(QgsLayerTreeViewMenuProvider):
# ----
menu.addSeparator()
a = menu.addAction('Add Spectral Library Layer')
a.triggered.connect(self.mapView().addSpectralProfileLayer)
a.triggered.connect(self.mapView().addSpectralProfileLayers)
a = menu.addAction('Add Temporal Profile Layer')
a.triggered.connect(self.mapView().addTemporalProfileLayer)
......@@ -1003,8 +1006,8 @@ class MapWidget(QFrame):
sigMapViewAdded = pyqtSignal(MapView)
sigMapViewRemoved = pyqtSignal(MapView)
sigCurrentLayerChanged = pyqtSignal(QgsMapLayer)
sigCurrentCanvasChanged = pyqtSignal(MapCanvas)
sigCurrentMapViewChanged = pyqtSignal(MapView)
# sigCurrentCanvasChanged = pyqtSignal(MapCanvas)
# sigCurrentMapViewChanged = pyqtSignal(MapView)
sigCurrentDateChanged = pyqtSignal(TimeSeriesDate)
sigCurrentLocationChanged = pyqtSignal([QgsCoordinateReferenceSystem, QgsPointXY],
[QgsCoordinateReferenceSystem, QgsPointXY, QgsMapCanvas])
......@@ -1281,7 +1284,7 @@ class MapWidget(QFrame):
canvases = mapView.mapCanvases()
if len(canvases) > 0:
position = min(position, len(canvases) - 1)
self.currentMapCanvas(canvases[position])
self.setCurrentMapCanvas(canvases[position])
def writeXml(self, node: QDomElement, doc: QDomDocument) -> bool:
"""
......
......@@ -75,7 +75,7 @@
<x>0</x>
<y>0</y>
<width>774</width>
<height>17</height>
<height>26</height>
</rect>
</property>
<property name="contextMenuPolicy">
......@@ -100,6 +100,7 @@
<addaction name="menuAdd_Product"/>
<addaction name="separator"/>
<addaction name="actionAddVectorData"/>
<addaction name="actionCreateSpectralLibrary"/>
<addaction name="separator"/>
<addaction name="actionLoadTS"/>
<addaction name="actionSaveTS"/>
......@@ -388,7 +389,7 @@
<bool>true</bool>
</property>
<property name="icon">
<iconset resource="../../../../cpp/QGIS/images/images.qrc">
<iconset resource="../../../QGIS/images/images.qrc">
<normaloff>:/images/themes/default/mActionZoomIn.svg</normaloff>:/images/themes/default/mActionZoomIn.svg</iconset>
</property>
<property name="text">
......@@ -403,7 +404,7 @@
<bool>true</bool>
</property>
<property name="icon">
<iconset resource="../../../../cpp/QGIS/images/images.qrc">
<iconset resource="../../../QGIS/images/images.qrc">
<normaloff>:/images/themes/default/mActionZoomOut.svg</normaloff>:/images/themes/default/mActionZoomOut.svg</iconset>
</property>
<property name="text">
......@@ -418,7 +419,7 @@
<bool>true</bool>
</property>
<property name="icon">
<iconset resource="../../../../cpp/QGIS/images/images.qrc">
<iconset resource="../../../QGIS/images/images.qrc">
<normaloff>:/images/themes/default/mActionZoomFullExtent.svg</normaloff>:/images/themes/default/mActionZoomFullExtent.svg</iconset>
</property>
<property name="text">
......@@ -433,7 +434,7 @@
<bool>true</bool>
</property>
<property name="icon">
<iconset resource="../../../../cpp/QGIS/images/images.qrc">
<iconset resource="../../../QGIS/images/images.qrc">
<normaloff>:/images/themes/default/mActionZoomActual.svg</normaloff>:/images/themes/default/mActionZoomActual.svg</iconset>
</property>
<property name="text">
......@@ -448,7 +449,7 @@
<bool>true</bool>
</property>
<property name="icon">
<iconset resource="../../../../cpp/QGIS/images/images.qrc">
<iconset resource="../../../QGIS/images/images.qrc">
<normaloff>:/images/themes/default/mActionPan.svg</normaloff>:/images/themes/default/mActionPan.svg</iconset>
</property>
<property name="text">
......@@ -522,7 +523,7 @@
</action>
<action name="actionRefresh">
<property name="icon">
<iconset resource="../../../../cpp/QGIS/images/images.qrc">
<iconset resource="../../../QGIS/images/images.qrc">
<normaloff>:/images/themes/default/mActionReload.svg</normaloff>:/images/themes/default/mActionReload.svg</iconset>
</property>
<property name="text">
......@@ -600,7 +601,7 @@
</action>
<action name="actionAddVectorData">
<property name="icon">
<iconset resource="../../../../cpp/QGIS/images/images.qrc">
<iconset resource="../../../QGIS/images/images.qrc">
<normaloff>:/images/themes/default/mActionAddOgrLayer.svg</normaloff>:/images/themes/default/mActionAddOgrLayer.svg</iconset>
</property>
<property name="text">
......@@ -653,7 +654,7 @@
<bool>false</bool>
</property>
<property name="icon">
<iconset resource="../../../../cpp/QGIS/images/images.qrc">
<iconset resource="../../../QGIS/images/images.qrc">
<normaloff>:/images/themes/default/mActionPropertiesWidget.svg</normaloff>:/images/themes/default/mActionPropertiesWidget.svg</iconset>
</property>
<property name="text">
......@@ -728,7 +729,7 @@
<bool>true</bool>
</property>
<property name="icon">
<iconset resource="../../../../cpp/QGIS/images/images.qrc">
<iconset resource="../../../QGIS/images/images.qrc">
<normaloff>:/images/themes/default/mActionSelectRectangle.svg</normaloff>:/images/themes/default/mActionSelectRectangle.svg</iconset>
</property>
<property name="text">
......@@ -743,7 +744,7 @@
<bool>true</bool>
</property>
<property name="icon">
<iconset resource="../../../../cpp/QGIS/images/images.qrc">
<iconset resource="../../../QGIS/images/images.qrc">
<normaloff>:/images/themes/default/mActionSelectPolygon.svg</normaloff>:/images/themes/default/mActionSelectPolygon.svg</iconset>
</property>
<property name="text">
......@@ -758,7 +759,7 @@
<bool>true</bool>
</property>
<property name="icon">
<iconset resource="../../../../cpp/QGIS/images/images.qrc">
<iconset resource="../../../QGIS/images/images.qrc">
<normaloff>:/images/themes/default/mActionSelectFreehand.svg</normaloff>:/images/themes/default/mActionSelectFreehand.svg</iconset>
</property>
<property name="text">
......@@ -770,7 +771,7 @@
<bool>true</bool>
</property>
<property name="icon">
<iconset resource="../../../../cpp/QGIS/images/images.qrc">
<iconset resource="../../../QGIS/images/images.qrc">
<normaloff>:/images/themes/default/mActionSelectRadius.svg</normaloff>:/images/themes/default/mActionSelectRadius.svg</iconset>
</property>
<property name="text">
......@@ -779,7 +780,7 @@
</action>
<action name="actionExportMapsToImages">
<property name="icon">
<iconset resource="../../../../cpp/QGIS/images/images.qrc">
<iconset resource="../../../QGIS/images/images.qrc">
<normaloff>:/images/themes/default/mActionSaveMapAsImage.svg</normaloff>:/images/themes/default/mActionSaveMapAsImage.svg</iconset>
</property>
<property name="text">
......@@ -799,7 +800,7 @@
<bool>true</bool>
</property>
<property name="icon">
<iconset resource="../../../../cpp/QGIS/images/images.qrc">
<iconset resource="../../../QGIS/images/images.qrc">
<normaloff>:/images/themes/default/lockedGray.svg</normaloff>:/images/themes/default/lockedGray.svg</iconset>
</property>
<property name="text">
......@@ -827,7 +828,7 @@
</action>
<action name="mActionSaveEdits">
<property name="icon">
<iconset resource="../../../../cpp/QGIS/images/images.qrc">
<iconset resource="../../../QGIS/images/images.qrc">
<normaloff>:/images/themes/default/mActionSaveEdits.svg</normaloff>:/images/themes/default/mActionSaveEdits.svg</iconset>
</property>
<property name="text">
......@@ -842,7 +843,7 @@
<bool>true</bool>
</property>
<property name="icon">
<iconset resource="../../../../cpp/QGIS/images/images.qrc">
<iconset resource="../../../QGIS/images/images.qrc">
<normaloff>:/images/themes/default/mActionCapturePolygon.svg</normaloff>:/images/themes/default/mActionCapturePolygon.svg</iconset>
</property>
<property name="text">
......@@ -857,7 +858,7 @@
<bool>true</bool>
</property>
<property name="icon">
<iconset resource="../../../../cpp/QGIS/images/images.qrc">
<iconset resource="../../../QGIS/images/images.qrc">
<normaloff>:/images/themes/default/mActionToggleEditing.svg</normaloff>:/images/themes/default/mActionToggleEditing.svg</iconset>
</property>
<property name="text">
......@@ -869,7 +870,7 @@
<bool>true</bool>
</property>
<property name="icon">
<iconset resource="../../../../cpp/QGIS/images/images.qrc">
<iconset resource="../../../QGIS/images/images.qrc">
<normaloff>:/images/themes/default/mActionSelectRectangle.svg</normaloff>:/images/themes/default/mActionSelectRectangle.svg</iconset>
</property>
<property name="text">
......@@ -884,7 +885,7 @@
</action>
<action name="mActionDeselectFeatures">
<property name="icon">
<iconset resource="../../../../cpp/QGIS/images/images.qrc">
<iconset resource="../../../QGIS/images/images.qrc">
<normaloff>:/images/themes/default/mActionDeselectAll.svg</normaloff>:/images/themes/default/mActionDeselectAll.svg</iconset>
</property>
<property name="text">
......@@ -901,7 +902,7 @@
</action>
<action name="mActionOpenTable">
<property name="icon">
<iconset resource="../../../../cpp/QGIS/images/images.qrc">
<iconset resource="../../../QGIS/images/images.qrc">
<normaloff>:/images/themes/default/mActionOpenTable.svg</normaloff>:/images/themes/default/mActionOpenTable.svg</iconset>
</property>
<property name="text">
......@@ -913,7 +914,7 @@
</action>
<action name="mActionZoomToLayer">
<property name="icon">
<iconset resource="../../../../cpp/QGIS/images/images.qrc">
<iconset resource="../../../QGIS/images/images.qrc">
<normaloff>:/images/themes/default/mActionZoomToLayer.svg</normaloff>:/images/themes/default/mActionZoomToLayer.svg</iconset>
</property>
<property name="text">
......@@ -932,7 +933,7 @@
</action>
<action name="actionSaveProject">
<property name="icon">
<iconset resource="../../../../cpp/QGIS/images/images.qrc">
<iconset resource="../../../QGIS/images/images.qrc">
<normaloff>:/images/themes/default/mActionFileSave.svg</normaloff>:/images/themes/default/mActionFileSave.svg</iconset>
</property>
<property name="text">
......@@ -941,7 +942,7 @@
</action>
<action name="actionLoadProject">
<property name="icon">
<iconset resource="../../../../cpp/QGIS/images/images.qrc">
<iconset resource="../../../QGIS/images/images.qrc">
<normaloff>:/images/themes/default/mActionFileOpen.svg</normaloff>:/images/themes/default/mActionFileOpen.svg</iconset>
</property>
<property name="text">
......@@ -956,6 +957,18 @@
<string>Reloads settings from the QGIS Project</string>
</property>
</action>
<action name="actionCreateSpectralLibrary">
<property name="icon">
<iconset resource="../externals/qps/qpsresources.qrc">
<normaloff>:/qps/ui/icons/speclib.svg</normaloff>:/qps/ui/icons/speclib.svg</iconset>
</property>
<property name="text">
<string>Create Spectral Library</string>
</property>
<property name="toolTip">
<string>Opens a Spectral Library to collect spectral profiles</string>
</property>
</action>
</widget>
<customwidgets>
<customwidget>
......@@ -968,7 +981,7 @@
<resources>
<include location="eotsv_resources.qrc"/>
<include location="../externals/qps/qpsresources.qrc"/>
<include location="../../../../cpp/QGIS/images/images.qrc"/>
<include location="../../../QGIS/images/images.qrc"/>
</resources>
<connections/>
</ui>