diff src/gui/widgets/elided_label.cc @ 253:b3549da699a6

*: ooooh! stupid big commit! oops
author Paper <paper@paper.us.eu.org>
date Tue, 06 Feb 2024 16:56:32 -0500
parents
children 862d0d8619f6
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/gui/widgets/elided_label.cc	Tue Feb 06 16:56:32 2024 -0500
@@ -0,0 +1,81 @@
+/*
+* 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();
+}