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 }