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.
174 lines
4.6 KiB
C
174 lines
4.6 KiB
C
2 years ago
|
/***************************************************************************
|
||
|
* 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_MAP_ANNOTATIONS_H
|
||
|
#define SEISCOMP_GUI_MAP_ANNOTATIONS_H
|
||
|
|
||
|
|
||
|
#include <QColor>
|
||
|
#include <QFont>
|
||
|
#include <QPen>
|
||
|
#include <QPoint>
|
||
|
#include <QString>
|
||
|
#include <QVariant>
|
||
|
|
||
|
|
||
|
namespace Seiscomp {
|
||
|
namespace Gui {
|
||
|
namespace Map {
|
||
|
|
||
|
|
||
|
class Annotations;
|
||
|
class AnnotationItem;
|
||
|
|
||
|
|
||
|
struct AnnotationStyle : public QObject {
|
||
|
AnnotationStyle(QObject *parent = nullptr);
|
||
|
virtual ~AnnotationStyle() {}
|
||
|
|
||
|
virtual void draw(QPainter &painter, const AnnotationItem &item);
|
||
|
|
||
|
virtual QRect itemRect(QPainter &painter, const AnnotationItem &item,
|
||
|
const QPoint &pos) const;
|
||
|
|
||
|
struct Palette {
|
||
|
QPen textPen;
|
||
|
QPen borderPen;
|
||
|
QBrush brush;
|
||
|
};
|
||
|
|
||
|
// One for normal (0) and one for highlighted (1)
|
||
|
Palette palette[2];
|
||
|
QFont font;
|
||
|
};
|
||
|
|
||
|
|
||
|
/**
|
||
|
* @brief The AnnotationItem struct holds properties like text, text color etc.
|
||
|
* which might be used when rendering an item on a map.
|
||
|
*/
|
||
|
class AnnotationItem {
|
||
|
private:
|
||
|
AnnotationItem(Annotations *parent) : pool(parent) {}
|
||
|
AnnotationItem(Annotations *parent, const QString &text)
|
||
|
: pool(parent), text(text) {}
|
||
|
|
||
|
public:
|
||
|
~AnnotationItem();
|
||
|
|
||
|
public:
|
||
|
/**
|
||
|
* @brief Updates the label rect of the item based on the given position
|
||
|
* and style
|
||
|
* @param pos The position of the label rect
|
||
|
*/
|
||
|
void updateLabelRect(QPainter &painter, const QPoint &pos) {
|
||
|
if ( style ) {
|
||
|
labelRect = style->itemRect(painter, *this, pos);
|
||
|
}
|
||
|
else {
|
||
|
labelRect = QRect();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public:
|
||
|
Annotations *pool{nullptr};
|
||
|
QString text;
|
||
|
AnnotationStyle *style{nullptr};
|
||
|
bool visible{true};
|
||
|
bool highlighted{false};
|
||
|
QRect labelRect;
|
||
|
QVariant data;
|
||
|
|
||
|
friend class Annotations;
|
||
|
};
|
||
|
|
||
|
|
||
|
class Annotations : public QObject {
|
||
|
public:
|
||
|
typedef QList<AnnotationItem*> Items;
|
||
|
typedef Items::const_iterator const_iterator;
|
||
|
|
||
|
public:
|
||
|
Annotations(QObject *parent = nullptr);
|
||
|
~Annotations();
|
||
|
|
||
|
const_iterator begin() const {
|
||
|
return _items.begin();
|
||
|
}
|
||
|
|
||
|
const_iterator end() const {
|
||
|
return _items.end();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @brief Clears the annotation pool
|
||
|
* This call calls delete for each AnnotationItem.
|
||
|
*/
|
||
|
void clear();
|
||
|
|
||
|
int size() { return _items.size(); }
|
||
|
|
||
|
/**
|
||
|
* @brief Adds a new object to the annotation pool
|
||
|
* @param text The annotation text
|
||
|
* @return Link to an annotation item which is owned by this instance
|
||
|
*/
|
||
|
AnnotationItem *add(const QString &text);
|
||
|
|
||
|
/**
|
||
|
* @brief Removes annotation item from annotation pool and deletes it
|
||
|
* @param item The annotation item to remove
|
||
|
* @return true if removed, false otherwise
|
||
|
*/
|
||
|
bool remove(const AnnotationItem *item);
|
||
|
|
||
|
/**
|
||
|
* @brief Removes annotation item from annotation pool but does not delete
|
||
|
* it. The pool member in the item will be set to nullptr.
|
||
|
* @param item The annotation item to be taken
|
||
|
* @return true if taken, false otherwise
|
||
|
*/
|
||
|
bool take(const AnnotationItem *item);
|
||
|
|
||
|
/**
|
||
|
* @brief Sets the default annotation style used while
|
||
|
* creating annotation items
|
||
|
* @param style The annotation style to set
|
||
|
*/
|
||
|
void setDefaultStyle(AnnotationStyle *style) {
|
||
|
_style = style;
|
||
|
}
|
||
|
|
||
|
|
||
|
private:
|
||
|
Items _items;
|
||
|
AnnotationStyle _defaultStyle;
|
||
|
AnnotationStyle *_style{nullptr};
|
||
|
};
|
||
|
|
||
|
|
||
|
} // ns Map
|
||
|
} // ns Gui
|
||
|
} // ns Seiscomp
|
||
|
|
||
|
|
||
|
#endif
|