force Qt to use implicit data sharing in icons and pixmaps by using our own cache, and apply this to GxsChannelPostItem

This commit is contained in:
csoler 2020-04-19 13:10:30 +02:00
parent 2a046eacb3
commit c84016c3b0
No known key found for this signature in database
GPG Key ID: 7BCA522266C0804C
7 changed files with 81 additions and 346 deletions

View File

@ -1470,7 +1470,7 @@ void SearchDialog::hideOrShowSearchResult(QTreeWidgetItem* resultItem, QString c
void SearchDialog::setIconAndType(QTreeWidgetItem *item, const QString& filename)
{
item->setIcon(SR_NAME_COL, FilesDefs::getIconFromFilename(filename));
item->setIcon(SR_NAME_COL, FilesDefs::getIconFromFileType(filename));
item->setText(SR_TYPE_COL, FilesDefs::getNameFromFilename(filename));
}

View File

@ -594,7 +594,7 @@ public:
if(col == COLUMN_NAME)
{
if(source_id == -1)
return QVariant(FilesDefs::getIconFromFilename(QString::fromUtf8(fileInfo.fname.c_str())));
return QVariant(FilesDefs::getIconFromFileType(QString::fromUtf8(fileInfo.fname.c_str())));
else
{
QString iconName,tooltip;
@ -1522,285 +1522,6 @@ void TransfersDialog::setDestinationDirectory()
}
}
/*
int TransfersDialog::addDLItem(int row, const FileInfo &fileInfo)
{
QString fileHash = QString::fromStdString(fileInfo.hash.toStdString());
double fileDlspeed = (fileInfo.downloadStatus == FT_STATE_DOWNLOADING) ? (fileInfo.tfRate * 1024.0) : 0.0;
QString status;
switch (fileInfo.downloadStatus) {
case FT_STATE_FAILED: status = tr("Failed"); break;
case FT_STATE_OKAY: status = tr("Okay"); break;
case FT_STATE_WAITING: status = tr("Waiting"); break;
case FT_STATE_DOWNLOADING: status = tr("Downloading"); break;
case FT_STATE_COMPLETE: status = tr("Complete"); break;
case FT_STATE_QUEUED: status = tr("Queued"); break;
case FT_STATE_PAUSED: status = tr("Paused"); break;
case FT_STATE_CHECKING_HASH:status = tr("Checking..."); break;
default: status = tr("Unknown"); break;
}
double priority = PRIORITY_NULL;
if (fileInfo.downloadStatus == FT_STATE_QUEUED) {
priority = fileInfo.queue_position;
} else if (fileInfo.downloadStatus == FT_STATE_COMPLETE) {
priority = 0;
} else {
switch (fileInfo.priority) {
case SPEED_LOW: priority = PRIORITY_SLOWER; break;
case SPEED_NORMAL: priority = PRIORITY_AVERAGE; break;
case SPEED_HIGH: priority = PRIORITY_FASTER; break;
default: priority = PRIORITY_AVERAGE; break;
}
}
qlonglong completed = fileInfo.transfered;
qlonglong remaining = fileInfo.size - fileInfo.transfered;
qlonglong downloadtime = (fileInfo.tfRate > 0)?( (fileInfo.size - fileInfo.transfered) / (fileInfo.tfRate * 1024.0) ) : 0 ;
qint64 qi64LastDL = fileInfo.lastTS ; //std::numeric_limits<qint64>::max();
if (qi64LastDL == 0) // file is complete, or any raison why the time has not been set properly
{
QFileInfo file;
if (fileInfo.downloadStatus == FT_STATE_COMPLETE)
file = QFileInfo(QString::fromUtf8(fileInfo.path.c_str()), QString::fromUtf8(fileInfo.fname.c_str()));
else
file = QFileInfo(QString::fromUtf8(rsFiles->getPartialsDirectory().c_str()), QString::fromUtf8(fileInfo.hash.toStdString().c_str()));
//Get Last Access on File
if (file.exists())
qi64LastDL = file.lastModified().toTime_t();
}
QString strPath = QString::fromUtf8(fileInfo.path.c_str());
QString strPathAfterDL = strPath;
strPathAfterDL.replace(QString::fromUtf8(rsFiles->getDownloadDirectory().c_str()),"");
FileChunksInfo fcinfo;
if (!rsFiles->FileDownloadChunksDetails(fileInfo.hash, fcinfo)) {
return -1;
}
FileProgressInfo pinfo;
pinfo.cmap = fcinfo.chunks;
pinfo.type = FileProgressInfo::DOWNLOAD_LINE;
pinfo.progress = (fileInfo.size == 0) ? 0 : (completed * 100.0 / fileInfo.size);
pinfo.nb_chunks = pinfo.cmap._map.empty() ? 0 : fcinfo.chunks.size();
for (uint32_t i = 0; i < fcinfo.chunks.size(); ++i)
switch(fcinfo.chunks[i])
{
case FileChunksInfo::CHUNK_CHECKING: pinfo.chunks_in_checking.push_back(i);
break ;
case FileChunksInfo::CHUNK_ACTIVE: pinfo.chunks_in_progress.push_back(i);
break ;
case FileChunksInfo::CHUNK_DONE:
case FileChunksInfo::CHUNK_OUTSTANDING:
break ;
}
QString tooltip;
if (fileInfo.downloadStatus == FT_STATE_CHECKING_HASH) {
tooltip = tr("If the hash of the downloaded data does\nnot correspond to the hash announced\nby the file source. The data is likely \nto be corrupted.\n\nRetroShare will ask the source a detailed \nmap of the data; it will compare and invalidate\nbad blocks, and download them again\n\nTry to be patient!") ;
}
if (row < 0) {
row = DLListModel->rowCount();
DLListModel->insertRow(row);
// change progress column to own class for sorting
DLListModel->setItem(row, COLUMN_PROGRESS, new ProgressItem(NULL));
DLListModel->setData(DLListModel->index(row, COLUMN_SIZE), QVariant((qlonglong) fileInfo.size));
DLListModel->setData(DLListModel->index(row, COLUMN_ID), fileHash, Qt::DisplayRole);
DLListModel->setData(DLListModel->index(row, COLUMN_ID), fileHash, Qt::UserRole);
}
QString fileName = QString::fromUtf8(fileInfo.fname.c_str());
DLListModel->setData(DLListModel->index(row, COLUMN_NAME), fileName);
DLListModel->setData(DLListModel->index(row, COLUMN_NAME), FilesDefs::getIconFromFilename(fileName), Qt::DecorationRole);
DLListModel->setData(DLListModel->index(row, COLUMN_COMPLETED), QVariant((qlonglong)completed));
DLListModel->setData(DLListModel->index(row, COLUMN_DLSPEED), QVariant((double)fileDlspeed));
DLListModel->setData(DLListModel->index(row, COLUMN_PROGRESS), QVariant((float)pinfo.progress));
DLListModel->setData(DLListModel->index(row, COLUMN_PROGRESS), QVariant::fromValue(pinfo), Qt::UserRole);
DLListModel->setData(DLListModel->index(row, COLUMN_STATUS), QVariant(status));
DLListModel->setData(DLListModel->index(row, COLUMN_PRIORITY), QVariant(priority));
DLListModel->setData(DLListModel->index(row, COLUMN_REMAINING), QVariant((qlonglong)remaining));
DLListModel->setData(DLListModel->index(row, COLUMN_DOWNLOADTIME), QVariant((qlonglong)downloadtime));
DLListModel->setData(DLListModel->index(row, COLUMN_LASTDL), QVariant(qi64LastDL));
DLListModel->setData(DLListModel->index(row, COLUMN_PATH), QVariant(strPathAfterDL));
DLListModel->item(row,COLUMN_PATH)->setToolTip(strPath);
DLListModel->item(row,COLUMN_STATUS)->setToolTip(tooltip);
QStandardItem *dlItem = DLListModel->item(row);
std::set<int> used_rows ;
int active = 0;
if (fileInfo.downloadStatus != FT_STATE_COMPLETE) {
for (std::vector<TransferInfo>::const_iterator pit = fileInfo.peers.begin() ; pit != fileInfo.peers.end(); ++pit)
{
const TransferInfo &transferInfo = *pit;
//unique combination: fileHash + peerId, variant: hash + peerName (too long)
QString hashFileAndPeerId = fileHash + QString::fromStdString(transferInfo.peerId.toStdString());
double peerDlspeed = 0;
if ((uint32_t)transferInfo.status == FT_STATE_DOWNLOADING && fileInfo.downloadStatus != FT_STATE_PAUSED && fileInfo.downloadStatus != FT_STATE_COMPLETE)
peerDlspeed = transferInfo.tfRate * 1024.0;
FileProgressInfo peerpinfo;
peerpinfo.cmap = fcinfo.compressed_peer_availability_maps[transferInfo.peerId];
peerpinfo.type = FileProgressInfo::DOWNLOAD_SOURCE ;
peerpinfo.progress = 0.0; // we don't display completion for sources.
peerpinfo.nb_chunks = peerpinfo.cmap._map.empty() ? 0 : fcinfo.chunks.size();
int row_id = addPeerToDLItem(dlItem, transferInfo.peerId, hashFileAndPeerId, peerDlspeed, transferInfo.status, peerpinfo);
used_rows.insert(row_id);
// get the sources (number of online peers)
if (transferInfo.tfRate > 0 && fileInfo.downloadStatus == FT_STATE_DOWNLOADING)
++active;
}
}
float fltSources = active + (float)fileInfo.peers.size()/1000;
DLListModel->setData(DLListModel->index(row, COLUMN_SOURCES), fltSources);
// This is not optimal, but we deal with a small number of elements. The reverse order is really important,
// because rows after the deleted rows change positions !
//
for (int r = dlItem->rowCount() - 1; r >= 0; --r) {
if (used_rows.find(r) == used_rows.end()) {
dlItem->removeRow(r);
}
}
return row;
}
int TransfersDialog::addPeerToDLItem(QStandardItem *dlItem, const RsPeerId& peer_ID, const QString& coreID, double dlspeed, uint32_t status, const FileProgressInfo& peerInfo)
{
// try to find the item
int childRow = -1;
QStandardItem *childId = NULL;
for (int count = 0; (childId = dlItem->child(count, COLUMN_ID)) != NULL; ++count) {
if (childId->data(Qt::UserRole).toString() == coreID) {
childRow = count;
break;
}
}
QStandardItem *siName = NULL;
QStandardItem *siStatus = NULL;
if (childRow == -1) {
// set this false if you want to expand on double click
dlItem->setEditable(false);
QHeaderView *header = ui.downloadList->header();
QStandardItem *iName = new QStandardItem(); //COLUMN_NAME
QStandardItem *iSize = new SortByNameItem(header); //COLUMN_SIZE
QStandardItem *iCompleted = new SortByNameItem(header); //COLUMN_COMPLETED
QStandardItem *iDlSpeed = new SortByNameItem(header); //COLUMN_DLSPEED
QStandardItem *iProgress = new ProgressItem(header); //COLUMN_PROGRESS
QStandardItem *iSource = new SortByNameItem(header); //COLUMN_SOURCES
QStandardItem *iStatus = new SortByNameItem(header); //COLUMN_STATUS
QStandardItem *iPriority = new SortByNameItem(header); //COLUMN_PRIORITY
QStandardItem *iRemaining = new SortByNameItem(header); //COLUMN_REMAINING
QStandardItem *iDownloadTime = new SortByNameItem(header); //COLUMN_DOWNLOADTIME
QStandardItem *iID = new SortByNameItem(header); //COLUMN_ID
QStandardItem *iLastDL = new SortByNameItem(header); //COLUMN_LASTDL
QStandardItem *iPath = new SortByNameItem(header); //COLUMN_PATH
siName = iName;
siStatus = iStatus;
QList<QStandardItem*> items;
QString iconName;
QString tooltip;
iName->setData(QVariant(getPeerName(peer_ID, iconName, tooltip)), Qt::DisplayRole);
iName->setData(QIcon(iconName), Qt::DecorationRole);
iName->setData(QVariant(tooltip), Qt::ToolTipRole);
iSize->setData(QVariant(QString()), Qt::DisplayRole);
iCompleted->setData(QVariant(QString()), Qt::DisplayRole);
iDlSpeed->setData(QVariant((double)dlspeed), Qt::DisplayRole);
iProgress->setData(QVariant((float)peerInfo.progress), Qt::DisplayRole);
iProgress->setData(QVariant::fromValue(peerInfo), Qt::UserRole);
iSource->setData(QVariant(QString()), Qt::DisplayRole);
iPriority->setData(QVariant((double)PRIORITY_NULL), Qt::DisplayRole); // blank field for priority
iRemaining->setData(QVariant(QString()), Qt::DisplayRole);
iDownloadTime->setData(QVariant(QString()), Qt::DisplayRole);
iID->setData(QVariant() , Qt::DisplayRole);
iID->setData(QVariant(coreID), Qt::UserRole);
iLastDL->setData(QVariant(QString()), Qt::DisplayRole);
iPath->setData(QVariant(QString()), Qt::DisplayRole);
items.append(iName);
items.append(iSize);
items.append(iCompleted);
items.append(iDlSpeed);
items.append(iProgress);
items.append(iSource);
items.append(iStatus);
items.append(iPriority);
items.append(iRemaining);
items.append(iDownloadTime);
items.append(iID);
items.append(iLastDL);
items.append(iPath);
dlItem->appendRow(items);
childRow = dlItem->rowCount() - 1;
} else {
// just update the child (peer)
dlItem->child(childRow, COLUMN_DLSPEED)->setData(QVariant((double)dlspeed), Qt::DisplayRole);
dlItem->child(childRow, COLUMN_PROGRESS)->setData(QVariant((float)peerInfo.progress), Qt::DisplayRole);
dlItem->child(childRow, COLUMN_PROGRESS)->setData(QVariant::fromValue(peerInfo), Qt::UserRole);
siName = dlItem->child(childRow,COLUMN_NAME);
siStatus = dlItem->child(childRow, COLUMN_STATUS);
}
switch (status) {
case FT_STATE_FAILED:
siStatus->setData(QVariant(tr("Failed"))) ;
siName->setData(QIcon(":/images/Client1.png"), Qt::StatusTipRole);
break ;
case FT_STATE_OKAY:
siStatus->setData(QVariant(tr("Okay")));
siName->setData(QIcon(":/images/Client2.png"), Qt::StatusTipRole);
break ;
case FT_STATE_WAITING:
siStatus->setData(QVariant(tr("")));
siName->setData(QIcon(":/images/Client3.png"), Qt::StatusTipRole);
break ;
case FT_STATE_DOWNLOADING:
siStatus->setData(QVariant(tr("Transferring")));
siName->setData(QIcon(":/images/Client0.png"), Qt::StatusTipRole);
break ;
case FT_STATE_COMPLETE:
siStatus->setData(QVariant(tr("Complete")));
siName->setData(QIcon(":/images/Client0.png"), Qt::StatusTipRole);
break ;
default:
siStatus->setData(QVariant(tr("")));
siName->setData(QIcon(":/images/Client4.png"), Qt::StatusTipRole);
}
return childRow;
}
*/
int TransfersDialog::addULItem(int row, const FileInfo &fileInfo)
{
if (fileInfo.peers.empty())
@ -1822,7 +1543,7 @@ int TransfersDialog::addULItem(int row, const FileInfo &fileInfo)
//ULListModel->setItem(row, COLUMN_UPROGRESS, new ProgressItem(NULL));
ULListModel->setData(ULListModel->index(row, COLUMN_UNAME), fileName);
ULListModel->setData(ULListModel->index(row, COLUMN_UNAME), FilesDefs::getIconFromFilename(fileName), Qt::DecorationRole);
ULListModel->setData(ULListModel->index(row, COLUMN_UNAME), FilesDefs::getIconFromFileType(fileName), Qt::DecorationRole);
ULListModel->setData(ULListModel->index(row, COLUMN_UHASH), fileHash);
ULListModel->setData(ULListModel->index(row, COLUMN_UHASH), fileHash, Qt::UserRole);
}

View File

@ -430,7 +430,7 @@ QVariant RetroshareDirModel::decorationRole(const DirDetails& details,int coln)
if(details.hash.isNull())
return QIcon(":/images/reset.png") ; // file is being hashed
else
return FilesDefs::getIconFromFilename(QString::fromUtf8(details.name.c_str()));
return FilesDefs::getIconFromFileType(QString::fromUtf8(details.name.c_str()));
}
else
return QVariant();

View File

@ -85,23 +85,57 @@ QString FilesDefs::getImageFromFilename(const QString& filename, bool anyForUnkn
return getInfoFromFilename(filename, anyForUnknown, true);
}
QIcon FilesDefs::getIconFromFilename(const QString& filename)
QPixmap FilesDefs::getPixmapFromQtResourcePath(const QString& resource_path)
{
QString sImage = getInfoFromFilename(filename, true, true);
static std::map<QString,QIcon> mIconCache;
QIcon icon;
auto item = mIconCache.find(sImage);
if (item == mIconCache.end())
static std::map<QString,QPixmap> mPixmapCache;
QPixmap pixmap;
std::cerr << "Creating Pixmap from resource path " << resource_path.toStdString() ;
auto item = mPixmapCache.find(resource_path);
if (item == mPixmapCache.end())
{
icon = QIcon(sImage);
mIconCache[sImage] = icon;
std::cerr << " Not in cache. Creating new one." << std::endl;
pixmap = QPixmap(resource_path);
mPixmapCache[resource_path] = pixmap;
}
else
{
std::cerr << " In cache. " << std::endl;
pixmap = item->second;
}
return pixmap;
}
QIcon FilesDefs::getIconFromQtResourcePath(const QString& resource_path)
{
static std::map<QString,QIcon> mIconCache;
QIcon icon;
std::cerr << "Creating Icon from resource path " << resource_path.toStdString() ;
auto item = mIconCache.find(resource_path);
if (item == mIconCache.end())
{
std::cerr << " Not in cache. Creating new one." << std::endl;
icon = QIcon(resource_path);
mIconCache[resource_path] = icon;
}
else
{
std::cerr << " In cache. " << std::endl;
icon = item->second;
}
return icon;
}
QIcon FilesDefs::getIconFromFileType(const QString& filename)
{
return getIconFromQtResourcePath(getInfoFromFilename(filename,true,true));
}
QString FilesDefs::getNameFromFilename(const QString &filename)
{
return getInfoFromFilename(filename, false, false);

View File

@ -28,7 +28,18 @@ class FilesDefs
{
public:
static QString getImageFromFilename(const QString& filename, bool anyForUnknown);
static QIcon getIconFromFilename(const QString& filename);
// Theses methods is here to fix a Qt design flow that makes QIcon loaded from filename (e.g. :/images/icon.png) to not use the cache.
// As a result, icons created by Qt in this way (mostly from GUI) do not use data sharing.
// The method below has its own cache.
static QIcon getIconFromQtResourcePath(const QString& resource_path);
static QPixmap getPixmapFromQtResourcePath(const QString& resource_path);
// This method returns a QIcon that is suitable to represent a file of a particular type (image, movie, etc.)
static QIcon getIconFromFileType(const QString& filename);
static QString getNameFromFilename(const QString& filename);
};

View File

@ -23,6 +23,7 @@
#include <QStyle>
#include "gui/gxs/GxsIdDetails.h"
#include "gui/common/FilesDefs.h"
#include "rshare.h"
#include "GxsChannelPostItem.h"
#include "ui_GxsChannelPostItem.h"
@ -150,6 +151,24 @@ void GxsChannelPostItem::setup()
ui = new Ui::GxsChannelPostItem;
ui->setupUi(this);
// Manually set icons to allow to use clever resource sharing that is missing in Qt for Icons loaded from Qt resource file.
// This is particularly important here because a channel may contain many posts, so duplicating the QImages here is deadly for the
// memory.
ui->logoLabel->setPixmap(FilesDefs::getPixmapFromQtResourcePath(":/images/thumb-default-video.png"));
ui->warn_image_label->setPixmap(FilesDefs::getPixmapFromQtResourcePath(":/images/status_unknown.png"));
ui->readButton->setIcon(FilesDefs::getIconFromQtResourcePath(":/images/message-state-unread.png"));
ui->voteUpButton->setIcon(FilesDefs::getIconFromQtResourcePath(":/images/vote_up.png"));
ui->voteDownButton->setIcon(FilesDefs::getIconFromQtResourcePath(":/images/vote_down.png"));
ui->downloadButton->setIcon(FilesDefs::getIconFromQtResourcePath(":/icons/png/download.png"));
ui->playButton->setIcon(FilesDefs::getIconFromQtResourcePath(":/icons/png/play.png"));
ui->commentButton->setIcon(FilesDefs::getIconFromQtResourcePath(":/icons/png/commnt.png"));
ui->editButton->setIcon(FilesDefs::getIconFromQtResourcePath(":/icons/png/pencil-edit-button.png"));
ui->copyLinkButton->setIcon(FilesDefs::getIconFromQtResourcePath(":/icons/png/copy.png"));
ui->expandButton->setIcon(FilesDefs::getIconFromQtResourcePath(":/icons/png/down-arrow.png"));
ui->readAndClearButton->setIcon(FilesDefs::getIconFromQtResourcePath(":/icons/png/correct.png"));
ui->clearButton->setIcon(FilesDefs::getIconFromQtResourcePath(":/icons/png/exit2.png"));
setAttribute(Qt::WA_DeleteOnClose, true);
mInFill = false;
@ -566,12 +585,12 @@ void GxsChannelPostItem::setReadStatus(bool isNew, bool isUnread)
if (isUnread)
{
ui->readButton->setChecked(true);
ui->readButton->setIcon(QIcon(":/images/message-state-unread.png"));
ui->readButton->setIcon(FilesDefs::getIconFromQtResourcePath(":/images/message-state-unread.png"));
}
else
{
ui->readButton->setChecked(false);
ui->readButton->setIcon(QIcon(":/images/message-state-read.png"));
ui->readButton->setIcon(FilesDefs::getIconFromQtResourcePath(":/images/message-state-read.png"));
}
ui->newLabel->setVisible(isNew);
@ -684,7 +703,7 @@ void GxsChannelPostItem::doExpand(bool open)
if (open)
{
ui->expandFrame->show();
ui->expandButton->setIcon(QIcon(QString(":/icons/png/up-arrow.png")));
ui->expandButton->setIcon(FilesDefs::getIconFromQtResourcePath(QString(":/icons/png/up-arrow.png")));
ui->expandButton->setToolTip(tr("Hide"));
readToggled(false);
@ -692,7 +711,7 @@ void GxsChannelPostItem::doExpand(bool open)
else
{
ui->expandFrame->hide();
ui->expandButton->setIcon(QIcon(QString(":/icons/png/down-arrow.png")));
ui->expandButton->setIcon(FilesDefs::getIconFromQtResourcePath(QString(":/icons/png/down-arrow.png")));
ui->expandButton->setToolTip(tr("Expand"));
}

View File

@ -62,9 +62,6 @@
<property name="text">
<string/>
</property>
<property name="pixmap">
<pixmap resource="../images.qrc">:/images/thumb-default-video.png</pixmap>
</property>
<property name="scaledContents">
<bool>false</bool>
</property>
@ -156,9 +153,6 @@
<property name="text">
<string/>
</property>
<property name="pixmap">
<pixmap resource="../images.qrc">:/images/status_unknown.png</pixmap>
</property>
</widget>
</item>
<item>
@ -213,10 +207,6 @@
<property name="toolTip">
<string>Toggle Message Read Status</string>
</property>
<property name="icon">
<iconset resource="../images.qrc">
<normaloff>:/images/message-state-unread.png</normaloff>:/images/message-state-unread.png</iconset>
</property>
<property name="checkable">
<bool>true</bool>
</property>
@ -249,10 +239,6 @@
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="../images.qrc">
<normaloff>:/images/vote_up.png</normaloff>:/images/vote_up.png</iconset>
</property>
</widget>
</item>
<item>
@ -263,10 +249,6 @@
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="../images.qrc">
<normaloff>:/images/vote_down.png</normaloff>:/images/vote_down.png</iconset>
</property>
</widget>
</item>
<item>
@ -277,10 +259,6 @@
<property name="text">
<string>Download</string>
</property>
<property name="icon">
<iconset resource="../icons.qrc">
<normaloff>:/icons/png/download.png</normaloff>:/icons/png/download.png</iconset>
</property>
<property name="autoExclusive">
<bool>false</bool>
</property>
@ -294,10 +272,6 @@
<property name="text">
<string>Play</string>
</property>
<property name="icon">
<iconset resource="../icons.qrc">
<normaloff>:/icons/png/play.png</normaloff>:/icons/png/play.png</iconset>
</property>
</widget>
</item>
<item>
@ -305,10 +279,6 @@
<property name="text">
<string>Comments</string>
</property>
<property name="icon">
<iconset resource="../icons.qrc">
<normaloff>:/icons/png/comment.png</normaloff>:/icons/png/comment.png</iconset>
</property>
</widget>
</item>
<item>
@ -316,10 +286,6 @@
<property name="text">
<string>Edit</string>
</property>
<property name="icon">
<iconset resource="../icons.qrc">
<normaloff>:/icons/png/pencil-edit-button.png</normaloff>:/icons/png/pencil-edit-button.png</iconset>
</property>
</widget>
</item>
<item>
@ -336,10 +302,6 @@
<property name="toolTip">
<string>Copy RetroShare Link</string>
</property>
<property name="icon">
<iconset resource="../icons.qrc">
<normaloff>:/icons/png/copy.png</normaloff>:/icons/png/copy.png</iconset>
</property>
</widget>
</item>
<item>
@ -398,10 +360,6 @@
<property name="toolTip">
<string>Expand</string>
</property>
<property name="icon">
<iconset resource="../icons.qrc">
<normaloff>:/icons/png/down-arrow.png</normaloff>:/icons/png/down-arrow.png</iconset>
</property>
</widget>
</item>
<item>
@ -418,10 +376,6 @@
<property name="toolTip">
<string>Set as read and remove item</string>
</property>
<property name="icon">
<iconset resource="../icons.qrc">
<normaloff>:/icons/png/correct.png</normaloff>:/icons/png/correct.png</iconset>
</property>
</widget>
</item>
<item>
@ -438,10 +392,6 @@
<property name="toolTip">
<string>Remove Item</string>
</property>
<property name="icon">
<iconset resource="../icons.qrc">
<normaloff>:/icons/png/exit2.png</normaloff>:/icons/png/exit2.png</iconset>
</property>
</widget>
</item>
</layout>