2019-09-10 14:33:39 +00:00
/*
* Squawk messenger .
* Copyright ( C ) 2019 Yury Gubich < blue @ macaw . me >
*
* This program is free software : you can redistribute it and / or modify
* 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 .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program . If not , see < http : //www.gnu.org/licenses/>.
*/
# include <QDebug>
2019-09-17 22:05:32 +00:00
# include <QMimeDatabase>
# include <QPixmap>
# include <QFileInfo>
2019-12-06 08:00:09 +00:00
# include <QRegularExpression>
2019-09-10 14:33:39 +00:00
# include "message.h"
2019-12-06 08:00:09 +00:00
const QRegularExpression urlReg ( " (?<!<a \\ shref=[' \" ]) ( ? < ! < img \ \ ssrc = [ ' \ " ])((?:https?|ftp):// \\ S+) " ) ; //finds all hypertext references which are not wrapped in a or img tags
const QRegularExpression imgReg ( " ((?:https?|ftp) : / / \ \ S + \ \ . ( ? : jpg | jpeg | png | svg | gif ) ) " ) ;
2019-09-10 14:33:39 +00:00
Message : : Message ( const Shared : : Message & source , bool outgoing , const QString & p_sender , QWidget * parent ) :
QHBoxLayout ( parent ) ,
msg ( source ) ,
body ( new QWidget ( ) ) ,
bodyLayout ( new QVBoxLayout ( body ) ) ,
date ( new QLabel ( msg . getTime ( ) . toLocalTime ( ) . toString ( ) ) ) ,
sender ( new QLabel ( p_sender ) ) ,
text ( new QLabel ( ) ) ,
2019-09-12 20:54:44 +00:00
shadow ( new QGraphicsDropShadowEffect ( ) ) ,
2019-11-12 13:38:01 +00:00
button ( 0 ) ,
2019-09-12 20:54:44 +00:00
file ( 0 ) ,
progress ( 0 ) ,
2019-09-17 22:05:32 +00:00
fileComment ( new QLabel ( ) ) ,
2019-11-12 13:38:01 +00:00
hasButton ( false ) ,
2019-09-12 20:54:44 +00:00
hasProgress ( false ) ,
2019-09-17 22:05:32 +00:00
hasFile ( false ) ,
2019-11-11 15:19:54 +00:00
commentAdded ( false )
2019-09-10 14:33:39 +00:00
{
body - > setBackgroundRole ( QPalette : : AlternateBase ) ;
body - > setAutoFillBackground ( true ) ;
QString bd = msg . getBody ( ) ;
//bd.replace(imgReg, "<img src=\"\\1\"/>");
bd . replace ( urlReg , " <a href= \" \\ 1 \" > \\ 1</a> " ) ;
2019-12-06 08:00:09 +00:00
text - > setTextFormat ( Qt : : RichText ) ;
2019-09-10 14:33:39 +00:00
text - > setText ( bd ) ; ;
text - > setTextInteractionFlags ( text - > textInteractionFlags ( ) | Qt : : TextSelectableByMouse | Qt : : LinksAccessibleByMouse ) ;
text - > setWordWrap ( true ) ;
text - > setOpenExternalLinks ( true ) ;
2019-09-12 20:54:44 +00:00
if ( bd . size ( ) = = 0 ) {
text - > hide ( ) ;
}
2019-09-10 14:33:39 +00:00
QFont dFont = date - > font ( ) ;
dFont . setItalic ( true ) ;
dFont . setPointSize ( dFont . pointSize ( ) - 2 ) ;
date - > setFont ( dFont ) ;
QFont f ;
f . setBold ( true ) ;
sender - > setFont ( f ) ;
bodyLayout - > addWidget ( sender ) ;
bodyLayout - > addWidget ( text ) ;
bodyLayout - > addWidget ( date ) ;
shadow - > setBlurRadius ( 10 ) ;
shadow - > setXOffset ( 1 ) ;
shadow - > setYOffset ( 1 ) ;
shadow - > setColor ( Qt : : black ) ;
body - > setGraphicsEffect ( shadow ) ;
if ( outgoing ) {
sender - > setAlignment ( Qt : : AlignRight ) ;
date - > setAlignment ( Qt : : AlignRight ) ;
addStretch ( ) ;
addWidget ( body ) ;
2019-11-12 13:38:01 +00:00
} else {
addWidget ( body ) ;
addStretch ( ) ;
2019-09-10 14:33:39 +00:00
}
}
Message : : ~ Message ( )
{
2019-09-17 22:05:32 +00:00
if ( ! commentAdded ) {
delete fileComment ;
}
2019-11-15 13:30:29 +00:00
delete body ;
2019-09-10 14:33:39 +00:00
}
QString Message : : getId ( ) const
{
return msg . getId ( ) ;
}
2019-11-11 15:19:54 +00:00
QString Message : : getFileUrl ( ) const
{
return msg . getOutOfBandUrl ( ) ;
}
2019-09-10 14:33:39 +00:00
void Message : : setSender ( const QString & p_sender )
{
sender - > setText ( p_sender ) ;
}
2019-09-12 20:54:44 +00:00
2019-11-14 11:43:43 +00:00
void Message : : addButton ( const QIcon & icon , const QString & buttonText , const QString & tooltip )
2019-09-12 20:54:44 +00:00
{
2019-09-17 22:05:32 +00:00
hideFile ( ) ;
hideProgress ( ) ;
2019-11-12 13:38:01 +00:00
if ( ! hasButton ) {
2019-09-17 22:05:32 +00:00
hideComment ( ) ;
2019-09-17 15:16:09 +00:00
if ( msg . getBody ( ) = = msg . getOutOfBandUrl ( ) ) {
text - > setText ( " " ) ;
text - > hide ( ) ;
}
2019-11-12 13:38:01 +00:00
button = new QPushButton ( icon , buttonText ) ;
2019-11-14 11:43:43 +00:00
button - > setToolTip ( tooltip ) ;
2019-11-12 13:38:01 +00:00
connect ( button , & QPushButton : : clicked , this , & Message : : buttonClicked ) ;
bodyLayout - > insertWidget ( 2 , button ) ;
hasButton = true ;
2019-09-12 20:54:44 +00:00
}
}
2019-11-12 13:38:01 +00:00
void Message : : setProgress ( qreal value )
2019-09-12 20:54:44 +00:00
{
2019-09-17 22:05:32 +00:00
hideFile ( ) ;
2019-11-12 13:38:01 +00:00
hideButton ( ) ;
2019-09-12 20:54:44 +00:00
if ( ! hasProgress ) {
2019-09-17 22:05:32 +00:00
hideComment ( ) ;
2019-09-17 15:16:09 +00:00
if ( msg . getBody ( ) = = msg . getOutOfBandUrl ( ) ) {
text - > setText ( " " ) ;
text - > hide ( ) ;
}
2019-09-17 22:05:32 +00:00
progress = new QProgressBar ( ) ;
progress - > setRange ( 0 , 100 ) ;
2019-09-12 20:54:44 +00:00
bodyLayout - > insertWidget ( 2 , progress ) ;
hasProgress = true ;
}
2019-09-17 22:05:32 +00:00
progress - > setValue ( value * 100 ) ;
2019-09-12 20:54:44 +00:00
}
void Message : : showFile ( const QString & path )
2019-09-17 22:05:32 +00:00
{
2019-11-12 13:38:01 +00:00
hideButton ( ) ;
2019-09-17 22:05:32 +00:00
hideProgress ( ) ;
if ( ! hasFile ) {
hideComment ( ) ;
if ( msg . getBody ( ) = = msg . getOutOfBandUrl ( ) ) {
text - > setText ( " " ) ;
text - > hide ( ) ;
}
QMimeDatabase db ;
QMimeType type = db . mimeTypeForFile ( path ) ;
QStringList parts = type . name ( ) . split ( " / " ) ;
QString big = parts . front ( ) ;
QFileInfo info ( path ) ;
if ( big = = " image " ) {
file = new Image ( path ) ;
} else {
file = new QLabel ( ) ;
file - > setPixmap ( QIcon : : fromTheme ( type . iconName ( ) ) . pixmap ( 50 ) ) ;
file - > setAlignment ( Qt : : AlignCenter ) ;
2019-11-12 13:38:01 +00:00
showComment ( info . fileName ( ) , true ) ;
2019-09-17 22:05:32 +00:00
}
file - > setContextMenuPolicy ( Qt : : ActionsContextMenu ) ;
2019-10-05 11:27:39 +00:00
QAction * openAction = new QAction ( QIcon : : fromTheme ( " document-new-from-template " ) , tr ( " Open " ) , file ) ;
2019-09-17 22:05:32 +00:00
connect ( openAction , & QAction : : triggered , [ path ] ( ) { //TODO need to get rid of this shame
QDesktopServices : : openUrl ( QUrl : : fromLocalFile ( path ) ) ;
} ) ;
file - > addAction ( openAction ) ;
bodyLayout - > insertWidget ( 2 , file ) ;
hasFile = true ;
}
}
void Message : : hideComment ( )
{
if ( commentAdded ) {
bodyLayout - > removeWidget ( fileComment ) ;
fileComment - > hide ( ) ;
fileComment - > setWordWrap ( false ) ;
}
}
2019-11-12 13:38:01 +00:00
void Message : : hideButton ( )
2019-09-12 20:54:44 +00:00
{
2019-11-12 13:38:01 +00:00
if ( hasButton ) {
button - > deleteLater ( ) ;
button = 0 ;
hasButton = false ;
2019-09-12 20:54:44 +00:00
}
2019-09-17 22:05:32 +00:00
}
void Message : : hideFile ( )
{
if ( hasFile ) {
file - > deleteLater ( ) ;
file = 0 ;
hasFile = false ;
}
}
void Message : : hideProgress ( )
{
2019-09-12 20:54:44 +00:00
if ( hasProgress ) {
progress - > deleteLater ( ) ;
progress = 0 ;
2019-09-17 22:05:32 +00:00
hasProgress = false ; ;
2019-09-12 20:54:44 +00:00
}
}
2019-11-12 13:38:01 +00:00
void Message : : showComment ( const QString & comment , bool wordWrap )
{
if ( ! commentAdded ) {
int index = 2 ;
if ( hasFile ) {
index + + ;
}
if ( hasButton ) {
index + + ;
}
if ( hasProgress ) {
index + + ;
}
bodyLayout - > insertWidget ( index , fileComment ) ;
fileComment - > show ( ) ;
commentAdded = true ;
}
fileComment - > setWordWrap ( wordWrap ) ;
fileComment - > setText ( comment ) ;
}
const Shared : : Message & Message : : getMessage ( ) const
{
return msg ;
}