//============================================================================= // // File : KviTalListWidget.cpp // Creation date : Mon May 05 2008 11:25:08 by Alessandro Carbone // // This file is part of the KVIrc IRC client distribution // Copyright (C) 2008 Alessandro Carbone (elfonol at gmail dot com) // // 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 2 // 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, write to the Free Software Foundation, // Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // //============================================================================= #include "KviTalListWidget.h" #include "KviTalIconAndRichTextItemDelegate.h" #include #include #include #include KviTalListWidget::KviTalListWidget(QWidget * pParent, QString name, Qt::WindowType f) : QListWidget(pParent) { setObjectName(name); setWindowFlags(f); //setUniformItemSizes(true); //setResizeMode(QListWidget::Adjust); //setWordWrap(true); viewport()->installEventFilter(this); } bool KviTalListWidget::eventFilter(QObject * o, QEvent * e) { if(e->type() == QEvent::Resize) { // A veeeery ugly hack. // This is the only reliable way I have found to perform a full // relayout on the items. // The Qt ItemView framework is so complicated that it's almost unusable. // We had the same functionality in Qt3 with 1/10 of the code. if(model()) { // And this does not even work when the items should shrink... // ...but well, that's the best we can do (but only under Qt5, as with Qt4 this is even protected). emit model()->layoutChanged(); // The model is hidden so we can't make these public. //model()->beginResetModel(); //model()->endResetModel(); } } return QListWidget::eventFilter(o, e); } bool KviTalListWidget::event(QEvent * e) { if(e->type() == QEvent::ToolTip) { QHelpEvent * helpEvent = static_cast(e); const QPoint & p = helpEvent->pos(); QListWidgetItem * item = itemAt(p); if(item) { emit tipRequest(item, p); } } return QListWidget::event(e); } KviTalListWidgetText::KviTalListWidgetText(KviTalListWidget * listbox, const QString & text) : KviTalListWidgetItem(listbox) { setText(text); } KviTalListWidgetText::KviTalListWidgetText(const QString & text) : KviTalListWidgetItem() { setText(text); } KviTalListWidgetText::~KviTalListWidgetText() = default; void KviTalListWidgetText::paint(QPainter * painter) { int itemHeight = height(listWidget()); QFontMetrics fm = painter->fontMetrics(); int yPos = ((itemHeight - fm.height()) / 2) + fm.ascent(); painter->drawText(3, yPos, text()); } int KviTalListWidgetText::height(const KviTalListWidget * lb) const { return lb ? lb->fontMetrics().lineSpacing() + 2 : 0; } int KviTalListWidgetText::width(const KviTalListWidget * lb) const { return lb ? lb->fontMetrics().horizontalAdvance(text()) + 6 : 0; } int KviTalListWidgetText::rtti() const { return RTTI; } KviTalListWidgetPixmap::KviTalListWidgetPixmap(KviTalListWidget * listbox, const QPixmap & pixmap) : KviTalListWidgetItem(listbox) { pm = pixmap; } KviTalListWidgetPixmap::KviTalListWidgetPixmap(const QPixmap & pixmap) : KviTalListWidgetItem() { pm = pixmap; } KviTalListWidgetPixmap::~KviTalListWidgetPixmap() = default; KviTalListWidgetPixmap::KviTalListWidgetPixmap(KviTalListWidget * listbox, const QPixmap & pix, const QString & text) : KviTalListWidgetItem(listbox) { pm = pix; setText(text); setIcon(QIcon(pix)); } KviTalListWidgetPixmap::KviTalListWidgetPixmap(const QPixmap & pix, const QString & text) : KviTalListWidgetItem() { pm = pix; setText(text); } void KviTalListWidgetPixmap::paint(QPainter * painter) { int itemHeight = height(listWidget()); int yPos; const QPixmap * pm = pixmap(); if(pm && !pm->isNull()) { yPos = (itemHeight - pm->height()) / 2; painter->drawPixmap(3, yPos, *pm); } if(!text().isEmpty()) { QFontMetrics fm = painter->fontMetrics(); yPos = ((itemHeight - fm.height()) / 2) + fm.ascent(); painter->drawText(pm->width() + 5, yPos, text()); } } int KviTalListWidgetPixmap::height(const KviTalListWidget * lb) const { int h; if(text().isEmpty()) h = pm.height(); else h = qMax(pm.height(), lb->fontMetrics().lineSpacing() + 2); return h; } int KviTalListWidgetPixmap::width(const KviTalListWidget * lb) const { if(text().isEmpty()) return pm.width() + 6; return pm.width() + lb->fontMetrics().horizontalAdvance(text()) + 6; } int KviTalListWidgetPixmap::rtti() const { return RTTI; }