File indexing completed on 2024-04-28 17:05:54

0001 /*
0002     SPDX-FileCopyrightText: 2002 Shie Erlich <erlich@users.sourceforge.net>
0003     SPDX-FileCopyrightText: 2002 Rafi Yanai <yanai@users.sourceforge.net>
0004     SPDX-FileCopyrightText: 2004-2022 Krusader Krew <https://krusader.org>
0005 
0006     SPDX-License-Identifier: GPL-2.0-or-later
0007 */
0008 
0009 #include "krsqueezedtextlabel.h"
0010 
0011 // QtGui
0012 #include <QDragEnterEvent>
0013 #include <QPainter>
0014 // QtWidgets
0015 #include <QLabel>
0016 #include <QToolTip>
0017 
0018 #include <KCoreAddons/KStringHandler>
0019 #include <KCoreAddons/KUrlMimeData>
0020 
0021 #include "../compat.h"
0022 
0023 KrSqueezedTextLabel::KrSqueezedTextLabel(QWidget *parent)
0024     : KSqueezedTextLabel(parent)
0025     , _index(-1)
0026     , _length(-1)
0027 {
0028     setAutoFillBackground(true);
0029 }
0030 
0031 KrSqueezedTextLabel::~KrSqueezedTextLabel() = default;
0032 
0033 void KrSqueezedTextLabel::mousePressEvent(QMouseEvent *e)
0034 {
0035     e->ignore();
0036     emit clicked(e);
0037 }
0038 
0039 void KrSqueezedTextLabel::squeezeTextToLabel(int index, int length)
0040 {
0041     if (index == -1 || length == -1)
0042         KSqueezedTextLabel::squeezeTextToLabel();
0043     else {
0044         QString sqtext = fullText;
0045         QFontMetrics fm(fontMetrics());
0046         int labelWidth = size().width();
0047         int textWidth = fm.horizontalAdvance(sqtext);
0048         if (textWidth > labelWidth) {
0049             int avgCharSize = textWidth / sqtext.length();
0050             int numOfExtraChars = (textWidth - labelWidth) / avgCharSize;
0051             int delta;
0052 
0053             // remove as much as possible from the left, and then from the right
0054             if (index > 3) {
0055                 delta = qMin(index, numOfExtraChars);
0056                 numOfExtraChars -= delta;
0057                 sqtext.replace(0, delta, "...");
0058             }
0059 
0060             if (numOfExtraChars > 0 && ((int)sqtext.length() > length + 3)) {
0061                 delta = qMin(numOfExtraChars, (int)sqtext.length() - (length + 3));
0062                 sqtext.replace(sqtext.length() - delta, delta, "...");
0063             }
0064             QLabel::setText(sqtext);
0065 
0066             setToolTip(QString());
0067             setToolTip(fullText);
0068         } else {
0069             QLabel::setText(fullText);
0070 
0071             setToolTip(QString());
0072             QToolTip::hideText();
0073         }
0074     }
0075 }
0076 
0077 void KrSqueezedTextLabel::setText(const QString &text, int index, int length)
0078 {
0079     _index = index;
0080     _length = length;
0081     fullText = text;
0082     KSqueezedTextLabel::setText(fullText);
0083     squeezeTextToLabel(_index, _length);
0084 }
0085 
0086 void KrSqueezedTextLabel::paintEvent(QPaintEvent *e)
0087 {
0088     KSqueezedTextLabel::paintEvent(e);
0089 }