diff options
author | Yoann Laissus <yoann.laissus@gmail.com> | 2010-08-17 12:43:07 +0200 |
---|---|---|
committer | Yoann Laissus <yoann.laissus@gmail.com> | 2010-08-17 12:43:07 +0200 |
commit | 05710490e9e4da45c8c9caaf8a998b851bd99085 (patch) | |
tree | 2484c32537a60e2deeb0bcbd65ed0d9ac6ca978c | |
parent | Merge commit 'refs/merge-requests/172' of git://gitorious.org/rekonq/mainline... (diff) | |
download | rekonq-05710490e9e4da45c8c9caaf8a998b851bd99085.tar.xz |
- Drag and drop in the bookmark toolbar between root items only (for the moment)
- Drag accepted from the panel
- Move two classes to a separate file
Partially fixed :
CCBUG: 226479
-rw-r--r-- | src/CMakeLists.txt | 3 | ||||
-rw-r--r-- | src/bookmarks/bookmarkscontextmenu.cpp (renamed from src/bookmarks/bookmarkcontextmenu.cpp) | 38 | ||||
-rw-r--r-- | src/bookmarks/bookmarkscontextmenu.h (renamed from src/bookmarks/bookmarkcontextmenu.h) | 6 | ||||
-rw-r--r-- | src/bookmarks/bookmarksmanager.cpp | 200 | ||||
-rw-r--r-- | src/bookmarks/bookmarksmanager.h | 74 | ||||
-rw-r--r-- | src/bookmarks/bookmarkspanel.cpp | 4 | ||||
-rw-r--r-- | src/bookmarks/bookmarkstoolbar.cpp | 432 | ||||
-rw-r--r-- | src/bookmarks/bookmarkstoolbar.h | 120 |
8 files changed, 581 insertions, 296 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5d06243c..8c78c5a3 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -48,7 +48,8 @@ SET( rekonq_KDEINIT_SRCS bookmarks/bookmarkspanel.cpp bookmarks/bookmarkstreemodel.cpp bookmarks/bookmarksproxy.cpp - bookmarks/bookmarkcontextmenu.cpp + bookmarks/bookmarkscontextmenu.cpp + bookmarks/bookmarkstoolbar.cpp #---------------------------------------- adblock/adblockmanager.cpp adblock/adblocknetworkreply.cpp diff --git a/src/bookmarks/bookmarkcontextmenu.cpp b/src/bookmarks/bookmarkscontextmenu.cpp index 714c8b51..c448d293 100644 --- a/src/bookmarks/bookmarkcontextmenu.cpp +++ b/src/bookmarks/bookmarkscontextmenu.cpp @@ -25,8 +25,8 @@ // Self Includes -#include "bookmarkcontextmenu.h" -#include "bookmarkcontextmenu.moc" +#include "bookmarkscontextmenu.h" +#include "bookmarkscontextmenu.moc" // Local Includes #include "application.h" @@ -41,7 +41,7 @@ #include <QClipboard> -BookmarkContextMenu::BookmarkContextMenu(const KBookmark & bookmark, KBookmarkManager *manager, KBookmarkOwner *owner, QWidget *parent) +BookmarksContextMenu::BookmarksContextMenu(const KBookmark & bookmark, KBookmarkManager *manager, KBookmarkOwner *owner, QWidget *parent) : KBookmarkContextMenu(bookmark, manager, owner, parent) , m_ac(new KActionCollection(this)) { @@ -49,13 +49,13 @@ BookmarkContextMenu::BookmarkContextMenu(const KBookmark & bookmark, KBookmarkMa } -BookmarkContextMenu::~BookmarkContextMenu() +BookmarksContextMenu::~BookmarksContextMenu() { delete m_ac; } -void BookmarkContextMenu::setupActions() +void BookmarksContextMenu::setupActions() { KAction* action; @@ -101,7 +101,7 @@ void BookmarkContextMenu::setupActions() } -void BookmarkContextMenu::addBookmarkActions() +void BookmarksContextMenu::addBookmarkActions() { addAction(m_ac->action("open")); addAction(m_ac->action("open_tab")); @@ -124,7 +124,7 @@ void BookmarkContextMenu::addBookmarkActions() } -void BookmarkContextMenu::addFolderActions() +void BookmarksContextMenu::addFolderActions() { if (!bookmark().toGroup().first().isNull()) { @@ -143,7 +143,7 @@ void BookmarkContextMenu::addFolderActions() } -void BookmarkContextMenu::addSeparatorActions() +void BookmarksContextMenu::addSeparatorActions() { addAction(m_ac->action("bookmark_page")); addAction(m_ac->action("folder_new")); @@ -155,7 +155,7 @@ void BookmarkContextMenu::addSeparatorActions() } -void BookmarkContextMenu::addActions() +void BookmarksContextMenu::addActions() { if (bookmark().isGroup()) { @@ -181,25 +181,25 @@ void BookmarkContextMenu::addActions() } -void BookmarkContextMenu::openInCurrentTab() +void BookmarksContextMenu::openInCurrentTab() { Application::instance()->loadUrl(bookmark().url()); } -void BookmarkContextMenu::openInNewTab() +void BookmarksContextMenu::openInNewTab() { Application::instance()->loadUrl(bookmark().url(), Rekonq::NewTab); } -void BookmarkContextMenu::openInNewWindow() +void BookmarksContextMenu::openInNewWindow() { Application::instance()->loadUrl(bookmark().url(), Rekonq::NewWindow); } -void BookmarkContextMenu::copyToClipboard() +void BookmarksContextMenu::copyToClipboard() { if (bookmark().isNull()) return; @@ -209,14 +209,14 @@ void BookmarkContextMenu::copyToClipboard() } -void BookmarkContextMenu::deleteBookmark() +void BookmarksContextMenu::deleteBookmark() { KBookmark bm = bookmark(); Application::bookmarkProvider()->bookmarkOwner()->deleteBookmark(bm); } -void BookmarkContextMenu::editBookmark() +void BookmarksContextMenu::editBookmark() { KBookmark selected = bookmark(); selected.setFullText(selected.fullText().replace("&&", "&")); @@ -227,14 +227,14 @@ void BookmarkContextMenu::editBookmark() } -void BookmarkContextMenu::openFolderInTabs() +void BookmarksContextMenu::openFolderInTabs() { if (bookmark().isGroup()) owner()->openFolderinTabs(bookmark().toGroup()); } -void BookmarkContextMenu::newBookmarkGroup() +void BookmarksContextMenu::newBookmarkGroup() { KBookmark selected = bookmark(); KBookmarkDialog *dialog = owner()->bookmarkDialog(manager(), QApplication::activeWindow()); @@ -266,7 +266,7 @@ void BookmarkContextMenu::newBookmarkGroup() } -void BookmarkContextMenu::newSeparator() +void BookmarksContextMenu::newSeparator() { KBookmark selected = bookmark(); KBookmark newBk; @@ -295,7 +295,7 @@ void BookmarkContextMenu::newSeparator() } -void BookmarkContextMenu::bookmarkCurrentPage() +void BookmarksContextMenu::bookmarkCurrentPage() { KBookmarkGroup parent = Application::bookmarkProvider()->rootGroup(); KBookmark selected = bookmark(); diff --git a/src/bookmarks/bookmarkcontextmenu.h b/src/bookmarks/bookmarkscontextmenu.h index ebbfd6e8..2ef8e5a7 100644 --- a/src/bookmarks/bookmarkcontextmenu.h +++ b/src/bookmarks/bookmarkscontextmenu.h @@ -34,13 +34,13 @@ #include <KBookmarkMenu> -class BookmarkContextMenu : public KBookmarkContextMenu +class BookmarksContextMenu : public KBookmarkContextMenu { Q_OBJECT public: - BookmarkContextMenu(const KBookmark & bk, KBookmarkManager * manager, KBookmarkOwner *owner, QWidget * parent = 0); - ~BookmarkContextMenu(); + BookmarksContextMenu(const KBookmark & bk, KBookmarkManager * manager, KBookmarkOwner *owner, QWidget * parent = 0); + ~BookmarksContextMenu(); virtual void addActions(); diff --git a/src/bookmarks/bookmarksmanager.cpp b/src/bookmarks/bookmarksmanager.cpp index cade77b4..221a6db1 100644 --- a/src/bookmarks/bookmarksmanager.cpp +++ b/src/bookmarks/bookmarksmanager.cpp @@ -36,7 +36,7 @@ #include "webtab.h" #include "webview.h" #include "mainview.h" -#include "bookmarkcontextmenu.h" +#include "bookmarkscontextmenu.h" // KDE Includes #include <KActionCollection> @@ -179,202 +179,6 @@ QList< QPair<QString, QString> > BookmarkOwner::currentBookmarkList() const // ------------------------------------------------------------------------------------------------------ -BookmarkMenu::BookmarkMenu(KBookmarkManager *manager, - KBookmarkOwner *owner, - KMenu *menu, - KActionCollection* actionCollection) - : KBookmarkMenu(manager, owner, menu, actionCollection) -{ -} - - -BookmarkMenu::BookmarkMenu(KBookmarkManager *manager, - KBookmarkOwner *owner, - KMenu *parentMenu, - const QString &parentAddress) - : KBookmarkMenu(manager, owner, parentMenu, parentAddress) -{ -} - - -BookmarkMenu::~BookmarkMenu() -{ -} - - -KMenu * BookmarkMenu::contextMenu(QAction *act) -{ - - KBookmarkActionInterface* action = dynamic_cast<KBookmarkActionInterface *>(act); - if (!action) - return 0; - return new BookmarkContextMenu(action->bookmark(), manager(), owner()); -} - - -QAction * BookmarkMenu::actionForBookmark(const KBookmark &bookmark) -{ - if (bookmark.isGroup()) - { - KBookmarkActionMenu *actionMenu = new KBookmarkActionMenu(bookmark, this); - BookmarkMenu *menu = new BookmarkMenu(manager(), owner(), actionMenu->menu(), bookmark.address()); - connect(actionMenu, SIGNAL(hovered()), menu, SLOT(slotAboutToShow())); - return actionMenu; - } - else if (bookmark.isSeparator()) - { - return KBookmarkMenu::actionForBookmark(bookmark); - } - else - { - KBookmarkAction *action = new KBookmarkAction(bookmark, owner(), this); - connect(action, SIGNAL(hovered()), this, SLOT(actionHovered())); - return action; - } -} - - -void BookmarkMenu::refill() -{ - clear(); - fillBookmarks(); - - if (parentMenu()->actions().count() > 0) - parentMenu()->addSeparator(); - - if (isRoot()) - { - addAddBookmark(); - addAddBookmarksList(); - addNewFolder(); - addEditBookmarks(); - } - else - { - addOpenFolderInTabs(); - addAddBookmark(); - addAddBookmarksList(); - addNewFolder(); - } -} - - -void BookmarkMenu::addOpenFolderInTabs() -{ - KAction *action; - KBookmarkGroup group = manager()->findByAddress(parentAddress()).toGroup(); - - if (!group.first().isNull()) - { - KBookmark bookmark = group.first(); - - while (bookmark.isGroup() || bookmark.isSeparator()) - { - bookmark = group.next(bookmark); - } - - if (!bookmark.isNull()) - { - action = new KAction(KIcon("tab-new"), i18n("Open Folder in Tabs"), this); - action->setHelpText(i18n("Open all bookmarks in this folder as new tabs.")); - connect(action, SIGNAL(triggered(bool)), this, SLOT(slotOpenFolderInTabs())); - parentMenu()->addAction(action); - } - } -} - - -void BookmarkMenu::actionHovered() -{ - KBookmarkActionInterface* action = dynamic_cast<KBookmarkActionInterface *>(sender()); - if (action) - Application::instance()->mainWindow()->notifyMessage(action->bookmark().url().url()); -} - - -// ------------------------------------------------------------------------------------------------------ - - -BookmarkToolBar::BookmarkToolBar( const QString &objectName, - QMainWindow *parentWindow, - Qt::ToolBarArea area, - bool newLine, - bool isMainToolBar, - bool readConfig - ) - : KToolBar(objectName, parentWindow, area, newLine, isMainToolBar, readConfig) - , m_filled(false) - , m_currentMenu(0) -{ - connect(Application::bookmarkProvider()->bookmarkManager(), SIGNAL(changed(QString,QString)), this, SLOT(hideMenu())); -} - - -BookmarkToolBar::~BookmarkToolBar() -{ -} - - -void BookmarkToolBar::setVisible(bool visible) -{ - if (visible && !m_filled) - { - m_filled = true; - Application::bookmarkProvider()->fillBookmarkBar(this); - } - KToolBar::setVisible(visible); -} - - -void BookmarkToolBar::menuDisplayed() -{ - qApp->installEventFilter(this); - m_currentMenu = qobject_cast<KMenu*>(sender()); -} - - -void BookmarkToolBar::menuHidden() -{ - qApp->removeEventFilter(this); - m_currentMenu = 0; -} - - -void BookmarkToolBar::hideMenu() -{ - if(m_currentMenu) - m_currentMenu->hide(); -} - - -bool BookmarkToolBar::eventFilter(QObject *watched, QEvent *event) -{ - // To switch root folders as in a menubar - if (event->type() == QEvent::MouseMove && m_currentMenu) - { - KBookmarkActionMenu* act = dynamic_cast<KBookmarkActionMenu *>(this->actionAt(this->mapFromGlobal(QCursor::pos()))); - if (act && act->menu() != m_currentMenu) - { - m_currentMenu->hide(); - QPoint pos = mapToGlobal(widgetForAction(act)->pos()); - act->menu()->popup(QPoint(pos.x(), pos.y() + widgetForAction(act)->height())); - } - } - return KToolBar::eventFilter(watched, event); -} - - -void BookmarkToolBar::actionHovered() -{ - KBookmarkActionInterface* action = dynamic_cast<KBookmarkActionInterface *>(sender()); - if (action) - Application::instance()->mainWindow()->notifyMessage(action->bookmark().url().url()); -} - -// ------------------------------------------------------------------------------------------------------ - - - BookmarkProvider::BookmarkProvider(QObject *parent) : QObject(parent) , m_manager(0) @@ -484,7 +288,7 @@ void BookmarkProvider::contextMenu(const QPoint &point) if (!action) return; - BookmarkContextMenu menu(action->bookmark(), bookmarkManager(), bookmarkOwner()); + BookmarksContextMenu menu(action->bookmark(), bookmarkManager(), bookmarkOwner()); menu.exec(bookmarkToolBar->mapToGlobal(point)); } diff --git a/src/bookmarks/bookmarksmanager.h b/src/bookmarks/bookmarksmanager.h index b084b8ee..6f97e4ef 100644 --- a/src/bookmarks/bookmarksmanager.h +++ b/src/bookmarks/bookmarksmanager.h @@ -38,6 +38,7 @@ #include "application.h" #include "urlresolver.h" #include "bookmarkspanel.h" +#include "bookmarkstoolbar.h" // Qt Includes #include <QWidget> @@ -137,79 +138,6 @@ signals: void openUrl(const KUrl &, const Rekonq::OpenType &); }; -// ------------------------------------------------------------------------------ - - -// KDE Includes -#include <KBookmarkMenu> - -/** - * This class represent the rekonq bookmarks menu. - * It's just a simple class inherited from KBookmarkMenu - * - */ -class BookmarkMenu : public KBookmarkMenu -{ - Q_OBJECT - -public: - BookmarkMenu(KBookmarkManager* manager, - KBookmarkOwner* owner, - KMenu* menu, - KActionCollection* actionCollection); - BookmarkMenu(KBookmarkManager *manager, - KBookmarkOwner *owner, - KMenu *parentMenu, - const QString &parentAddress); - ~BookmarkMenu(); - -protected: - virtual KMenu * contextMenu(QAction * act); - virtual void refill(); - virtual QAction* actionForBookmark(const KBookmark &bookmark); - -private slots: - void actionHovered(); - -private: - void addOpenFolderInTabs(); - -}; - - -// ------------------------------------------------------------------------------ - -#include <KToolBar> - -class BookmarkToolBar : public KToolBar -{ - Q_OBJECT - -public: -BookmarkToolBar(const QString &objectName, - QMainWindow *parentWindow, - Qt::ToolBarArea area, - bool newLine = false, - bool isMainToolBar = false, - bool readConfig = true); -~BookmarkToolBar(); - -virtual void setVisible(bool visible); - -protected: - bool eventFilter(QObject *watched, QEvent *event); - -private slots: - void actionHovered(); - void menuDisplayed(); - void menuHidden(); - void hideMenu(); - -private: - bool m_filled; - KMenu *m_currentMenu; -}; - // ------------------------------------------------------------------------------ diff --git a/src/bookmarks/bookmarkspanel.cpp b/src/bookmarks/bookmarkspanel.cpp index b49d4f5e..72778f7a 100644 --- a/src/bookmarks/bookmarkspanel.cpp +++ b/src/bookmarks/bookmarkspanel.cpp @@ -33,7 +33,7 @@ #include "bookmarksmanager.h" #include "bookmarkstreemodel.h" #include "bookmarksproxy.h" -#include "bookmarkcontextmenu.h" +#include "bookmarkscontextmenu.h" // Auto Includes #include "rekonq.h" @@ -201,7 +201,7 @@ void BookmarksPanel::contextMenu(const QPoint &pos) KBookmark selected = bookmarkForIndex(index); - BookmarkContextMenu menu( selected, + BookmarksContextMenu menu( selected, Application::bookmarkProvider()->bookmarkManager(), Application::bookmarkProvider()->bookmarkOwner(), this diff --git a/src/bookmarks/bookmarkstoolbar.cpp b/src/bookmarks/bookmarkstoolbar.cpp new file mode 100644 index 00000000..e9ab8a5a --- /dev/null +++ b/src/bookmarks/bookmarkstoolbar.cpp @@ -0,0 +1,432 @@ +/* ============================================================ +* +* This file is a part of the rekonq project +* +* Copyright (C) 2008-2010 by Andrea Diamantini <adjam7 at gmail dot com> +* Copyright (C) 2010 by Yoann Laissus <yoann dot laissus at gmail dot com> +* +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License as +* published by the Free Software Foundation; either version 2 of +* the License or (at your option) version 3 or any later version +* accepted by the membership of KDE e.V. (or its successor approved +* by the membership of KDE e.V.), which shall act as a proxy +* defined in Section 14 of version 3 of the license. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see <http://www.gnu.org/licenses/>. +* +* ============================================================ */ + + +// Self Includes +#include "bookmarkstoolbar.h" +#include "bookmarkstoolbar.moc" + +// Local Includes +#include "bookmarkscontextmenu.h" +#include "mainwindow.h" +#include "application.h" +#include "bookmarksmanager.h" + + +BookmarkMenu::BookmarkMenu(KBookmarkManager *manager, + KBookmarkOwner *owner, + KMenu *menu, + KActionCollection* actionCollection) + : KBookmarkMenu(manager, owner, menu, actionCollection) +{ +} + + +BookmarkMenu::BookmarkMenu(KBookmarkManager *manager, + KBookmarkOwner *owner, + KMenu *parentMenu, + const QString &parentAddress) + : KBookmarkMenu(manager, owner, parentMenu, parentAddress) +{ +} + + +BookmarkMenu::~BookmarkMenu() +{ +} + + +KMenu * BookmarkMenu::contextMenu(QAction *act) +{ + + KBookmarkActionInterface* action = dynamic_cast<KBookmarkActionInterface *>(act); + if (!action) + return 0; + return new BookmarksContextMenu(action->bookmark(), manager(), owner()); +} + + +QAction * BookmarkMenu::actionForBookmark(const KBookmark &bookmark) +{ + if (bookmark.isGroup()) + { + KBookmarkActionMenu *actionMenu = new KBookmarkActionMenu(bookmark, this); + BookmarkMenu *menu = new BookmarkMenu(manager(), owner(), actionMenu->menu(), bookmark.address()); + // An hack to get rid of bug 219274 + connect(actionMenu, SIGNAL(hovered()), menu, SLOT(slotAboutToShow())); + return actionMenu; + } + else if (bookmark.isSeparator()) + { + return KBookmarkMenu::actionForBookmark(bookmark); + } + else + { + KBookmarkAction *action = new KBookmarkAction(bookmark, owner(), this); + connect(action, SIGNAL(hovered()), this, SLOT(actionHovered())); + return action; + } +} + + +void BookmarkMenu::refill() +{ + clear(); + fillBookmarks(); + + if (parentMenu()->actions().count() > 0) + parentMenu()->addSeparator(); + + if (isRoot()) + { + addAddBookmark(); + addAddBookmarksList(); + addNewFolder(); + addEditBookmarks(); + } + else + { + addOpenFolderInTabs(); + addAddBookmark(); + addAddBookmarksList(); + addNewFolder(); + } +} + + +void BookmarkMenu::addOpenFolderInTabs() +{ + KAction *action; + KBookmarkGroup group = manager()->findByAddress(parentAddress()).toGroup(); + + if (!group.first().isNull()) + { + KBookmark bookmark = group.first(); + + while (bookmark.isGroup() || bookmark.isSeparator()) + { + bookmark = group.next(bookmark); + } + + if (!bookmark.isNull()) + { + action = new KAction(KIcon("tab-new"), i18n("Open Folder in Tabs"), this); + action->setHelpText(i18n("Open all bookmarks in this folder as new tabs.")); + connect(action, SIGNAL(triggered(bool)), this, SLOT(slotOpenFolderInTabs())); + parentMenu()->addAction(action); + } + } +} + + +void BookmarkMenu::actionHovered() +{ + KBookmarkActionInterface* action = dynamic_cast<KBookmarkActionInterface *>(sender()); + if (action) + Application::instance()->mainWindow()->notifyMessage(action->bookmark().url().url()); +} + + +// ------------------------------------------------------------------------------------------------------ + +#include <QActionEvent> + +BookmarkToolBar::BookmarkToolBar( const QString &objectName, + QMainWindow *parentWindow, + Qt::ToolBarArea area, + bool newLine, + bool isMainToolBar, + bool readConfig + ) + : KToolBar(objectName, parentWindow, area, newLine, isMainToolBar, readConfig) + , m_filled(false) + , m_currentMenu(0) + , m_dragAction(0) + , m_dropAction(0) +{ + connect(Application::bookmarkProvider()->bookmarkManager(), SIGNAL(changed(QString, QString)), this, SLOT(hideMenu())); + setAcceptDrops(true); +} + + +BookmarkToolBar::~BookmarkToolBar() +{ +} + + +void BookmarkToolBar::setVisible(bool visible) +{ + if (visible && !m_filled) + { + m_filled = true; + Application::bookmarkProvider()->fillBookmarkBar(this); + } + KToolBar::setVisible(visible); +} + + +void BookmarkToolBar::menuDisplayed() +{ + qApp->installEventFilter(this); + m_currentMenu = qobject_cast<KMenu*>(sender()); +} + + +void BookmarkToolBar::menuHidden() +{ + qApp->removeEventFilter(this); + m_currentMenu = 0; +} + + +void BookmarkToolBar::hideMenu() +{ + if(m_currentMenu) + m_currentMenu->hide(); +} + + +bool BookmarkToolBar::eventFilter(QObject *watched, QEvent *event) +{ + + if (m_currentMenu && m_currentMenu->isVisible()) + { + // To switch root folders as in a menubar + KBookmarkActionMenu* act = dynamic_cast<KBookmarkActionMenu *>(this->actionAt(this->mapFromGlobal(QCursor::pos()))); + if (event->type() == QEvent::MouseMove && act && m_currentMenu && act->menu() != m_currentMenu) + { + m_currentMenu->hide(); + QPoint pos = mapToGlobal(widgetForAction(act)->pos()); + act->menu()->popup(QPoint(pos.x(), pos.y() + widgetForAction(act)->height())); + } + } + else + { + // Drag handling + if (event->type() == QEvent::MouseButtonPress) + { + QPoint pos = mapFromGlobal(QCursor::pos()); + KBookmarkActionInterface* action = dynamic_cast<KBookmarkActionInterface *>(actionAt(pos)); + + if (action && !action->bookmark().isGroup()) + { + m_dragAction = actionAt(pos); + m_startDragPos = pos; + } + } + else if (event->type() == QEvent::MouseMove) + { + int distance = (mapFromGlobal(QCursor::pos()) - m_startDragPos).manhattanLength(); + if (distance >= QApplication::startDragDistance()) + { + startDrag(); + } + } + } + return KToolBar::eventFilter(watched, event); +} + + +void BookmarkToolBar::actionHovered() +{ + KBookmarkActionInterface* action = dynamic_cast<KBookmarkActionInterface *>(sender()); + if (action) + Application::instance()->mainWindow()->notifyMessage(action->bookmark().url().url()); +} + + +void BookmarkToolBar::actionEvent(QActionEvent *event) +{ + KToolBar::actionEvent(event); + + QWidget *widget = widgetForAction(event->action()); + if (!widget || event->action() == m_dropAction) + return; + + if (event->type() == QEvent::ActionAdded) + { + widget->installEventFilter(this); + } + else if (event->type() == QEvent::ActionRemoved) + { + widget->removeEventFilter(this); + } + else if (event->type() == QEvent::ParentChange) + { + widget->removeEventFilter(this); + } +} + + +void BookmarkToolBar::startDrag() +{ + KBookmarkActionInterface *action = dynamic_cast<KBookmarkActionInterface *>(m_dragAction); + if (action && !action->bookmark().isGroup()) + { + QMimeData *mimeData = new QMimeData; + + QByteArray address = action->bookmark().address().toLatin1(); + mimeData->setData("application/rekonq-bookmark", address); + action->bookmark().populateMimeData(mimeData); + + QDrag *drag = new QDrag(this); + drag->setMimeData(mimeData); + drag->setPixmap(KIcon(action->bookmark().icon()).pixmap(24, 24)); + + drag->start(Qt::MoveAction); + connect(drag, SIGNAL(destroyed()), this, SLOT(dragDestroyed())); + } +} + + +void BookmarkToolBar::dragEnterEvent(QDragEnterEvent *event) +{ + if (event->mimeData()->hasFormat("application/rekonq-bookmark")) + { + QByteArray addresses = event->mimeData()->data("application/rekonq-bookmark"); + KBookmark bookmark = Application::bookmarkProvider()->bookmarkManager()->findByAddress(QString::fromLatin1(addresses.data())); + + if (!bookmark.isNull()) + { + QFrame* dropIndicatorWidget = new QFrame(this); + dropIndicatorWidget->setFrameShape(QFrame::VLine); + m_dropAction = insertWidget(actionAt(event->pos()), dropIndicatorWidget); + + event->accept(); + } + } + + KToolBar::dragEnterEvent(event); +} + + +void BookmarkToolBar::dragMoveEvent(QDragMoveEvent *event) +{ + if (event->mimeData()->hasFormat("application/rekonq-bookmark")) + { + QByteArray addresses = event->mimeData()->data("application/rekonq-bookmark"); + KBookmark bookmark = Application::bookmarkProvider()->bookmarkManager()->findByAddress(QString::fromLatin1(addresses.data())); + QAction *overAction = actionAt(event->pos()); + KBookmarkActionInterface *overActionBK = dynamic_cast<KBookmarkActionInterface*>(overAction); + QWidget *widgetAction = widgetForAction(overAction); + + if (!bookmark.isNull() && overAction != m_dropAction && overActionBK && widgetAction && m_dropAction) + { + removeAction(m_dropAction); + + if ((event->pos().x() - widgetAction->pos().x()) > (widgetAction->width() / 2)) + { + if (actions().count() > actions().indexOf(overAction) + 1) + { + insertAction(actions().at(actions().indexOf(overAction) + 1), m_dropAction); + } + else + { + addAction(m_dropAction); + } + } + else + { + insertAction(overAction, m_dropAction); + } + + event->accept(); + } + } + + KToolBar::dragMoveEvent(event); +} + + +void BookmarkToolBar::dragLeaveEvent(QDragLeaveEvent *event) +{ + delete m_dropAction; + m_dropAction = 0; + event->accept(); + KToolBar::dragLeaveEvent(event); +} + + +void BookmarkToolBar::dropEvent(QDropEvent *event) +{ + if (event->mimeData()->hasFormat("application/rekonq-bookmark")) + { + QByteArray addresses = event->mimeData()->data("application/rekonq-bookmark"); + KBookmark bookmark = Application::bookmarkProvider()->bookmarkManager()->findByAddress(QString::fromLatin1(addresses.data())); + + QAction *destAction = actionAt(event->pos()); + if (destAction && destAction == m_dropAction) + { + if (actions().indexOf(m_dropAction) > 0) + { + destAction = actions().at(actions().indexOf(m_dropAction) - 1); + } + else + { + destAction = actions().at(1); + } + } + + KBookmarkActionInterface *destBookmarkAction = dynamic_cast<KBookmarkActionInterface *>(destAction); + QWidget *widgetAction = widgetForAction(destAction); + + if (!bookmark.isNull() && destBookmarkAction && !destBookmarkAction->bookmark().isNull() && widgetAction) + { + KBookmarkGroup root = Application::bookmarkProvider()->rootGroup(); + KBookmark destBookmark = destBookmarkAction->bookmark(); + // To fix an issue with panel's drags + root.deleteBookmark(bookmark); + + if ((event->pos().x() - widgetAction->pos().x()) > (widgetAction->width() / 2)) + { + root.moveBookmark(bookmark, destBookmark); + } + else + { + root.moveBookmark(bookmark, destBookmark.parentGroup().previous(destBookmark)); + } + + Application::bookmarkProvider()->bookmarkManager()->emitChanged(); + event->accept(); + } + } + + KToolBar::dropEvent(event); +} + + +void BookmarkToolBar::dragDestroyed() +{ + // A workaround to get rid of the checked state of the dragged action + if (m_dragAction) + { + m_dragAction->setVisible(false); + m_dragAction->setVisible(true); + m_dragAction = 0; + } + delete m_dropAction; + m_dropAction = 0; +} diff --git a/src/bookmarks/bookmarkstoolbar.h b/src/bookmarks/bookmarkstoolbar.h new file mode 100644 index 00000000..cf7b62cc --- /dev/null +++ b/src/bookmarks/bookmarkstoolbar.h @@ -0,0 +1,120 @@ +/* ============================================================ +* +* This file is a part of the rekonq project +* +* Copyright (C) 2008-2010 by Andrea Diamantini <adjam7 at gmail dot com> +* Copyright (C) 2010 by Yoann Laissus <yoann dot laissus at gmail dot com> +* +* +* This program is free software; you can redistribute it and/or +* modify it under the terms of the GNU General Public License as +* published by the Free Software Foundation; either version 2 of +* the License or (at your option) version 3 or any later version +* accepted by the membership of KDE e.V. (or its successor approved +* by the membership of KDE e.V.), which shall act as a proxy +* defined in Section 14 of version 3 of the license. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see <http://www.gnu.org/licenses/>. +* +* ============================================================ */ + +#ifndef BOOKMARKSTOOLBAR_H +#define BOOKMARKSTOOLBAR_H + +// Local Includes + + +// Qt Includes + + +// KDE Includes +#include <KBookmarkMenu> +#include <KToolBar> + + + +/** + * This class represent the rekonq bookmarks menu. + * It's just a simple class inherited from KBookmarkMenu + * + */ +class BookmarkMenu : public KBookmarkMenu +{ + Q_OBJECT + +public: + BookmarkMenu(KBookmarkManager* manager, + KBookmarkOwner* owner, + KMenu* menu, + KActionCollection* actionCollection); + BookmarkMenu(KBookmarkManager *manager, + KBookmarkOwner *owner, + KMenu *parentMenu, + const QString &parentAddress); + ~BookmarkMenu(); + +protected: + virtual KMenu * contextMenu(QAction * act); + virtual void refill(); + virtual QAction* actionForBookmark(const KBookmark &bookmark); + +private slots: + void actionHovered(); + +private: + void addOpenFolderInTabs(); + +}; + + +// ------------------------------------------------------------------------------ + +#include <KToolBar> + +class BookmarkToolBar : public KToolBar +{ + Q_OBJECT + +public: +BookmarkToolBar(const QString &objectName, + QMainWindow *parentWindow, + Qt::ToolBarArea area, + bool newLine = false, + bool isMainToolBar = false, + bool readConfig = true); +~BookmarkToolBar(); + +virtual void setVisible(bool visible); + +protected: + bool eventFilter(QObject *watched, QEvent *event); + void dragEnterEvent(QDragEnterEvent *event); + void dragMoveEvent(QDragMoveEvent *event); + void dragLeaveEvent(QDragLeaveEvent *event); + void dropEvent(QDropEvent *event); + void actionEvent(QActionEvent *event); + +private slots: + void actionHovered(); + void menuDisplayed(); + void menuHidden(); + void hideMenu(); + void dragDestroyed(); + +private: + void startDrag(); + + bool m_filled; + KMenu *m_currentMenu; + QPoint m_startDragPos; + QAction *m_dragAction; + QAction *m_dropAction; +}; + +#endif // BOOKMARKSTOOLBAR_H |