From 03c624f2b2e718ca6164402d55b5dca8c3a819dd Mon Sep 17 00:00:00 2001 From: Yoann Laissus Date: Mon, 20 Dec 2010 20:48:18 +0100 Subject: - Bookmark folders can now be dragged and dropped in the toolbar. - Drop a bookmark folder in the WebView no longer crash rekonq but open this folder in new tabs - Fix some crash when a single bookmark is dropped in the WebView (incorrect URL) - Port the drag icon to IconManager CCBUG: 226479 --- src/bookmarks/bookmarkstoolbar.cpp | 60 +++++++++++++++++++++++++------------- 1 file changed, 39 insertions(+), 21 deletions(-) (limited to 'src/bookmarks/bookmarkstoolbar.cpp') diff --git a/src/bookmarks/bookmarkstoolbar.cpp b/src/bookmarks/bookmarkstoolbar.cpp index 63092b8d..e239e235 100644 --- a/src/bookmarks/bookmarkstoolbar.cpp +++ b/src/bookmarks/bookmarkstoolbar.cpp @@ -328,27 +328,24 @@ bool BookmarkToolBar::eventFilter(QObject *watched, QEvent *event) { QDropEvent *dropEvent = static_cast(event); KBookmark bookmark; - QUrl url; - QString title; + KBookmarkGroup root = Application::bookmarkProvider()->rootGroup(); if (dropEvent->mimeData()->hasFormat("application/rekonq-bookmark")) { QByteArray addresses = dropEvent->mimeData()->data("application/rekonq-bookmark"); bookmark = Application::bookmarkProvider()->bookmarkManager()->findByAddress(QString::fromLatin1(addresses.data())); if (bookmark.isNull()) - return QObject::eventFilter(watched, event); - - url = bookmark.url(); - title = bookmark.fullText(); + return false; } else if (dropEvent->mimeData()->hasFormat("text/uri-list")) { - title = dropEvent->mimeData()->text(); - url = dropEvent->mimeData()->urls().at(0).toString(); + QString title = dropEvent->mimeData()->text(); + QString url = dropEvent->mimeData()->urls().at(0).toString(); + bookmark = root.addBookmark(title, url); } else { - return QObject::eventFilter(watched, event); + return false; } QAction *destAction = toolBar()->actionAt(dropEvent->pos()); @@ -364,8 +361,6 @@ bool BookmarkToolBar::eventFilter(QObject *watched, QEvent *event) } } - KBookmarkGroup root = Application::bookmarkProvider()->rootGroup(); - if (destAction) { KBookmarkActionInterface *destBookmarkAction = dynamic_cast(destAction); @@ -375,8 +370,6 @@ bool BookmarkToolBar::eventFilter(QObject *watched, QEvent *event) && bookmark.address() != destBookmarkAction->bookmark().address()) { KBookmark destBookmark = destBookmarkAction->bookmark(); - root.deleteBookmark(bookmark); - bookmark = root.addBookmark(title, url); if ((dropEvent->pos().x() - widgetAction->pos().x()) > (widgetAction->width() / 2)) { @@ -393,7 +386,7 @@ bool BookmarkToolBar::eventFilter(QObject *watched, QEvent *event) else { root.deleteBookmark(bookmark); - bookmark = root.addBookmark(title, url); + bookmark = root.addBookmark(bookmark); if (dropEvent->pos().x() < toolBar()->widgetForAction(toolBar()->actions().first())->pos().x()) { root.moveBookmark(bookmark, KBookmark()); @@ -410,22 +403,38 @@ bool BookmarkToolBar::eventFilter(QObject *watched, QEvent *event) if (event->type() == QEvent::MouseButtonPress) { QPoint pos = toolBar()->mapFromGlobal(QCursor::pos()); - KBookmarkActionInterface* action = dynamic_cast(toolBar()->actionAt(pos)); + KBookmarkActionInterface *action = dynamic_cast(toolBar()->actionAt(pos)); - if (action && !action->bookmark().isGroup()) + if (action) { m_dragAction = toolBar()->actionAt(pos); m_startDragPos = pos; + + // The menu is displayed only when the mouse button is released + if (action->bookmark().isGroup()) + return true; } } else if (event->type() == QEvent::MouseMove) { int distance = (toolBar()->mapFromGlobal(QCursor::pos()) - m_startDragPos).manhattanLength(); - if (distance >= QApplication::startDragDistance()) + if (!m_currentMenu && distance >= QApplication::startDragDistance()) { startDrag(); } } + else if (event->type() == QEvent::MouseButtonRelease) + { + int distance = (toolBar()->mapFromGlobal(QCursor::pos()) - m_startDragPos).manhattanLength(); + KBookmarkActionInterface *action = dynamic_cast(toolBar()->actionAt(m_startDragPos)); + + if (action && action->bookmark().isGroup() && distance < QApplication::startDragDistance()) + { + KBookmarkActionMenu *menu = dynamic_cast(toolBar()->actionAt(m_startDragPos)); + QPoint actionPos = toolBar()->mapToGlobal(toolBar()->widgetForAction(menu)->pos()); + menu->menu()->popup(QPoint(actionPos.x(), actionPos.y() + toolBar()->widgetForAction(menu)->height())); + } + } } return QObject::eventFilter(watched, event); @@ -443,17 +452,26 @@ void BookmarkToolBar::actionHovered() void BookmarkToolBar::startDrag() { KBookmarkActionInterface *action = dynamic_cast(m_dragAction); - if (action && !action->bookmark().isGroup()) + if (action) { QMimeData *mimeData = new QMimeData; + KBookmark bookmark = action->bookmark(); - QByteArray address = action->bookmark().address().toLatin1(); + QByteArray address = bookmark.address().toLatin1(); mimeData->setData("application/rekonq-bookmark", address); - action->bookmark().populateMimeData(mimeData); + bookmark.populateMimeData(mimeData); QDrag *drag = new QDrag(toolBar()); drag->setMimeData(mimeData); - drag->setPixmap(KIcon(action->bookmark().icon()).pixmap(24, 24)); + + if (bookmark.isGroup()) + { + drag->setPixmap(KIcon(bookmark.icon()).pixmap(24, 24)); + } + else + { + drag->setPixmap(Application::iconManager()->iconForUrl(action->bookmark().url()).pixmap(24, 24)); + } drag->start(Qt::MoveAction); connect(drag, SIGNAL(destroyed()), this, SLOT(dragDestroyed())); -- cgit v1.2.1