You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
324 lines
10 KiB
C++
324 lines
10 KiB
C++
/***************************************************************************
|
|
* Copyright (C) gempa GmbH *
|
|
* All rights reserved. *
|
|
* Contact: gempa GmbH (seiscomp-dev@gempa.de) *
|
|
* *
|
|
* GNU Affero General Public License Usage *
|
|
* This file may be used under the terms of the GNU Affero *
|
|
* Public License version 3.0 as published by the Free Software Foundation *
|
|
* and appearing in the file LICENSE included in the packaging of this *
|
|
* file. Please review the following information to ensure the GNU Affero *
|
|
* Public License version 3.0 requirements will be met: *
|
|
* https://www.gnu.org/licenses/agpl-3.0.html. *
|
|
* *
|
|
* Other Usage *
|
|
* Alternatively, this file may be used in accordance with the terms and *
|
|
* conditions contained in a signed written agreement between you and *
|
|
* gempa GmbH. *
|
|
***************************************************************************/
|
|
|
|
|
|
#ifndef SEISCOMP_GUI_EVENTEDIT_H
|
|
#define SEISCOMP_GUI_EVENTEDIT_H
|
|
|
|
#include <QWidget>
|
|
#include <string>
|
|
#include <list>
|
|
|
|
#ifndef Q_MOC_RUN
|
|
#include <seiscomp/datamodel/event.h>
|
|
#include <seiscomp/datamodel/origin.h>
|
|
#include <seiscomp/datamodel/magnitude.h>
|
|
#include <seiscomp/datamodel/focalmechanism.h>
|
|
#include <seiscomp/datamodel/momenttensor.h>
|
|
#include <seiscomp/datamodel/journalentry.h>
|
|
#include <seiscomp/datamodel/databasequery.h>
|
|
#endif
|
|
#include <seiscomp/gui/qt.h>
|
|
#include <seiscomp/gui/datamodel/originsymbol.h>
|
|
#include <seiscomp/gui/datamodel/tensorsymbol.h>
|
|
#include <seiscomp/gui/map/mapwidget.h>
|
|
|
|
#include <seiscomp/gui/datamodel/ui_eventedit.h>
|
|
|
|
namespace Seiscomp {
|
|
namespace Gui {
|
|
|
|
// Extends tensor symbol by label and reference position
|
|
class SC_GUI_API ExtTensorSymbol : public TensorSymbol {
|
|
public:
|
|
ExtTensorSymbol(const Math::Tensor2Sd &t,
|
|
const DataModel::FocalMechanism *fm,
|
|
Map::Decorator* decorator = nullptr);
|
|
~ExtTensorSymbol() {};
|
|
|
|
public:
|
|
void setSelected(bool selected) { _selected = selected; }
|
|
void setDrawAgency(bool enabled) { _drawAgency = enabled; }
|
|
void setDrawMagnitude(bool enabled) { _drawMagnitude = enabled; }
|
|
void setDrawDepth(bool enabled) { _drawDepth = enabled; }
|
|
void setReferencePositionEnabled(bool enabled) { _refPosEnabled = enabled; }
|
|
void setReferencePosition(const QPointF &refPos) { _refPos = refPos; }
|
|
|
|
const QString& agencyID() const { return _agency; }
|
|
const Core::Time& created() const { return _created; }
|
|
|
|
protected:
|
|
virtual void customDraw(const Map::Canvas *canvas, QPainter &painter);
|
|
|
|
private:
|
|
bool _selected;
|
|
bool _refPosEnabled;
|
|
QPointF _refPos;
|
|
|
|
QString _agency;
|
|
QString _magnitude;
|
|
QString _depth;
|
|
Core::Time _created;
|
|
|
|
bool _drawAgency;
|
|
bool _drawMagnitude;
|
|
bool _drawDepth;
|
|
};
|
|
|
|
|
|
|
|
// Adds context menu entries to control drawing of focal mechanism symbols
|
|
class SC_GUI_API FMMap : public MapWidget {
|
|
Q_OBJECT
|
|
|
|
public:
|
|
FMMap(const MapsDesc &maps, QWidget *parent = 0, Qt::WindowFlags f = 0)
|
|
: MapWidget(maps, parent, f) { init(); }
|
|
FMMap(Map::ImageTree* mapTree, QWidget *parent = 0, Qt::WindowFlags f = 0)
|
|
: MapWidget(mapTree, parent, f) { init(); }
|
|
|
|
virtual ~FMMap();
|
|
|
|
virtual void draw(QPainter&);
|
|
|
|
void addFM(const DataModel::FocalMechanism *fm);
|
|
void clear();
|
|
void setCurrentFM(const std::string &id);
|
|
void setEvent(const DataModel::Event *event);
|
|
|
|
|
|
protected:
|
|
void contextMenuEvent(QContextMenuEvent *e);
|
|
|
|
private:
|
|
void init();
|
|
void updateSmartLayout();
|
|
|
|
private:
|
|
typedef std::map<std::string, ExtTensorSymbol*> FMSymbols;
|
|
|
|
FMSymbols _fmSymbols;
|
|
OriginSymbol *_originSymbol;
|
|
|
|
bool _drawAgency;
|
|
bool _drawMagnitude;
|
|
bool _drawDepth;
|
|
bool _smartLayout;
|
|
bool _groupByAgency;
|
|
|
|
bool _smartLayoutDirty;
|
|
QRectF _fmBoundings;
|
|
};
|
|
|
|
|
|
// Derived from Observer to receive local object modifications, because
|
|
// messages sent by other controls won't be received by the client
|
|
// application again.
|
|
class SC_GUI_API EventEdit : public QWidget, public DataModel::Observer {
|
|
Q_OBJECT
|
|
|
|
public:
|
|
EventEdit(DataModel::DatabaseQuery* reader,
|
|
Map::ImageTree *mapTreeOrigin = nullptr,
|
|
QWidget *parent = 0);
|
|
~EventEdit();
|
|
|
|
|
|
public:
|
|
//! Sets the usage of messaging to notify about object changes.
|
|
//! When disabled a local EventParameters instance is searched for and
|
|
//! all updates and adds are applied to this instance.
|
|
void setMessagingEnabled(bool);
|
|
|
|
|
|
signals:
|
|
void originSelected(Seiscomp::DataModel::Origin*, Seiscomp::DataModel::Event* = nullptr);
|
|
void originMergeRequested(QList<Seiscomp::DataModel::Origin*>);
|
|
void fmSelected(Seiscomp::DataModel::FocalMechanism*, Seiscomp::DataModel::Event* = nullptr);
|
|
|
|
|
|
public slots:
|
|
void addObject(const QString& parentID, Seiscomp::DataModel::Object* obj);
|
|
void updateObject(const QString& parentID, Seiscomp::DataModel::Object* obj);
|
|
void removeObject(const QString& parentID, Seiscomp::DataModel::Object* obj);
|
|
|
|
void setEvent(Seiscomp::DataModel::Event *event, Seiscomp::DataModel::Origin *origin);
|
|
void updateOrigin(Seiscomp::DataModel::Origin*);
|
|
void updateFM(Seiscomp::DataModel::FocalMechanism*);
|
|
|
|
void showTab(int);
|
|
|
|
|
|
private slots:
|
|
void sortOriginItems(int);
|
|
void sortFMItems(int);
|
|
void originSelected(QTreeWidgetItem *item, int);
|
|
void fmSelected(QTreeWidgetItem *item, int);
|
|
|
|
void sortMagnitudeItems(int);
|
|
|
|
void currentTypeChanged(int);
|
|
void currentTypeCertaintyChanged(int);
|
|
void currentOriginChanged(QTreeWidgetItem*, QTreeWidgetItem*);
|
|
void currentFMChanged(QTreeWidgetItem*, QTreeWidgetItem*);
|
|
void currentMagnitudeChanged(QTreeWidgetItem*, QTreeWidgetItem*);
|
|
|
|
void originTreeCustomContextMenu(const QPoint &);
|
|
void originTreeHeaderCustomContextMenu(const QPoint &);
|
|
void fmTreeCustomContextMenu(const QPoint &);
|
|
void fmTreeHeaderCustomContextMenu(const QPoint &);
|
|
void magnitudeTreeCustomContextMenu(const QPoint &);
|
|
|
|
void fixOrigin();
|
|
void fixFM();
|
|
void releaseOrigin();
|
|
void releaseFM();
|
|
|
|
void fixMagnitudeType();
|
|
void releaseMagnitudeType();
|
|
|
|
void fixMw();
|
|
void fixFmMw();
|
|
void releaseMw();
|
|
void triggerMw();
|
|
|
|
void evalResultAvailable(const QString &originID,
|
|
const QString &className,
|
|
const QString &script,
|
|
const QString &result);
|
|
|
|
void evalResultError(const QString &originID,
|
|
const QString &className,
|
|
const QString &script,
|
|
int error);
|
|
|
|
|
|
public:
|
|
const DataModel::Event *currentEvent() const;
|
|
void handleOrigins(const QList<DataModel::Origin*> &origins);
|
|
|
|
|
|
private:
|
|
void init();
|
|
|
|
void updateContent();
|
|
void updateEvent();
|
|
void updateOrigin();
|
|
void updateMagnitude();
|
|
void updateFM();
|
|
void updateMT();
|
|
void updateJournal();
|
|
|
|
void resetContent();
|
|
void resetOrigin();
|
|
void resetMagnitude();
|
|
void resetFM();
|
|
void resetMT(bool resetCurrent = false);
|
|
bool sendJournal(const std::string &action,
|
|
const std::string ¶ms);
|
|
|
|
void addMagnitude(DataModel::Magnitude *mag);
|
|
void addJournal(DataModel::JournalEntry *entry);
|
|
|
|
void updatePreferredOriginIndex();
|
|
void updatePreferredMagnitudeIndex();
|
|
void updatePreferredFMIndex();
|
|
|
|
void onObjectAdded(DataModel::Object* parent, DataModel::Object* newChild);
|
|
void onObjectRemoved(DataModel::Object* parent, DataModel::Object* oldChild);
|
|
void onObjectModified(DataModel::Object* object);
|
|
|
|
void insertOriginRow(DataModel::Origin *);
|
|
void updateOriginRow(int row, DataModel::Origin *);
|
|
void updateMagnitudeRow(int row, DataModel::Magnitude *);
|
|
void insertFMRow(DataModel::FocalMechanism *);
|
|
void updateFMRow(int row, DataModel::FocalMechanism *);
|
|
|
|
void storeOrigin(DataModel::Origin *);
|
|
void storeFM(DataModel::FocalMechanism *);
|
|
void storeDerivedOrigin(DataModel::Origin *);
|
|
void clearOrigins();
|
|
void clearFMs();
|
|
|
|
void mergeOrigins(const QList<DataModel::Origin*> &origins);
|
|
|
|
void setFMActivity(bool);
|
|
|
|
|
|
private:
|
|
typedef std::list<DataModel::OriginPtr> OriginList;
|
|
typedef std::list<DataModel::FocalMechanismPtr> FMList;
|
|
struct ProcessColumn {
|
|
int pos;
|
|
QString script;
|
|
};
|
|
|
|
Ui::EventEdit _ui;
|
|
|
|
QList<DataModel::EventType> _eventTypesWhitelist;
|
|
DataModel::DatabaseQuery* _reader;
|
|
Map::ImageTreePtr _mapTreeOrigin;
|
|
Map::ImageTreePtr _mapTreeFM;
|
|
QLabel *_fmActivity;
|
|
QMovie *_fmActivityMovie;
|
|
|
|
DataModel::EventPtr _currentEvent;
|
|
bool _updateLocalEPInstance;
|
|
bool _blockObserver;
|
|
|
|
// origin tab
|
|
OriginList _origins;
|
|
MapWidget *_originMap;
|
|
QRectF _originBoundings;
|
|
DataModel::OriginPtr _currentOrigin;
|
|
DataModel::MagnitudePtr _currentMagnitude;
|
|
int _fixOriginDefaultActionCount;
|
|
int _preferredOriginIdx;
|
|
int _preferredMagnitudeIdx;
|
|
QStringList _originTableHeader;
|
|
QVector<int> _originColumnMap;
|
|
int _customColumn;
|
|
QString _customColumnLabel;
|
|
std::string _commentID;
|
|
QString _customDefaultText;
|
|
QMap<std::string, QColor> _customColorMap;
|
|
QVector<ProcessColumn> _scriptColumns;
|
|
QHash<QString, int> _scriptColumnMap;
|
|
|
|
QTreeWidget *_originTree;
|
|
|
|
// focal mechanism tab
|
|
FMList _fms;
|
|
OriginList _derivedOrigins;
|
|
FMMap *_fmMap;
|
|
DataModel::FocalMechanismPtr _currentFM;
|
|
DataModel::MomentTensorPtr _currentMT;
|
|
int _fixFMDefaultActionCount;
|
|
int _preferredFMIdx;
|
|
QStringList _fmTableHeader;
|
|
QVector<int> _fmColumnMap;
|
|
OriginSymbol *_fmPrefOriginSymbol;
|
|
};
|
|
|
|
|
|
}
|
|
}
|
|
|
|
#endif
|