mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-01 02:23:25 +00:00
Profile: add white outline to all text
To draw the white outline around profile text we trace a text path using QPainterPath::addText() and then create a couple of QGraphicsPathItem objects. One of the objects is outlined using QPainterPathStroker and is placed at the bottom of a QGraphicsItemGroup with a white brush. The other object holds the standard colored text and is placed on top. Notes: - possibly quite expensive on older machines - ProfileGraphicsView::plot_text() now returns a QGraphicsItemGroup - QGraphicsSimpleTextItem uses a top-left baseline anchor while QPainterPath::addText() uses a bottom-left baseline which is a bit mysterious, requires the -3 offset for a match and is possibly non-portable across fonts and sizes. Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com> Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
parent
9d9d516c26
commit
b68e86a141
2 changed files with 23 additions and 10 deletions
|
@ -1061,23 +1061,36 @@ void ProfileGraphicsView::plot_depth_profile()
|
|||
}
|
||||
}
|
||||
|
||||
QGraphicsSimpleTextItem *ProfileGraphicsView::plot_text(text_render_options_t *tro,const QPointF& pos, const QString& text, QGraphicsItem *parent)
|
||||
QGraphicsItemGroup *ProfileGraphicsView::plot_text(text_render_options_t *tro,const QPointF& pos, const QString& text, QGraphicsItem *parent)
|
||||
{
|
||||
QFontMetrics fm(font());
|
||||
QFont fnt(font());
|
||||
QFontMetrics fm(fnt);
|
||||
|
||||
QPointF point(SCALEGC(pos.x(), pos.y())); // This is neded because of the SCALE macro.
|
||||
double dx = tro->hpos * (fm.width(text));
|
||||
double dy = tro->vpos * (fm.height());
|
||||
|
||||
QGraphicsSimpleTextItem *item = new QGraphicsSimpleTextItem(text, parent);
|
||||
QPointF point(SCALEGC(pos.x(), pos.y())); // This is neded because of the SCALE macro.
|
||||
QGraphicsItemGroup *group = new QGraphicsItemGroup(parent);
|
||||
QPainterPath textPath;
|
||||
/* addText() uses bottom-left text baseline and the -3 offset is probably slightly off
|
||||
* for different font sizes. */
|
||||
textPath.addText(0, fm.height() - 3, fnt, text);
|
||||
QPainterPathStroker stroker;
|
||||
stroker.setWidth(3);
|
||||
QGraphicsPathItem *strokedItem = new QGraphicsPathItem(stroker.createStroke(textPath), group);
|
||||
strokedItem->setBrush(QBrush(profile_color[TEXT_BACKGROUND].first()));
|
||||
strokedItem->setPen(Qt::NoPen);
|
||||
|
||||
item->setPos(point.x() + dx, point.y() + dy);
|
||||
item->setBrush(QBrush(profile_color[tro->color].first()));
|
||||
item->setFlag(QGraphicsItem::ItemIgnoresTransformations);
|
||||
QGraphicsPathItem *textItem = new QGraphicsPathItem(textPath, group);
|
||||
textItem->setBrush(QBrush(profile_color[tro->color].first()));
|
||||
textItem->setPen(Qt::NoPen);
|
||||
|
||||
group->setPos(point.x() + dx, point.y() + dy);
|
||||
group->setFlag(QGraphicsItem::ItemIgnoresTransformations);
|
||||
|
||||
if (!parent)
|
||||
scene()->addItem(item);
|
||||
return item;
|
||||
scene()->addItem(group);
|
||||
return group;
|
||||
}
|
||||
|
||||
void ProfileGraphicsView::resizeEvent(QResizeEvent *event)
|
||||
|
|
|
@ -104,7 +104,7 @@ public slots:
|
|||
|
||||
private:
|
||||
void plot_depth_profile();
|
||||
QGraphicsSimpleTextItem* plot_text(text_render_options_t *tro, const QPointF& pos, const QString &text, QGraphicsItem *parent = 0);
|
||||
QGraphicsItemGroup *plot_text(text_render_options_t *tro, const QPointF& pos, const QString &text, QGraphicsItem *parent = 0);
|
||||
void plot_events(struct divecomputer *dc);
|
||||
void plot_one_event(struct event *event);
|
||||
void plot_temperature_profile();
|
||||
|
|
Loading…
Add table
Reference in a new issue