qTox  Version: nightly | Commit: bc751c8e1cac455f9690654fcfe0f560d2d7dfdd
croppinglabel.cpp
Go to the documentation of this file.
1 /*
2  Copyright © 2014-2019 by The qTox Project Contributors
3 
4  This file is part of qTox, a Qt-based graphical interface for Tox.
5 
6  qTox is libre software: you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation, either version 3 of the License, or
9  (at your option) any later version.
10 
11  qTox is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with qTox. If not, see <http://www.gnu.org/licenses/>.
18 */
19 
20 #include "croppinglabel.h"
21 #include <QKeyEvent>
22 #include <QLineEdit>
23 #include <QResizeEvent>
24 #include <QTextDocument>
25 
27  : QLabel(parent)
28  , blockPaintEvents(false)
29  , editable(false)
30  , elideMode(Qt::ElideRight)
31 {
32  setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
33 
34  class LineEdit : public QLineEdit
35  {
36  public:
37  explicit LineEdit(QWidget* parent = nullptr)
38  : QLineEdit(parent)
39  {}
40 
41  protected:
42  void keyPressEvent(QKeyEvent* event) override
43  {
44  if (event->key() == Qt::Key_Escape) {
45  undo();
46  clearFocus();
47  }
48 
49  QLineEdit::keyPressEvent(event);
50  }
51  };
52 
53  textEdit = new LineEdit(this);
54  textEdit->hide();
55  textEdit->setInputMethodHints(Qt::ImhNoAutoUppercase | Qt::ImhNoPredictiveText | Qt::ImhPreferLatin);
56 
57  connect(textEdit, &QLineEdit::editingFinished, this, &CroppingLabel::editingFinished);
58 }
59 
61 {
62  showTextEdit();
63  textEdit->selectAll();
64 }
65 
66 void CroppingLabel::setEditable(bool editable)
67 {
68  this->editable = editable;
69 
70  if (editable)
71  setCursor(Qt::PointingHandCursor);
72  else
73  unsetCursor();
74 }
75 
76 void CroppingLabel::setElideMode(Qt::TextElideMode elide)
77 {
78  elideMode = elide;
79 }
80 
81 void CroppingLabel::setText(const QString& text)
82 {
83  origText = text.trimmed();
84  setElidedText();
85 }
86 
87 void CroppingLabel::setPlaceholderText(const QString& text)
88 {
89  textEdit->setPlaceholderText(text);
90  setElidedText();
91 }
92 
93 void CroppingLabel::resizeEvent(QResizeEvent* ev)
94 {
95  setElidedText();
96  textEdit->resize(ev->size());
97 
98  QLabel::resizeEvent(ev);
99 }
100 
102 {
103  return QSize(0, QLabel::sizeHint().height());
104 }
105 
107 {
108 #if (QT_VERSION >= QT_VERSION_CHECK(5, 11, 0))
109  return QSize(fontMetrics().horizontalAdvance("..."), QLabel::minimumSizeHint().height());
110 #else
111  return QSize(fontMetrics().width("..."), QLabel::minimumSizeHint().height());
112 #endif
113 }
114 
116 {
117  if (editable)
118  showTextEdit();
119 
120  emit clicked();
121 
122  QLabel::mouseReleaseEvent(e);
123 }
124 
125 void CroppingLabel::paintEvent(QPaintEvent* paintEvent)
126 {
127  if (blockPaintEvents) {
128  paintEvent->ignore();
129  return;
130  }
131  QLabel::paintEvent(paintEvent);
132 }
133 
135 {
136  QString elidedText = fontMetrics().elidedText(origText, elideMode, width());
137  if (elidedText != origText)
138  setToolTip(Qt::convertFromPlainText(origText, Qt::WhiteSpaceNormal));
139  else
140  setToolTip(QString());
141  if (!elidedText.isEmpty()) {
142  QLabel::setText(elidedText);
143  } else {
144  // NOTE: it would be nice if the label had custom styling when it was default
145  QLabel::setText(textEdit->placeholderText());
146  }
147 }
148 
150 {
151  textEdit->hide();
152  blockPaintEvents = false;
153 }
154 
156 {
157  blockPaintEvents = true;
158  textEdit->show();
159  textEdit->setFocus();
160  textEdit->setText(origText);
161  textEdit->setFocusPolicy(Qt::ClickFocus);
162 }
163 
169 {
170  return origText;
171 }
172 
174 {
175  // This function chooses the smallest possible maximum width.
176  // Text width + padding. Without padding, we'll have elipses.
177 #if (QT_VERSION >= QT_VERSION_CHECK(5, 11, 0))
178  setMaximumWidth(fontMetrics().horizontalAdvance(origText) + fontMetrics().horizontalAdvance("..."));
179 #else
180  setMaximumWidth(fontMetrics().width(origText) + fontMetrics().width("..."));
181 #endif
182 }
183 
185 {
186  hideTextEdit();
187  QString newText = textEdit->text().trimmed().remove(QRegExp("[\\t\\n\\v\\f\\r\\x0000]"));
188 
189  if (origText != newText)
190  emit editFinished(textEdit->text());
191 
192  emit editRemoved();
193 }
CroppingLabel::resizeEvent
void resizeEvent(QResizeEvent *ev) final
Definition: croppinglabel.cpp:93
CroppingLabel::mouseReleaseEvent
void mouseReleaseEvent(QMouseEvent *e) final
Definition: croppinglabel.cpp:115
CroppingLabel::setElidedText
void setElidedText()
Definition: croppinglabel.cpp:134
CroppingLabel::editFinished
void editFinished(const QString &newText)
CroppingLabel::editable
bool editable
Definition: croppinglabel.h:66
CroppingLabel::CroppingLabel
CroppingLabel(QWidget *parent=nullptr)
Definition: croppinglabel.cpp:26
CroppingLabel::setText
void setText(const QString &text)
Definition: croppinglabel.cpp:81
CroppingLabel::editingFinished
void editingFinished()
Definition: croppinglabel.cpp:184
CroppingLabel::showTextEdit
void showTextEdit()
Definition: croppinglabel.cpp:155
CroppingLabel::origText
QString origText
Definition: croppinglabel.h:63
CroppingLabel::blockPaintEvents
bool blockPaintEvents
Definition: croppinglabel.h:65
CroppingLabel::minimumSizeHint
QSize minimumSizeHint() const final
Definition: croppinglabel.cpp:106
CroppingLabel::sizeHint
QSize sizeHint() const final
Definition: croppinglabel.cpp:101
CroppingLabel::editBegin
void editBegin()
Definition: croppinglabel.cpp:60
croppinglabel.h
CroppingLabel::setEditable
void setEditable(bool editable)
Definition: croppinglabel.cpp:66
CroppingLabel::setElideMode
void setElideMode(Qt::TextElideMode elide)
Definition: croppinglabel.cpp:76
CroppingLabel::minimizeMaximumWidth
void minimizeMaximumWidth()
Definition: croppinglabel.cpp:173
CroppingLabel::hideTextEdit
void hideTextEdit()
Definition: croppinglabel.cpp:149
CroppingLabel::editRemoved
void editRemoved()
CroppingLabel::textEdit
QLineEdit * textEdit
Definition: croppinglabel.h:64
CroppingLabel::fullText
QString fullText()
Get original full text.
Definition: croppinglabel.cpp:168
CroppingLabel::paintEvent
void paintEvent(QPaintEvent *paintEvent) override
Definition: croppinglabel.cpp:125
CroppingLabel::elideMode
Qt::TextElideMode elideMode
Definition: croppinglabel.h:67
CroppingLabel::clicked
void clicked()
CroppingLabel::setPlaceholderText
void setPlaceholderText(const QString &text)
Definition: croppinglabel.cpp:87
LineEdit
Definition: searchform.h:95