diff --git a/retroshare-gui/src/gui/ForumsDialog.cpp b/retroshare-gui/src/gui/ForumsDialog.cpp index 93576aee2..066f0a160 100644 --- a/retroshare-gui/src/gui/ForumsDialog.cpp +++ b/retroshare-gui/src/gui/ForumsDialog.cpp @@ -140,6 +140,9 @@ ForumsDialog::ForumsDialog(QWidget *parent) connect(NotifyQt::getInstance(), SIGNAL(forumMsgReadSatusChanged(QString,QString,int)), this, SLOT(forumMsgReadSatusChanged(QString,QString,int))); + connect(ui.threadTitle, SIGNAL(elisionChanged(bool)), this, SLOT(threadTitle_elisionChanged(bool))); + + ui.imageBlockWidget->addButtonAction(tr("Load images always for this message"), this, SLOT(loadImagesAlways()), true); ui.postText->setImageBlockWidget(ui.imageBlockWidget); @@ -2139,3 +2142,9 @@ void ForumsDialog::loadImagesAlways() rsForums->setMessageStatus(mCurrForumId, mCurrThreadId, FORUM_MSG_STATUS_LOAD_EMBEDDED_IMAGES, FORUM_MSG_STATUS_LOAD_EMBEDDED_IMAGES); } + +void ForumsDialog::threadTitle_elisionChanged(bool elided) +{ + ui.threadTitle->setToolTip(elided?ui.threadTitle->text():""); +} + diff --git a/retroshare-gui/src/gui/ForumsDialog.h b/retroshare-gui/src/gui/ForumsDialog.h index eb4ab043d..e59b18562 100644 --- a/retroshare-gui/src/gui/ForumsDialog.h +++ b/retroshare-gui/src/gui/ForumsDialog.h @@ -129,6 +129,7 @@ private slots: void shareKey(); void loadImagesAlways(); + void threadTitle_elisionChanged(bool elided); private: void insertForums(); diff --git a/retroshare-gui/src/gui/ForumsDialog.ui b/retroshare-gui/src/gui/ForumsDialog.ui index ed4772355..88e33dfb6 100644 --- a/retroshare-gui/src/gui/ForumsDialog.ui +++ b/retroshare-gui/src/gui/ForumsDialog.ui @@ -381,7 +381,7 @@ - + 10 @@ -610,7 +610,12 @@ LineEditClear QLineEdit
gui/common/LineEditClear.h
- + + + ElidedLabel + QLabel +
gui/common/ElidedLabel.h
+
diff --git a/retroshare-gui/src/gui/common/ElidedLabel.cpp b/retroshare-gui/src/gui/common/ElidedLabel.cpp new file mode 100644 index 000000000..81cbbdb4c --- /dev/null +++ b/retroshare-gui/src/gui/common/ElidedLabel.cpp @@ -0,0 +1,112 @@ +/**************************************************************************** + ** + ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). + ** Contact: http://www.qt-project.org/legal + ** + ** This file is part of the QtCore module of the Qt Toolkit. + ** + ** $QT_BEGIN_LICENSE:BSD$ + ** You may use this file under the terms of the BSD license as follows: + ** + ** "Redistribution and use in source and binary forms, with or without + ** modification, are permitted provided that the following conditions are + ** met: + ** * Redistributions of source code must retain the above copyright + ** notice, this list of conditions and the following disclaimer. + ** * Redistributions in binary form must reproduce the above copyright + ** notice, this list of conditions and the following disclaimer in + ** the documentation and/or other materials provided with the + ** distribution. + ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names + ** of its contributors may be used to endorse or promote products derived + ** from this software without specific prior written permission. + ** + ** + ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." + ** + ** $QT_END_LICENSE$ + ** + ****************************************************************************/ + +#include "ElidedLabel.h" + +#include +#include +#include +#include + +ElidedLabel::ElidedLabel(const QString &text, QWidget *parent) + : QLabel(parent) + , elided(false) + , content(text) +{ + setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); +} + +ElidedLabel::ElidedLabel(QWidget *parent) + : QLabel(parent) + , elided(false) +{ + setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); + content=""; +} + +void ElidedLabel::setText(const QString &newText) +{ + content = newText; + update(); +} + +void ElidedLabel::paintEvent(QPaintEvent *event) +{ + QLabel::paintEvent(event); + + QPainter painter(this); + QFontMetrics fontMetrics = painter.fontMetrics(); + QRect cr = contentsRect(); + cr.adjust(margin(), margin(), -margin(), -margin()); + + bool didElide = false; + int lineSpacing = fontMetrics.lineSpacing(); + int x, y = x =cr.top()+(cr.height()-lineSpacing)/2; + + QTextLayout textLayout( content, painter.font()); + textLayout.beginLayout(); + forever { + QTextLine line = textLayout.createLine(); + + if (!line.isValid()) + break; + + line.setLineWidth(cr.width()+2*x); + int nextLineY = y + lineSpacing; + + if (cr.height() >= nextLineY + lineSpacing) { + line.draw(&painter, QPoint(x, y)); + y = nextLineY; + } else { + QString lastLine = content.mid(line.textStart()); + QString elidedLastLine = fontMetrics.elidedText(lastLine, Qt::ElideRight, cr.width()); + painter.drawText(QPoint(x, y + fontMetrics.ascent()), elidedLastLine); + line = textLayout.createLine(); + didElide = line.isValid(); + break; + } + } + textLayout.endLayout(); + + if (didElide != elided) { + elided = didElide; + emit elisionChanged(didElide); + } +} diff --git a/retroshare-gui/src/gui/common/ElidedLabel.h b/retroshare-gui/src/gui/common/ElidedLabel.h new file mode 100644 index 000000000..c451c1d0b --- /dev/null +++ b/retroshare-gui/src/gui/common/ElidedLabel.h @@ -0,0 +1,75 @@ +/**************************************************************************** + ** + ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). + ** Contact: http://www.qt-project.org/legal + ** + ** This file is part of the QtCore module of the Qt Toolkit. + ** + ** $QT_BEGIN_LICENSE:BSD$ + ** You may use this file under the terms of the BSD license as follows: + ** + ** "Redistribution and use in source and binary forms, with or without + ** modification, are permitted provided that the following conditions are + ** met: + ** * Redistributions of source code must retain the above copyright + ** notice, this list of conditions and the following disclaimer. + ** * Redistributions in binary form must reproduce the above copyright + ** notice, this list of conditions and the following disclaimer in + ** the documentation and/or other materials provided with the + ** distribution. + ** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names + ** of its contributors may be used to endorse or promote products derived + ** from this software without specific prior written permission. + ** + ** + ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." + ** + ** $QT_END_LICENSE$ + ** + ****************************************************************************/ + + #ifndef ELIDEDLABEL_H + #define ELIDEDLABEL_H + + #include + #include + #include + #include + #include + + class ElidedLabel : public QLabel + { + Q_OBJECT + Q_PROPERTY(QString text READ text WRITE setText) + Q_PROPERTY(bool isElided READ isElided) + + public: + ElidedLabel(const QString &text, QWidget *parent = 0); + ElidedLabel(QWidget *parent = 0); + + void setText(const QString &text); + const QString & text() const { return content; } + bool isElided() const { return elided; } + + protected: + void paintEvent(QPaintEvent *event); + + signals: + void elisionChanged(bool elided); + + private: + bool elided; + QString content; + }; + + #endif // TEXTWRAPPINGWIDGET_H diff --git a/retroshare-gui/src/retroshare-gui.pro b/retroshare-gui/src/retroshare-gui.pro index a89329c00..6ef5aaf7d 100644 --- a/retroshare-gui/src/retroshare-gui.pro +++ b/retroshare-gui/src/retroshare-gui.pro @@ -426,6 +426,7 @@ HEADERS += rshare.h \ gui/toaster/GroupChatToaster.h \ gui/toaster/ChatLobbyToaster.h \ gui/toaster/FriendRequestToaster.h \ + gui/common/ElidedLabel.h \ gui/common/vmessagebox.h \ gui/common/RsUrlHandler.h \ gui/common/RsCollectionFile.h \ @@ -708,6 +709,7 @@ SOURCES += main.cpp \ gui/msgs/MessageWindow.cpp \ gui/msgs/TagsMenu.cpp \ gui/msgs/MessageUserNotify.cpp \ + gui/common/ElidedLabel.cpp \ gui/common/vmessagebox.cpp \ gui/common/RsCollectionFile.cpp \ gui/common/RsCollectionDialog.cpp \