From ffe8734f3a5f821f9e5aecff2cc97502ada74aa1 Mon Sep 17 00:00:00 2001 From: Yoann Laissus Date: Fri, 27 May 2011 09:32:21 +0200 Subject: - Bookmark can now be dropped inside folders : - Correctly hide a folder menu if there is a click outside --- src/bookmarks/bookmarkstoolbar.cpp | 115 +++++++++++++++++++++++++++++-------- src/bookmarks/bookmarkstoolbar.h | 1 + 2 files changed, 92 insertions(+), 24 deletions(-) (limited to 'src') diff --git a/src/bookmarks/bookmarkstoolbar.cpp b/src/bookmarks/bookmarkstoolbar.cpp index 1f1e38c3..585c29a2 100644 --- a/src/bookmarks/bookmarkstoolbar.cpp +++ b/src/bookmarks/bookmarkstoolbar.cpp @@ -163,6 +163,7 @@ BookmarkToolBar::BookmarkToolBar(KToolBar *toolBar, QObject *parent) , m_currentMenu(0) , m_dragAction(0) , m_dropAction(0) + , m_checkedAction(0) , m_filled(false) { toolBar->setContextMenuPolicy(Qt::CustomContextMenu); @@ -228,16 +229,23 @@ void BookmarkToolBar::hideMenu() bool BookmarkToolBar::eventFilter(QObject *watched, QEvent *event) { - // 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()))) + if (m_currentMenu && m_currentMenu->isVisible() + && !m_currentMenu->rect().contains(m_currentMenu->mapFromGlobal(QCursor::pos()))) { - KBookmarkActionMenu* act = dynamic_cast(toolBar()->actionAt(toolBar()->mapFromGlobal(QCursor::pos()))); - if (act && act->menu() != m_currentMenu) + // To switch root folders as in a menubar + if (event->type() == QEvent::MouseMove) + { + KBookmarkActionMenu* act = dynamic_cast(toolBar()->actionAt(toolBar()->mapFromGlobal(QCursor::pos()))); + if (act && act->menu() != m_currentMenu) + { + m_currentMenu->hide(); + QPoint pos = toolBar()->mapToGlobal(toolBar()->widgetForAction(act)->pos()); + act->menu()->popup(QPoint(pos.x(), pos.y() + toolBar()->widgetForAction(act)->height())); + } + } + else if (event->type() == QEvent::MouseButtonPress) { m_currentMenu->hide(); - QPoint pos = toolBar()->mapToGlobal(toolBar()->widgetForAction(act)->pos()); - act->menu()->popup(QPoint(pos.x(), pos.y() + toolBar()->widgetForAction(act)->height())); } return QObject::eventFilter(watched, event); @@ -296,7 +304,23 @@ bool BookmarkToolBar::eventFilter(QObject *watched, QEvent *event) } } break; - + + case QEvent::DragLeave: + { + QDragLeaveEvent *dragEvent = static_cast(event); + + if (m_checkedAction) + { + m_checkedAction->setCheckable(false); + m_checkedAction->setChecked(false); + } + + delete m_dropAction; + m_dropAction = 0; + dragEvent->accept(); + } + break; + case QEvent::DragMove: { QDragMoveEvent *dragEvent = static_cast(event); @@ -309,21 +333,53 @@ bool BookmarkToolBar::eventFilter(QObject *watched, QEvent *event) if (overAction != m_dropAction && overActionBK && widgetAction && m_dropAction) { toolBar()->removeAction(m_dropAction); + if (m_checkedAction) + { + m_checkedAction->setCheckable(false); + m_checkedAction->setChecked(false); + } - if ((dragEvent->pos().x() - widgetAction->pos().x()) > (widgetAction->width() / 2)) + if (!overActionBK->bookmark().isGroup()) { - if (toolBar()->actions().count() > toolBar()->actions().indexOf(overAction) + 1) + if ((dragEvent->pos().x() - widgetAction->pos().x()) > (widgetAction->width() / 2)) { - toolBar()->insertAction(toolBar()->actions().at(toolBar()->actions().indexOf(overAction) + 1), m_dropAction); + if (toolBar()->actions().count() > toolBar()->actions().indexOf(overAction) + 1) + { + toolBar()->insertAction(toolBar()->actions().at(toolBar()->actions().indexOf(overAction) + 1), m_dropAction); + } + else + { + toolBar()->addAction(m_dropAction); + } } else { - toolBar()->addAction(m_dropAction); + toolBar()->insertAction(overAction, m_dropAction); } } else { - toolBar()->insertAction(overAction, m_dropAction); + if ((dragEvent->pos().x() - widgetAction->pos().x()) >= (widgetAction->width() * 0.75)) + { + if (toolBar()->actions().count() > toolBar()->actions().indexOf(overAction) + 1) + { + toolBar()->insertAction(toolBar()->actions().at(toolBar()->actions().indexOf(overAction) + 1), m_dropAction); + } + else + { + toolBar()->addAction(m_dropAction); + } + } + else if ((dragEvent->pos().x() - widgetAction->pos().x()) <= (widgetAction->width() * 0.25)) + { + toolBar()->insertAction(overAction, m_dropAction); + } + else + { + overAction->setCheckable(true); + overAction->setChecked(true); + m_checkedAction = overAction; + } } dragEvent->accept(); @@ -332,14 +388,6 @@ bool BookmarkToolBar::eventFilter(QObject *watched, QEvent *event) } break; - case QEvent::DragLeave: - { - QDragLeaveEvent *dragEvent = static_cast(event); - delete m_dropAction; - m_dropAction = 0; - dragEvent->accept(); - } - break; case QEvent::Drop: { @@ -404,15 +452,34 @@ bool BookmarkToolBar::eventFilter(QObject *watched, QEvent *event) { KBookmark destBookmark = destBookmarkAction->bookmark(); - if ((dropEvent->pos().x() - widgetAction->pos().x()) > (widgetAction->width() / 2)) + if (!destBookmark.isGroup()) { - root.moveBookmark(bookmark, destBookmark); + if ((dropEvent->pos().x() - widgetAction->pos().x()) >= (widgetAction->width() / 2)) + { + root.moveBookmark(bookmark, destBookmark); + } + else + { + root.moveBookmark(bookmark, destBookmark.parentGroup().previous(destBookmark)); + } } else { - root.moveBookmark(bookmark, destBookmark.parentGroup().previous(destBookmark)); + if ((dropEvent->pos().x() - widgetAction->pos().x()) >= (widgetAction->width() * 0.75)) + { + root.moveBookmark(bookmark, destBookmark); + } + else if ((dropEvent->pos().x() - widgetAction->pos().x()) <= (widgetAction->width() * 0.25)) + { + root.moveBookmark(bookmark, destBookmark.parentGroup().previous(destBookmark)); + } + else + { + destBookmark.toGroup().addBookmark(bookmark); + } } + rApp->bookmarkProvider()->bookmarkManager()->emitChanged(); } } diff --git a/src/bookmarks/bookmarkstoolbar.h b/src/bookmarks/bookmarkstoolbar.h index f97c461a..3eaa1e87 100644 --- a/src/bookmarks/bookmarkstoolbar.h +++ b/src/bookmarks/bookmarkstoolbar.h @@ -108,6 +108,7 @@ private: QPoint m_startDragPos; QAction *m_dragAction; QAction *m_dropAction; + QAction *m_checkedAction; bool m_filled; }; -- cgit v1.2.1