253
+ − 1 /*
258
+ − 2 * Copyright (C) 2016 The Qt Company Ltd.
+ − 3 * Contact: https://www.qt.io/licensing/
+ − 4 *
+ − 5 * This file is part of the QtCore module of the Qt Toolkit.
+ − 6 *
+ − 7 * "Redistribution and use in source and binary forms, with or without
+ − 8 * modification, are permitted provided that the following conditions are
+ − 9 * met:
+ − 10 * * Redistributions of source code must retain the above copyright
+ − 11 * notice, this list of conditions and the following disclaimer.
+ − 12 * * Redistributions in binary form must reproduce the above copyright
+ − 13 * notice, this list of conditions and the following disclaimer in
+ − 14 * the documentation and/or other materials provided with the
+ − 15 * distribution.
+ − 16 * * Neither the name of The Qt Company Ltd nor the names of its
+ − 17 * contributors may be used to endorse or promote products derived
+ − 18 * from this software without specific prior written permission.
+ − 19 *
+ − 20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ − 21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ − 22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ − 23 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ − 24 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ − 25 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ − 26 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ − 27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ − 28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ − 29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ − 30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+ − 31 */
253
+ − 32
+ − 33 #include "gui/widgets/elided_label.h"
+ − 34
+ − 35 #include <QPainter>
+ − 36 #include <QSizePolicy>
+ − 37 #include <QTextLayout>
+ − 38
258
+ − 39 ElidedLabel::ElidedLabel(const QString& text, QWidget* parent) : QFrame(parent), content(text) {
253
+ − 40 setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
+ − 41 }
+ − 42
+ − 43 void ElidedLabel::SetText(const QString& text) {
+ − 44 content = text;
+ − 45 update();
+ − 46 }
+ − 47
258
+ − 48 void ElidedLabel::paintEvent(QPaintEvent* event) {
253
+ − 49 QFrame::paintEvent(event);
+ − 50
+ − 51 QPainter painter(this);
+ − 52 QFontMetrics fontMetrics = painter.fontMetrics();
+ − 53
+ − 54 int line_spacing = fontMetrics.lineSpacing();
+ − 55 int y = 0;
+ − 56
+ − 57 QTextLayout textLayout(content, painter.font());
+ − 58 textLayout.beginLayout();
+ − 59 for (;;) {
+ − 60 QTextLine line = textLayout.createLine();
+ − 61
+ − 62 if (!line.isValid())
+ − 63 break;
+ − 64
+ − 65 line.setLineWidth(width());
+ − 66 int nextLineY = y + line_spacing;
+ − 67
+ − 68 if (height() >= nextLineY + line_spacing) {
+ − 69 line.draw(&painter, QPoint(0, y));
+ − 70 y = nextLineY;
+ − 71 } else {
+ − 72 QString last_line = content.mid(line.textStart());
+ − 73 QString elided_last_line = fontMetrics.elidedText(last_line, Qt::ElideRight, width());
+ − 74 painter.drawText(QPoint(0, y + fontMetrics.ascent()), elided_last_line);
+ − 75 line = textLayout.createLine();
+ − 76 break;
+ − 77 }
+ − 78 }
+ − 79 textLayout.endLayout();
+ − 80 }