From 339f1fe47ae8f6dcd799a674cdab65693a810d5f Mon Sep 17 00:00:00 2001 From: Andrea Diamantini Date: Thu, 28 Apr 2011 00:04:20 +0200 Subject: - A new option to set/unset the current bookmark bar folder in the context menu - Fix drag and drop with a custom folder - Fix a regression which affects BK bar drag and drop (5a53d2bf91dd) Patch by Yoann Laissus, reviewed by me :) --- src/bookmarks/bookmarkowner.cpp | 31 ++++++++++++ src/bookmarks/bookmarkowner.h | 6 ++- src/bookmarks/bookmarkscontextmenu.cpp | 19 ++++++++ src/bookmarks/bookmarkstoolbar.cpp | 86 +++++++++++++++++++--------------- 4 files changed, 102 insertions(+), 40 deletions(-) diff --git a/src/bookmarks/bookmarkowner.cpp b/src/bookmarks/bookmarkowner.cpp index bfca6ef3..da006801 100644 --- a/src/bookmarks/bookmarkowner.cpp +++ b/src/bookmarks/bookmarkowner.cpp @@ -89,6 +89,12 @@ KAction* BookmarkOwner::createAction(const KBookmark &bookmark, const BookmarkAc case DELETE: return createAction(i18n("Delete"), "edit-delete", i18n("Delete the bookmark"), SLOT(deleteBookmark(const KBookmark &)), bookmark); + case SET_TOOLBAR_FOLDER: + return createAction(i18n("Set as toolbar folder"), "bookmark-toolbar", + "", SLOT(setToolBarFolder(KBookmark)), bookmark); + case UNSET_TOOLBAR_FOLDER: + return createAction(i18n("Unset this folder as the toolbar folder"), "bookmark-toolbar", + "", SLOT(unsetToolBarFolder()), bookmark); default: return 0; } @@ -332,6 +338,31 @@ bool BookmarkOwner::deleteBookmark(const KBookmark &bookmark) } +void BookmarkOwner::setToolBarFolder(KBookmark bookmark) +{ + if (!bookmark.isGroup()) + return; + + unsetToolBarFolder(); + bookmark.internalElement().setAttribute("toolbar", "yes"); + bookmark.setIcon("bookmark-toolbar"); + + m_manager->emitChanged(); +} + + +void BookmarkOwner::unsetToolBarFolder() +{ + KBookmarkGroup toolbar = m_manager->toolbar(); + if (!toolbar.isNull()) + { + toolbar.internalElement().setAttribute("toolbar", "no"); + toolbar.setIcon(""); + } + m_manager->emitChanged(); +} + + KAction* BookmarkOwner::createAction(const QString &text, const QString &icon, const QString &help, const char *slot, const KBookmark &bookmark) diff --git a/src/bookmarks/bookmarkowner.h b/src/bookmarks/bookmarkowner.h index 8f0cd3b8..a414963b 100644 --- a/src/bookmarks/bookmarkowner.h +++ b/src/bookmarks/bookmarkowner.h @@ -61,7 +61,9 @@ public: COPY, EDIT, DELETE, - NUM_ACTIONS + NUM_ACTIONS, + SET_TOOLBAR_FOLDER, + UNSET_TOOLBAR_FOLDER }; /** @@ -106,6 +108,8 @@ public Q_SLOTS: void copyLink(const KBookmark &bookmark); void editBookmark(KBookmark bookmark); bool deleteBookmark(const KBookmark &bookmark); + void setToolBarFolder(KBookmark bookmark = KBookmark()); + void unsetToolBarFolder(); Q_SIGNALS: /** diff --git a/src/bookmarks/bookmarkscontextmenu.cpp b/src/bookmarks/bookmarkscontextmenu.cpp index a55f7777..25cb9f24 100644 --- a/src/bookmarks/bookmarkscontextmenu.cpp +++ b/src/bookmarks/bookmarkscontextmenu.cpp @@ -29,6 +29,11 @@ // Local Includes #include "bookmarkowner.h" +#include "bookmarkprovider.h" +#include "application.h" + +// KDE Includes +#include BookmarksContextMenu::BookmarksContextMenu(const KBookmark &bookmark, KBookmarkManager *manager, BookmarkOwner *owner, QWidget *parent) @@ -64,6 +69,15 @@ void BookmarksContextMenu::addFolderActions() { KBookmarkGroup group = bookmark().toGroup(); + if (bookmark().internalElement().attributeNode("toolbar").value() == "yes") + { + addAction(m_bmOwner->createAction(bookmark(), BookmarkOwner::UNSET_TOOLBAR_FOLDER)); + } + else + { + addAction(m_bmOwner->createAction(bookmark(), BookmarkOwner::SET_TOOLBAR_FOLDER)); + } + if (!group.first().isNull()) { KBookmark child = group.first(); @@ -105,6 +119,11 @@ void BookmarksContextMenu::addSeparatorActions() void BookmarksContextMenu::addNullActions() { + KBookmarkManager *manager = rApp->bookmarkProvider()->bookmarkManager(); + if (manager->toolbar().hasParent()) + { + addAction(m_bmOwner->createAction(bookmark(), BookmarkOwner::UNSET_TOOLBAR_FOLDER)); + } addAction(m_bmOwner->createAction(bookmark(), BookmarkOwner::BOOKMARK_PAGE)); addAction(m_bmOwner->createAction(bookmark(), BookmarkOwner::NEW_FOLDER)); addAction(m_bmOwner->createAction(bookmark(), BookmarkOwner::NEW_SEPARATOR)); diff --git a/src/bookmarks/bookmarkstoolbar.cpp b/src/bookmarks/bookmarkstoolbar.cpp index 3667503b..57d56fff 100644 --- a/src/bookmarks/bookmarkstoolbar.cpp +++ b/src/bookmarks/bookmarkstoolbar.cpp @@ -223,11 +223,12 @@ void BookmarkToolBar::hideMenu() bool BookmarkToolBar::eventFilter(QObject *watched, QEvent *event) { - if (m_currentMenu && m_currentMenu->isVisible() && !m_currentMenu->rect().contains(m_currentMenu->mapFromGlobal(QCursor::pos()))) + // To switch root folders as in a menubar + if (m_currentMenu && m_currentMenu->isVisible() && event->type() == QEvent::MouseMove + && !m_currentMenu->rect().contains(m_currentMenu->mapFromGlobal(QCursor::pos()))) { - // To switch root folders as in a menubar KBookmarkActionMenu* act = dynamic_cast(toolBar()->actionAt(toolBar()->mapFromGlobal(QCursor::pos()))); - if (event->type() == QEvent::MouseMove && act && m_currentMenu && act->menu() != m_currentMenu) + if (act && act->menu() != m_currentMenu) { m_currentMenu->hide(); QPoint pos = toolBar()->mapToGlobal(toolBar()->widgetForAction(act)->pos()); @@ -237,9 +238,6 @@ bool BookmarkToolBar::eventFilter(QObject *watched, QEvent *event) return QObject::eventFilter(watched, event); } - if (watched != toolBar()) - return QObject::eventFilter(watched, event); - switch (event->type()) { case QEvent::Show: @@ -342,7 +340,7 @@ bool BookmarkToolBar::eventFilter(QObject *watched, QEvent *event) { QDropEvent *dropEvent = static_cast(event); KBookmark bookmark; - KBookmarkGroup root = rApp->bookmarkProvider()->rootGroup(); + KBookmarkGroup root = rApp->bookmarkProvider()->bookmarkManager()->toolbar(); if (dropEvent->mimeData()->hasFormat("application/rekonq-bookmark")) { @@ -428,49 +426,59 @@ bool BookmarkToolBar::eventFilter(QObject *watched, QEvent *event) } break; - case QEvent::MouseButtonPress: // drag handling - { - QPoint pos = toolBar()->mapFromGlobal(QCursor::pos()); - KBookmarkActionInterface *action = dynamic_cast(toolBar()->actionAt(pos)); + default: + break; + } - if (action) + // These events need to be handled only for Bookmark actions and not the bar + if (watched != toolBar()) + { + switch (event->type()) + { + case QEvent::MouseButtonPress: // drag handling { - m_dragAction = toolBar()->actionAt(pos); - m_startDragPos = pos; + QPoint pos = toolBar()->mapFromGlobal(QCursor::pos()); + KBookmarkActionInterface *action = dynamic_cast(toolBar()->actionAt(pos)); + + 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; + // The menu is displayed only when the mouse button is released + if (action->bookmark().isGroup()) + return true; + } } - } - break; + break; - case QEvent::MouseMove: - { - int distance = (toolBar()->mapFromGlobal(QCursor::pos()) - m_startDragPos).manhattanLength(); - if (!m_currentMenu && distance >= QApplication::startDragDistance()) + case QEvent::MouseMove: { - startDrag(); + int distance = (toolBar()->mapFromGlobal(QCursor::pos()) - m_startDragPos).manhattanLength(); + if (!m_currentMenu && distance >= QApplication::startDragDistance()) + { + startDrag(); + } } - } - break; - - case QEvent::MouseButtonRelease: - { - int distance = (toolBar()->mapFromGlobal(QCursor::pos()) - m_startDragPos).manhattanLength(); - KBookmarkActionInterface *action = dynamic_cast(toolBar()->actionAt(m_startDragPos)); + break; - if (action && action->bookmark().isGroup() && distance < QApplication::startDragDistance()) + case QEvent::MouseButtonRelease: { - 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())); + 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())); + } } - } - break; + break; - default: - break; + default: + break; + } } return QObject::eventFilter(watched, event); -- cgit v1.2.1