--- /usr/portage/distfiles/svn-src/kde/trunk/KDE/kdepim/akregator/src/feedlistview.cpp 2005-06-19 22:33:13.000000000 +0200 +++ feedlistview.cpp 2005-06-22 11:04:32.000000000 +0200 @@ -202,17 +202,18 @@ m_connectNodeVisitor = new ConnectNodeVisitor(this), m_disconnectNodeVisitor = new DisconnectNodeVisitor(this); m_createItemVisitor = new CreateItemVisitor(this); - + setMinimumSize(150, 150); addColumn(i18n("Feeds")); setRootIsDecorated(true); setItemsRenameable(true); setItemMargin(2); - + setFullWidth(true); setSorting(-1); setDragAutoScroll(true); setDropVisualizer(true); + //setDropHighlighter(false); // these have to be enabled from outside after loading the feed list! setDragEnabled(true); @@ -223,7 +224,8 @@ connect( this, SIGNAL(selectionChanged(QListViewItem*)), this, SLOT(slotSelectionChanged(QListViewItem*)) ); connect( this, SIGNAL(itemRenamed(QListViewItem*, const QString&, int)), this, SLOT(slotItemRenamed(QListViewItem*, const QString&, int)) ); connect( this, SIGNAL(contextMenu(KListView*, QListViewItem*, const QPoint&)), this, SLOT(slotContextMenu(KListView*, QListViewItem*, const QPoint&)) ); - + connect( &m_autoopentimer, SIGNAL( timeout() ), this, SLOT( openFolder() ) ); + clear(); QWhatsThis::add(this, i18n("

Feeds tree

" @@ -364,84 +366,41 @@ void FeedListView::slotDropped( QDropEvent *e, QListViewItem * /*item*/ ) { - if (!acceptDrag(e)) - return; - - QListViewItem *qiparent; - QListViewItem *qiafterme; - findDrop( e->pos(), qiparent, qiafterme ); - FolderItem* parent = static_cast (qiparent); - - if (!parent) - { - e->accept(); - return; - } - + m_autoopentimer.stop(); if (e->source() != viewport()) { - if (KURLDrag::canDecode( e )) - { - findDrop( e->pos(), qiparent, qiafterme ); - FolderItem* parent = static_cast (qiparent); - TreeNodeItem* afterme = static_cast (qiafterme); - - KURL::List urls; - KURLDrag::decode( e, urls ); - e->accept(); - emit signalDropped( urls, afterme, parent); - } - else - { - e->ignore(); - return; - } + openFolder(); + + FolderItem* parent = static_cast (m_parent); + TreeNodeItem* afterMe = 0; + + if(m_afterme) + afterMe = static_cast (m_afterme); + + KURL::List urls; + KURLDrag::decode( e, urls ); + e->accept(); + emit signalDropped( urls, afterMe, parent); } - } void FeedListView::movableDropEvent(QListViewItem* parent, QListViewItem* afterme) { - if (selectedItem() == afterme) - return; - - if (parent) + m_autoopentimer.stop(); + if (m_parent) { - Folder* parentNode = (static_cast (parent))->node(); + openFolder(); + Folder* parentNode = (static_cast (m_parent))->node(); TreeNode* afterMeNode = 0; TreeNode* current = selectedNode(); - if (afterme) - afterMeNode = (static_cast (afterme))->node(); + if (m_afterme) + afterMeNode = (static_cast (m_afterme))->node(); - // don't dnd nodes between different top-level nodes - - TreeNode* root1 = current; - while (root1 && root1->parent()) - root1 = root1->parent(); - - TreeNode* root2 = parentNode; - while (root2 && root2->parent()) - root2 = root2->parent(); - - if (root1 != root2) - return; - - // don't drop node into own subtree - - Folder* p = parentNode; - while (p) - if (p == current) - return; - else - p = p->parent(); - - // ok, tests passed, let's move the node - current->parent()->removeChild(current); parentNode->insertChild(current, afterMeNode); - KListView::movableDropEvent(parent, afterme); + KListView::movableDropEvent(m_parent, m_afterme); } } @@ -458,42 +417,98 @@ QListViewItem *qiparent; QListViewItem *qiafterme; findDrop( event->pos(), qiparent, qiafterme ); - - //TreeNodeItem* afterme = static_cast (qiafterme); - - // disable any drops where the result would be top level nodes - if (i && !i->parent()) - { - event->ignore(); - return; - } - // prevent dragging nodes from All Feeds to My Tags or vice versa - QListViewItem* root1 = i; - while (root1 && root1->parent()) - root1 = root1->parent(); - - QListViewItem* root2 = selectedItem(); - while (root2 && root2->parent()) - root2 = root2->parent(); + if (event->source() == viewport()) { + // disable any drops where the result would be top level nodes + if (i && !i->parent()) + { + event->ignore(); + m_autoopentimer.stop(); + return; + } + + // prevent dragging nodes from All Feeds to My Tags or vice versa + QListViewItem* root1 = i; + while (root1 && root1->parent()) + root1 = root1->parent(); - if (root1 != root2) - { - event->ignore(); - return; + QListViewItem* root2 = selectedItem(); + while (root2 && root2->parent()) + root2 = root2->parent(); + + if (root1 != root2) + { + event->ignore(); + m_autoopentimer.stop(); + return; + } + + // don't drop node into own subtree + QListViewItem* p = qiparent; + while (p) + if (p == selectedItem()) + { + event->ignore(); + m_autoopentimer.stop(); + return; + } + else + { + p = p->parent(); + } + + // disable drags onto the item itself + if (selectedItem() == i) + { + event->ignore(); + m_autoopentimer.stop(); + return; + } } + // what the hell was this good for? -fo // if (!i || event->pos().x() > header()->cellPos(header()->mapToIndex(0)) + // treeStepSize() * (i->depth() + 1) + itemMargin() || // event->pos().x() < header()->cellPos(header()->mapToIndex(0))) // {} else - if (i && i->childCount() && !i->isOpen()) - i->setOpen(true); // open folders under drag + // do we want to move inside the old parent or do we want to move to a new parent + if (i && (itemAt(vp - QPoint(0,5)) == i && itemAt(vp + QPoint(0,5)) == i)) + { + setDropVisualizer(false); + setDropHighlighter(true); + cleanDropVisualizer(); + + TreeNode *iNode = (static_cast (i))->node(); + if (iNode->isGroup()) + { + if (i != m_parent) + m_autoopentimer.stop(); + m_parent = i; + } + else + { + event->ignore(); + m_autoopentimer.stop(); + return; + } + m_afterme = 0; + m_autoopentimer.start(750); + } + else + { + setDropVisualizer(true); + setDropHighlighter(false); + cleanItemHighlighter(); + m_parent = qiparent; + m_afterme = qiafterme; + m_autoopentimer.stop(); + } // the rest is handled by KListView. KListView::contentsDragMoveEvent(event); } + /* void FeedListView::keyPressEvent(QKeyEvent* e) { @@ -898,4 +913,11 @@ return md; } +void FeedListView::openFolder() { + m_autoopentimer.stop(); + if (m_parent && !m_parent->isOpen()) + { + m_parent->setOpen(true); + } +} #include "feedlistview.moc" --- /usr/portage/distfiles/svn-src/kde/trunk/KDE/kdepim/akregator/src/feedlistview.h 2005-06-19 22:33:13.000000000 +0200 +++ feedlistview.h 2005-06-22 11:01:40.000000000 +0200 @@ -28,6 +28,7 @@ #include #include +#include namespace Akregator @@ -172,6 +173,7 @@ virtual void slotFeedFetchAborted(Feed* feed); virtual void slotFeedFetchError(Feed* feed); virtual void slotFeedFetchCompleted(Feed* feed); + void openFolder(); private: @@ -186,12 +188,17 @@ friend class CreateItemVisitor; class CreateItemVisitor; CreateItemVisitor* m_createItemVisitor; - + /** used for finding the item belonging to a node */ QPtrDict m_itemDict; FeedList* m_feedList; TagNodeList* m_tagNodeList; bool m_showTagFolders; + + // Drag and Drop variables + QListViewItem *m_parent; + QListViewItem *m_afterme; + QTimer m_autoopentimer; }; } --- /usr/portage/distfiles/svn-src/kde/trunk/KDE/kdepim/akregator/src/folderitem.cpp 2005-06-19 22:33:13.000000000 +0200 +++ folderitem.cpp 2005-06-21 01:28:15.000000000 +0200 @@ -36,7 +36,6 @@ FolderItem::FolderItem(FolderItem* parent, Folder* node) : TreeNodeItem(parent, node) { setRenameEnabled(0, true); - setExpandable(true); setOpen( node->isOpen() ); setPixmap ( 0, KGlobal::iconLoader()->loadIcon("folder", KIcon::Small) ); if (node) @@ -46,7 +45,6 @@ FolderItem::FolderItem(FolderItem* parent, TreeNodeItem* after, Folder* node) : TreeNodeItem(parent, after, node) { setRenameEnabled(0, true); - setExpandable(true); setOpen(node->isOpen()); setPixmap ( 0, KGlobal::iconLoader()->loadIcon("folder", KIcon::Small) ); if (node) @@ -56,7 +54,6 @@ FolderItem::FolderItem(KListView* parent, Folder* node) : TreeNodeItem(parent, node) { setRenameEnabled(0, true); - setExpandable(true); setOpen(true); setPixmap ( 0, KGlobal::iconLoader()->loadIcon("folder", KIcon::Small) ); if (node) @@ -66,7 +63,6 @@ FolderItem::FolderItem(KListView* parent, TreeNodeItem* after, Folder* node) : TreeNodeItem(parent, after, node) { setRenameEnabled(0, true); - setExpandable(true); setOpen(true); setPixmap ( 0, KGlobal::iconLoader()->loadIcon("folder", KIcon::Small) ); if (node)