Bug 124303 - Drag/drop between folders sometimes creates 2 list entries (duplicate)
Summary: Drag/drop between folders sometimes creates 2 list entries (duplicate)
Status: RESOLVED FIXED
Alias: None
Product: akregator
Classification: Applications
Component: general (show other bugs)
Version: unspecified
Platform: unspecified Linux
: NOR normal
Target Milestone: ---
Assignee: kdepim bugs
URL:
Keywords:
: 138996 (view as bug list)
Depends on:
Blocks:
 
Reported: 2006-03-26 17:16 UTC by Ned Boony
Modified: 2006-12-19 08:05 UTC (History)
2 users (show)

See Also:
Latest Commit:
Version Fixed In:


Attachments
Screenshot showing dupes. (22.11 KB, image/png)
2006-10-06 21:12 UTC, Scott
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Ned Boony 2006-03-26 17:16:43 UTC
Version:           unknown (using KDE 3.5.1, Gentoo)
Compiler:          gcc version 3.3.5-20050130 (Gentoo 3.3.5.20050130-r1, ssp-3.3.5.20050130-1, pie-8.7.7.1)
OS:                Linux (i686) release 2.6.14-gentoo-r5

Sometimes, if you drag a feed from one folder to another, it will create 2 or 3 list entries in the destination folder. Each has the same name, and each will appear to read feeds. If you drag either list entry back to the source, it will delete both entries in the source as if nothing out of place ever happened. If instead, you drag the topfolder (containing the duplicates) around, it will delete the extras. Drag it again, however, and it will crash (for me creating invalid backtrace). This happens a lot, actually. I have a small vidcap, if interested.
Comment 1 Scott 2006-05-06 04:33:22 UTC
Thanks for saving me time in filing this bug.

I have exactly the same problem. And I've experienced it on three different Linux distributions over the past several months.

Kubuntu 6.04/6.06
Fedora Core 5
Debian Sid (Unstable).

All had the most recent (or next to) versions of Akregator installed.

It can get confusing because sometimes trying to delete the duplicates (or triplicates) results in deleting all of them.

When you add it back you wind up with duplicates again.
Comment 2 Paul Puschmann 2006-05-17 11:46:53 UTC
Hi,
i'm using akregator 1.2.2 with kde 3.5.2 in Debian testing ("etch") and report the same effects.

This behaviour does only occur with some special feeds.
I imported my feed manually from the Firefox-bookmark.html, created afterwards the folders and then sorted my feeds into them.

Here some feeds that did duplicate:
http://www.heise.de/newsticker/heise.rdf
http://www.golem.de/rss.php?feed=RSS2.0

Here one that didn't:
http://www.einfach-fuer-alle.de/blog/feed/efafeed.rss

I didn't report crashing, but after I closed akregator (even in the tray) and restarted it, all duplicates were gone and everything was as it should be (I think).

Right now (when I wanted to confirm the feeds behaviour) I saw that I could move a feed as I like (after the restart that cleaned everything up) without creating duplicates. ARGHH! Maybe this some caching problem.
Comment 3 Frank Osterfeld 2006-08-09 23:21:02 UTC
> ARGHH! Maybe this some caching problem. 

It's a potential problem with the list widget...

I can't reproduce it here with 3.5.4.
Anyone who can?
Does it matter if you drag the feed inside a folder, from one folder to a sibling folder, from top folder to subfolder, or vice versa?
 
Comment 4 Paul Puschmann 2006-08-10 09:23:41 UTC
I did now some quick tests with my Debian unstable (sid) using amarok 1.2.3 in kde 3.5.4.

I couldn't reproduce the bug / misbehaviour now.

In my case the effect appeared with dragging (moving) a feed from the "root" into a subfolder.
Seems to be done.
Comment 5 Frank Osterfeld 2006-08-20 20:29:52 UTC
I close the bug for now then. Reopen if the problem reappears with >= 3.5.4
Comment 6 Anthony Ettinger 2006-08-27 21:51:54 UTC
A screen capture when dragging  a feed into a newly created subfolder...
http://chovy.dyndns.org/err/akregator.png

Akregator 1.2.4
Comment 7 Frank Osterfeld 2006-08-27 22:49:41 UTC
Indeed, it's still there.

I could reproduce it now like follows:

* Create new subfolder "Foo" of folder "Bar".
* Drag "Foo" to upper level, so it becomes a sibling of "Bar". (That's important - if I kept the folder in "Bar", the bug did not occur)
* Drag some feed to Foo. Entries are duplicated. First it's two, number of dupes seems to increase when repeatingly dragging feeds.

Deleting the dupes can lead to a crash. Something is going seriously wrong with item management in the feed list...

Using host libthread_db library "/lib/tls/i686/cmov/libthread_db.so.1".
[Thread debugging using libthread_db enabled]
[New Thread -1243576640 (LWP 5326)]
[KCrash handler]
#6  0x091bcb50 in ?? ()
#7  0xb5b66917 in Akregator::NodeListView::DeleteItemVisitor::visitTreeNode (
    this=0x8194160, node=0x913bed8) at feedlistview.cpp:213
#8  0xb7f91cf9 in Akregator::Feed::accept (this=0x869ecc0, visitor=0x8194160)
    at feed.cpp:177
#9  0xb7f994c8 in Akregator::TreeNodeVisitor::visit (this=0x913bed8, 
    node=0x9325b28) at treenodevisitor.cpp:32
#10 0xb5b66763 in Akregator::NodeListView::DeleteItemVisitor::deleteItem (
    this=0x9325b28, node=0x913bed8, selectNeighbour=false)
    at feedlistview.cpp:233
#11 0xb5b63eed in Akregator::NodeListView::slotNodeRemoved (this=0x913bed8, 
    node=0x869ecc0) at feedlistview.cpp:973
#12 0xb5b655d0 in Akregator::NodeListView::qt_invoke (this=0x8190228, _id=127, 
    _o=0xbf8f5d90) at feedlistview.moc:286
#13 0xb65f2fe6 in QObject::activate_signal ()
   from /usr/share/qt3/lib/libqt-mt.so.3
#14 0xb7f9ae4a in Akregator::Folder::signalChildRemoved (this=0x83bee28, 
    t0=0x913bed8, t1=0x913bed8) at folder.moc:147
#15 0xb7f9c1a3 in Akregator::Folder::removeChild (this=0x83bee28, 
    node=0x869ecc0) at folder.cpp:211
#16 0xb5b6310d in Akregator::NodeListView::movableDropEvent (this=0x8190228)
    at feedlistview.cpp:584
#17 0xb6fa1481 in KListView::contentsDropEvent (this=0x8190228, e=0xbf8f63cc)
    at klistview.cpp:924
#18 0xb67279ad in QScrollView::viewportDropEvent ()
   from /usr/share/qt3/lib/libqt-mt.so.3
#19 0xb672a255 in QScrollView::eventFilter ()
   from /usr/share/qt3/lib/libqt-mt.so.3
#20 0xb66ee6ed in QListView::eventFilter ()
   from /usr/share/qt3/lib/libqt-mt.so.3
#21 0xb65f0002 in QObject::activate_filters ()
   from /usr/share/qt3/lib/libqt-mt.so.3
#22 0xb65f0080 in QObject::event () from /usr/share/qt3/lib/libqt-mt.so.3
#23 0xb662d5aa in QWidget::event () from /usr/share/qt3/lib/libqt-mt.so.3
#24 0xb6588e56 in QApplication::internalNotify ()
   from /usr/share/qt3/lib/libqt-mt.so.3
#25 0xb6589bd6 in QApplication::notify () from /usr/share/qt3/lib/libqt-mt.so.3
#26 0xb6c8c5e9 in KApplication::notify (this=0xbf8f7b14, receiver=0x8190890, 
    event=0xbf8f63cc) at kapplication.cpp:550
#27 0xb787626a in QApplication::sendEvent (receiver=0x9325b28, 
    event=0xbf8f63cc) at qapplication.h:520
#28 0xb652828e in qt_handle_xdnd_drop () from /usr/share/qt3/lib/libqt-mt.so.3
#29 0xb65284fc in QDragManager::drop () from /usr/share/qt3/lib/libqt-mt.so.3
#30 0xb652a1ed in QDragManager::eventFilter ()
   from /usr/share/qt3/lib/libqt-mt.so.3
#31 0xb6588c46 in QApplication::internalNotify ()
   from /usr/share/qt3/lib/libqt-mt.so.3
#32 0xb65893e0 in QApplication::notify () from /usr/share/qt3/lib/libqt-mt.so.3
#33 0xb6c8c5e9 in KApplication::notify (this=0xbf8f7b14, receiver=0x940e4f8, 
    event=0xbf8f684c) at kapplication.cpp:550
#34 0xb651a1c5 in QApplication::sendSpontaneousEvent ()
   from /usr/share/qt3/lib/libqt-mt.so.3
#35 0xb6515873 in QETWidget::translateMouseEvent ()
   from /usr/share/qt3/lib/libqt-mt.so.3
#36 0xb6513d59 in QApplication::x11ProcessEvent ()
   from /usr/share/qt3/lib/libqt-mt.so.3
#37 0xb652d4db in QEventLoop::processEvents ()
   from /usr/share/qt3/lib/libqt-mt.so.3
#38 0xb65a1947 in QEventLoop::enterLoop ()
   from /usr/share/qt3/lib/libqt-mt.so.3
#39 0xb6587991 in QApplication::enter_loop ()
   from /usr/share/qt3/lib/libqt-mt.so.3
#40 0xb6529f8c in QDragManager::drag () from /usr/share/qt3/lib/libqt-mt.so.3
#41 0xb65991f4 in QDragObject::drag () from /usr/share/qt3/lib/libqt-mt.so.3
#42 0xb6599148 in QDragObject::drag () from /usr/share/qt3/lib/libqt-mt.so.3
#43 0xb6fa1ee8 in KListView::startDrag (this=0x8190228) at klistview.cpp:1158
#44 0xb6f9cb3c in KListView::contentsMouseMoveEvent (this=0x8190228, 
    e=0xbf8f6fac) at klistview.cpp:842
#45 0xb6727669 in QScrollView::viewportMouseMoveEvent ()
   from /usr/share/qt3/lib/libqt-mt.so.3
#46 0xb672a0d0 in QScrollView::eventFilter ()
   from /usr/share/qt3/lib/libqt-mt.so.3
#47 0xb66ee6ed in QListView::eventFilter ()
   from /usr/share/qt3/lib/libqt-mt.so.3
#48 0xb65f0002 in QObject::activate_filters ()
   from /usr/share/qt3/lib/libqt-mt.so.3
#49 0xb65f0080 in QObject::event () from /usr/share/qt3/lib/libqt-mt.so.3
#50 0xb662d5aa in QWidget::event () from /usr/share/qt3/lib/libqt-mt.so.3
#51 0xb6588e56 in QApplication::internalNotify ()
   from /usr/share/qt3/lib/libqt-mt.so.3
#52 0xb65893e0 in QApplication::notify () from /usr/share/qt3/lib/libqt-mt.so.3
#53 0xb6c8c5e9 in KApplication::notify (this=0xbf8f7b14, receiver=0x8190890, 
    event=0xbf8f753c) at kapplication.cpp:550
#54 0xb651a1c5 in QApplication::sendSpontaneousEvent ()
   from /usr/share/qt3/lib/libqt-mt.so.3
#55 0xb6515873 in QETWidget::translateMouseEvent ()
   from /usr/share/qt3/lib/libqt-mt.so.3
#56 0xb6513d59 in QApplication::x11ProcessEvent ()
   from /usr/share/qt3/lib/libqt-mt.so.3
#57 0xb652d4db in QEventLoop::processEvents ()
   from /usr/share/qt3/lib/libqt-mt.so.3
#58 0xb65a1947 in QEventLoop::enterLoop ()
   from /usr/share/qt3/lib/libqt-mt.so.3
#59 0xb65a186a in QEventLoop::exec () from /usr/share/qt3/lib/libqt-mt.so.3
#60 0xb6587965 in QApplication::exec () from /usr/share/qt3/lib/libqt-mt.so.3
#61 0x0805169e in main (argc=152288984, argv=0x913bed8) at main.cpp:110

Comment 8 Frank Osterfeld 2006-08-27 22:59:20 UTC
Update: drag folder => dupe++. For every folder dragging, the number of duplicates increases by one. Moving the folder removes the dupes, but can lead
to crashes.
Comment 9 Frank Osterfeld 2006-08-28 00:49:24 UTC
SVN commit 577945 by osterfeld:

don't create dupes when dragging items to a folder that was moved before.
Avoid multiple item creation and signal connection.
Also, remove some unfinished cruft that wasn't used anyway (DragAndDropVisitor).

BUG: 124303


 M  +20 -60    feedlistview.cpp  


--- branches/KDE/3.5/kdepim/akregator/src/feedlistview.cpp #577944:577945
@@ -72,47 +72,8 @@
     DisconnectNodeVisitor* disconnectNodeVisitor;
     CreateItemVisitor* createItemVisitor;
     DeleteItemVisitor* deleteItemVisitor;
-    DragAndDropVisitor* dragAndDropVisitor;
 };
 
-class NodeListView::DragAndDropVisitor : public TreeNodeVisitor
-{
-
-public:
-    DragAndDropVisitor(NodeListView* view) : m_view(view) {}
-
-    /*
-    virtual bool visitTagNode(TagNode* node)
-    {
-        if (m_mode == ArticlesDropped)
-        {
-            Tag tag = node->tag();
-            QValueList<ArticleDragItem>::ConstIterator end(m_items.end());
-            for (QValueList<ArticleDragItem>::ConstIterator it = m_items.begin(); it != end; ++it)
-            {
-                Article a = Kernel::self()->feedList()->findArticle((*it).feedURL, (*it).guid);
-                if (!a.isNull())
-                     a.addTag(tag.id());
-            }
-        }
-        return true;
-    }
-*/
-    void articlesDropped(TreeNode* node, const QValueList<ArticleDragItem>& items)
-    {
-        m_items = items;
-        m_mode = ArticlesDropped;
-        visit(node);
-    }
-
-private:
-    NodeListView* m_view;
-    QValueList<ArticleDragItem> m_items;
-     
-    enum Mode { ArticlesDropped };
-    Mode m_mode;
-};
-
 class NodeListView::ConnectNodeVisitor : public TreeNodeVisitor
 {
     public:
@@ -210,6 +171,7 @@
                     m_view->setSelected(item, false);
             }
             
+            m_view->disconnectFromNode(node);
             delete item;
             return true;
         
@@ -245,6 +207,9 @@
 
         virtual bool visitTagNode(TagNode* node)
         {
+            if (m_view->findNodeItem(node))
+                return true;
+            
             TagNodeItem* item = 0;
             TreeNode* prev = node->prevSibling();
             FolderItem* parentItem = static_cast<FolderItem*>(m_view->findNodeItem(node->parent()));
@@ -276,6 +241,9 @@
 
         virtual bool visitTagFolder(TagFolder* node)
         {
+            if (m_view->findNodeItem(node))
+                return true;
+         
             TagFolderItem* item = 0;
             TreeNode* prev = node->prevSibling();
             FolderItem* parentItem = static_cast<FolderItem*>(m_view->findNodeItem(node->parent()));
@@ -311,6 +279,9 @@
         
         virtual bool visitFolder(Folder* node)
         {
+            if (m_view->findNodeItem(node))
+                return true;
+                     
             FolderItem* item = 0;
             TreeNode* prev = node->prevSibling();
             FolderItem* parentItem = static_cast<FolderItem*>(m_view->findNodeItem(node->parent()));
@@ -345,6 +316,9 @@
         
         virtual bool visitFeed(Feed* node)
         {
+            if (m_view->findNodeItem(node))
+                return true;
+         
             FeedItem* item = 0;
             TreeNode* prev = node->prevSibling();
             FolderItem* parentItem = static_cast<FolderItem*>(m_view->findNodeItem(node->parent()));
@@ -386,7 +360,6 @@
     d->disconnectNodeVisitor = new DisconnectNodeVisitor(this);
     d->createItemVisitor = new CreateItemVisitor(this);
     d->deleteItemVisitor = new DeleteItemVisitor(this);
-    d->dragAndDropVisitor = new DragAndDropVisitor(this);
 
     setMinimumSize(150, 150);
     addColumn(i18n("Feeds"));
@@ -426,7 +399,6 @@
     delete d->disconnectNodeVisitor;
     delete d->createItemVisitor;
     delete d->deleteItemVisitor;
-    delete d->dragAndDropVisitor;
     delete d;
     d = 0;
 }
@@ -536,26 +508,14 @@
     {
         openFolder();
 
-        FolderItem* parent = dynamic_cast<FolderItem*> (d->parent);
-        TreeNodeItem* afterMe = 0;
-
-        if(d->afterme)
-            afterMe = dynamic_cast<TreeNodeItem*> (d->afterme);
-
-        if (ArticleDrag::canDecode(e))
+        if (KURLDrag::canDecode(e))
         {
-            QPoint vp = contentsToViewport(e->pos());
-            TreeNodeItem* tni = dynamic_cast<TreeNodeItem*>(itemAt(vp));
-            if (tni != 0 && tni->node() != 0)
-            {
-                QValueList<ArticleDragItem> items;
-                ArticleDrag::decode(e, items);
-                d->dragAndDropVisitor->articlesDropped(tni->node(), items);
-
-            }
-        }
-        else if (KURLDrag::canDecode(e))
-        {
+            FolderItem* parent = dynamic_cast<FolderItem*> (d->parent);
+            TreeNodeItem* afterMe = 0;
+            
+            if(d->afterme)
+                afterMe = dynamic_cast<TreeNodeItem*> (d->afterme);
+            
             KURL::List urls;
             KURLDrag::decode( e, urls );
             e->accept();
Comment 10 Frank Osterfeld 2006-08-28 01:04:25 UTC
SVN commit 577949 by osterfeld:

forwardport 124303 (prevent multiple list items when dragging folders and feeds)
CCBUG: 124303


 M  +82 -86    feedlistview.cpp  
 M  +3 -3      feedlistview.h  


--- trunk/KDE/kdepim/akregator/src/feedlistview.cpp #577948:577949
@@ -73,47 +73,9 @@
     ConnectNodeVisitor* connectNodeVisitor;
     DisconnectNodeVisitor* disconnectNodeVisitor;
     CreateItemVisitor* createItemVisitor;
-    DragAndDropVisitor* dragAndDropVisitor;
+    DeleteItemVisitor* deleteItemVisitor;
 };
 
-class NodeListView::DragAndDropVisitor : public TreeNodeVisitor
-{
-
-public:
-    DragAndDropVisitor(NodeListView* view) : m_view(view) {}
-
-    /*
-    virtual bool visitTagNode(TagNode* node)
-    {
-        if (m_mode == ArticlesDropped)
-        {
-            Tag tag = node->tag();
-            QValueList<ArticleDragItem>::ConstIterator end(m_items.end());
-            for (QValueList<ArticleDragItem>::ConstIterator it = m_items.begin(); it != end; ++it)
-            {
-                Article a = Kernel::self()->feedList()->findArticle((*it).feedURL, (*it).guid);
-                if (!a.isNull())
-                     a.addTag(tag.id());
-            }
-        }
-        return true;
-    }
-*/
-    void articlesDropped(TreeNode* node, const QList<ArticleDragItem>& items)
-    {
-        m_items = items;
-        m_mode = ArticlesDropped;
-        visit(node);
-    }
-
-private:
-    NodeListView* m_view;
-    QList<ArticleDragItem> m_items;
-     
-    enum Mode { ArticlesDropped };
-    Mode m_mode;
-};
-
 class NodeListView::ConnectNodeVisitor : public TreeNodeVisitor
 {
     public:
@@ -188,6 +150,59 @@
         NodeListView* m_view;
 };
 
+class NodeListView::DeleteItemVisitor : public TreeNodeVisitor
+{
+    public:
+        
+        DeleteItemVisitor(NodeListView* view) : m_view(view) {}
+        
+        virtual bool visitTreeNode(TreeNode* node)
+        {
+            TreeNodeItem* item = m_view->d->itemDict.take(node);
+    
+            if (!item)
+                return true;
+    
+            if ( m_selectNeighbour && item->isSelected() )
+            {
+                if (item->itemBelow())
+                    m_view->setSelected(item->itemBelow(), true);
+                else if (item->itemAbove())
+                    m_view->setSelected(item->itemAbove(), true);
+                else
+                    m_view->setSelected(item, false);
+            }
+            
+            m_view->disconnectFromNode(node);
+            delete item;
+            return true;
+        
+        }
+        
+        virtual bool visitFolder(Folder* node)
+        {
+            // delete child items recursively before deleting parent
+            QList<TreeNode*> children = node->children();
+            for (QList<TreeNode*>::ConstIterator it =  children.begin(); it != children.end(); ++it )
+                visit(*it);
+            
+            visitTreeNode(node);
+            
+            return true;
+        }
+        
+        void deleteItem(TreeNode* node, bool selectNeighbour)
+        {
+            m_selectNeighbour = selectNeighbour;
+            visit(node);
+        }
+        
+    private:
+        NodeListView* m_view;
+        bool m_selectNeighbour;
+};
+
+
 class NodeListView::CreateItemVisitor : public TreeNodeVisitor
 {
     public:
@@ -195,7 +210,9 @@
 
         virtual bool visitTagNode(TagNode* node)
         {
-            kDebug() << "create item for " << node->title() << endl;
+            if (m_view->findNodeItem(node))
+                return true;
+
             TagNodeItem* item = 0;
             TreeNode* prev = node->prevSibling();
             FolderItem* parentItem = static_cast<FolderItem*>(m_view->findNodeItem(node->parent()));
@@ -227,6 +244,9 @@
 
         virtual bool visitTagFolder(TagFolder* node)
         {
+            if (m_view->findNodeItem(node))
+                return true;
+
             TagFolderItem* item = 0;
             TreeNode* prev = node->prevSibling();
             FolderItem* parentItem = static_cast<FolderItem*>(m_view->findNodeItem(node->parent()));
@@ -262,6 +282,9 @@
         
         virtual bool visitFolder(Folder* node)
         {
+            if (m_view->findNodeItem(node))
+                return true;
+
             FolderItem* item = 0;
             TreeNode* prev = node->prevSibling();
             FolderItem* parentItem = static_cast<FolderItem*>(m_view->findNodeItem(node->parent()));
@@ -296,6 +319,9 @@
         
         virtual bool visitFeed(Feed* node)
         {
+            if (m_view->findNodeItem(node))
+                return true;
+
             FeedItem* item = 0;
             TreeNode* prev = node->prevSibling();
             FolderItem* parentItem = static_cast<FolderItem*>(m_view->findNodeItem(node->parent()));
@@ -337,8 +363,8 @@
     d->connectNodeVisitor = new ConnectNodeVisitor(this),
     d->disconnectNodeVisitor = new DisconnectNodeVisitor(this);
     d->createItemVisitor = new CreateItemVisitor(this);
-    d->dragAndDropVisitor = new DragAndDropVisitor(this);
-
+    d->deleteItemVisitor = new DeleteItemVisitor(this);
+    
     setMinimumSize(150, 150);
     addColumn(i18n("Feeds"));
     setRootIsDecorated(false);
@@ -376,7 +402,7 @@
     delete d->connectNodeVisitor;
     delete d->disconnectNodeVisitor;
     delete d->createItemVisitor;
-    delete d->dragAndDropVisitor;
+    delete d->deleteItemVisitor;
     delete d;
     d = 0;
 }
@@ -502,27 +528,15 @@
     if (e->source() != viewport())
     {
         openFolder();
-
-        FolderItem* parent = dynamic_cast<FolderItem*> (d->parent);
-        TreeNodeItem* afterMe = 0;
-
-        if(d->afterme)
-            afterMe = dynamic_cast<TreeNodeItem*> (d->afterme);
-
-        if (ArticleDrag::canDecode(e))
+        
+        if (K3URLDrag::canDecode(e))
         {
-            QPoint vp = contentsToViewport(e->pos());
-            TreeNodeItem* tni = dynamic_cast<TreeNodeItem*>(itemAt(vp));
-            if (tni != 0 && tni->node() != 0)
-            {
-                QList<ArticleDragItem> items;
-                ArticleDrag::decode(e, items);
-                d->dragAndDropVisitor->articlesDropped(tni->node(), items);
+            FolderItem* parent = dynamic_cast<FolderItem*> (d->parent);
+            TreeNodeItem* afterMe = 0;
 
-            }
-        }
-        else if (K3URLDrag::canDecode(e))
-        {
+            if(d->afterme)
+                afterMe = dynamic_cast<TreeNodeItem*> (d->afterme);
+        
             KUrl::List urls;
             K3URLDrag::decode( e, urls );
             e->accept();
@@ -925,17 +939,14 @@
       
 void NodeListView::slotNodeAdded(TreeNode* node)
 {
-    d->createItemVisitor->visit(node);
-    kDebug() << "NodeListView::slotNodeAdded: " << node->title() << endl;
+    if (node)
+        d->createItemVisitor->visit(node);
 }
 
 void NodeListView::slotNodeRemoved(Folder* /*parent*/, TreeNode* node)
 {
-    if (!node)
-        return;
-    kDebug() << "NodeListView::slotNodeRemoved: " << node->title() << endl; 
-    disconnectFromNode(node);
-    delete d->itemDict.take(node);
+    if (node)
+        d->deleteItemVisitor->deleteItem(node, false); 
 }
 
 void NodeListView::connectToNode(TreeNode* node)
@@ -978,23 +989,8 @@
 
 void NodeListView::slotNodeDestroyed(TreeNode* node)
 {
-    TreeNodeItem* item = findNodeItem(node);
-    
-    d->itemDict.remove(node);
-
-    if (!item)
-        return;
-    
-    if ( item->isSelected() )
-    {
-        if (item->itemBelow())
-            setSelected(item->itemBelow(), true);
-        else if (item->itemAbove())
-            setSelected(item->itemAbove(), true);
-        else
-            setSelected(item, false);
-    }
-    delete item;
+    if (node)
+        d->deleteItemVisitor->deleteItem(node, true);
 }
 
 void NodeListView::slotRootNodeChanged(TreeNode* rootNode)
--- trunk/KDE/kdepim/akregator/src/feedlistview.h #577948:577949
@@ -182,9 +182,9 @@
     friend class CreateItemVisitor;
     class CreateItemVisitor;
 
-    friend class DragAndDropVisitor;
-    class DragAndDropVisitor;
-
+    friend class DeleteItemVisitor;
+    class DeleteItemVisitor;
+    
     class NodeListViewPrivate;
     NodeListViewPrivate* d;
 };
Comment 11 Scott 2006-10-06 21:12:28 UTC
Created attachment 18044 [details]
Screenshot showing dupes.

Has the patch made it into KDE 3.5.4/Akregator 1.2.4?

Because as far as I'm concerned, the bug still exists.

See attached screenshot.
Comment 12 Scott 2006-10-06 21:16:08 UTC
In addition, if you delete one of the duplicate feeds it takes the other feed with it, thereby deleting both. This is been the the case since this bug first appeared.
Comment 13 Frank Osterfeld 2006-10-09 20:52:48 UTC
> Has the patch made it into KDE 3.5.4/Akregator 1.2.4? 

No, you will see it fixed in 3.5.5.
Comment 14 Frank Osterfeld 2006-12-19 08:05:50 UTC
*** Bug 138996 has been marked as a duplicate of this bug. ***