2014-08-14 15:47:30 +08:00
/*
2015-06-06 09:40:08 +08:00
Copyright © 2014 - 2015 by The qTox Project
2014-08-14 15:47:30 +08:00
This file is part of qTox , a Qt - based graphical interface for Tox .
2015-06-06 09:40:08 +08:00
qTox is libre software : you can redistribute it and / or modify
2014-08-14 15:47:30 +08:00
it under the terms of the GNU General Public License as published by
the Free Software Foundation , either version 3 of the License , or
( at your option ) any later version .
2015-06-06 09:40:08 +08:00
qTox is distributed in the hope that it will be useful ,
2014-08-14 15:47:30 +08:00
but WITHOUT ANY WARRANTY ; without even the implied warranty of
2015-06-06 09:40:08 +08:00
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
2014-08-14 15:47:30 +08:00
2015-06-06 09:40:08 +08:00
You should have received a copy of the GNU General Public License
along with qTox . If not , see < http : //www.gnu.org/licenses/>.
2014-08-14 15:47:30 +08:00
*/
# include "croppinglabel.h"
2014-09-01 17:00:06 +08:00
# include <QResizeEvent>
2014-09-11 21:44:34 +08:00
# include <QLineEdit>
2014-08-14 15:47:30 +08:00
2015-06-04 04:18:40 +08:00
# include <QTimer>
2015-06-07 11:20:06 +08:00
# include <QDebug>
2015-06-04 04:18:40 +08:00
2014-08-14 17:42:03 +08:00
CroppingLabel : : CroppingLabel ( QWidget * parent )
2014-08-14 15:47:30 +08:00
: QLabel ( parent )
2014-09-01 17:00:06 +08:00
, blockPaintEvents ( false )
, editable ( false )
, elideMode ( Qt : : ElideRight )
2014-08-14 15:47:30 +08:00
{
setSizePolicy ( QSizePolicy : : Expanding , QSizePolicy : : Preferred ) ;
2014-09-01 17:00:06 +08:00
textEdit = new QLineEdit ( this ) ;
textEdit - > hide ( ) ;
2015-02-07 20:42:31 +08:00
textEdit - > setInputMethodHints ( Qt : : ImhNoAutoUppercase
| Qt : : ImhNoPredictiveText
| Qt : : ImhPreferLatin ) ;
2014-09-01 17:00:06 +08:00
installEventFilter ( this ) ;
textEdit - > installEventFilter ( this ) ;
2015-06-07 11:20:06 +08:00
connect ( textEdit , & QLineEdit : : editingFinished , this , & CroppingLabel : : finishTextEdit ) ;
2014-09-01 17:00:06 +08:00
}
2015-06-02 02:39:40 +08:00
void CroppingLabel : : editStart ( )
{
2015-06-07 11:20:06 +08:00
//if (!parentWidget()->isVisible())
// return;
2015-06-02 02:39:40 +08:00
showTextEdit ( ) ;
textEdit - > selectAll ( ) ;
}
2014-09-01 17:00:06 +08:00
void CroppingLabel : : setEditable ( bool editable )
{
this - > editable = editable ;
if ( editable )
setCursor ( Qt : : PointingHandCursor ) ;
else
unsetCursor ( ) ;
}
void CroppingLabel : : setEdlideMode ( Qt : : TextElideMode elide )
{
elideMode = elide ;
2014-08-14 15:47:30 +08:00
}
2014-08-14 17:42:03 +08:00
void CroppingLabel : : setText ( const QString & text )
2014-08-14 15:47:30 +08:00
{
2014-08-18 21:56:48 +08:00
origText = text . trimmed ( ) ;
2014-08-14 17:42:03 +08:00
setElidedText ( ) ;
2014-08-14 15:47:30 +08:00
}
2014-08-14 17:42:03 +08:00
void CroppingLabel : : resizeEvent ( QResizeEvent * ev )
2014-08-14 15:47:30 +08:00
{
2014-08-14 17:42:03 +08:00
setElidedText ( ) ;
2014-09-01 17:00:06 +08:00
textEdit - > resize ( ev - > size ( ) ) ;
2014-08-14 15:47:30 +08:00
QLabel : : resizeEvent ( ev ) ;
}
QSize CroppingLabel : : sizeHint ( ) const
{
return QSize ( 0 , QLabel : : sizeHint ( ) . height ( ) ) ;
}
QSize CroppingLabel : : minimumSizeHint ( ) const
{
return QSize ( fontMetrics ( ) . width ( " ... " ) , QLabel : : minimumSizeHint ( ) . height ( ) ) ;
}
2014-08-14 17:42:03 +08:00
2014-09-01 17:00:06 +08:00
void CroppingLabel : : mouseReleaseEvent ( QMouseEvent * e )
{
if ( editable )
2014-09-01 17:16:41 +08:00
showTextEdit ( ) ;
emit clicked ( ) ;
2014-09-01 17:00:06 +08:00
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 )
{
2014-11-15 03:12:23 +08:00
if ( ! textEdit - > isVisible ( ) )
return false ;
2014-09-01 17:00:06 +08:00
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 )
2015-06-07 11:20:06 +08:00
{
2014-09-01 17:00:06 +08:00
hideTextEdit ( true ) ;
2015-06-07 11:20:06 +08:00
}
2014-09-01 17:00:06 +08:00
}
return false ;
}
2014-08-14 17:42:03 +08:00
void CroppingLabel : : setElidedText ( )
{
2014-09-01 17:00:06 +08:00
QString elidedText = fontMetrics ( ) . elidedText ( origText , elideMode , width ( ) ) ;
2014-08-14 17:42:03 +08:00
if ( elidedText ! = origText )
setToolTip ( origText ) ;
else
setToolTip ( QString ( ) ) ;
QLabel : : setText ( elidedText ) ;
}
2014-09-01 17:00:06 +08:00
void CroppingLabel : : hideTextEdit ( bool acceptText )
{
if ( acceptText )
2014-09-01 17:16:41 +08:00
{
2015-06-02 02:39:40 +08:00
textEdit - > setText ( textEdit - > text ( ) . trimmed ( ) . remove ( QRegExp ( " [ \\ t \\ n \\ v \\ f \\ r \\ x0000] " ) ) ) ; // we should really treat regular names this way as well (*ahem* zetok)
2014-11-18 11:22:40 +08:00
QString oldOrigText = origText ;
setText ( textEdit - > text ( ) ) ; // set before emitting so we don't override external reactions to signal
emit textChanged ( textEdit - > text ( ) , oldOrigText ) ;
2015-06-02 02:39:40 +08:00
emit editFinished ( textEdit - > text ( ) ) ;
2014-09-01 17:16:41 +08:00
}
2014-09-01 17:00:06 +08:00
textEdit - > hide ( ) ;
blockPaintEvents = false ;
}
2014-09-01 17:16:41 +08:00
void CroppingLabel : : showTextEdit ( )
{
blockPaintEvents = true ;
textEdit - > show ( ) ;
2015-06-04 04:18:40 +08:00
//textEdit->setFocus();
2014-09-01 17:16:41 +08:00
textEdit - > setText ( origText ) ;
2015-06-04 04:18:40 +08:00
// Set focus when event loop is free.
QTimer : : singleShot ( 0 , textEdit , SLOT ( setFocus ( ) ) ) ;
2014-09-01 17:16:41 +08:00
}
2014-11-16 06:17:30 +08:00
QString CroppingLabel : : fullText ( )
{
return origText ;
}
2015-06-07 11:20:06 +08:00
void CroppingLabel : : finishTextEdit ( )
{
QString newText = textEdit - > text ( ) . trimmed ( ) . remove ( QRegExp ( " [ \\ t \\ n \\ v \\ f \\ r \\ x0000] " ) ) ;
if ( ! newText . isEmpty ( ) & & origText ! = newText )
{
setText ( textEdit - > text ( ) ) ; // set before emitting so we don't override external reactions to signal
emit textChanged ( textEdit - > text ( ) , origText ) ;
emit editFinished ( textEdit - > text ( ) ) ;
}
textEdit - > hide ( ) ;
blockPaintEvents = false ;
}