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.
394 lines
13 KiB
C++
394 lines
13 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_ORIGINLISTVIEW_H
|
|
#define SEISCOMP_GUI_ORIGINLISTVIEW_H
|
|
|
|
#include <seiscomp/gui/core/connectiondialog.h>
|
|
#include <seiscomp/gui/core/utils.h>
|
|
#include <seiscomp/gui/qt.h>
|
|
#ifndef Q_MOC_RUN
|
|
#include <seiscomp/core/baseobject.h>
|
|
#include <seiscomp/core/timewindow.h>
|
|
#include <seiscomp/geo/boundingbox.h>
|
|
#endif
|
|
|
|
#include <QWidget>
|
|
|
|
|
|
// Ui forward declarations
|
|
class QTreeWidget;
|
|
class QTreeWidgetItem;
|
|
|
|
namespace Ui {
|
|
class EventListView;
|
|
class EventListViewRegionFilterDialog;
|
|
}
|
|
|
|
|
|
namespace Seiscomp {
|
|
|
|
namespace DataModel {
|
|
|
|
|
|
DEFINE_SMARTPOINTER(Event);
|
|
DEFINE_SMARTPOINTER(Origin);
|
|
DEFINE_SMARTPOINTER(FocalMechanism);
|
|
DEFINE_SMARTPOINTER(Pick);
|
|
DEFINE_SMARTPOINTER(Station);
|
|
DEFINE_SMARTPOINTER(Amplitude);
|
|
class OriginReference;
|
|
class DatabaseQuery;
|
|
class Notifier;
|
|
|
|
}
|
|
|
|
namespace Client {
|
|
|
|
DEFINE_SMARTPOINTER(Connection);
|
|
|
|
}
|
|
|
|
namespace Geo {
|
|
|
|
DEFINE_SMARTPOINTER(GeoFeature);
|
|
|
|
}
|
|
|
|
namespace Gui {
|
|
|
|
|
|
namespace Private {
|
|
|
|
class EventTreeItem;
|
|
class OriginTreeItem;
|
|
class FocalMechanismTreeItem;
|
|
class EventFilterWidget;
|
|
|
|
}
|
|
|
|
|
|
class CommandMessage;
|
|
|
|
|
|
class SC_GUI_API EventListView : public QWidget {
|
|
Q_OBJECT
|
|
|
|
// ------------------------------------------------------------------
|
|
// Public types
|
|
// ------------------------------------------------------------------
|
|
public:
|
|
typedef QMap<QString, DataModel::StationPtr> StationMap;
|
|
|
|
struct Filter {
|
|
Filter(const Seiscomp::Core::TimeWindow& tw = Seiscomp::Core::TimeWindow())
|
|
: startTime(tw.startTime()), endTime(tw.endTime()) {}
|
|
Seiscomp::Core::Time startTime;
|
|
Seiscomp::Core::Time endTime;
|
|
OPT(float) minLatitude, maxLatitude;
|
|
OPT(float) minLongitude, maxLongitude;
|
|
OPT(float) minDepth, maxDepth;
|
|
OPT(float) minMagnitude, maxMagnitude;
|
|
std::string eventID;
|
|
|
|
bool isNull() const;
|
|
};
|
|
|
|
|
|
// ------------------------------------------------------------------
|
|
// X'truction
|
|
// ------------------------------------------------------------------
|
|
public:
|
|
EventListView(Seiscomp::DataModel::DatabaseQuery* reader,
|
|
bool withOrigins = true, bool withFocalMechanisms = false,
|
|
QWidget * parent = 0, Qt::WindowFlags f = 0);
|
|
~EventListView();
|
|
|
|
|
|
public:
|
|
void setRelativeMinimumEventTime(const Seiscomp::Core::TimeSpan&);
|
|
void add(Seiscomp::DataModel::Event* event,
|
|
Seiscomp::DataModel::Origin* origin);
|
|
|
|
//! Sets the usage of messaging to notify about new objects or updates.
|
|
//! When disabled a local EventParameters instance is searched for and
|
|
//! all updates and adds are applied to this instance.
|
|
void setMessagingEnabled(bool);
|
|
void setEventModificationsEnabled(bool);
|
|
void setSortingEnabled(bool);
|
|
void moveSection(int, int);
|
|
|
|
void setControlsHidden(bool);
|
|
void setCustomControls(QWidget*) const;
|
|
void setFMLinkEnabled(bool);
|
|
|
|
QList<Seiscomp::DataModel::Event*> selectedEvents();
|
|
|
|
QTreeWidget *eventTree() { return _treeWidget; }
|
|
Seiscomp::DataModel::Event *eventFromTreeItem(QTreeWidgetItem *item) const;
|
|
|
|
int eventCount() const;
|
|
|
|
//! \since 15.0.0
|
|
int visibleEventCount() const;
|
|
|
|
|
|
signals:
|
|
void originAdded();
|
|
void focalMechanismAdded();
|
|
|
|
void originSelected(Seiscomp::DataModel::Origin*,
|
|
Seiscomp::DataModel::Event* = nullptr);
|
|
void originUpdated(Seiscomp::DataModel::Origin*);
|
|
|
|
void focalMechanismSelected(Seiscomp::DataModel::FocalMechanism*,
|
|
Seiscomp::DataModel::Event* = nullptr);
|
|
void focalMechanismUpdated(Seiscomp::DataModel::FocalMechanism*);
|
|
|
|
void eventSelected(Seiscomp::DataModel::Event*);
|
|
void eventFMSelected(Seiscomp::DataModel::Event*);
|
|
void originReferenceAdded(const std::string &, Seiscomp::DataModel::OriginReference*);
|
|
|
|
//! Emitted when the event list is cleared
|
|
void reset();
|
|
void eventAddedToList(Seiscomp::DataModel::Event*, bool fromNotification);
|
|
void eventUpdatedInList(Seiscomp::DataModel::Event*);
|
|
void eventRemovedFromList(Seiscomp::DataModel::Event*);
|
|
|
|
//! \since 15.0.0
|
|
void visibleEventCountChanged();
|
|
|
|
//! Emitted when a bigger update process has finished, such as show/hide
|
|
//! of a subset of events.
|
|
void eventsUpdated();
|
|
|
|
|
|
public slots:
|
|
void setAutoSelect(bool);
|
|
void onCommand(Seiscomp::Gui::CommandMessage* cmsg);
|
|
void messageAvailable(Seiscomp::Core::Message*, Seiscomp::Client::Packet*);
|
|
void notifierAvailable(Seiscomp::DataModel::Notifier*);
|
|
|
|
void updateOrigin(Seiscomp::DataModel::Origin* origin);
|
|
void insertOrigin(Seiscomp::DataModel::Origin* origin,
|
|
Seiscomp::DataModel::Event* baseEvent,
|
|
const Seiscomp::Gui::ObjectChangeList<Seiscomp::DataModel::Pick>&,
|
|
const std::vector<Seiscomp::DataModel::AmplitudePtr>&);
|
|
|
|
void updateFocalMechanism(Seiscomp::DataModel::FocalMechanism *fm);
|
|
void insertFocalMechanism(Seiscomp::DataModel::FocalMechanism *fm,
|
|
Seiscomp::DataModel::Event *event,
|
|
Seiscomp::DataModel::Origin *origin = 0);
|
|
|
|
void setInterval(const Seiscomp::Core::TimeWindow&);
|
|
|
|
void selectFirstEnabledEvent();
|
|
void selectEvent(int index);
|
|
void selectEventID(const std::string& publicID);
|
|
|
|
void setPreviousEvent();
|
|
void setNextEvent();
|
|
|
|
void readFromDatabase();
|
|
void readFromDatabase(const Seiscomp::Gui::EventListView::Filter&);
|
|
void clear();
|
|
void clearDatabaseFilter();
|
|
|
|
void selectEventFM(const QString &);
|
|
|
|
protected slots:
|
|
void itemSelected(QTreeWidgetItem*,int);
|
|
void itemPressed(QTreeWidgetItem*,int);
|
|
void copyRowToClipboard();
|
|
|
|
void readLastDays();
|
|
void readInterval();
|
|
|
|
void onShowOtherEvents(int checked);
|
|
void onShowForeignEvents(int checked);
|
|
void onHideOutsideRegion(int checked);
|
|
void onFilterRegionModeChanged(int mode);
|
|
|
|
void updateAgencyState();
|
|
|
|
private slots:
|
|
void sortItems(int);
|
|
void headerContextMenuRequested(const QPoint &);
|
|
void waitDialogDestroyed(QObject *o);
|
|
|
|
void regionSelectionChanged(int index);
|
|
void changeRegion();
|
|
|
|
void itemEntered(QTreeWidgetItem *item, int);
|
|
void itemExpanded(QTreeWidgetItem * item);
|
|
void currentItemChanged(QTreeWidgetItem* current, QTreeWidgetItem* previous);
|
|
void indicatorResized(const QSize &size);
|
|
|
|
void evalResultAvailable(const QString &publicID,
|
|
const QString &className,
|
|
const QString &script,
|
|
const QString &result);
|
|
|
|
void evalResultError(const QString &publicID,
|
|
const QString &className,
|
|
const QString &script,
|
|
int error);
|
|
|
|
|
|
protected:
|
|
bool eventFilter(QObject *obj, QEvent *event);
|
|
|
|
private:
|
|
void initTree();
|
|
|
|
Private::EventTreeItem* addEvent(Seiscomp::DataModel::Event*, bool fromNotification);
|
|
Private::OriginTreeItem* addOrigin(Seiscomp::DataModel::Origin*, QTreeWidgetItem* parent, bool highPriority);
|
|
Private::FocalMechanismTreeItem* addFocalMechanism(Seiscomp::DataModel::FocalMechanism*, QTreeWidgetItem* parent);
|
|
|
|
Private::EventTreeItem* findEvent(const std::string&);
|
|
Private::OriginTreeItem* findOrigin(const std::string&);
|
|
Private::FocalMechanismTreeItem* findFocalMechanism(const std::string&);
|
|
|
|
void removeExpiredEvents();
|
|
void updateHideState();
|
|
bool updateHideState(QTreeWidgetItem *item);
|
|
|
|
void updateOriginProcessColumns(QTreeWidgetItem *item, bool highPriority);
|
|
void updateEventProcessColumns(QTreeWidgetItem *item, bool highPriority);
|
|
|
|
bool sendJournalAndWait(const std::string &objectID,
|
|
const std::string &action,
|
|
const std::string ¶ms, const char *group);
|
|
|
|
void loadItem(QTreeWidgetItem*);
|
|
|
|
|
|
public:
|
|
struct ProcessColumn {
|
|
int pos;
|
|
QString script;
|
|
};
|
|
|
|
struct ItemConfig {
|
|
ItemConfig() : createFMLink(false) {}
|
|
|
|
QColor disabledColor;
|
|
|
|
bool createFMLink;
|
|
QStringList header;
|
|
QVector<int> columnMap;
|
|
int customColumn;
|
|
std::string originCommentID;
|
|
std::string eventCommentID;
|
|
QString customDefaultText;
|
|
QMap<std::string, QColor> customColorMap;
|
|
QVector<ProcessColumn> originScriptColumns;
|
|
QVector<ProcessColumn> eventScriptColumns;
|
|
QSet<int> eventScriptPositions;
|
|
QHash<QString, int> originScriptColumnMap;
|
|
QHash<QString, int> eventScriptColumnMap;
|
|
QSet<int> hiddenEventTypes;
|
|
QSet<QString> preferredAgencies;
|
|
};
|
|
|
|
struct Region {
|
|
QString name;
|
|
Geo::GeoBoundingBox bbox;
|
|
const Geo::GeoFeature *poly{nullptr};
|
|
};
|
|
|
|
typedef QList<Region> FilterRegions;
|
|
|
|
private:
|
|
::Ui::EventListView *_ui;
|
|
Private::EventFilterWidget *_filterWidget;
|
|
ItemConfig _itemConfig;
|
|
FilterRegions _filterRegions;
|
|
QTreeWidget *_treeWidget;
|
|
QTreeWidgetItem *_unassociatedEventItem;
|
|
QWidget *_commandWaitDialog;
|
|
QMovie *_busyIndicator;
|
|
QLabel *_busyIndicatorLabel;
|
|
//StationMap _associatedStations;
|
|
Seiscomp::DataModel::DatabaseQuery *_reader;
|
|
Seiscomp::Core::TimeSpan _timeAgo;
|
|
Filter _filter;
|
|
bool _autoSelect;
|
|
bool _withOrigins;
|
|
bool _withFocalMechanisms;
|
|
bool _updateLocalEPInstance;
|
|
//bool _withComments;
|
|
bool _blockSelection;
|
|
bool _blockRemovingOfExpiredEvents;
|
|
bool _blockCountSignal;
|
|
bool _hideOtherEvents;
|
|
bool _hideForeignEvents;
|
|
bool _hideOutsideRegion;
|
|
bool _checkEventAgency;
|
|
bool _showOnlyLatestPerAgency;
|
|
int _regionIndex;
|
|
mutable int _visibleEventCount;
|
|
};
|
|
|
|
|
|
class SC_GUI_API EventListViewRegionFilterDialog : public QDialog {
|
|
Q_OBJECT
|
|
|
|
// ------------------------------------------------------------------
|
|
// X'truction
|
|
// ------------------------------------------------------------------
|
|
public:
|
|
EventListViewRegionFilterDialog(QWidget *parent, EventListView::Region *target,
|
|
EventListView::FilterRegions *regionList);
|
|
~EventListViewRegionFilterDialog();
|
|
|
|
|
|
// ------------------------------------------------------------------
|
|
// QDialog interface
|
|
// ------------------------------------------------------------------
|
|
public:
|
|
virtual void accept();
|
|
|
|
|
|
// ------------------------------------------------------------------
|
|
// Slots
|
|
// ------------------------------------------------------------------
|
|
private slots:
|
|
void regionSelectionChanged(const QString &);
|
|
void showError(const QString &);
|
|
|
|
|
|
// ------------------------------------------------------------------
|
|
// Private members
|
|
// ------------------------------------------------------------------
|
|
private:
|
|
::Ui::EventListViewRegionFilterDialog *_ui;
|
|
EventListView::Region *_target;
|
|
EventListView::FilterRegions *_regionList;
|
|
};
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
#endif
|