[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: KDE/kdepim/akregator/src
From: Frank Osterfeld <frank.osterfeld () kdemail ! net>
Date: 2006-08-27 23:04:17
Message-ID: 1156719857.604979.8361.nullmailer () svn ! kde ! org
[Download RAW message or body]
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;
};
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic