mirror of
				https://github.com/subsurface/subsurface.git
				synced 2025-02-19 22:16:15 +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
		Add a link
		
	
		Reference in a new issue