Mercurial > minori
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(); +}