removed dangerous mItems map from RSFeedWidget, replacing the search by data-based search

This commit is contained in:
csoler 2019-12-19 23:34:10 +01:00
parent 856d1b62a7
commit ff86d3cd20
No known key found for this signature in database
GPG Key ID: 7BCA522266C0804C
2 changed files with 45 additions and 40 deletions

View File

@ -28,7 +28,8 @@
#include <iostream> #include <iostream>
#define COLUMN_FEED 0 #define COLUMN_FEED 0
#define COLUMN_IDENTIFIER 1
#define SINGLE_STEP 15 #define SINGLE_STEP 15
@ -74,6 +75,8 @@ RSFeedWidget::RSFeedWidget(QWidget *parent)
ui->treeWidget->installEventFilter(this); ui->treeWidget->installEventFilter(this);
ui->treeWidget->setVerticalScrollBar(new RSFeedWidgetScrollBar); ui->treeWidget->setVerticalScrollBar(new RSFeedWidgetScrollBar);
ui->treeWidget->setColumnCount(2);
ui->treeWidget->setColumnHidden(COLUMN_IDENTIFIER,true);
} }
RSFeedWidget::~RSFeedWidget() RSFeedWidget::~RSFeedWidget()
@ -130,17 +133,14 @@ bool RSFeedWidget::eventFilter(QObject *object, QEvent *event)
void RSFeedWidget::feedAdded(FeedItem *feedItem, QTreeWidgetItem *treeItem) void RSFeedWidget::feedAdded(FeedItem *feedItem, QTreeWidgetItem *treeItem)
{ {
mItems.insert(feedItem, treeItem);
} }
void RSFeedWidget::feedRemoved(FeedItem *feedItem) void RSFeedWidget::feedRemoved(FeedItem *feedItem)
{ {
mItems.remove(feedItem);
} }
void RSFeedWidget::feedsCleared() void RSFeedWidget::feedsCleared()
{ {
mItems.clear();
} }
void RSFeedWidget::connectSignals(FeedItem *feedItem) void RSFeedWidget::connectSignals(FeedItem *feedItem)
@ -179,6 +179,7 @@ void RSFeedWidget::addFeedItem(FeedItem *feedItem, Qt::ItemDataRole sortRole, co
QTreeWidgetItem *treeItem = new RSTreeWidgetItem(mFeedCompareRole); QTreeWidgetItem *treeItem = new RSTreeWidgetItem(mFeedCompareRole);
treeItem->setData(COLUMN_FEED, sortRole, value); treeItem->setData(COLUMN_FEED, sortRole, value);
treeItem->setData(COLUMN_IDENTIFIER, Qt::DisplayRole, QString::fromStdString(feedItem->uniqueIdentifier()));
ui->treeWidget->addTopLevelItem(treeItem); ui->treeWidget->addTopLevelItem(treeItem);
ui->treeWidget->setItemWidget(treeItem, 0, feedItem); ui->treeWidget->setItemWidget(treeItem, 0, feedItem);
@ -208,6 +209,7 @@ void RSFeedWidget::addFeedItem(FeedItem *feedItem, const QMap<Qt::ItemDataRole,
} }
ui->treeWidget->addTopLevelItem(treeItem); ui->treeWidget->addTopLevelItem(treeItem);
treeItem->setData(COLUMN_FEED, Qt::DisplayRole, QString::fromStdString(feedItem->uniqueIdentifier()));
ui->treeWidget->setItemWidget(treeItem, 0, feedItem); ui->treeWidget->setItemWidget(treeItem, 0, feedItem);
feedAdded(feedItem, treeItem); feedAdded(feedItem, treeItem);
@ -223,14 +225,13 @@ void RSFeedWidget::addFeedItem(FeedItem *feedItem, const QMap<Qt::ItemDataRole,
void RSFeedWidget::setSort(FeedItem *feedItem, Qt::ItemDataRole sortRole, const QVariant &value) void RSFeedWidget::setSort(FeedItem *feedItem, Qt::ItemDataRole sortRole, const QVariant &value)
{ {
if (!feedItem) { if (!feedItem)
return; return;
}
QTreeWidgetItem *treeItem = findTreeWidgetItem(feedItem); QTreeWidgetItem *treeItem = findTreeWidgetItem(feedItem->uniqueIdentifier());
if (!treeItem) {
if (!treeItem)
return; return;
}
treeItem->setData(COLUMN_FEED, sortRole, value); treeItem->setData(COLUMN_FEED, sortRole, value);
} }
@ -241,10 +242,9 @@ void RSFeedWidget::setSort(FeedItem *feedItem, const QMap<Qt::ItemDataRole, QVar
return; return;
} }
QTreeWidgetItem *treeItem = findTreeWidgetItem(feedItem); QTreeWidgetItem *treeItem = findTreeWidgetItem(feedItem->uniqueIdentifier());
if (!treeItem) { if (!treeItem)
return; return;
}
QMap<Qt::ItemDataRole, QVariant>::const_iterator it; QMap<Qt::ItemDataRole, QVariant>::const_iterator it;
for (it = sort.begin(); it != sort.end(); ++it) { for (it = sort.begin(); it != sort.end(); ++it) {
@ -388,10 +388,7 @@ void RSFeedWidget::removeFeedItem(FeedItem *feedItem)
return; return;
} }
disconnectSignals(feedItem); QTreeWidgetItem *treeItem = findTreeWidgetItem(feedItem->uniqueIdentifier());
QTreeWidgetItem *treeItem = findTreeWidgetItem(feedItem);
feedRemoved(feedItem);
if (treeItem) if (treeItem)
{ {
@ -403,8 +400,10 @@ void RSFeedWidget::removeFeedItem(FeedItem *feedItem)
return ; return ;
} }
ui->treeWidget->takeTopLevelItem(treeItem_index); feedRemoved(feedItem);
delete(treeItem); disconnectSignals(feedItem);
delete ui->treeWidget->takeTopLevelItem(treeItem_index);
} }
if (!mCountChangedDisabled) { if (!mCountChangedDisabled) {
@ -429,40 +428,49 @@ void RSFeedWidget::feedItemDestroyed(FeedItem *feedItem)
{ {
/* No need to disconnect when object will be destroyed */ /* No need to disconnect when object will be destroyed */
QTreeWidgetItem *treeItem = findTreeWidgetItem(feedItem); QTreeWidgetItem *treeItem = findTreeWidgetItem(feedItem->uniqueIdentifier());
feedRemoved(feedItem);
if (treeItem) {
delete(treeItem);
}
if (!mCountChangedDisabled) { feedRemoved(feedItem);
if (treeItem)
delete(treeItem);
if (!mCountChangedDisabled)
emit feedCountChanged(); emit feedCountChanged();
}
} }
QTreeWidgetItem *RSFeedWidget::findTreeWidgetItem(FeedItem *feedItem) QTreeWidgetItem *RSFeedWidget::findTreeWidgetItem(const std::string& identifier)
{ {
QMap<FeedItem*, QTreeWidgetItem*>::iterator it = mItems.find(feedItem); std::cerr << "FindTreeWidgetItem: looking for \"" << identifier << "\"" << std::endl;
if (it == mItems.end()) { QList<QTreeWidgetItem*> list = ui->treeWidget->findItems(QString::fromStdString(identifier),Qt::MatchExactly,COLUMN_IDENTIFIER);
return NULL;
}
return it.value(); if(list.empty())
{
std::cerr << "not found!"<< std::endl;
return nullptr;
}
else if(list.size() == 1)
{
std::cerr << "found!"<< std::endl;
return list.front();
}
else
{
std::cerr << "(EE) More than a single item with identifier \"" << identifier << "\" in the feed tree widget. This shouldn't happen!" << std::endl;
return nullptr;
}
} }
bool RSFeedWidget::scrollTo(FeedItem *feedItem, bool focus) bool RSFeedWidget::scrollTo(FeedItem *feedItem, bool focus)
{ {
QTreeWidgetItem *item = findTreeWidgetItem(feedItem); QTreeWidgetItem *item = findTreeWidgetItem(feedItem->uniqueIdentifier());
if (!feedItem) { if (!feedItem)
return false; return false;
}
ui->treeWidget->scrollToItem(item); ui->treeWidget->scrollToItem(item);
ui->treeWidget->setCurrentItem(item); ui->treeWidget->setCurrentItem(item);
if (focus) { if (focus)
ui->treeWidget->setFocus(); ui->treeWidget->setFocus();
}
return true; return true;
} }

View File

@ -98,7 +98,7 @@ private:
void connectSignals(FeedItem *feedItem); void connectSignals(FeedItem *feedItem);
void disconnectSignals(FeedItem *feedItem); void disconnectSignals(FeedItem *feedItem);
FeedItem *feedItemFromTreeItem(QTreeWidgetItem *treeItem); FeedItem *feedItemFromTreeItem(QTreeWidgetItem *treeItem);
QTreeWidgetItem *findTreeWidgetItem(FeedItem *feedItem); QTreeWidgetItem *findTreeWidgetItem(const std::string &identifier);
void filterItems(); void filterItems();
void filterItem(QTreeWidgetItem *treeItem, FeedItem *feedItem); void filterItem(QTreeWidgetItem *treeItem, FeedItem *feedItem);
@ -117,9 +117,6 @@ private:
/* Options */ /* Options */
int mCountChangedDisabled; int mCountChangedDisabled;
/* Items */
QMap<FeedItem*, QTreeWidgetItem*> mItems;
Ui::RSFeedWidget *ui; Ui::RSFeedWidget *ui;
}; };