From d4237450641f0588bb0b16de414e7219500d0fde Mon Sep 17 00:00:00 2001 From: csoler Date: Sat, 24 Dec 2016 15:04:08 +0100 Subject: [PATCH] added column to show distribution data and moved ReputationItemDelegate to GxsIdDetails --- retroshare-gui/src/gui/Identity/IdDialog.cpp | 38 +----------------- retroshare-gui/src/gui/gxs/GxsIdDetails.cpp | 40 +++++++++++++++++-- retroshare-gui/src/gui/gxs/GxsIdDetails.h | 26 +++++++++++- .../gui/gxsforums/GxsForumThreadWidget.cpp | 22 +++++----- .../src/gui/gxsforums/GxsForumThreadWidget.ui | 7 +++- 5 files changed, 80 insertions(+), 53 deletions(-) diff --git a/retroshare-gui/src/gui/Identity/IdDialog.cpp b/retroshare-gui/src/gui/Identity/IdDialog.cpp index 584c71d33..5dc948599 100644 --- a/retroshare-gui/src/gui/Identity/IdDialog.cpp +++ b/retroshare-gui/src/gui/Identity/IdDialog.cpp @@ -130,42 +130,6 @@ class TreeWidgetItem : public QTreeWidgetItem { } }; -// This class allows to draw the item in the share flags column using an appropriate size - -class ReputationItemDelegate: public QStyledItemDelegate -{ -public: - ReputationItemDelegate() {} - - virtual void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const - { - Q_ASSERT(index.isValid()); - - QStyleOptionViewItemV4 opt = option; - initStyleOption(&opt, index); - // disable default icon - opt.icon = QIcon(); - // draw default item - QApplication::style()->drawControl(QStyle::CE_ItemViewItem, &opt, painter, 0); - - const QRect r = option.rect; - - // get pixmap - unsigned int icon_index = qvariant_cast(index.data(Qt::DecorationRole)); - - if(icon_index > 4) - return ; - - QIcon icon = GxsIdDetails::getReputationIcon(RsReputations::ReputationLevel(icon_index)); - - QPixmap pix = icon.pixmap(r.size()); - - // draw pixmap at center of item - const QPoint p = QPoint((r.width() - pix.width())/2, (r.height() - pix.height())/2); - painter->drawPixmap(r.topLeft() + p, pix); - } -}; - /** Constructor */ IdDialog::IdDialog(QWidget *parent) : RsGxsUpdateBroadcastPage(rsIdentity, parent), @@ -360,7 +324,7 @@ IdDialog::IdDialog(QWidget *parent) : ui->idTreeWidget->setColumnWidth(RSID_COL_IDTYPE, 18 * fontWidth); ui->idTreeWidget->setColumnWidth(RSID_COL_VOTES, 7 * fontWidth); - ui->idTreeWidget->setItemDelegateForColumn(RSID_COL_VOTES,new ReputationItemDelegate()) ; + ui->idTreeWidget->setItemDelegateForColumn(RSID_COL_VOTES,new ReputationItemDelegate(RsReputations::ReputationLevel(0xff))) ; //QHeaderView_setSectionResizeMode(ui->idTreeWidget->header(), QHeaderView::ResizeToContents); diff --git a/retroshare-gui/src/gui/gxs/GxsIdDetails.cpp b/retroshare-gui/src/gui/gxs/GxsIdDetails.cpp index a3f4b680b..0ccc4c2a2 100644 --- a/retroshare-gui/src/gui/gxs/GxsIdDetails.cpp +++ b/retroshare-gui/src/gui/gxs/GxsIdDetails.cpp @@ -53,6 +53,7 @@ #define REPUTATION_NEUTRAL_ICON ":/icons/bullet_grey_128.png" #define REPUTATION_REMOTELY_NEGATIVE_ICON ":/icons/yellow_biohazard64.png" #define REPUTATION_LOCALLY_NEGATIVE_ICON ":/icons/red_biohazard64.png" +#define REPUTATION_VOID ":/icons/void_128.png" #define TIMER_INTERVAL 500 #define MAX_ATTEMPTS 10 @@ -66,6 +67,35 @@ const int kRecognTagType_Dev_Translator = 3; const int kRecognTagType_Dev_Patcher = 4; const int kRecognTagType_Dev_Developer = 5; + +void ReputationItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const +{ + Q_ASSERT(index.isValid()); + + QStyleOptionViewItemV4 opt = option; + initStyleOption(&opt, index); + // disable default icon + opt.icon = QIcon(); + // draw default item + QApplication::style()->drawControl(QStyle::CE_ItemViewItem, &opt, painter, 0); + + const QRect r = option.rect; + + // get pixmap + unsigned int icon_index = qvariant_cast(index.data(Qt::DecorationRole)); + + if(icon_index > mMaxLevelToDisplay) + return ; + + QIcon icon = GxsIdDetails::getReputationIcon(RsReputations::ReputationLevel(icon_index),0xff); + + QPixmap pix = icon.pixmap(r.size()); + + // draw pixmap at center of item + const QPoint p = QPoint((r.width() - pix.width())/2, (r.height() - pix.height())/2); + painter->drawPixmap(r.topLeft() + p, pix); +} + /* The global object */ GxsIdDetails *GxsIdDetails::mInstance = NULL ; @@ -964,8 +994,11 @@ QString nickname ; return comment; } -QIcon GxsIdDetails::getReputationIcon(RsReputations::ReputationLevel icon_index) +QIcon GxsIdDetails::getReputationIcon(RsReputations::ReputationLevel icon_index,uint32_t min_reputation) { + if(icon_index >= min_reputation) + return QIcon(REPUTATION_VOID); + switch(icon_index) { case RsReputations::REPUTATION_LOCALLY_NEGATIVE: return QIcon(REPUTATION_LOCALLY_NEGATIVE_ICON) ; break ; @@ -979,7 +1012,7 @@ QIcon GxsIdDetails::getReputationIcon(RsReputations::ReputationLevel icon_index) } } -void GxsIdDetails::getIcons(const RsIdentityDetails &details, QList &icons,uint32_t icon_types) +void GxsIdDetails::getIcons(const RsIdentityDetails &details, QList &icons,uint32_t icon_types,uint32_t minimal_required_reputation) { QPixmap pix ; @@ -989,10 +1022,9 @@ void GxsIdDetails::getIcons(const RsIdentityDetails &details, QList &icon icons.push_back(QIcon(IMAGE_BANNED)) ; return ; } - if(icon_types & ICON_TYPE_REPUTATION) - icons.push_back(getReputationIcon(details.mReputation.mOverallReputationLevel)) ; + icons.push_back(getReputationIcon(details.mReputation.mOverallReputationLevel,minimal_required_reputation)) ; if(icon_types & ICON_TYPE_AVATAR) { diff --git a/retroshare-gui/src/gui/gxs/GxsIdDetails.h b/retroshare-gui/src/gui/gxs/GxsIdDetails.h index 7199f0565..39a6ad29d 100644 --- a/retroshare-gui/src/gui/gxs/GxsIdDetails.h +++ b/retroshare-gui/src/gui/gxs/GxsIdDetails.h @@ -29,6 +29,7 @@ #include #include #include +#include #include @@ -45,6 +46,21 @@ enum GxsIdDetailsType typedef void (*GxsIdDetailsCallbackFunction)(GxsIdDetailsType type, const RsIdentityDetails &details, QObject *object, const QVariant &data); +// This class allows to draw the item in a reputation column using an appropriate size. The max_level_to_display parameter allows to replace +// the icon by an empty icon when needed. This allows to keep the focus on the critical icons only. + +class ReputationItemDelegate: public QStyledItemDelegate +{ +public: + ReputationItemDelegate(RsReputations::ReputationLevel max_level_to_display) : mMaxLevelToDisplay(max_level_to_display) {} + + virtual void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; + +private: + uint32_t mMaxLevelToDisplay ; +}; + + class GxsIdDetails : public QObject { Q_OBJECT @@ -67,7 +83,13 @@ public: static QString getName(const RsIdentityDetails &details); static QString getComment(const RsIdentityDetails &details); - static void getIcons(const RsIdentityDetails &details, QList &icons,uint32_t icon_types=ICON_TYPE_ALL); + + /*! + * \brief getIcons + * Returns the list of icons to display along with the ID name. The types of icons to show is a compound of the ICON_TYPE_* flags. + * If reputation is needed and exceeds the minimal reputation, an empty/void icon is showsn . This allow to only show reputation for IDs for which a problem exists. + */ + static void getIcons(const RsIdentityDetails &details, QList &icons, uint32_t icon_types=ICON_TYPE_ALL, uint32_t minimal_required_reputation=0xff); static QString getEmptyIdText(); static QString getLoadingText(const RsGxsId &id); @@ -76,7 +98,7 @@ public: static QString getNameForType(GxsIdDetailsType type, const RsIdentityDetails &details); static QIcon getLoadingIcon(const RsGxsId &id); - static QIcon getReputationIcon(RsReputations::ReputationLevel icon_index); + static QIcon getReputationIcon(RsReputations::ReputationLevel icon_index, uint32_t min_reputation); static void GenerateCombinedPixmap(QPixmap &pixmap, const QList &icons, int iconSize); diff --git a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp index fe36f9305..2171c1012 100644 --- a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp +++ b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.cpp @@ -67,13 +67,14 @@ #define VIEW_FLAT 2 /* Thread constants */ -#define COLUMN_THREAD_COUNT 6 -#define COLUMN_THREAD_TITLE 0 -#define COLUMN_THREAD_READ 1 -#define COLUMN_THREAD_DATE 2 -#define COLUMN_THREAD_AUTHOR 3 -#define COLUMN_THREAD_SIGNED 4 -#define COLUMN_THREAD_CONTENT 5 +#define COLUMN_THREAD_TITLE 0 +#define COLUMN_THREAD_READ 1 +#define COLUMN_THREAD_DATE 2 +#define COLUMN_THREAD_DISTRIBUTION 3 +#define COLUMN_THREAD_AUTHOR 4 +#define COLUMN_THREAD_SIGNED 5 +#define COLUMN_THREAD_CONTENT 6 +#define COLUMN_THREAD_COUNT 7 #define COLUMN_THREAD_DATA 0 // column for storing the userdata like msgid and parentid @@ -137,6 +138,8 @@ GxsForumThreadWidget::GxsForumThreadWidget(const RsGxsGroupId &forumId, QWidget mThreadCompareRole = new RSTreeWidgetItemCompareRole; mThreadCompareRole->setRole(COLUMN_THREAD_DATE, ROLE_THREAD_SORT); + ui->threadTreeWidget->setItemDelegateForColumn(COLUMN_THREAD_DISTRIBUTION,new ReputationItemDelegate(RsReputations::REPUTATION_NEUTRAL)) ; + connect(ui->threadTreeWidget, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(threadListCustomPopupMenu(QPoint))); connect(ui->postText, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(contextMenuTextBrowser(QPoint))); @@ -1000,7 +1003,7 @@ QTreeWidgetItem *GxsForumThreadWidget::convertMsgToThreadWidget(const RsGxsForum bool redacted = (reputation_level == RsReputations::REPUTATION_LOCALLY_NEGATIVE) ; - GxsIdRSTreeWidgetItem *item = new GxsIdRSTreeWidgetItem(mThreadCompareRole,GxsIdDetails::ICON_TYPE_REPUTATION | GxsIdDetails::ICON_TYPE_AVATAR ); + GxsIdRSTreeWidgetItem *item = new GxsIdRSTreeWidgetItem(mThreadCompareRole,GxsIdDetails::ICON_TYPE_AVATAR ); item->moveToThread(ui->threadTreeWidget->thread()); if(redacted) @@ -1008,6 +1011,7 @@ QTreeWidgetItem *GxsForumThreadWidget::convertMsgToThreadWidget(const RsGxsForum else item->setText(COLUMN_THREAD_TITLE, QString::fromUtf8(msg.mMeta.mMsgName.c_str())); + item->setData(COLUMN_THREAD_DISTRIBUTION,Qt::DecorationRole, reputation_level) ; //msg.mMeta.mChildTs Was not updated when received new child // so do it here. @@ -1096,7 +1100,7 @@ QTreeWidgetItem *GxsForumThreadWidget::convertMsgToThreadWidget(const RsGxsForum QTreeWidgetItem *GxsForumThreadWidget::generateMissingItem(const RsGxsMessageId &msgId) { - GxsIdRSTreeWidgetItem *item = new GxsIdRSTreeWidgetItem(mThreadCompareRole,GxsIdDetails::ICON_TYPE_REPUTATION | GxsIdDetails::ICON_TYPE_AVATAR); + GxsIdRSTreeWidgetItem *item = new GxsIdRSTreeWidgetItem(mThreadCompareRole,GxsIdDetails::ICON_TYPE_AVATAR); item->setText(COLUMN_THREAD_TITLE, tr("[ ... Missing Message ... ]")); item->setData(COLUMN_THREAD_DATA, ROLE_THREAD_MSGID, QString::fromStdString(msgId.toStdString())); diff --git a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.ui b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.ui index a086d110c..ba0dd9640 100644 --- a/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.ui +++ b/retroshare-gui/src/gui/gxsforums/GxsForumThreadWidget.ui @@ -6,7 +6,7 @@ 0 0 - 851 + 1217 721 @@ -238,6 +238,11 @@ Date + + + Distribution + + Author