OGS
StationTreeView.cpp
Go to the documentation of this file.
1 
15 #include "StationTreeView.h"
16 
17 #include <QFileDialog>
18 #include <QMenu>
19 
21 #include "Base/ImportFileTypes.h"
23 #include "Base/OGSError.h"
26 #include "GeoLib/Station.h"
27 #include "ModelTreeItem.h"
28 #include "StationTreeModel.h"
29 
30 StationTreeView::StationTreeView(QWidget* parent) : QTreeView(parent)
31 {
32  // setContextMenuPolicy(Qt::CustomContextMenu);
33  // connect(this, SIGNAL(customContextMenuRequested(const QPoint &)),
34  // this, SLOT(showContextMenu(const QPoint &)));
35 }
36 
38 {
39  setAlternatingRowColors(true);
40  setColumnWidth(0, 150);
41  setColumnWidth(1, 75);
42  setColumnWidth(2, 75);
43  setColumnWidth(3, 75);
44 }
45 
46 void StationTreeView::selectionChanged(const QItemSelection& selected,
47  const QItemSelection& deselected)
48 {
49  Q_UNUSED(deselected);
50  if (!selected.isEmpty())
51  {
52  const QModelIndex idx = *(selected.indexes().begin());
53  const TreeItem* tree_item =
54  static_cast<TreeModel*>(this->model())->getItem(idx);
55 
56  const auto* list_item =
57  dynamic_cast<const ModelTreeItem*>(tree_item->parentItem());
58  if (list_item->getItem())
59  {
60  if (list_item)
61  {
62  emit geoItemSelected(list_item->getItem()->vtkSource(),
63  tree_item->row());
64  }
65  emit enableRemoveButton(false);
66  emit enableSaveButton(false);
67  }
68  else
69  {
71  emit enableSaveButton(true);
72  emit enableRemoveButton(true);
73  }
74  }
75  // emit itemSelectionChanged(selected, deselected);
76  // return QTreeView::selectionChanged(selected, deselected);
77 }
78 
80  const QItemSelection& selected, const QItemSelection& deselected)
81 {
82  QItemSelectionModel* selModel = this->selectionModel();
83 
84  selModel->blockSignals(true);
85  selModel->select(deselected, QItemSelectionModel::Deselect);
86  selModel->select(selected, QItemSelectionModel::Select);
87  selModel->blockSignals(false);
88 
89  return QTreeView::selectionChanged(selected, deselected);
90 }
91 
92 void StationTreeView::contextMenuEvent(QContextMenuEvent* event)
93 {
94  QModelIndex index = this->selectionModel()->currentIndex();
95  auto* item = static_cast<ModelTreeItem*>(index.internalPointer());
96 
97  if (!item)
98  { // Otherwise sometimes it crashes when (unmotivated ;-) ) clicking in a
99  // treeview
100  return;
101  }
102 
103  // The current index refers to a parent item (e.g. a listname)
104  if (item->childCount() > 0)
105  {
106  QMenu menu;
107  QAction* mapAction = menu.addAction("Map stations...");
108  QAction* exportAction = menu.addAction("Export to GMS...");
109  menu.addSeparator();
110 
111  connect(mapAction, SIGNAL(triggered()), this, SLOT(mapStations()));
112  connect(exportAction, SIGNAL(triggered()), this, SLOT(exportList()));
113  menu.exec(event->globalPos());
114  }
115  // The current index refers to a station object
116  else
117  {
118  QString temp_name;
119  QMenu menu;
120 
121  QAction* setNameAction = menu.addAction("Set name...");
122  connect(setNameAction, SIGNAL(triggered()), this,
123  SLOT(setNameForElement()));
124  if (dynamic_cast<GeoLib::StationBorehole*>(
125  static_cast<StationTreeModel*>(model())->stationFromIndex(
126  index, temp_name)))
127  {
128  QAction* stratAction = menu.addAction("Display Stratigraphy...");
129  QAction* exportAction = menu.addAction("Export to GMS...");
130  connect(stratAction, SIGNAL(triggered()), this,
131  SLOT(displayStratigraphy()));
132  connect(exportAction, SIGNAL(triggered()), this,
133  SLOT(exportStation()));
134  menu.exec(event->globalPos());
135  }
136  else
137  {
138  QAction* showDiagramAction = menu.addAction("View Diagram...");
139  connect(showDiagramAction, SIGNAL(triggered()), this,
140  SLOT(showDiagramPrefsDialog()));
141  menu.exec(event->globalPos());
142  }
143  }
144 }
145 
147 {
148  TreeItem const* const item =
149  static_cast<StationTreeModel*>(model())->getItem(
150  this->selectionModel()->currentIndex());
151  std::string const stn_vec_name =
152  item->parentItem()->data(0).toString().toStdString();
153  emit requestNameChangeDialog(stn_vec_name, item->row());
154 }
155 
157 {
158  TreeItem const* const item =
159  static_cast<StationTreeModel*>(model())->getItem(
160  this->selectionModel()->currentIndex());
161  std::string const& geo_name(item->data(0).toString().toStdString());
162  emit geometryMappingRequested(geo_name);
163 }
164 
166 {
167  QModelIndex index = this->selectionModel()->currentIndex();
168 
169  QString temp_name;
170  // get list name
171  static_cast<StationTreeModel*>(model())->stationFromIndex(
172  this->selectionModel()->currentIndex(), temp_name);
173  // get color table (horrible way to do it but there you go ...)
174  std::map<std::string, DataHolderLib::Color> colorLookupTable =
175  static_cast<VtkStationSource*>(
176  static_cast<StationTreeModel*>(model())->vtkSource(
177  temp_name.toStdString()))
179  auto* stratView = new StratWindow(
180  static_cast<GeoLib::StationBorehole*>(
181  static_cast<StationTreeModel*>(model())->stationFromIndex(
182  index, temp_name)),
183  &colorLookupTable);
184  stratView->setAttribute(
185  Qt::WA_DeleteOnClose); // this fixes the memory leak shown by cppcheck
186  stratView->show();
187 }
188 
190 {
192 }
193 
195 {
196  QModelIndex index(this->selectionModel()->currentIndex());
197  if (!index.isValid())
198  {
199  OGSError::box("No station list selected.");
200  }
201  else
202  {
203  TreeItem* item =
204  static_cast<StationTreeModel*>(model())->getItem(index);
205  QString listName = item->data(0).toString();
206  QString fileName = QFileDialog::getSaveFileName(
207  this, "Save station list",
208  LastSavedFileDirectory::getDir() + listName, "*.stn");
209  if (!fileName.isEmpty())
210  {
212  emit stationListSaved(listName, fileName);
213  }
214  }
215 }
216 
218 {
219  // only a test for the stratigraphy screenshot tool and writer!!
220  // QString Name =
221  // static_cast<StationTreeModel*>(model())->getItem(this->selectionModel()->currentIndex())->data(0).toString();
222  // writeStratigraphiesAsImages(Name);
223 
224  TreeItem* item = static_cast<StationTreeModel*>(model())->getItem(
225  this->selectionModel()->currentIndex());
226  QString listName = item->data(0).toString();
227  QString fileName = QFileDialog::getSaveFileName(
228  this, "Export Boreholes to GMS-Format",
229  LastSavedFileDirectory::getDir() + listName, "*.txt");
230  if (!fileName.isEmpty())
231  {
233  emit stationListExportRequested(listName.toStdString(),
234  fileName.toStdString());
235  }
236 }
237 
239 {
240  QModelIndex index = this->selectionModel()->currentIndex();
241  QString fileName =
242  QFileDialog::getSaveFileName(this, "Export Borehole to GMS-Format",
243  LastSavedFileDirectory::getDir(), "*.txt");
244  if (!fileName.isEmpty())
245  {
246  QString temp_name;
247  std::vector<GeoLib::Point*> stations;
248  stations.push_back(static_cast<GeoLib::StationBorehole*>(
249  static_cast<StationTreeModel*>(model())->stationFromIndex(
250  index, temp_name)));
252  fileName.toStdString());
254  }
255 }
256 
258 {
259  QModelIndex index(this->selectionModel()->currentIndex());
260  if (!index.isValid())
261  {
262  OGSError::box("No station list selected.");
263  }
264  else
265  {
266  TreeItem* item =
267  static_cast<StationTreeModel*>(model())->getItem(index);
268  emit stationListRemoved((item->data(0).toString()).toStdString());
269 
270  if (this->selectionModel()->selectedIndexes().count() == 0)
271  {
272  emit enableSaveButton(false);
273  emit enableRemoveButton(false);
274  }
275  }
276 }
277 
279 {
280  QModelIndex index = this->selectionModel()->currentIndex();
281  emit diagramRequested(index);
282 }
283 
285 {
286  std::map<std::string, DataHolderLib::Color> colorLookupTable =
287  static_cast<VtkStationSource*>(
288  static_cast<StationTreeModel*>(model())->vtkSource(
289  listName.toStdString()))
291  std::vector<ModelTreeItem*> lists =
292  static_cast<StationTreeModel*>(model())->getLists();
293  std::size_t nLists = lists.size();
294  for (std::size_t i = 0; i < nLists; i++)
295  {
296  if (listName.compare(lists[i]->data(0).toString()) != 0)
297  {
298  continue;
299  }
300 
301  std::vector<GeoLib::Point*> const& stations =
302  *dynamic_cast<BaseItem*>(lists[i]->getItem())->getStations();
303 
304  for (auto station : stations)
305  {
306  auto* stratView =
307  new StratWindow(static_cast<GeoLib::StationBorehole*>(station),
308  &colorLookupTable);
309  stratView->setAttribute(Qt::WA_DeleteOnClose);
310  stratView->show();
311  stratView->stationView->saveAsImage(
312  QString::fromStdString(
313  static_cast<GeoLib::StationBorehole*>(station)->getName()) +
314  ".jpg");
315  stratView->close();
316  }
317  }
318 }
Definition of the DiagramPrefsDialog class.
Definition of the GMSInterface class.
Definition of the ImportFileTypes enumeration.
Manages the last directory used for saving a file.
Definition of the ModelTreeItem class.
Definition of the OGSError class.
Definition of the StationTreeModel class.
Definition of the StationTreeView class.
Definition of the Station class.
Definition of the StratWindow class.
std::string getName(std::string const &line)
Returns the name/title from the "Zone"-description.
A BaseItem contains additional Information about a subtree in the StationTreeModel.
Definition: BaseItem.h:32
static void writeBoreholesToGMS(const std::vector< GeoLib::Point * > *stations, const std::string &filename)
A borehole as a geometric object.
static void setDir(const QString &path)
Sets the directory last used for saving a file.
static const QString getDir()
Returns the directory last used for saving a file.
A TreeItem containing some additional information used in the StationModel.
Definition: ModelTreeItem.h:28
static void box(const QString &e)
Definition: OGSError.cpp:23
A model for the StationTreeView implementing a tree as a double-linked list.
void updateView()
Update the view to visualise changes made to the underlying data.
void selectionChangedFromOutside(const QItemSelection &selected, const QItemSelection &deselected)
Instructions if the selection of items in the view has changed by events outside the view (i....
void requestNameChangeDialog(const std::string &, std::size_t)
void openStationListFile(int)
void stationListExportRequested(std::string listName, std::string fileName)
void geometryMappingRequested(const std::string &)
void geoItemSelected(const vtkPolyDataAlgorithm *, int)
void diagramRequested(QModelIndex &)
void enableRemoveButton(bool)
void contextMenuEvent(QContextMenuEvent *e) override
Actions to be taken after a right mouse click is performed in the station view.
void setNameForElement()
Calls a SetNameDialog.
void stationListSaved(QString listName, QString fileName)
void removeGeoItemSelection()
void selectionChanged(const QItemSelection &selected, const QItemSelection &deselected) override
Instructions if the selection of items in the view has changed.
StationTreeView(QWidget *parent=nullptr)
Constructor.
void enableSaveButton(bool)
void writeStratigraphiesAsImages(QString listName)
Create image files from all stratigraphies in a borehole vector.
void stationListRemoved(std::string name)
Creates a window to visualise the stratigraphy of a borehole.
Definition: StratWindow.h:29
Objects nodes for the TreeModel.
Definition: TreeItem.h:28
TreeItem * parentItem() const
Definition: TreeItem.cpp:115
int row() const
Definition: TreeItem.cpp:73
virtual QVariant data(int column) const
Definition: TreeItem.cpp:94
A hierarchical model for a tree implemented as a double-linked list.
Definition: TreeModel.h:30
VTK source object for the visualisation of station data (including boreholes)
const std::map< std::string, DataHolderLib::Color > & getColorLookupTable() const