From 66d7e7e52a448edcc30eca992b4c5bdbff6f562c Mon Sep 17 00:00:00 2001
From: Karsten Rink <karsten.rink@ufz.de>
Date: Mon, 19 Nov 2012 17:23:20 +0100
Subject: [PATCH] added open/save/remove buttons in tab-widgets; added reload
 button for recalculating colorlookup-table for active scalar; fixed issue
 with incorrect display of active scalar array name; fixed issue with mesh
 quality not being scaled correctly; added scheme for enabling access buttons
 only when needed

---
 FileIO/ImportFileTypes.h                   |  12 ++
 Gui/DataView/GeoTabWidget.cpp              |   6 +
 Gui/DataView/GeoTabWidget.h                |   5 +
 Gui/DataView/GeoTabWidgetBase.ui           | 123 ++++++++++++++++++++-
 Gui/DataView/GeoTreeView.cpp               |  66 +++++++----
 Gui/DataView/GeoTreeView.h                 |   7 +-
 Gui/DataView/MshTabWidget.cpp              |   6 +-
 Gui/DataView/MshTabWidget.h                |   4 +
 Gui/DataView/MshTabWidgetBase.ui           |  79 ++++++++++---
 Gui/DataView/MshView.cpp                   |  44 ++++----
 Gui/DataView/MshView.h                     |  14 ++-
 Gui/DataView/StationTabWidget.cpp          |   6 +
 Gui/DataView/StationTabWidget.h            |   4 +
 Gui/DataView/StationTabWidgetBase.ui       | 123 ++++++++++++++++++++-
 Gui/DataView/StationTreeView.cpp           |  71 ++++++++----
 Gui/DataView/StationTreeView.h             |   7 +-
 Gui/Img/delete-icon.png                    | Bin 0 -> 639 bytes
 Gui/Img/icons.qrc                          |   4 +
 Gui/Img/open-icon.png                      | Bin 0 -> 467 bytes
 Gui/Img/oxygen.icons                       |   1 +
 Gui/Img/refresh-icon.png                   | Bin 0 -> 881 bytes
 Gui/Img/save-icon.png                      | Bin 0 -> 686 bytes
 Gui/VtkAct/VtkCustomInteractorStyle.cpp    |   5 +-
 Gui/VtkVis/VtkAlgorithmProperties.cpp      |  17 ++-
 Gui/VtkVis/VtkAlgorithmProperties.h        |   3 +
 Gui/VtkVis/VtkVisTabWidget.cpp             |  46 ++++----
 Gui/VtkVis/VtkVisTabWidget.h               |   1 +
 Gui/VtkVis/VtkVisTabWidgetBase.ui          |  39 ++++++-
 Gui/mainwindow.cpp                         |   8 +-
 Gui/mainwindow.ui                          |   3 +
 MeshLib/MeshQuality/MeshQualityChecker.cpp |   2 +-
 MeshLib/MeshQuality/MeshQualityVolume.cpp  |   2 +-
 32 files changed, 578 insertions(+), 130 deletions(-)
 create mode 100644 Gui/Img/delete-icon.png
 create mode 100644 Gui/Img/open-icon.png
 create mode 100644 Gui/Img/oxygen.icons
 create mode 100644 Gui/Img/refresh-icon.png
 create mode 100644 Gui/Img/save-icon.png

diff --git a/FileIO/ImportFileTypes.h b/FileIO/ImportFileTypes.h
index 84cdfc099de..82b5ef38d0e 100644
--- a/FileIO/ImportFileTypes.h
+++ b/FileIO/ImportFileTypes.h
@@ -24,6 +24,9 @@ public:
 
 	enum type {
 		OGS = 0,
+		OGS_GEO,
+		OGS_STN,
+		OGS_MSH,
 		FEFLOW,
 		GMS,
 		GMSH,
@@ -43,6 +46,9 @@ public:
 		else if (t==ImportFileType::GMSH) return "GMSH";
 		else if (t==ImportFileType::NETCDF) return "NetCDF";
 		else if (t==ImportFileType::OGS) return "OGS";
+		else if (t==ImportFileType::OGS_GEO) return "OGS geometry";
+		else if (t==ImportFileType::OGS_STN) return "OGS station list";
+		else if (t==ImportFileType::OGS_MSH) return "OGS mesh";
 		else if (t==ImportFileType::PETREL) return "Petrel";
 		else if((t==ImportFileType::RASTER) || (t==ImportFileType::POLYRASTER)) return "Raster";
 		else if (t==ImportFileType::SHAPE) return "Shape";
@@ -63,6 +69,12 @@ public:
 			return "NetCDF files (*.nc)";
 		else if (t==ImportFileType::OGS)
 			return "OpenGeosys files (*.gsp *.gml *.vtu *.stn);;GeoSys legacy files (*.gli *.msh);;GeoSys FEM Conditions (*.cnd *.bc *.ic *.st);;All files (* *.*)";
+		else if (t==ImportFileType::OGS_GEO)
+			return "OpenGeosys files (*.gml *.gli)";
+		else if (t==ImportFileType::OGS_STN)
+			return "OpenGeosys files (*.stn)";
+		else if (t==ImportFileType::OGS_MSH)
+			return "OpenGeosys files (*.vtu *.msh)";
 		else if (t==ImportFileType::PETREL)
 			return "Petrel files (*)";
 		else if (t==ImportFileType::RASTER)
diff --git a/Gui/DataView/GeoTabWidget.cpp b/Gui/DataView/GeoTabWidget.cpp
index 03912716d55..8e22b64da8e 100644
--- a/Gui/DataView/GeoTabWidget.cpp
+++ b/Gui/DataView/GeoTabWidget.cpp
@@ -16,4 +16,10 @@ GeoTabWidget::GeoTabWidget( QWidget* parent /*= 0*/ )
 	: QWidget(parent)
 {
 	setupUi(this);
+
+	connect(this->openGeoPushButton, SIGNAL(clicked()), this->treeView, SLOT(addGeometry()));
+	connect(this->saveGeoPushButton, SIGNAL(clicked()), this->treeView, SLOT(writeToFile()));
+	connect(this->removeGeoPushButton, SIGNAL(clicked()), this->treeView, SLOT(removeGeometry()));
+	connect(this->treeView, SIGNAL(enableSaveButton(bool)), this, SLOT(enableSaveButton(bool)));
+	connect(this->treeView, SIGNAL(enableRemoveButton(bool)), this, SLOT(enableRemoveButton(bool)));
 }
diff --git a/Gui/DataView/GeoTabWidget.h b/Gui/DataView/GeoTabWidget.h
index 21697d1f497..bf763204625 100644
--- a/Gui/DataView/GeoTabWidget.h
+++ b/Gui/DataView/GeoTabWidget.h
@@ -26,6 +26,11 @@ public:
 	GeoTabWidget(QWidget* parent = 0);
 
 private:
+
+private slots:
+	void enableSaveButton(bool enable) { this->saveGeoPushButton->setEnabled(enable); };
+	void enableRemoveButton(bool enable) { this->removeGeoPushButton->setEnabled(enable); };
+
 };
 
 #endif // GEOTABWIDGET_H
diff --git a/Gui/DataView/GeoTabWidgetBase.ui b/Gui/DataView/GeoTabWidgetBase.ui
index 6dce56723bf..e556afe7731 100644
--- a/Gui/DataView/GeoTabWidgetBase.ui
+++ b/Gui/DataView/GeoTabWidgetBase.ui
@@ -17,6 +17,125 @@
    <property name="margin">
     <number>2</number>
    </property>
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout">
+     <item>
+      <widget class="QPushButton" name="openGeoPushButton">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="minimumSize">
+        <size>
+         <width>24</width>
+         <height>24</height>
+        </size>
+       </property>
+       <property name="maximumSize">
+        <size>
+         <width>24</width>
+         <height>24</height>
+        </size>
+       </property>
+       <property name="toolTip">
+        <string>Open geometry...</string>
+       </property>
+       <property name="text">
+        <string/>
+       </property>
+       <property name="icon">
+        <iconset resource="../Img/icons.qrc">
+         <normaloff>:/Images/open-icon.png</normaloff>:/Images/open-icon.png</iconset>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QPushButton" name="saveGeoPushButton">
+       <property name="enabled">
+        <bool>false</bool>
+       </property>
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="minimumSize">
+        <size>
+         <width>24</width>
+         <height>24</height>
+        </size>
+       </property>
+       <property name="maximumSize">
+        <size>
+         <width>24</width>
+         <height>24</height>
+        </size>
+       </property>
+       <property name="toolTip">
+        <string>Save geometry...</string>
+       </property>
+       <property name="text">
+        <string/>
+       </property>
+       <property name="icon">
+        <iconset resource="../Img/icons.qrc">
+         <normaloff>:/Images/save-icon.png</normaloff>:/Images/save-icon.png</iconset>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QPushButton" name="removeGeoPushButton">
+       <property name="enabled">
+        <bool>false</bool>
+       </property>
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="minimumSize">
+        <size>
+         <width>24</width>
+         <height>24</height>
+        </size>
+       </property>
+       <property name="maximumSize">
+        <size>
+         <width>24</width>
+         <height>24</height>
+        </size>
+       </property>
+       <property name="toolTip">
+        <string>Remove geometry</string>
+       </property>
+       <property name="text">
+        <string/>
+       </property>
+       <property name="icon">
+        <iconset resource="../Img/icons.qrc">
+         <normaloff>:/Images/delete-icon.png</normaloff>:/Images/delete-icon.png</iconset>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <spacer name="horizontalSpacer">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>40</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+    </layout>
+   </item>
    <item>
     <widget class="GeoTreeView" name="treeView"/>
    </item>
@@ -29,6 +148,8 @@
    <header>GeoTreeView.h</header>
   </customwidget>
  </customwidgets>
- <resources/>
+ <resources>
+  <include location="../Img/icons.qrc"/>
+ </resources>
  <connections/>
 </ui>
diff --git a/Gui/DataView/GeoTreeView.cpp b/Gui/DataView/GeoTreeView.cpp
index 99400ced283..e0253d2e73a 100644
--- a/Gui/DataView/GeoTreeView.cpp
+++ b/Gui/DataView/GeoTreeView.cpp
@@ -11,6 +11,7 @@
 
 #include <QFileDialog>
 #include <QMenu>
+#include <QSettings>
 #include <iostream>
 
 #include "GeoObjectListItem.h"
@@ -18,7 +19,7 @@
 #include "GeoTreeModel.h"
 #include "GeoTreeView.h"
 #include "OGSError.h"
-
+#include "ImportFileTypes.h"
 
 GeoTreeView::GeoTreeView(QWidget* parent) : QTreeView(parent)
 {
@@ -49,9 +50,20 @@ void GeoTreeView::selectionChanged( const QItemSelection &selected,
 
 		const GeoObjectListItem* list_item = dynamic_cast<GeoObjectListItem*>(tree_item->parentItem());
 		if (list_item)
+		{
+			emit enableSaveButton(false);
+			emit enableRemoveButton(false);
 			emit geoItemSelected(list_item->vtkSource(), tree_item->row());
+		}
 		else
+		{
+			emit enableRemoveButton(true);
 			emit removeGeoItemSelection();
+			if (!idx.parent().isValid())
+				emit enableSaveButton(true);
+			else
+				emit enableSaveButton(false);
+		}
 	}
 	//emit itemSelectionChanged(selected, deselected);
 	//return QTreeView::selectionChanged(selected, deselected);
@@ -121,17 +133,17 @@ void GeoTreeView::contextMenuEvent( QContextMenuEvent* event )
 		{
 			if (item->child(0)->data(0).toString().compare("Points") == 0) // clumsy way to find out
 			{
-				QAction* saveAction = menu.addAction("Save geometry...");
+				//QAction* saveAction = menu.addAction("Save geometry...");
 				QAction* mapAction = menu.addAction("Map geometry...");
 				QAction* addCNDAction = menu.addAction("Load FEM Conditions...");
 				//QAction* saveCondAction    = menu.addAction("Save FEM conditions...");
 				menu.addSeparator();
-				QAction* removeAction = menu.addAction("Remove geometry");
-				connect(saveAction, SIGNAL(triggered()), this, SLOT(writeToFile()));
+				//QAction* removeAction = menu.addAction("Remove geometry");
+				//connect(saveAction, SIGNAL(triggered()), this, SLOT(writeToFile()));
 				connect(mapAction, SIGNAL(triggered()), this, SLOT(mapGeometry()));
 				connect(addCNDAction, SIGNAL(triggered()), this, SLOT(loadFEMConditions()));
 				//connect(saveCondAction, SIGNAL(triggered()), this, SLOT(saveFEMConditions()));
-				connect(removeAction, SIGNAL(triggered()), this, SLOT(removeList()));
+				//connect(removeAction, SIGNAL(triggered()), this, SLOT(removeList()));
 			}
 		}
 	}
@@ -146,17 +158,26 @@ void GeoTreeView::connectPolylines()
 	emit requestLineEditDialog(item->data(0).toString().toStdString());
 }
 
-void GeoTreeView::removeList()
+void GeoTreeView::addGeometry()
 {
-	TreeItem* item = static_cast<GeoTreeModel*>(model())->getItem(
-	        this->selectionModel()->currentIndex());
+	emit openGeometryFile(ImportFileType::OGS_GEO);
+}
 
-	GeoObjectListItem* list = dynamic_cast<GeoObjectListItem*>(item);
-	if (list)
-		emit listRemoved((item->parentItem()->data(
-		                          0).toString()).toStdString(), list->getType());
+void GeoTreeView::removeGeometry()
+{
+	QModelIndex index (this->selectionModel()->currentIndex());
+	if (!index.isValid())
+		OGSError::box("No geometry selected.");
 	else
-		emit listRemoved((item->data(0).toString()).toStdString(), GeoLib::INVALID);
+	{
+		TreeItem* item = static_cast<GeoTreeModel*>(model())->getItem(index);
+		GeoObjectListItem* list = dynamic_cast<GeoObjectListItem*>(item);
+		if (list)
+			emit listRemoved((item->parentItem()->data(
+									  0).toString()).toStdString(), list->getType());
+		else
+			emit listRemoved((item->data(0).toString()).toStdString(), GeoLib::INVALID);
+	}
 }
 
 void GeoTreeView::setElementAsCondition(bool set_on_points)
@@ -189,13 +210,18 @@ void GeoTreeView::mapGeometry()
 
 void GeoTreeView::writeToFile() const
 {
-	TreeItem* item = static_cast<GeoTreeModel*>(model())->getItem(
-	        this->selectionModel()->currentIndex());
-	QString gliName = item->data(0).toString();
-	QString fileName = QFileDialog::getSaveFileName(NULL,
-						"Save geometry as", gliName, "GeoSys geometry file (*.gml)");
-	if (!fileName.isEmpty())
-		emit saveToFileRequested(gliName, fileName);
+	QModelIndex index (this->selectionModel()->currentIndex());
+	if (!index.isValid())
+		OGSError::box("No geometry selected.");
+	else
+	{
+		TreeItem* item = static_cast<GeoTreeModel*>(model())->getItem(index);
+		QString geoName = item->data(0).toString();
+		QString fileName = QFileDialog::getSaveFileName(NULL,
+							"Save geometry as", geoName, "GeoSys geometry file (*.gml)");
+		if (!fileName.isEmpty())
+			emit saveToFileRequested(geoName, fileName);
+	}
 }
 
 void GeoTreeView::loadFEMConditions()
diff --git a/Gui/DataView/GeoTreeView.h b/Gui/DataView/GeoTreeView.h
index 2e00a7f5d5d..437f930af14 100644
--- a/Gui/DataView/GeoTreeView.h
+++ b/Gui/DataView/GeoTreeView.h
@@ -13,6 +13,7 @@
 #define GEOTREEVIEW_H
 
 #include "GeoType.h"
+
 #include <QContextMenuEvent>
 #include <QTreeView>
 
@@ -48,6 +49,7 @@ private:
 	void setElementAsCondition(bool set_on_points = false);
 
 private slots:
+	void addGeometry();
 	/// Allows to add FEM Conditions to a process
 	void loadFEMConditions();
 	void on_Clicked(QModelIndex idx);
@@ -61,17 +63,20 @@ private slots:
 	/// Saves a geometry in a file.
 	void writeToFile() const;
 	/// Removes a whole geometry or parts of it.
-	void removeList();
+	void removeGeometry();
 	/// Saves FEM Conditions associated with the given geometry
 	//void saveFEMConditions();
 
 signals:
+	void enableSaveButton(bool);
+	void enableRemoveButton(bool);
 	void geoItemSelected(const vtkPolyDataAlgorithm*, int);
 	void geometryMappingRequested(const std::string&);
 	void removeGeoItemSelection();
 	//void itemSelectionChanged(const QItemSelection & selected, const QItemSelection & deselected);
 	void listRemoved(std::string name, GeoLib::GEOTYPE);
 	void loadFEMCondFileRequested(std::string);
+	void openGeometryFile(int);
 	void saveToFileRequested(QString, QString) const;
 	void requestCondSetupDialog(const std::string&, const GeoLib::GEOTYPE, const std::size_t, bool on_points);
 	void requestLineEditDialog(const std::string&);
diff --git a/Gui/DataView/MshTabWidget.cpp b/Gui/DataView/MshTabWidget.cpp
index bcaf875c830..f4e8ade653f 100644
--- a/Gui/DataView/MshTabWidget.cpp
+++ b/Gui/DataView/MshTabWidget.cpp
@@ -17,8 +17,10 @@ MshTabWidget::MshTabWidget( QWidget* parent /*= 0*/ )
 {
 	setupUi(this);
 
-	connect(this->addMeshPushButton, SIGNAL(clicked()), this->treeView, SLOT(addMeshAction()));
-	connect(this->saveMeshPushButton, SIGNAL(clicked()), this->treeView, SLOT(writeMeshToFile()));
+	connect(this->addMeshPushButton, SIGNAL(clicked()), this->treeView, SLOT(addMesh()));
+	connect(this->saveMeshPushButton, SIGNAL(clicked()), this->treeView, SLOT(writeToFile()));
 	connect(this->removeMeshPushButton, SIGNAL(clicked()), this->treeView, SLOT(removeMesh()));
 	//connect(this->clearAllPushButton, SIGNAL(clicked()), this->treeView, SLOT(removeAllMeshes()));
+	connect(this->treeView, SIGNAL(enableSaveButton(bool)), this, SLOT(enableSaveButton(bool)));
+	connect(this->treeView, SIGNAL(enableRemoveButton(bool)), this, SLOT(enableRemoveButton(bool)));
 }
diff --git a/Gui/DataView/MshTabWidget.h b/Gui/DataView/MshTabWidget.h
index 71b411d4162..7bf3a2b200c 100644
--- a/Gui/DataView/MshTabWidget.h
+++ b/Gui/DataView/MshTabWidget.h
@@ -24,6 +24,10 @@ class MshTabWidget : public QWidget, public Ui_MshTabWidgetBase
 
 public:
 	MshTabWidget(QWidget* parent = 0);
+
+private slots:
+	void enableSaveButton(bool enable) { this->saveMeshPushButton->setEnabled(enable); };
+	void enableRemoveButton(bool enable) { this->removeMeshPushButton->setEnabled(enable); };
 };
 
 #endif // MSHTABWIDGET_H
diff --git a/Gui/DataView/MshTabWidgetBase.ui b/Gui/DataView/MshTabWidgetBase.ui
index 4cc6999aba6..17885a96595 100644
--- a/Gui/DataView/MshTabWidgetBase.ui
+++ b/Gui/DataView/MshTabWidgetBase.ui
@@ -21,58 +21,103 @@
     <layout class="QHBoxLayout" name="horizontalLayout">
      <item>
       <widget class="QPushButton" name="addMeshPushButton">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
        <property name="minimumSize">
         <size>
-         <width>50</width>
-         <height>0</height>
+         <width>24</width>
+         <height>24</height>
         </size>
        </property>
        <property name="maximumSize">
         <size>
-         <width>50</width>
-         <height>16777215</height>
+         <width>24</width>
+         <height>24</height>
         </size>
        </property>
+       <property name="toolTip">
+        <string>Open mesh...</string>
+       </property>
        <property name="text">
-        <string>Add</string>
+        <string/>
+       </property>
+       <property name="icon">
+        <iconset resource="../Img/icons.qrc">
+         <normaloff>:/Images/open-icon.png</normaloff>:/Images/open-icon.png</iconset>
        </property>
       </widget>
      </item>
      <item>
       <widget class="QPushButton" name="saveMeshPushButton">
+       <property name="enabled">
+        <bool>false</bool>
+       </property>
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
        <property name="minimumSize">
         <size>
-         <width>50</width>
-         <height>0</height>
+         <width>24</width>
+         <height>24</height>
         </size>
        </property>
        <property name="maximumSize">
         <size>
-         <width>50</width>
-         <height>16777215</height>
+         <width>24</width>
+         <height>24</height>
         </size>
        </property>
+       <property name="toolTip">
+        <string>Save mesh...</string>
+       </property>
        <property name="text">
-        <string>Save</string>
+        <string/>
+       </property>
+       <property name="icon">
+        <iconset resource="../Img/icons.qrc">
+         <normaloff>:/Images/save-icon.png</normaloff>:/Images/save-icon.png</iconset>
        </property>
       </widget>
      </item>
      <item>
       <widget class="QPushButton" name="removeMeshPushButton">
+       <property name="enabled">
+        <bool>false</bool>
+       </property>
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
        <property name="minimumSize">
         <size>
-         <width>50</width>
-         <height>0</height>
+         <width>24</width>
+         <height>24</height>
         </size>
        </property>
        <property name="maximumSize">
         <size>
-         <width>50</width>
-         <height>16777215</height>
+         <width>24</width>
+         <height>24</height>
         </size>
        </property>
+       <property name="toolTip">
+        <string>Remove mesh</string>
+       </property>
        <property name="text">
-        <string>Remove</string>
+        <string/>
+       </property>
+       <property name="icon">
+        <iconset resource="../Img/icons.qrc">
+         <normaloff>:/Images/delete-icon.png</normaloff>:/Images/delete-icon.png</iconset>
        </property>
       </widget>
      </item>
@@ -136,6 +181,8 @@
    <header>MshView.h</header>
   </customwidget>
  </customwidgets>
- <resources/>
+ <resources>
+  <include location="../Img/icons.qrc"/>
+ </resources>
  <connections/>
 </ui>
diff --git a/Gui/DataView/MshView.cpp b/Gui/DataView/MshView.cpp
index a56acffb075..be9b29eb765 100644
--- a/Gui/DataView/MshView.cpp
+++ b/Gui/DataView/MshView.cpp
@@ -15,6 +15,7 @@
 #include "MshItem.h"
 #include "MshModel.h"
 #include "OGSError.h"
+#include "ImportFileTypes.h"
 #include <QHeaderView>
 
 #include "VtkMeshSource.h"
@@ -49,25 +50,32 @@ void MshView::updateView()
 		resizeColumnToContents(i);
 }
 
-void MshView::addMeshAction()
+void MshView::selectionChanged( const QItemSelection &selected, const QItemSelection &deselected )
 {
-	QSettings settings;
-	QString fileName =
-	        QFileDialog::getOpenFileName(this, "Select mesh file", settings.value(
-	                                             "lastOpenedFileDirectory").toString(),
-	                                     "OpenGeosys mesh files (*.vtu *.msh);;All files (* *.*)");
-	if (!fileName.isEmpty())
+	Q_UNUSED(deselected);
+	if (!selected.isEmpty())
 	{
-		std::string name = fileName.toStdString();
-		FileIO::MeshIO meshIO;
-		MeshLib::Mesh* msh = meshIO.loadMeshFromFile(name);
-		if (msh)
+		const QModelIndex idx = *(selected.indexes().begin());
+		const TreeItem* tree_item = static_cast<TreeModel*>(this->model())->getItem(idx);
+
+		const MshItem* list_item = dynamic_cast<const MshItem*>(tree_item);
+		if (list_item)
 		{
-			static_cast<MshModel*>(this->model())->addMesh(msh);
-			QDir dir = QDir(fileName);
-			settings.setValue("lastOpenedFileDirectory", dir.absolutePath());
+			emit enableSaveButton(true);
+			emit enableRemoveButton(true);
+		}
+		else
+		{
+			emit enableSaveButton(false);
+			emit enableRemoveButton(false);
 		}
 	}
+	//emit itemSelectionChanged(selected, deselected);
+	//return QTreeView::selectionChanged(selected, deselected);
+}
+void MshView::addMesh()
+{
+	emit openMeshFile(ImportFileType::OGS_MSH);
 }
 
 void MshView::removeMesh()
@@ -131,7 +139,7 @@ void MshView::openMshEditDialog()
 	meshEdit.exec();
 }
 
-int MshView::writeMeshToFile() const
+int MshView::writeToFile() const
 {
 	QModelIndex index = this->selectionModel()->currentIndex();
 
@@ -201,12 +209,6 @@ void MshView::checkMeshQuality ()
 }
 
 /*
-   void DataView::selectionChanged( const QItemSelection &selected, const QItemSelection &deselected )
-   {
-    emit itemSelectionChanged(selected, deselected);
-    return QTreeView::selectionChanged(selected, deselected);
-   }
-
    void DataView::selectionChangedFromOutside( const QItemSelection &selected, const QItemSelection &deselected )
    {
     QItemSelectionModel* selModel = this->selectionModel();
diff --git a/Gui/DataView/MshView.h b/Gui/DataView/MshView.h
index 356437b8b9b..b03c0db719e 100644
--- a/Gui/DataView/MshView.h
+++ b/Gui/DataView/MshView.h
@@ -42,9 +42,8 @@ public slots:
 	void updateView();
 
 protected slots:
-	/// Is called when the selection of this view changes. Emits a the signal
-	/// itemSelectionChanged()
-	//void selectionChanged(const QItemSelection &selected, const QItemSelection &deselected);
+	/// Is called when the selection of this view changes. 
+	void selectionChanged(const QItemSelection &selected, const QItemSelection &deselected);
 
 	/// Selects items without sending signals.
 	//void selectionChangedFromOutside(const QItemSelection &selected,
@@ -61,7 +60,7 @@ private slots:
 	void openMshEditDialog();
 
 	/// Adds a new mesh.
-	void addMeshAction();
+	void addMesh();
 
 	void addDIRECTSourceTerms();
 
@@ -74,7 +73,7 @@ private slots:
 	//void removeAllMeshes();
 
 	/// Calls the FileDialog to save a mesh to a file.
-	int writeMeshToFile() const;
+	int writeToFile() const;
 
 	/**
 	 * checks the mesh quality
@@ -82,6 +81,9 @@ private slots:
 	void checkMeshQuality();
 
 signals:
+	void enableSaveButton(bool);
+	void enableRemoveButton(bool);
+	void openMeshFile(int);
 	void qualityCheckRequested(VtkMeshSource*);
 	void requestCondSetupDialog(const std::string&, const GeoLib::GEOTYPE, const std::size_t, bool on_points);
 	void requestMeshRemoval(const QModelIndex&);
@@ -91,7 +93,7 @@ signals:
 /*
     void itemSelectionChanged(const QItemSelection &selected,
         const QItemSelection &deselected);
-    void itemSelectionChangedFromOutside(const QItemSelection &selected,
+    //void itemSelectionChangedFromOutside(const QItemSelection &selected,
         const QItemSelection &deselected);
  */
 };
diff --git a/Gui/DataView/StationTabWidget.cpp b/Gui/DataView/StationTabWidget.cpp
index a159b1fd587..3a08a342d4e 100644
--- a/Gui/DataView/StationTabWidget.cpp
+++ b/Gui/DataView/StationTabWidget.cpp
@@ -16,4 +16,10 @@ StationTabWidget::StationTabWidget( QWidget* parent /*= 0*/ )
 	: QWidget(parent)
 {
 	setupUi(this);
+
+	connect(this->openStnPushButton, SIGNAL(clicked()), this->treeView, SLOT(addStationList()));
+	connect(this->saveStnPushButton, SIGNAL(clicked()), this->treeView, SLOT(writeToFile()));
+	connect(this->removeStnPushButton, SIGNAL(clicked()), this->treeView, SLOT(removeStationList()));
+	connect(this->treeView, SIGNAL(enableSaveButton(bool)), this, SLOT(enableSaveButton(bool)));
+	connect(this->treeView, SIGNAL(enableRemoveButton(bool)), this, SLOT(enableRemoveButton(bool)));
 }
diff --git a/Gui/DataView/StationTabWidget.h b/Gui/DataView/StationTabWidget.h
index 093e6316842..2ca5c415133 100644
--- a/Gui/DataView/StationTabWidget.h
+++ b/Gui/DataView/StationTabWidget.h
@@ -26,6 +26,10 @@ public:
 	StationTabWidget(QWidget* parent = 0);
 
 private:
+
+private slots:
+	void enableSaveButton(bool enable) { this->saveStnPushButton->setEnabled(enable); };
+	void enableRemoveButton(bool enable) { this->removeStnPushButton->setEnabled(enable); };
 };
 
 #endif // STATIONTABWIDGET_H
diff --git a/Gui/DataView/StationTabWidgetBase.ui b/Gui/DataView/StationTabWidgetBase.ui
index d1badedab01..fa44ece4953 100644
--- a/Gui/DataView/StationTabWidgetBase.ui
+++ b/Gui/DataView/StationTabWidgetBase.ui
@@ -17,6 +17,125 @@
    <property name="margin">
     <number>2</number>
    </property>
+   <item>
+    <layout class="QHBoxLayout" name="horizontalLayout">
+     <item>
+      <widget class="QPushButton" name="openStnPushButton">
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="minimumSize">
+        <size>
+         <width>24</width>
+         <height>24</height>
+        </size>
+       </property>
+       <property name="maximumSize">
+        <size>
+         <width>24</width>
+         <height>24</height>
+        </size>
+       </property>
+       <property name="toolTip">
+        <string>Open observation sites...</string>
+       </property>
+       <property name="text">
+        <string/>
+       </property>
+       <property name="icon">
+        <iconset resource="../Img/icons.qrc">
+         <normaloff>:/Images/open-icon.png</normaloff>:/Images/open-icon.png</iconset>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QPushButton" name="saveStnPushButton">
+       <property name="enabled">
+        <bool>false</bool>
+       </property>
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="minimumSize">
+        <size>
+         <width>24</width>
+         <height>24</height>
+        </size>
+       </property>
+       <property name="maximumSize">
+        <size>
+         <width>24</width>
+         <height>24</height>
+        </size>
+       </property>
+       <property name="toolTip">
+        <string>Save observation sites...</string>
+       </property>
+       <property name="text">
+        <string/>
+       </property>
+       <property name="icon">
+        <iconset resource="../Img/icons.qrc">
+         <normaloff>:/Images/save-icon.png</normaloff>:/Images/save-icon.png</iconset>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QPushButton" name="removeStnPushButton">
+       <property name="enabled">
+        <bool>false</bool>
+       </property>
+       <property name="sizePolicy">
+        <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+         <horstretch>0</horstretch>
+         <verstretch>0</verstretch>
+        </sizepolicy>
+       </property>
+       <property name="minimumSize">
+        <size>
+         <width>24</width>
+         <height>24</height>
+        </size>
+       </property>
+       <property name="maximumSize">
+        <size>
+         <width>24</width>
+         <height>24</height>
+        </size>
+       </property>
+       <property name="toolTip">
+        <string>Remove observation sites</string>
+       </property>
+       <property name="text">
+        <string/>
+       </property>
+       <property name="icon">
+        <iconset resource="../Img/icons.qrc">
+         <normaloff>:/Images/delete-icon.png</normaloff>:/Images/delete-icon.png</iconset>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <spacer name="horizontalSpacer">
+       <property name="orientation">
+        <enum>Qt::Horizontal</enum>
+       </property>
+       <property name="sizeHint" stdset="0">
+        <size>
+         <width>40</width>
+         <height>20</height>
+        </size>
+       </property>
+      </spacer>
+     </item>
+    </layout>
+   </item>
    <item>
     <widget class="StationTreeView" name="treeView"/>
    </item>
@@ -29,6 +148,8 @@
    <header>StationTreeView.h</header>
   </customwidget>
  </customwidgets>
- <resources/>
+ <resources>
+  <include location="../Img/icons.qrc"/>
+ </resources>
  <connections/>
 </ui>
diff --git a/Gui/DataView/StationTreeView.cpp b/Gui/DataView/StationTreeView.cpp
index 2cb476f2369..979fac8f734 100644
--- a/Gui/DataView/StationTreeView.cpp
+++ b/Gui/DataView/StationTreeView.cpp
@@ -22,6 +22,7 @@
 #include "StationTreeModel.h"
 #include "StationTreeView.h"
 #include "StratWindow.h"
+#include "ImportFileTypes.h"
 
 StationTreeView::StationTreeView(QWidget* parent) : QTreeView(parent)
 {
@@ -37,16 +38,29 @@ void StationTreeView::updateView()
 	setColumnWidth(2,50);
 }
 
-void StationTreeView::on_Clicked(QModelIndex idx)
-{
-	qDebug("%d, %d",idx.parent().row(), idx.row());
-}
-
 void StationTreeView::selectionChanged( const QItemSelection &selected,
                                         const QItemSelection &deselected )
 {
-	emit itemSelectionChanged(selected, deselected);
-	return QTreeView::selectionChanged(selected, deselected);
+	Q_UNUSED(deselected);
+	if (!selected.isEmpty())
+	{
+		const QModelIndex idx = *(selected.indexes().begin());
+		const TreeItem* tree_item = static_cast<TreeModel*>(this->model())->getItem(idx);
+
+		const ModelTreeItem* list_item = dynamic_cast<const ModelTreeItem*>(tree_item);
+		if (list_item->getItem())
+		{
+			emit enableSaveButton(true);
+			emit enableRemoveButton(true);
+		}
+		else
+		{
+			emit enableRemoveButton(false);
+			emit enableSaveButton(false);
+		}
+	}
+	//emit itemSelectionChanged(selected, deselected);
+	//return QTreeView::selectionChanged(selected, deselected);
 }
 
 void StationTreeView::selectionChangedFromOutside( const QItemSelection &selected,
@@ -76,14 +90,14 @@ void StationTreeView::contextMenuEvent( QContextMenuEvent* event )
 		QMenu menu;
 		QAction* propertyAction = menu.addAction("Display list properties...");
 		QAction* exportAction   = menu.addAction("Export to GMS...");
-		QAction* saveAction   = menu.addAction("Save to file...");
+		//QAction* saveAction   = menu.addAction("Save to file...");
 		menu.addSeparator();
-		QAction* removeAction   = menu.addAction("Remove station list");
+		//QAction* removeAction   = menu.addAction("Remove station list");
 
 		connect(propertyAction, SIGNAL(triggered()), this, SLOT(showPropertiesDialog()));
 		connect(exportAction,   SIGNAL(triggered()), this, SLOT(exportList()));
-		connect(saveAction,   SIGNAL(triggered()), this, SLOT(saveList()));
-		connect(removeAction,   SIGNAL(triggered()), this, SLOT(removeStationList()));
+		//connect(saveAction,   SIGNAL(triggered()), this, SLOT(saveList()));
+		//connect(removeAction,   SIGNAL(triggered()), this, SLOT(removeStationList()));
 		menu.exec(event->globalPos());
 	}
 	// The current index refers to a station object
@@ -138,14 +152,24 @@ void StationTreeView::displayStratigraphy()
 	stratView->show();
 }
 
-void StationTreeView::saveList()
+void StationTreeView::addStationList()
 {
-	TreeItem* item = static_cast<StationTreeModel*>(model())->getItem(
-	        this->selectionModel()->currentIndex());
-	QString listName = item->data(0).toString();
-	QString fileName = QFileDialog::getSaveFileName(this, "Save station list", "","*.stn");
-	if (!fileName.isEmpty())
-		emit stationListSaved(listName, fileName);
+	emit openStationListFile(ImportFileType::OGS_STN);
+}
+
+void StationTreeView::writeToFile()
+{
+	QModelIndex index (this->selectionModel()->currentIndex());
+	if (!index.isValid())
+		OGSError::box("No station list selected.");
+	else
+	{
+		TreeItem* item = static_cast<StationTreeModel*>(model())->getItem(index);
+		QString listName = item->data(0).toString();
+		QString fileName = QFileDialog::getSaveFileName(this, "Save station list", "","*.stn");
+		if (!fileName.isEmpty())
+			emit stationListSaved(listName, fileName);
+	}
 }
 
 void StationTreeView::exportList()
@@ -188,9 +212,14 @@ void StationTreeView::exportStation()
 
 void StationTreeView::removeStationList()
 {
-	TreeItem* item = static_cast<StationTreeModel*>(model())->getItem(
-	        this->selectionModel()->currentIndex());
-	emit stationListRemoved((item->data(0).toString()).toStdString());
+	QModelIndex index (this->selectionModel()->currentIndex());
+	if (!index.isValid())
+		OGSError::box("No station list selected.");
+	else
+	{
+		TreeItem* item = static_cast<StationTreeModel*>(model())->getItem(index);
+		emit stationListRemoved((item->data(0).toString()).toStdString());
+	}
 }
 
 void StationTreeView::showPropertiesDialog()
diff --git a/Gui/DataView/StationTreeView.h b/Gui/DataView/StationTreeView.h
index 47fe2a64229..78a10b3e37a 100644
--- a/Gui/DataView/StationTreeView.h
+++ b/Gui/DataView/StationTreeView.h
@@ -52,18 +52,21 @@ private:
 	void writeStratigraphiesAsImages(QString listName);
 
 private slots:
-	void on_Clicked(QModelIndex idx);
+	void addStationList();
 	void displayStratigraphy();
 	void exportList();
 	void exportStation();
 	void removeStationList();
-	void saveList();
+	void writeToFile();
 	void showPropertiesDialog();
 	void showDiagramPrefsDialog();
 
 signals:
+	void enableSaveButton(bool);
+	void enableRemoveButton(bool);
 	void itemSelectionChanged(const QItemSelection & selected,
 	                          const QItemSelection & deselected);
+	void openStationListFile(int);
 	void propertiesDialogRequested(std::string name);
 	void stationListExportRequested(std::string listName, std::string fileName);
 	void stationListRemoved(std::string name);
diff --git a/Gui/Img/delete-icon.png b/Gui/Img/delete-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..253482309d9ec26559fc2bf435e9afdea6158bec
GIT binary patch
literal 639
zcmV-_0)YLAP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0006;Nkl<Zc-muR
zpb#)p)qsVJjHWWymg`=hIF%al=g$sgxur}@9+I|JbDkeP5g7gF&uI(;<}fgr$|}q5
zvP?}CIJa)?kB6r&2E{WlYzN8BV_@)9GS*pV6du8GeBQhd&u-jvOJra;jbgx3c9zHX
zX$dk+|JWHAxH%Zk?%nZY@7b%tAUPL9t+hr@ZX66helsvi2r=wyX?qg=^RFz50h1XR
zJml47*Q*#?aQyxCpMjB&n_=(S6F(XM|7UPAGH3t)<vRllH#@`Ki|2kkx^O)(i-BPW
zMi}$~ohqjyxlTb@gX8bFKMel_c)$vnK7VK6ke6h*ee&3kCpR7j<wL!OH5NL6hR7?4
zty2(_=J@mdAH#oUW(Ech28KsZ@BeuI@O@Azl4h(1Gy@G#loMJf_vHu2uXo?TVr)WO
z43Bs@e>{BnHmDk(0kuHQs`8@i3_pM8`1|e)!w+FzumbkCpBb2ic^J;~a{svd;AK!F
zHZN3gvU_SuimY?|_?d&@?I(s`qCyOHJRCn67#aUJ0S#n({f>b_M1WyGKmU)n|Cxh|
z?%mstVnCy+%##dmerc`?R~deZi7?dh@%*@R=Rxpapqz$^;@ZYfpE=lGy<zxfq{pz~
zKl79H^XE~cv4n-$R8>lHSD>(vz>F_new?~}FL(<B!#0qd7tm|gs!Hopd3iY2zj^oJ
z!INih?f?Fr#t4IAJ}z@Eap84O?>|eK_vbH4U}dnfdU~3f&bfI0LO|WOZ<tA$Dw&BK
Z000)F*%2XP>aYL+002ovPDHLkV1m;pEs+2K

literal 0
HcmV?d00001

diff --git a/Gui/Img/icons.qrc b/Gui/Img/icons.qrc
index 9992a4241c7..29045b759cf 100644
--- a/Gui/Img/icons.qrc
+++ b/Gui/Img/icons.qrc
@@ -1,5 +1,9 @@
 <RCC>
   <qresource prefix="Images">
+    <file>refresh-icon.png</file>
+    <file>delete-icon.png</file>
+    <file>open-icon.png</file>
+    <file>save-icon.png</file>
     <file>icon_glass_active.png</file>
     <file>icon_hlight_active.png</file>
     <file>icon_persp_active.png</file>
diff --git a/Gui/Img/open-icon.png b/Gui/Img/open-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..ff530540af800bdf778d99a4f1688527574a6150
GIT binary patch
literal 467
zcmV;^0WAKBP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0004+Nkl<Zc-muR
zpb#)p#Q+x*K}j!bu>>FwVc`G&VCu`a-<RuV-`|YafF;d_Z2@W7l?)937#RNkX88a2
zC&T|gKN$W2@uRC3UzD^RlHPUd{XeV*99!giKw8V#N?2BjmErF%pvIqI4AT7n&v%CJ
zAKx;(dHUqz|9`*#GyMGnH2gP^`u%_L_Lt!kRzBIycwtk-Wfe0g9kAxVFpUt+|9^jH
z`1cz`e`EOj^BcqKkIW35B647xPwYL=7*lt#f$`kBprdj+CRVTRU1wlnV*~pAAJF?C
z|NjHCL1FP9B=+wggM_*<0}DGR*npRJuYG=X|Hehe6U)4Iiz_I(@bd96u(Gq06a)7z
zoxjAmZ;tauX*o$h5m6qJqwvhp^NSfbPqJRFtRNU6BEU?NW{@|Rti4vqxT@21u9h5A
zk`Uj2k_`C%^FKr9!Y6i&v#T^GTdV)h;pO;Ek^vvSv;E7P^jd&%QlUzxr|#P_R;E8B
z8Sv`6$ZfOC`)Z7B8Hy>+x_>Gd8A$WOtFPP}e9CT?P$x4{0svR0$7jSk%i;h4002ov
JPDHLkV1gQH=Gp)N

literal 0
HcmV?d00001

diff --git a/Gui/Img/oxygen.icons b/Gui/Img/oxygen.icons
new file mode 100644
index 00000000000..c27544e010f
--- /dev/null
+++ b/Gui/Img/oxygen.icons
@@ -0,0 +1 @@
+http://www.iconarchive.com/show/oxygen-icons-by-oxygen-icons.org.html
\ No newline at end of file
diff --git a/Gui/Img/refresh-icon.png b/Gui/Img/refresh-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..f0abac679939bd59d71d556a11cfde6dacc9550f
GIT binary patch
literal 881
zcmV-%1CIQOP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0009xNkl<Zc-n1~
zO=w(I6vzMfzVG?W<V|8bW{espp(WEr+GK_jLi%A<f~(R+NT6B}U3A-)E(*bg*saiw
zRYHZPVg+4TR8Wg9QZZ?Yw28J+(xho-GSfPl<h?iVz5Cv~PDTtR=E7Z^bI<v6&i$Q3
zu*1<u_158`;iK8-vl)R1WVSH-=e2LHeP0|e7PrTeXANnDw(2jmTs+);WTYq4BgG=I
zhJVA{z|8!Nck|v4pOp*cGi=;1=05E`pM7p$VM`!1EM<H4ANclg?<*-z_)dj^aDt!i
z{<u2(^zK)q`IGOAKe#;B5QrR+Tle;L-^m~BPjSvc2tm12#`4NCn9rc=I@;UYAqYa_
zjr$xT6*2Mf<9`KGCz78W8hZ5<p#;9?WAc|tEH5oVbZD*KB=?$wklGf)!2SW~5gqUW
z>Qnsu_t#@2)~6;j`L4&iGHvpv*wpkCj3<?K#S!1NAF=B^0N2{3<95co;=K%Y;Kc!`
zo(kd+{N?;QMiPVCiH^R#pUY7Nl}ZKk^Y@{Pq0!YZjjR9l-u#;Oo;kuUBoaxaSsK!Y
z1gm7h#^ZVg{mQvi?@J%lX`xUpz^Rz7xJaWLQ;xftJal$n?vAi@izNw{Eji!@r{<bL
zJmztISLiJgIVhj?cGHU_PT)pe$R>5^9EqBfuDhK=bWjm!m;}`u_7*0h=EdVd8~?)H
zUH_S6oroYqTa?}`UpB8in;gq2IypvkNAlKvkDFNIHv2GOMC>NbO1D%nJ6&0fQ-ov*
zEmp+v%fV@Dj!k$~pG!@`pw=ZFH8Sp_8e<P_hpmK4a>>5URvH+?Z^$2c{lVL!MiEiu
z#!V0nyviM))tNU@&r;d4<+6K*?auiun78k<>Dndl_l5w;BiWJ*&jejO9aa^@v^voU
zV8=c9B8TKqu2w~tnZbhPu-~i&ce?b4c?s81+Ztv1I@yyx5dSXPsicK4fzj&1XmP=m
z0E#IhR+4$s6V)!x8k36;)=pspOaEIYa;!eJdqVH0I%6kEmME2u8l0$y_<{;LP2APn
z#?{JV?Hq2PyyG@*Ide#$35OI-?AWxOnzz8$aTB-jbbIVSO?P0K0AcGg00000NkvXX
Hu0mjfa9FvS

literal 0
HcmV?d00001

diff --git a/Gui/Img/save-icon.png b/Gui/Img/save-icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..46e5e207b0883491221e6cfbca66982df3f66087
GIT binary patch
literal 686
zcmV;f0#W^mP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV0007YNkl<Zc-p0t
zU1$?Q5P;_{$wf4h#3w0%KvC>N9{h!hpdu(miTMAUrq)nVqfx0gRS>mB?1PO}t1&jw
z{@9{bQL%^$QmG(<1rbRrQmI7{A@)Hbg(P>k&d%myBffdu><l+E-^|YLN${VK#FxPC
zKpKsyTm1njn^OjoB%wfF3tI+8Iyp29y**uERg{Sf7h9$gz+dTS+^7j20(a@`;tB;A
zLU8%=`4hyWSHNsG!?o)%i2&7AyBODdf+1M6VD4W{GGORsxac~A!FTT=5p5+vTOuw1
zl{<X|s5vmH14b`TF95iF9UXxi(aQw5+0iZlJGN~nK=r;5cs!mzwRuurV{z)><8Tr>
zW36B^nV_rtmH=$ow3z@^dqXhOJ&PvGSiXJ3<`7ih$3~#L4Yz=Ro;$Y%VB`7?6u!K|
z3odsl(Pdet0dj|~>!52o<TMq&jg7*<^FE5{y?0jt)_K>me;=|mX_mzy9B}{P0}<g}
zy{5>^tMdTk9)QsWiiW~rJmyi~W8tk>xr!Ny$Lhmiv)KwmH12|`s!)6Q2m&;4I-C^y
z<k?dJSg~{&MVjzv!Y7VH<CzA?WHN9*(o7JZoXh3lY(pccng)u+LVy=9`vqW0`C<XU
zk0(!`g8I5JWOG>rL@1F<Hk*Z(<_K-Wf&dE^>wh&M01M~M&!C~0(ZM^Yt33)TwtB9q
zi8|o`u47lDw12DBN*%lzd@BG>yCdi-DY>L5io8E`kSg$`bUIC1!?wA!#}hOUjN_Vp
z7)nkz&S?ftz1-z;P4W4B4!hlsKbvB~{mZ&|a;a2mqO+s(=lJ-K{1t;=IGfkM0T8tx
UHk7_WD*ylh07*qoM6N<$g3(wu#sB~S

literal 0
HcmV?d00001

diff --git a/Gui/VtkAct/VtkCustomInteractorStyle.cpp b/Gui/VtkAct/VtkCustomInteractorStyle.cpp
index 3e7988fbd92..4596fbb44af 100644
--- a/Gui/VtkAct/VtkCustomInteractorStyle.cpp
+++ b/Gui/VtkAct/VtkCustomInteractorStyle.cpp
@@ -177,10 +177,7 @@ void VtkCustomInteractorStyle::OnLeftButtonDown()
 			          << " cells in the selection." << std::endl;
 
 			// check if the underlying object is a mesh and if so, send a signal to the element model for display of information about the picked element.
-			vtkAlgorithm* data_set =
-			        picker->GetActor()->GetMapper()->GetInputConnection(0,
-			                                                            0)->GetProducer()
-			        ->GetInputConnection(0,0)->GetProducer();
+			vtkAlgorithm* data_set = picker->GetActor()->GetMapper()->GetInputConnection(0, 0)->GetProducer()->GetInputConnection(0,0)->GetProducer();
 			VtkMeshSource* source = dynamic_cast<VtkMeshSource*>(data_set);
 			if (source)
 				emit elementPicked(source->GetMesh(), picker->GetCellId());
diff --git a/Gui/VtkVis/VtkAlgorithmProperties.cpp b/Gui/VtkVis/VtkAlgorithmProperties.cpp
index f5840196c29..88d7f84bcde 100644
--- a/Gui/VtkVis/VtkAlgorithmProperties.cpp
+++ b/Gui/VtkVis/VtkAlgorithmProperties.cpp
@@ -51,18 +51,23 @@ vtkLookupTable* VtkAlgorithmProperties::GetLookupTable(const QString& array_name
 		return NULL;
 }
 
+void VtkAlgorithmProperties::RemoveLookupTable(const QString& array_name)
+{
+	std::map<QString, vtkLookupTable*>::iterator it = _lut.find(array_name);
+	if (it != _lut.end())
+	{
+		it->second->Delete();
+		_lut.erase(it);
+	}
+}
+
 void VtkAlgorithmProperties::SetLookUpTable(const QString &array_name, vtkLookupTable* lut)
 {
 	lut->Build();
 
 	if (array_name.length() > 0)
 	{
-		std::map<QString, vtkLookupTable*>::iterator it = _lut.find(array_name);
-		if (it != _lut.end())
-		{
-			it->second->Delete();
-			_lut.erase(it);
-		}
+		this->RemoveLookupTable(array_name);
 		_lut.insert( std::pair<QString, vtkLookupTable*>(array_name, lut) );
 		_activeAttributeName = array_name;
 	}
diff --git a/Gui/VtkVis/VtkAlgorithmProperties.h b/Gui/VtkVis/VtkAlgorithmProperties.h
index 1a31365dda0..6330aacc12c 100644
--- a/Gui/VtkVis/VtkAlgorithmProperties.h
+++ b/Gui/VtkVis/VtkAlgorithmProperties.h
@@ -154,6 +154,9 @@ public:
 	/// @brief Returns the colour lookup table (if one has been assigned).
 	vtkLookupTable* GetLookupTable(const QString& array_name);
 
+	/// @brief Removes the lookup table for the given scalar.
+	void RemoveLookupTable(const QString& array_name);
+
 	/// @brief Sets a colour lookup table for the given scalar array of the VtkVisPipelineItem.
 	void SetLookUpTable(const QString &array_name, vtkLookupTable* lut);
 
diff --git a/Gui/VtkVis/VtkVisTabWidget.cpp b/Gui/VtkVis/VtkVisTabWidget.cpp
index 280fb057417..3940caf52c4 100644
--- a/Gui/VtkVis/VtkVisTabWidget.cpp
+++ b/Gui/VtkVis/VtkVisTabWidget.cpp
@@ -18,6 +18,7 @@
 
 #include <vtkActor.h>
 #include <vtkImageChangeInformation.h>
+#include <vtkLookupTable.h>
 #include <vtkProperty.h>
 #include <vtkTransform.h>
 #include <vtkTransformFilter.h>
@@ -55,6 +56,14 @@ VtkVisTabWidget::VtkVisTabWidget( QWidget* parent /*= 0*/ )
 	        this, SLOT(SetActiveAttributeOnItem(const QString &)));
 }
 
+void VtkVisTabWidget::on_arrayResetPushButton_clicked()
+{
+	VtkAlgorithmProperties* props = _item->getVtkProperties();
+	const QString selected_array_name = this->activeScalarComboBox->currentText();
+	props->RemoveLookupTable(selected_array_name);
+	_item->SetActiveAttribute(selected_array_name);
+}
+
 void VtkVisTabWidget::setActiveItem( VtkVisPipelineItem* item )
 {
 	if (item)
@@ -131,25 +140,6 @@ void VtkVisTabWidget::setActiveItem( VtkVisPipelineItem* item )
 
 		this->buildProportiesDialog(item);
 
-		//
-		///* Integrating colour tables into property-window (test!) */
-		//VtkStationSource* test = dynamic_cast<VtkStationSource*>(_item->algorithm());
-		//if (test)
-		//{
-		//	std::map<std::string, GeoLib::Color> colors = test->getColorLookupTable();
-		//	if (!colors.empty())
-		//	{
-		//		ColorTableModel* ctm = new ColorTableModel(colors);
-		//		ColorTableView* ctv = new ColorTableView();
-		//		ctv->setModel(ctm);
-		//		ctv->setItemDelegate(new ColorTableViewDelegate);
-		//		vbox->addWidget(ctv);
-		//		ctv->resizeRowsToContents();
-		//	}
-		//}
-
-		/**/
-
 		emit requestViewUpdate();
 	}
 	else
@@ -335,8 +325,7 @@ void VtkVisTabWidget::buildProportiesDialog(VtkVisPipelineItem* item)
 				foreach (QVariant variant, values)
 				valuesAsString.push_back(variant.toString());
 
-				vectorEdit = new VtkAlgorithmPropertyVectorEdit(valuesAsString,
-				                                                key,
+				vectorEdit = new VtkAlgorithmPropertyVectorEdit(valuesAsString, key,
 				                                                values.front().type(),
 				                                                algProps);
 				connect(vectorEdit, SIGNAL(editingFinished()), this,
@@ -355,9 +344,22 @@ void VtkVisTabWidget::buildScalarArrayComboBox(VtkVisPipelineItem* item)
 	this->activeScalarComboBox->clear();
 	this->activeScalarComboBox->insertItems(0, dataSetAttributesList);
 	this->activeScalarComboBox->blockSignals(false);
+	QString active_array_name = item->GetActiveAttribute();
 	QList<QString>::iterator it = dataSetAttributesList.begin();
-	if (item->GetActiveAttribute().count() == 0)
+	if (active_array_name.length() == 0)
 		item->SetActiveAttribute(*it);
+	else
+	{
+		unsigned nArrays (dataSetAttributesList.size());
+		int idx(0);
+		for (it=dataSetAttributesList.begin(); it!=dataSetAttributesList.end(); ++it)
+			if (active_array_name.compare((*it).right((*it).length()-2))==0) 
+			{
+				this->activeScalarComboBox->setCurrentIndex(idx);
+				break;
+			}
+			else idx++;
+	}
 }
 
 void VtkVisTabWidget::SetActiveAttributeOnItem( const QString &name )
diff --git a/Gui/VtkVis/VtkVisTabWidget.h b/Gui/VtkVis/VtkVisTabWidget.h
index 10e7061348c..24196144fab 100644
--- a/Gui/VtkVis/VtkVisTabWidget.h
+++ b/Gui/VtkVis/VtkVisTabWidget.h
@@ -34,6 +34,7 @@ protected slots:
 	/// Updates the property panels to show informations on the given VtkVisPipelineItem.
 	void setActiveItem(VtkVisPipelineItem* item);
 
+	void on_arrayResetPushButton_clicked();
 	void on_diffuseColorPickerButton_colorPicked(QColor color);
 	void on_visibleEdgesCheckBox_stateChanged(int state);
 	void on_edgeColorPickerButton_colorPicked(QColor color);
diff --git a/Gui/VtkVis/VtkVisTabWidgetBase.ui b/Gui/VtkVis/VtkVisTabWidgetBase.ui
index 5bad5ace50b..cd1c2f1a71a 100644
--- a/Gui/VtkVis/VtkVisTabWidgetBase.ui
+++ b/Gui/VtkVis/VtkVisTabWidgetBase.ui
@@ -65,7 +65,7 @@
           <property name="margin">
            <number>3</number>
           </property>
-          <item row="0" column="1">
+          <item row="0" column="1" colspan="2">
            <widget class="ColorPickerPushButton" name="diffuseColorPickerButton">
             <property name="text">
              <string>(255,255,255)</string>
@@ -86,7 +86,7 @@
             </property>
            </widget>
           </item>
-          <item row="3" column="1">
+          <item row="3" column="1" colspan="2">
            <widget class="ColorPickerPushButton" name="edgeColorPickerButton">
             <property name="text">
              <string>(255, 255, 255)</string>
@@ -100,7 +100,7 @@
             </property>
            </widget>
           </item>
-          <item row="4" column="1">
+          <item row="4" column="1" colspan="2">
            <widget class="QValueTooltipSlider" name="opacitySlider">
             <property name="maximum">
              <number>100</number>
@@ -123,6 +123,35 @@
             </property>
            </widget>
           </item>
+          <item row="1" column="2">
+           <widget class="QPushButton" name="arrayResetPushButton">
+            <property name="sizePolicy">
+             <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+              <horstretch>0</horstretch>
+              <verstretch>0</verstretch>
+             </sizepolicy>
+            </property>
+            <property name="minimumSize">
+             <size>
+              <width>24</width>
+              <height>0</height>
+             </size>
+            </property>
+            <property name="maximumSize">
+             <size>
+              <width>24</width>
+              <height>16777215</height>
+             </size>
+            </property>
+            <property name="text">
+             <string/>
+            </property>
+            <property name="icon">
+             <iconset resource="../Img/icons.qrc">
+              <normaloff>:/Images/refresh-icon.png</normaloff>:/Images/refresh-icon.png</iconset>
+            </property>
+           </widget>
+          </item>
          </layout>
         </widget>
        </item>
@@ -375,6 +404,8 @@
    <header>QValueTooltipSlider.h</header>
   </customwidget>
  </customwidgets>
- <resources/>
+ <resources>
+  <include location="../Img/icons.qrc"/>
+ </resources>
  <connections/>
 </ui>
diff --git a/Gui/mainwindow.cpp b/Gui/mainwindow.cpp
index 431134a13ac..c034f279754 100644
--- a/Gui/mainwindow.cpp
+++ b/Gui/mainwindow.cpp
@@ -140,6 +140,8 @@ MainWindow::MainWindow(QWidget* parent /* = 0*/)
 	_vtkVisPipeline = new VtkVisPipeline(visualizationWidget->renderer());
 
 	// station model connects
+	connect(stationTabWidget->treeView, SIGNAL(openStationListFile(int)),
+	        this, SLOT(open(int)));
 	connect(stationTabWidget->treeView, SIGNAL(stationListExportRequested(std::string, std::string)),
 	        this, SLOT(exportBoreholesToGMS(std::string, std::string))); // export Stationlist to GMS
 	connect(stationTabWidget->treeView, SIGNAL(stationListRemoved(std::string)), _geoModels,
@@ -152,6 +154,8 @@ MainWindow::MainWindow(QWidget* parent /* = 0*/)
 	        this, SLOT(showDiagramPrefsDialog(QModelIndex &))); // connect treeview to diagramview
 
 	// geo model connects
+	connect(geoTabWidget->treeView, SIGNAL(openGeometryFile(int)),
+        this, SLOT(open(int)));
 	connect(geoTabWidget->treeView, SIGNAL(listRemoved(std::string, GeoLib::GEOTYPE)),
 	        _geoModels, SLOT(removeGeometry(std::string, GeoLib::GEOTYPE)));
 	connect(geoTabWidget->treeView, SIGNAL(geometryMappingRequested(const std::string&)),
@@ -179,6 +183,8 @@ MainWindow::MainWindow(QWidget* parent /* = 0*/)
 
 
 	// Setup connections for mesh models to GUI
+	connect(mshTabWidget->treeView, SIGNAL(openMeshFile(int)),
+        this, SLOT(open(int)));
 	connect(mshTabWidget->treeView, SIGNAL(requestMeshRemoval(const QModelIndex &)),
 	        _meshModels, SLOT(removeMesh(const QModelIndex &)));
 	connect(mshTabWidget->treeView, SIGNAL(requestMeshRemoval(const QModelIndex &)),
@@ -487,7 +493,7 @@ void MainWindow::loadFile(ImportFileType::type t, const QString &fileName)
 	QFileInfo fi(fileName);
 	std::string base = fi.absoluteDir().absoluteFilePath(fi.completeBaseName()).toStdString();
 
-	if (t == ImportFileType::OGS)
+	if (t == ImportFileType::OGS || t == ImportFileType::OGS_GEO || t == ImportFileType::OGS_STN || t == ImportFileType::OGS_MSH)
 	{
 		if (fi.suffix().toLower() == "gli")
 		{
diff --git a/Gui/mainwindow.ui b/Gui/mainwindow.ui
index e056d6667ee..f965c4eb1e3 100644
--- a/Gui/mainwindow.ui
+++ b/Gui/mainwindow.ui
@@ -231,6 +231,9 @@
    </attribute>
    <widget class="QWidget" name="dockWidgetContents_5">
     <layout class="QHBoxLayout" name="horizontalLayout">
+     <property name="margin">
+      <number>1</number>
+     </property>
      <item>
       <widget class="GeoTabWidget" name="geoTabWidget" native="true">
        <property name="enabled">
diff --git a/MeshLib/MeshQuality/MeshQualityChecker.cpp b/MeshLib/MeshQuality/MeshQualityChecker.cpp
index 83fad02943f..e51f4461e73 100644
--- a/MeshLib/MeshQuality/MeshQualityChecker.cpp
+++ b/MeshLib/MeshQuality/MeshQualityChecker.cpp
@@ -18,7 +18,7 @@
 namespace MeshLib
 {
 MeshQualityChecker::MeshQualityChecker(Mesh const* const mesh) :
-	_min (-1.0), _max (-1.0), _mesh (mesh)
+	_min (std::numeric_limits<double>::max()), _max (std::numeric_limits<double>::min()), _mesh (mesh)
 {
 	if (_mesh)
 		_mesh_quality_measure.resize (_mesh->getNElements(), -1.0);
diff --git a/MeshLib/MeshQuality/MeshQualityVolume.cpp b/MeshLib/MeshQuality/MeshQualityVolume.cpp
index 4f16e76c9f0..41239a466ea 100644
--- a/MeshLib/MeshQuality/MeshQualityVolume.cpp
+++ b/MeshLib/MeshQuality/MeshQualityVolume.cpp
@@ -37,7 +37,7 @@ void MeshQualityVolume::check()
 		    || elem_type == MshElemType::TRIANGLE
 		    || elem_type == MshElemType::QUAD)
 		{
-            _mesh_quality_measure[k] = -1.0;
+            _mesh_quality_measure[k] = 0.0;
             continue;
         }
 
-- 
GitLab