diff --git a/autotests/kurlcomboboxtest.h b/autotests/kurlcomboboxtest.h --- a/autotests/kurlcomboboxtest.h +++ b/autotests/kurlcomboboxtest.h @@ -29,6 +29,7 @@ private Q_SLOTS: void testTextForItem(); void testTextForItem_data(); + void testSetUrlMultipleTimes(); }; #endif //KURLCOMBOBOXTEST_H diff --git a/autotests/kurlcomboboxtest.cpp b/autotests/kurlcomboboxtest.cpp --- a/autotests/kurlcomboboxtest.cpp +++ b/autotests/kurlcomboboxtest.cpp @@ -45,3 +45,10 @@ QCOMPARE(combo.itemText(0), expectedText); } + +void KUrlComboBoxTest::testSetUrlMultipleTimes() +{ + KUrlComboBox combo(KUrlComboBox::Directories); + combo.setUrl(QUrl("http://kde.org")); + combo.setUrl(QUrl("http://www.kde.org")); +} diff --git a/src/widgets/kurlcombobox.cpp b/src/widgets/kurlcombobox.cpp --- a/src/widgets/kurlcombobox.cpp +++ b/src/widgets/kurlcombobox.cpp @@ -29,20 +29,16 @@ #include #include +#include + class KUrlComboBoxPrivate { public: KUrlComboBoxPrivate(KUrlComboBox *parent) : m_parent(parent), dirIcon(QStringLiteral("folder")) {} - ~KUrlComboBoxPrivate() - { - qDeleteAll(itemList); - qDeleteAll(defaultList); - } - struct KUrlComboItem { KUrlComboItem(const QUrl &url, const QIcon &icon, const QString &text = QString()) : url(url), icon(icon), text(text) {} @@ -52,10 +48,10 @@ }; void init(KUrlComboBox::Mode mode); - QString textForItem(const KUrlComboItem *item) const; - void insertUrlItem(const KUrlComboItem *); + QString textForItem(std::shared_ptr item) const; + void insertUrlItem(std::shared_ptr item); QIcon getIcon(const QUrl &url) const; - void updateItem(const KUrlComboItem *item, int index, const QIcon &icon); + void updateItem(std::shared_ptr item, int index, const QIcon &icon); void _k_slotActivated(int); @@ -66,14 +62,14 @@ KUrlComboBox::Mode myMode; QPoint m_dragPoint; - QList itemList; - QList defaultList; - QMap itemMapper; + QList> itemList; + QList> defaultList; + QMap> itemMapper; QIcon opendirIcon; }; -QString KUrlComboBoxPrivate::textForItem(const KUrlComboItem *item) const +QString KUrlComboBoxPrivate::textForItem(std::shared_ptr item) const { if (!item->text.isEmpty()) { return item->text; @@ -156,18 +152,16 @@ void KUrlComboBox::addDefaultUrl(const QUrl &url, const QIcon &icon, const QString &text) { - d->defaultList.append(new KUrlComboBoxPrivate::KUrlComboItem(url, icon, text)); + d->defaultList.append(std::shared_ptr(new KUrlComboBoxPrivate::KUrlComboItem(url, icon, text))); } void KUrlComboBox::setDefaults() { clear(); d->itemMapper.clear(); - const KUrlComboBoxPrivate::KUrlComboItem *item; for (int id = 0; id < d->defaultList.count(); id++) { - item = d->defaultList.at(id); - d->insertUrlItem(item); + d->insertUrlItem(d->defaultList.at(id)); } } @@ -179,7 +173,6 @@ void KUrlComboBox::setUrls(const QStringList &_urls, OverLoadResolving remove) { setDefaults(); - qDeleteAll(d->itemList); d->itemList.clear(); d->urlAdded = false; @@ -217,8 +210,6 @@ it = urls.constBegin(); - KUrlComboBoxPrivate::KUrlComboItem *item = nullptr; - while (it != urls.constEnd()) { if ((*it).isEmpty()) { ++it; @@ -237,7 +228,7 @@ continue; } - item = new KUrlComboBoxPrivate::KUrlComboItem(u, d->getIcon(u)); + std::shared_ptr item(new KUrlComboBoxPrivate::KUrlComboItem(u, d->getIcon(u))); d->insertUrlItem(item); d->itemList.append(item); ++it; @@ -253,7 +244,7 @@ bool blocked = blockSignals(true); // check for duplicates - QMap::ConstIterator mit = d->itemMapper.constBegin(); + auto mit = d->itemMapper.constBegin(); QString urlToInsert = url.toString(QUrl::StripTrailingSlash); while (mit != d->itemMapper.constEnd()) { Q_ASSERT(mit.value()); @@ -287,7 +278,7 @@ d->insertUrlItem(d->itemList[i]); } - KUrlComboBoxPrivate::KUrlComboItem *item = new KUrlComboBoxPrivate::KUrlComboItem(url, d->getIcon(url)); + std::shared_ptr item(new KUrlComboBoxPrivate::KUrlComboItem(url, d->getIcon(url))); const int id = count(); const QString text = d->textForItem(item); @@ -308,15 +299,15 @@ void KUrlComboBoxPrivate::_k_slotActivated(int index) { - const KUrlComboItem *item = itemMapper.value(index); + auto item = itemMapper.value(index); if (item) { m_parent->setUrl(item->url); emit m_parent->urlActivated(item->url); } } -void KUrlComboBoxPrivate::insertUrlItem(const KUrlComboBoxPrivate::KUrlComboItem *item) +void KUrlComboBoxPrivate::insertUrlItem(std::shared_ptr item) { Q_ASSERT(item); @@ -356,7 +347,7 @@ void KUrlComboBox::removeUrl(const QUrl &url, bool checkDefaultURLs) { - QMap::ConstIterator mit = d->itemMapper.constBegin(); + auto mit = d->itemMapper.constBegin(); while (mit != d->itemMapper.constEnd()) { if (url.toString(QUrl::StripTrailingSlash) == mit.value()->url.toString(QUrl::StripTrailingSlash)) { if (!d->itemList.removeAll(mit.value()) && checkDefaultURLs) { @@ -368,7 +359,7 @@ bool blocked = blockSignals(true); setDefaults(); - QListIterator it(d->itemList); + QListIterator> it(d->itemList); while (it.hasNext()) { d->insertUrlItem(it.next()); } @@ -406,7 +397,7 @@ void KUrlComboBox::mouseMoveEvent(QMouseEvent *event) { const int index = currentIndex(); - const KUrlComboBoxPrivate::KUrlComboItem *item = d->itemMapper.value(index); + auto item = d->itemMapper.value(index); if (item && !d->m_dragPoint.isNull() && event->buttons() & Qt::LeftButton && (event->pos() - d->m_dragPoint).manhattanLength() > QApplication::startDragDistance()) { @@ -436,7 +427,7 @@ // updates "item" with icon "icon" // kdelibs4 used to also say "and sets the URL instead of text", but this breaks const-ness, // now that it would require clearing the text, and I don't see the point since the URL was already in the text. -void KUrlComboBoxPrivate::updateItem(const KUrlComboBoxPrivate::KUrlComboItem *item, +void KUrlComboBoxPrivate::updateItem(std::shared_ptr item, int index, const QIcon &icon) { m_parent->setItemIcon(index, icon);