mirror of
https://github.com/qTox/qTox.git
synced 2024-03-22 14:00:36 +08:00
editable CroppingLabel
This commit is contained in:
parent
c54cfd6ff3
commit
7c0cdd710f
@ -15,11 +15,36 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "croppinglabel.h"
|
#include "croppinglabel.h"
|
||||||
|
#include <QResizeEvent>
|
||||||
|
|
||||||
CroppingLabel::CroppingLabel(QWidget* parent)
|
CroppingLabel::CroppingLabel(QWidget* parent)
|
||||||
: QLabel(parent)
|
: QLabel(parent)
|
||||||
|
, blockPaintEvents(false)
|
||||||
|
, editable(false)
|
||||||
|
, elideMode(Qt::ElideRight)
|
||||||
{
|
{
|
||||||
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
|
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
|
||||||
|
|
||||||
|
textEdit = new QLineEdit(this);
|
||||||
|
textEdit->hide();
|
||||||
|
|
||||||
|
installEventFilter(this);
|
||||||
|
textEdit->installEventFilter(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CroppingLabel::setEditable(bool editable)
|
||||||
|
{
|
||||||
|
this->editable = editable;
|
||||||
|
|
||||||
|
if (editable)
|
||||||
|
setCursor(Qt::PointingHandCursor);
|
||||||
|
else
|
||||||
|
unsetCursor();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CroppingLabel::setEdlideMode(Qt::TextElideMode elide)
|
||||||
|
{
|
||||||
|
elideMode = elide;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CroppingLabel::setText(const QString& text)
|
void CroppingLabel::setText(const QString& text)
|
||||||
@ -31,6 +56,8 @@ void CroppingLabel::setText(const QString& text)
|
|||||||
void CroppingLabel::resizeEvent(QResizeEvent* ev)
|
void CroppingLabel::resizeEvent(QResizeEvent* ev)
|
||||||
{
|
{
|
||||||
setElidedText();
|
setElidedText();
|
||||||
|
textEdit->resize(ev->size());
|
||||||
|
|
||||||
QLabel::resizeEvent(ev);
|
QLabel::resizeEvent(ev);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -44,9 +71,50 @@ QSize CroppingLabel::minimumSizeHint() const
|
|||||||
return QSize(fontMetrics().width("..."), QLabel::minimumSizeHint().height());
|
return QSize(fontMetrics().width("..."), QLabel::minimumSizeHint().height());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CroppingLabel::mouseReleaseEvent(QMouseEvent *e)
|
||||||
|
{
|
||||||
|
if (editable)
|
||||||
|
{
|
||||||
|
blockPaintEvents = true;
|
||||||
|
textEdit->show();
|
||||||
|
textEdit->setFocus();
|
||||||
|
}
|
||||||
|
|
||||||
|
QLabel::mouseReleaseEvent(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CroppingLabel::eventFilter(QObject *obj, QEvent *e)
|
||||||
|
{
|
||||||
|
// catch paint events if needed
|
||||||
|
if (obj == this)
|
||||||
|
{
|
||||||
|
if (e->type() == QEvent::Paint && blockPaintEvents)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// events fired by the QLineEdit
|
||||||
|
if (obj == textEdit)
|
||||||
|
{
|
||||||
|
if (e->type() == QEvent::KeyPress)
|
||||||
|
{
|
||||||
|
QKeyEvent* keyEvent = static_cast<QKeyEvent*>(e);
|
||||||
|
if (keyEvent->key() == Qt::Key_Return)
|
||||||
|
hideTextEdit(true);
|
||||||
|
|
||||||
|
if (keyEvent->key() == Qt::Key_Escape)
|
||||||
|
hideTextEdit(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (e->type() == QEvent::FocusOut)
|
||||||
|
hideTextEdit(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void CroppingLabel::setElidedText()
|
void CroppingLabel::setElidedText()
|
||||||
{
|
{
|
||||||
QString elidedText = fontMetrics().elidedText(origText, Qt::ElideRight, width());
|
QString elidedText = fontMetrics().elidedText(origText, elideMode, width());
|
||||||
if (elidedText != origText)
|
if (elidedText != origText)
|
||||||
setToolTip(origText);
|
setToolTip(origText);
|
||||||
else
|
else
|
||||||
@ -54,3 +122,12 @@ void CroppingLabel::setElidedText()
|
|||||||
|
|
||||||
QLabel::setText(elidedText);
|
QLabel::setText(elidedText);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CroppingLabel::hideTextEdit(bool acceptText)
|
||||||
|
{
|
||||||
|
if (acceptText)
|
||||||
|
setText(textEdit->text());
|
||||||
|
|
||||||
|
textEdit->hide();
|
||||||
|
blockPaintEvents = false;
|
||||||
|
}
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
#define CROPPINGLABEL_H
|
#define CROPPINGLABEL_H
|
||||||
|
|
||||||
#include <QLabel>
|
#include <QLabel>
|
||||||
|
#include <QLineEdit>
|
||||||
|
|
||||||
class CroppingLabel : public QLabel
|
class CroppingLabel : public QLabel
|
||||||
{
|
{
|
||||||
@ -25,16 +26,28 @@ class CroppingLabel : public QLabel
|
|||||||
public:
|
public:
|
||||||
explicit CroppingLabel(QWidget *parent = 0);
|
explicit CroppingLabel(QWidget *parent = 0);
|
||||||
|
|
||||||
|
void setEditable(bool editable);
|
||||||
|
void setEdlideMode(Qt::TextElideMode elide);
|
||||||
|
|
||||||
virtual void setText(const QString& text);
|
virtual void setText(const QString& text);
|
||||||
virtual void resizeEvent(QResizeEvent *ev);
|
virtual void resizeEvent(QResizeEvent *ev);
|
||||||
virtual QSize sizeHint() const;
|
virtual QSize sizeHint() const;
|
||||||
virtual QSize minimumSizeHint() const;
|
virtual QSize minimumSizeHint() const;
|
||||||
|
virtual void mouseReleaseEvent(QMouseEvent *e);
|
||||||
|
virtual bool eventFilter(QObject *obj, QEvent *e);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void setElidedText();
|
void setElidedText();
|
||||||
|
void acceptText();
|
||||||
|
void rejectText();
|
||||||
|
void hideTextEdit(bool acceptText);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QString origText;
|
QString origText;
|
||||||
|
QLineEdit* textEdit;
|
||||||
|
bool blockPaintEvents;
|
||||||
|
bool editable;
|
||||||
|
Qt::TextElideMode elideMode;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // CROPPINGLABEL_H
|
#endif // CROPPINGLABEL_H
|
||||||
|
Loading…
x
Reference in New Issue
Block a user