┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPeter Penz <[email protected]>2007-03-15 22:42:21 +0000
committerPeter Penz <[email protected]>2007-03-15 22:42:21 +0000
commit1cdb64a12bf5e6f3b97d38992799ba6bfbb06ef5 (patch)
treea037da905c5c5b39c3dc5719f428f325091c1efe /src
parent242bda1eaddd863b12afe8f3da7cf11d98475ccb (diff)
Don't force the context menu to be valid only for DolphinView instances, make it possible to have it also inside the treeview sidebar.
svn path=/trunk/KDE/kdebase/apps/; revision=642953
Diffstat (limited to 'src')
-rw-r--r--src/dolphincontextmenu.cpp119
-rw-r--r--src/dolphincontextmenu.h46
-rw-r--r--src/dolphinview.cpp5
-rw-r--r--src/treeviewsidebarpage.cpp51
-rw-r--r--src/treeviewsidebarpage.h3
5 files changed, 136 insertions, 88 deletions
diff --git a/src/dolphincontextmenu.cpp b/src/dolphincontextmenu.cpp
index f6ee7c78f..915f7e3e1 100644
--- a/src/dolphincontextmenu.cpp
+++ b/src/dolphincontextmenu.cpp
@@ -45,37 +45,38 @@
#include <QDir>
-DolphinContextMenu::DolphinContextMenu(DolphinView* parent,
- KFileItem* fileInfo) :
- m_dolphinView(parent),
- m_fileInfo(fileInfo),
- m_context(NoContext)
+DolphinContextMenu::DolphinContextMenu(DolphinMainWindow* parent,
+ KFileItem* fileInfo,
+ const KUrl& baseUrl,
+ KFileItemList selectedItems) :
+ m_mainWindow(parent),
+ m_fileInfo(fileInfo),
+ m_baseUrl(baseUrl),
+ m_selectedItems(selectedItems),
+ m_context(NoContext)
{
+ // The context menu either accesses the URLs of the selected items
+ // or the items itself. To increase the performance the URLs are cached.
+ KFileItemList::const_iterator it = selectedItems.begin();
+ const KFileItemList::const_iterator end = selectedItems.end();
+ while (it != end) {
+ KFileItem* item = *it;
+ m_selectedUrls.append(item->url());
+ ++it;
+ }
}
void DolphinContextMenu::open()
{
// get the context information
- const KUrl& url = m_dolphinView->url();
- if (url.protocol() == "trash") {
+ if (m_baseUrl.protocol() == "trash") {
m_context |= TrashContext;
}
if (m_fileInfo != 0) {
m_context |= ItemContext;
-
// TODO: handle other use cases like devices + desktop files
- /*
- const KUrl::List urls = m_dolphinView->selectedUrls();
-
- KUrl::List::const_iterator it = urls.begin();
- KUrl::List::const_iterator end = urls.end();
- while (it != end) {
- const KUrl& url = *it;
-
- ++it;
- }*/
- }
+ }
// open the corresponding popup for the context
if (m_context & TrashContext) {
@@ -103,26 +104,25 @@ void DolphinContextMenu::openTrashContextMenu()
{
Q_ASSERT(m_context & TrashContext);
- KMenu* popup = new KMenu(m_dolphinView);
+ KMenu* popup = new KMenu(m_mainWindow);
QAction* emptyTrashAction = new QAction(KIcon("user-trash"), i18n("Emtpy Trash"), popup);
KConfig trashConfig("trashrc", KConfig::OnlyLocal);
emptyTrashAction->setEnabled(!trashConfig.group("Status").readEntry("Empty", true));
popup->addAction(emptyTrashAction);
- DolphinMainWindow* mainWindow = m_dolphinView->mainWindow();
- QAction* propertiesAction = mainWindow->actionCollection()->action("properties");
+ QAction* propertiesAction = m_mainWindow->actionCollection()->action("properties");
popup->addAction(propertiesAction);
if (popup->exec(QCursor::pos()) == emptyTrashAction) {
const QString text(i18n("Do you really want to empty the Trash? All items will get deleted."));
- const bool del = KMessageBox::warningContinueCancel(mainWindow,
+ const bool del = KMessageBox::warningContinueCancel(m_mainWindow,
text,
QString(),
KGuiItem(i18n("Empty Trash"), KIcon("user-trash"))
) == KMessageBox::Continue;
if (del) {
- KonqOperations::emptyTrash(m_dolphinView);
+ KonqOperations::emptyTrash(m_mainWindow);
}
}
@@ -134,21 +134,19 @@ void DolphinContextMenu::openTrashItemContextMenu()
Q_ASSERT(m_context & TrashContext);
Q_ASSERT(m_context & ItemContext);
- KMenu* popup = new KMenu(m_dolphinView);
+ KMenu* popup = new KMenu(m_mainWindow);
- DolphinMainWindow* mainWindow = m_dolphinView->mainWindow();
- QAction* restoreAction = new QAction(i18n("Restore"), m_dolphinView);
+ QAction* restoreAction = new QAction(i18n("Restore"), m_mainWindow);
popup->addAction(restoreAction);
- QAction* deleteAction = mainWindow->actionCollection()->action("delete");
+ QAction* deleteAction = m_mainWindow->actionCollection()->action("delete");
popup->addAction(deleteAction);
- QAction* propertiesAction = mainWindow->actionCollection()->action("properties");
+ QAction* propertiesAction = m_mainWindow->actionCollection()->action("properties");
popup->addAction(propertiesAction);
if (popup->exec(QCursor::pos()) == restoreAction) {
- const KUrl::List urls = m_dolphinView->selectedUrls();
- KonqOperations::restoreTrashedItems(urls, m_dolphinView);
+ KonqOperations::restoreTrashedItems(m_selectedUrls, m_mainWindow);
}
popup->deleteLater();
@@ -158,15 +156,12 @@ void DolphinContextMenu::openItemContextMenu()
{
Q_ASSERT(m_fileInfo != 0);
- KMenu* popup = new KMenu(m_dolphinView);
+ KMenu* popup = new KMenu(m_mainWindow);
insertDefaultItemActions(popup);
- DolphinMainWindow* mainWindow = m_dolphinView->mainWindow();
- const KUrl::List urls = m_dolphinView->selectedUrls();
-
// insert 'Bookmark this folder' entry if exactly one item is selected
QAction* bookmarkAction = 0;
- if (m_fileInfo->isDir() && (urls.count() == 1)) {
+ if (m_fileInfo->isDir() && (m_selectedUrls.count() == 1)) {
bookmarkAction = popup->addAction(KIcon("bookmark-folder"), i18n("Bookmark this folder"));
}
@@ -180,7 +175,7 @@ void DolphinContextMenu::openItemContextMenu()
popup->addSeparator();
// insert 'Properties...' entry
- QAction* propertiesAction = mainWindow->actionCollection()->action("properties");
+ QAction* propertiesAction = m_mainWindow->actionCollection()->action("properties");
popup->addAction(propertiesAction);
QAction* activatedAction = popup->exec(QCursor::pos());
@@ -201,18 +196,18 @@ void DolphinContextMenu::openItemContextMenu()
else if (serviceActions.contains(activatedAction)) {
// one of the 'Actions' items has been selected
int id = serviceActions.indexOf(activatedAction);
- KDEDesktopMimeType::executeService(urls, actionsVector[id]);
+ KDEDesktopMimeType::executeService(m_selectedUrls, actionsVector[id]);
}
else if (openWithActions.contains(activatedAction)) {
// one of the 'Open With' items has been selected
if (openWithActions.last() == activatedAction) {
// the item 'Other...' has been selected
- KRun::displayOpenWithDialog(urls, m_dolphinView);
+ KRun::displayOpenWithDialog(m_selectedUrls, m_mainWindow);
}
else {
int id = openWithActions.indexOf(activatedAction);
KService::Ptr servicePtr = openWithVector[id];
- KRun::run(*servicePtr, urls, m_dolphinView);
+ KRun::run(*servicePtr, m_selectedUrls, m_mainWindow);
}
}
@@ -224,29 +219,28 @@ void DolphinContextMenu::openItemContextMenu()
void DolphinContextMenu::openViewportContextMenu()
{
Q_ASSERT(m_fileInfo == 0);
- DolphinMainWindow* mainWindow = m_dolphinView->mainWindow();
- KMenu* popup = new KMenu(m_dolphinView);
+ KMenu* popup = new KMenu(m_mainWindow);
// setup 'Create New' menu
- KNewMenu* newMenu = mainWindow->newMenu();
+ KNewMenu* newMenu = m_mainWindow->newMenu();
newMenu->slotCheckUpToDate();
- newMenu->setPopupFiles(m_dolphinView->url());
+ newMenu->setPopupFiles(m_baseUrl);
popup->addMenu(newMenu->menu());
popup->addSeparator();
- QAction* pasteAction = mainWindow->actionCollection()->action(KStandardAction::stdName(KStandardAction::Paste));
+ QAction* pasteAction = m_mainWindow->actionCollection()->action(KStandardAction::stdName(KStandardAction::Paste));
popup->addAction(pasteAction);
// setup 'View Mode' menu
KMenu* viewModeMenu = new KMenu(i18n("View Mode"));
- QAction* iconsMode = mainWindow->actionCollection()->action("icons");
+ QAction* iconsMode = m_mainWindow->actionCollection()->action("icons");
viewModeMenu->addAction(iconsMode);
- QAction* detailsMode = mainWindow->actionCollection()->action("details");
+ QAction* detailsMode = m_mainWindow->actionCollection()->action("details");
viewModeMenu->addAction(detailsMode);
- QAction* previewsMode = mainWindow->actionCollection()->action("previews");
+ QAction* previewsMode = m_mainWindow->actionCollection()->action("previews");
viewModeMenu->addAction(previewsMode);
popup->addMenu(viewModeMenu);
@@ -259,10 +253,10 @@ void DolphinContextMenu::openViewportContextMenu()
QAction* activatedAction = popup->exec(QCursor::pos());
if (activatedAction == propertiesAction) {
- new KPropertiesDialog(mainWindow->activeView()->url());
+ new KPropertiesDialog(m_mainWindow->activeView()->url());
}
else if (activatedAction == bookmarkAction) {
- const KUrl& url = mainWindow->activeView()->url();
+ const KUrl& url = m_mainWindow->activeView()->url();
KBookmark bookmark = EditBookmarkDialog::getBookmark(i18n("Add folder as bookmark"),
url.fileName(),
url,
@@ -282,9 +276,6 @@ void DolphinContextMenu::insertDefaultItemActions(KMenu* popup)
{
Q_ASSERT(popup != 0);
- DolphinMainWindow* mainWindow = m_dolphinView->mainWindow();
- const KUrl::List urls = m_dolphinView->selectedUrls();
-
// insert 'Cut', 'Copy' and 'Paste'
const KStandardAction::StandardAction actionNames[] = {
KStandardAction::Cut,
@@ -294,7 +285,7 @@ void DolphinContextMenu::insertDefaultItemActions(KMenu* popup)
const int count = sizeof(actionNames) / sizeof(KStandardAction::StandardAction);
for (int i = 0; i < count; ++i) {
- QAction* action = mainWindow->actionCollection()->action(KStandardAction::stdName(actionNames[i]));
+ QAction* action = m_mainWindow->actionCollection()->action(KStandardAction::stdName(actionNames[i]));
if (action != 0) {
popup->addAction(action);
}
@@ -302,16 +293,16 @@ void DolphinContextMenu::insertDefaultItemActions(KMenu* popup)
popup->addSeparator();
// insert 'Rename'
- QAction* renameAction = mainWindow->actionCollection()->action("rename");
+ QAction* renameAction = m_mainWindow->actionCollection()->action("rename");
popup->addAction(renameAction);
// insert 'Move to Trash' and (optionally) 'Delete'
const KSharedConfig::Ptr globalConfig = KSharedConfig::openConfig("kdeglobals", KConfig::NoGlobals);
const KConfigGroup kdeConfig(globalConfig, "KDE");
bool showDeleteCommand = kdeConfig.readEntry("ShowDeleteCommand", false);
- const KUrl& url = mainWindow->activeView()->url();
+ const KUrl& url = m_mainWindow->activeView()->url();
if (url.isLocalFile()) {
- QAction* moveToTrashAction = mainWindow->actionCollection()->action("move_to_trash");
+ QAction* moveToTrashAction = m_mainWindow->actionCollection()->action("move_to_trash");
popup->addAction(moveToTrashAction);
}
else {
@@ -319,7 +310,7 @@ void DolphinContextMenu::insertDefaultItemActions(KMenu* popup)
}
if (showDeleteCommand) {
- QAction* deleteAction = mainWindow->actionCollection()->action("delete");
+ QAction* deleteAction = m_mainWindow->actionCollection()->action("delete");
popup->addAction(deleteAction);
}
}
@@ -336,12 +327,10 @@ QList<QAction*> DolphinContextMenu::insertOpenWithItems(KMenu* popup,
// are listed which are registered to open the item. As last entry "Other..." will be
// attached which allows to select a custom application. If no applications are registered
// no sub menu is created at all, only "Open With..." will be offered.
- const KFileItemList list = m_dolphinView->selectedItems();
-
bool insertOpenWithItems = true;
const QString contextMimeType(m_fileInfo->mimetype());
- QListIterator<KFileItem*> mimeIt(list);
+ QListIterator<KFileItem*> mimeIt(m_selectedItems);
while (insertOpenWithItems && mimeIt.hasNext()) {
KFileItem* item = mimeIt.next();
insertOpenWithItems = (contextMimeType == item->mimetype());
@@ -433,9 +422,7 @@ QList<QAction*> DolphinContextMenu::insertActionItems(KMenu* popup,
if ((*it) == "all/allfiles") {
// The service type is valid for all files, but not for directories.
// Check whether the selected items only consist of files...
- const KFileItemList list = m_dolphinView->selectedItems();
-
- QListIterator<KFileItem*> mimeIt(list);
+ QListIterator<KFileItem*> mimeIt(m_selectedItems);
insert = true;
while (insert && mimeIt.hasNext()) {
KFileItem* item = mimeIt.next();
@@ -447,9 +434,7 @@ QList<QAction*> DolphinContextMenu::insertActionItems(KMenu* popup,
// Check whether the MIME types of all selected files match
// to the mimetype of the service action. As soon as one MIME
// type does not match, no service menu is shown at all.
- const KFileItemList list = m_dolphinView->selectedItems();
-
- QListIterator<KFileItem*> mimeIt(list);
+ QListIterator<KFileItem*> mimeIt(m_selectedItems);
insert = true;
while (insert && mimeIt.hasNext()) {
KFileItem* item = mimeIt.next();
diff --git a/src/dolphincontextmenu.h b/src/dolphincontextmenu.h
index ac9a19d7c..7e3476a4c 100644
--- a/src/dolphincontextmenu.h
+++ b/src/dolphincontextmenu.h
@@ -1,6 +1,5 @@
/***************************************************************************
- * Copyright (C) 2006 by Peter Penz *
+ * Copyright (C) 2006 by Peter Penz <[email protected]> *
* *
* 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 *
@@ -21,22 +20,22 @@
#ifndef DOLPHINCONTEXTMENU_H
#define DOLPHINCONTEXTMENU_H
+#include <kdedesktopmimetype.h>
+#include <kfileitem.h>
+#include <kservice.h>
+#include <kurl.h>
+
#include <QString>
#include <QVector>
-#include <kservice.h>
-#include <kpropertiesdialog.h>
-#include <kdedesktopmimetype.h>
-
class KMenu;
class KFileItem;
-class QPoint;
-class QWidget;
-class DolphinView;
+class QAction;
+class DolphinMainWindow;
/**
* @brief Represents the context menu which appears when doing a right
- * click on an item or the viewport of the file manager.
+ * click on an item or the viewport of the file manager.
*
* Beside static menu entries (e. g. 'Paste' or 'Properties') two
* dynamic sub menus are shown when opening a context menu above
@@ -45,21 +44,25 @@ class DolphinView;
* open items of the given MIME type.
* - 'Actions': Contains all actions which can be applied to the
* given item.
- *
- * @author Peter Penz <[email protected]>
*/
class DolphinContextMenu
{
public:
/**
- * @parent Pointer to the dolphin view the context menu
- * belongs to.
- * @fileInfo Pointer to the file item the context menu
- * is applied. If 0 is passed, the context menu
- * is above the viewport.
+ * @parent Pointer to the main window the context menu
+ * belongs to.
+ * @fileInfo Pointer to the file item the context menu
+ * is applied. If 0 is passed, the context menu
+ * is above the viewport.
+ * @baseUrl Base URL of the viewport where the context menu
+ * should be opened.
+ * @selectedItems Selected items where the actions of the context menu
+ * are applied.
*/
- DolphinContextMenu(DolphinView* parent,
- KFileItem* fileInfo);
+ DolphinContextMenu(DolphinMainWindow* parent,
+ KFileItem* fileInfo,
+ const KUrl& baseUrl,
+ KFileItemList selectedItems);
virtual ~DolphinContextMenu();
@@ -120,8 +123,11 @@ private:
TrashContext = 2
};
- DolphinView* m_dolphinView;
+ DolphinMainWindow* m_mainWindow;
KFileItem* m_fileInfo;
+ KUrl m_baseUrl;
+ KFileItemList m_selectedItems;
+ KUrl::List m_selectedUrls;
int m_context;
};
diff --git a/src/dolphinview.cpp b/src/dolphinview.cpp
index da8aa3c82..8f06d3dc8 100644
--- a/src/dolphinview.cpp
+++ b/src/dolphinview.cpp
@@ -973,7 +973,10 @@ void DolphinView::openContextMenu(const QPoint& pos)
item = fileItem(index);
}
- DolphinContextMenu contextMenu(this, item);
+ DolphinContextMenu contextMenu(m_mainWindow,
+ item,
+ url(),
+ selectedItems());
contextMenu.open();
}
diff --git a/src/treeviewsidebarpage.cpp b/src/treeviewsidebarpage.cpp
index c605babf0..65b0687e8 100644
--- a/src/treeviewsidebarpage.cpp
+++ b/src/treeviewsidebarpage.cpp
@@ -20,6 +20,7 @@
#include "treeviewsidebarpage.h"
#include "bookmarkselector.h"
+#include "dolphincontextmenu.h"
#include "dolphinmainwindow.h"
#include "dolphinsortfilterproxymodel.h"
#include "dolphinview.h"
@@ -103,6 +104,56 @@ void TreeViewSidebarPage::showEvent(QShowEvent* event)
connectToActiveView();
}
+void TreeViewSidebarPage::contextMenuEvent(QContextMenuEvent* event)
+{
+ SidebarPage::contextMenuEvent(event);
+
+ // TODO: temporary deactivate the following code, as the wrong
+ // selection of cut/copy/paste actions is very confusing:
+ return;
+
+ KFileItem* item = 0;
+
+ const QModelIndex index = m_treeView->indexAt(event->pos());
+ if (!index.isValid()) {
+ // only open a context menu above a directory item
+ return;
+ }
+
+#if defined(USE_PROXY_MODEL)
+ const QModelIndex dirModelIndex = m_proxyModel->mapToSource(index);
+ item = m_dirModel->itemForIndex(dirModelIndex);
+#else
+ item = m_dirModel->itemForIndex(index);
+#endif
+
+#if defined(USE_PROXY_MODEL)
+ const QItemSelection selection = m_proxyModel->mapSelectionToSource(
+ m_treeView->selectionModel()->selection());
+#else
+ const QItemSelection selection = m_treeView->selectionModel()->selection();
+#endif
+
+ KFileItemList selectedItems;
+
+ const QModelIndexList indexList = selection.indexes();
+ QModelIndexList::const_iterator end = indexList.end();
+ for (QModelIndexList::const_iterator it = indexList.begin(); it != end; ++it) {
+ Q_ASSERT((*it).isValid());
+
+ KFileItem* item = m_dirModel->itemForIndex(*it);
+ if (item != 0) {
+ selectedItems.append(item);
+ }
+ }
+
+ DolphinContextMenu contextMenu(mainWindow(),
+ item,
+ m_dirLister->url(),
+ selectedItems);
+ contextMenu.open();
+}
+
void TreeViewSidebarPage::updateSelection(const KUrl& url)
{
if (!url.isValid() || (url == m_selectedUrl)) {
diff --git a/src/treeviewsidebarpage.h b/src/treeviewsidebarpage.h
index 7a4541cb3..c8aec9e4e 100644
--- a/src/treeviewsidebarpage.h
+++ b/src/treeviewsidebarpage.h
@@ -52,6 +52,9 @@ protected:
/** @see QWidget::showEvent() */
virtual void showEvent(QShowEvent* event);
+ /** @see QWidget::contextMenuEvent() */
+ virtual void contextMenuEvent(QContextMenuEvent* event);
+
private slots:
/**
* Updates the current selection inside the tree to