view src/gui/widgets/elided_label.cc @ 255:fe702c8f161f

*: whatever
author Paper <paper@paper.us.eu.org>
date Wed, 07 Feb 2024 17:04:06 -0500
parents b3549da699a6
children 862d0d8619f6
line wrap: on
line source

/*
* Copyright (C) 2016 The Qt Company Ltd.
* Contact: https://www.qt.io/licensing/
*
* This file is part of the QtCore module of the Qt Toolkit.
*
* "Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*   * Redistributions of source code must retain the above copyright
*     notice, this list of conditions and the following disclaimer.
*   * Redistributions in binary form must reproduce the above copyright
*     notice, this list of conditions and the following disclaimer in
*     the documentation and/or other materials provided with the
*     distribution.
*   * Neither the name of The Qt Company Ltd nor the names of its
*     contributors may be used to endorse or promote products derived
*     from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
*/

#include "gui/widgets/elided_label.h"

#include <QPainter>
#include <QSizePolicy>
#include <QTextLayout>

ElidedLabel::ElidedLabel(const QString& text, QWidget* parent)
	: QFrame(parent), content(text) {
	setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
}

void ElidedLabel::SetText(const QString& text) {
	content = text;
	update();
}

void ElidedLabel::paintEvent(QPaintEvent *event) {
	QFrame::paintEvent(event);

	QPainter painter(this);
	QFontMetrics fontMetrics = painter.fontMetrics();

	int line_spacing = fontMetrics.lineSpacing();
	int y = 0;

	QTextLayout textLayout(content, painter.font());
	textLayout.beginLayout();
	for (;;) {
		QTextLine line = textLayout.createLine();

		if (!line.isValid())
			break;

		line.setLineWidth(width());
		int nextLineY = y + line_spacing;

		if (height() >= nextLineY + line_spacing) {
			line.draw(&painter, QPoint(0, y));
			y = nextLineY;
		} else {
			QString last_line = content.mid(line.textStart());
			QString elided_last_line = fontMetrics.elidedText(last_line, Qt::ElideRight, width());
			painter.drawText(QPoint(0, y + fontMetrics.ascent()), elided_last_line);
			line = textLayout.createLine();
			break;
		}
	}
	textLayout.endLayout();
}