]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/dolphincontextmenu.cpp
- Use less separators
[dolphin.git] / src / dolphincontextmenu.cpp
index 7d195df6694d6130763de2bcb250e479ff6c9e21..a36d1aeb06a174227942a67cd668db9c68940636 100644 (file)
@@ -37,6 +37,7 @@
 #include <kmenubar.h>
 #include <kmessagebox.h>
 #include <kmimetypetrader.h>
+#include <kmodifierkeyinfo.h>
 #include <knewfilemenu.h>
 #include <konqmimedata.h>
 #include <konq_operations.h>
@@ -53,6 +54,8 @@
 #include "views/dolphinview.h"
 #include "views/viewmodecontroller.h"
 
+K_GLOBAL_STATIC(KModifierKeyInfo, m_keyInfo)
+
 DolphinContextMenu::DolphinContextMenu(DolphinMainWindow* parent,
                                        const KFileItem& fileInfo,
                                        const KUrl& baseUrl) :
@@ -64,8 +67,8 @@ DolphinContextMenu::DolphinContextMenu(DolphinMainWindow* parent,
     m_copyToMenu(parent),
     m_customActions(),
     m_popup(new KMenu(m_mainWindow)),
-    m_showDeleteCommand(false),
-    m_shiftIsPressed(false)
+    m_shiftPressed(false),
+    m_removeAction(0)
 {
     // The context menu either accesses the URLs of the selected items
     // or the items itself. To increase the performance both lists are cached.
@@ -73,7 +76,16 @@ DolphinContextMenu::DolphinContextMenu(DolphinMainWindow* parent,
     m_selectedUrls = view->selectedUrls();
     m_selectedItems = view->selectedItems();
 
-    m_showDeleteCommand = KGlobal::config()->group("KDE").readEntry("ShowDeleteCommand", false);
+    if (m_keyInfo != 0) {
+        if (m_keyInfo->isKeyPressed(Qt::Key_Shift) || m_keyInfo->isKeyLatched(Qt::Key_Shift)) {
+            m_shiftPressed = true;
+        }
+        connect(m_keyInfo, SIGNAL(keyPressed(Qt::Key, bool)),
+                this, SLOT(slotKeyModifierPressed(Qt::Key, bool)));
+    }
+
+    m_removeAction = new QAction(this);
+    connect(m_removeAction, SIGNAL(triggered()), this, SLOT(slotRemoveActionTriggered()));
 }
 
 DolphinContextMenu::~DolphinContextMenu()
@@ -90,7 +102,7 @@ void DolphinContextMenu::setCustomActions(const QList<QAction*>& actions)
 void DolphinContextMenu::open()
 {
     // get the context information
-    if (m_baseUrl.protocol() == "trash") {
+    if (m_baseUrl.protocol() == QLatin1String("trash")) {
         m_context |= TrashContext;
     }
 
@@ -114,6 +126,30 @@ void DolphinContextMenu::open()
     }
 }
 
+void DolphinContextMenu::initializeModifierKeyInfo()
+{
+    // Access m_keyInfo, so that it gets instantiated by
+    // K_GLOBAL_STATIC
+    KModifierKeyInfo* keyInfo = m_keyInfo;
+    Q_UNUSED(keyInfo);
+}
+
+void DolphinContextMenu::slotKeyModifierPressed(Qt::Key key, bool pressed)
+{
+    m_shiftPressed = (key == Qt::Key_Shift) && pressed;
+    updateRemoveAction();
+}
+
+void DolphinContextMenu::slotRemoveActionTriggered()
+{
+    const KActionCollection* collection = m_mainWindow->actionCollection();
+    if (m_shiftPressed) {
+        collection->action("delete")->trigger();
+    } else {
+        collection->action("move_to_trash")->trigger();
+    }
+}
+
 void DolphinContextMenu::openTrashContextMenu()
 {
     Q_ASSERT(m_context & TrashContext);
@@ -183,6 +219,7 @@ void DolphinContextMenu::openItemContextMenu()
 {
     Q_ASSERT(!m_fileInfo.isNull());
 
+    QAction* addToPlacesAction = 0;
     if (m_fileInfo.isDir() && (m_selectedUrls.count() == 1)) {
         // setup 'Create New' menu
         DolphinNewFileMenu* newFileMenu = new DolphinNewFileMenu(m_popup.data(), m_mainWindow);
@@ -201,6 +238,14 @@ void DolphinContextMenu::openItemContextMenu()
         // insert 'Open in new window' and 'Open in new tab' entries
         m_popup->addAction(m_mainWindow->actionCollection()->action("open_in_new_window"));
         m_popup->addAction(m_mainWindow->actionCollection()->action("open_in_new_tab"));
+
+        // insert 'Add to Places' entry
+        if (!placeExists(m_fileInfo.url())) {
+            addToPlacesAction = m_popup->addAction(KIcon("bookmark-new"),
+                                                   i18nc("@action:inmenu Add selected folder to places",
+                                                         "Add to Places"));
+        }
+
         m_popup->addSeparator();
     }
     addShowMenubarAction();
@@ -219,14 +264,6 @@ void DolphinContextMenu::openItemContextMenu()
         m_copyToMenu.setItems(m_selectedItems);
         m_copyToMenu.setReadOnly(!capabilities().supportsWriting());
         m_copyToMenu.addActionsTo(m_popup.data());
-        m_popup->addSeparator();
-    }
-
-    // insert 'Add to Places' entry if exactly one item is selected
-    QAction* addToPlacesAction = 0;
-    if (m_fileInfo.isDir() && (m_selectedUrls.count() == 1) && !placeExists(m_fileInfo.url())) {
-        addToPlacesAction = m_popup->addAction(KIcon("bookmark-new"),
-                                             i18nc("@action:inmenu Add selected folder to places", "Add to Places"));
     }
 
     // insert 'Properties...' entry
@@ -305,13 +342,9 @@ void DolphinContextMenu::insertDefaultItemActions()
 {
     const KActionCollection* collection = m_mainWindow->actionCollection();
 
-    // Cut action
+    // Insert 'Cut', 'Copy' and 'Paste'
     m_popup->addAction(collection->action(KStandardAction::name(KStandardAction::Cut)));
-
-    // Copy action
     m_popup->addAction(collection->action(KStandardAction::name(KStandardAction::Copy)));
-
-    // Paste action
     m_popup->addAction(createPasteAction());
 
     m_popup->addSeparator();
@@ -320,26 +353,14 @@ void DolphinContextMenu::insertDefaultItemActions()
     QAction* renameAction = collection->action("rename");
     m_popup->addAction(renameAction);
 
-    // Insert move to trash and delete. We need to insert both because both can be visible.
-    m_popup->addAction(collection->action("move_to_trash"));
-    m_popup->addAction(collection->action("delete"));
-
-    const KUrl& url = m_mainWindow->activeViewContainer()->url();
-    if (url.isLocalFile()) {
-        collection->action("move_to_trash")->setVisible(true);
-        collection->action("delete")->setVisible(false);
+    // Insert 'Move to Trash' and/or 'Delete'
+    if (KGlobal::config()->group("KDE").readEntry("ShowDeleteCommand", false)) {
+        m_popup->addAction(collection->action("move_to_trash"));
+        m_popup->addAction(collection->action("delete"));
     } else {
-        collection->action("delete")->setVisible(true);
+        m_popup->addAction(m_removeAction);
+        updateRemoveAction();
     }
-
-    if(m_showDeleteCommand) {
-        collection->action("delete")->setVisible(true);
-    }
-
-    if(m_shiftIsPressed) {
-        deleteOrTrashMenuEntry(Qt::Key_Shift, m_shiftIsPressed);
-    }
-
 }
 
 void DolphinContextMenu::addShowMenubarAction()
@@ -408,9 +429,7 @@ void DolphinContextMenu::addServiceActions(KFileItemActions& fileItemActions)
     fileItemActions.addOpenWithActionsTo(m_popup.data(), "DesktopEntryName != 'dolphin'");
 
     // insert 'Actions' sub menu
-    if (fileItemActions.addServiceActionsTo(m_popup.data())) {
-        m_popup->addSeparator();
-    }
+    fileItemActions.addServiceActionsTo(m_popup.data());
 }
 
 void DolphinContextMenu::addVersionControlActions()
@@ -432,30 +451,14 @@ void DolphinContextMenu::addCustomActions()
     }
 }
 
-void DolphinContextMenu::setShiftIsPressed(bool pressed)
-{
-    m_shiftIsPressed = pressed;
-}
-
-void DolphinContextMenu::deleteOrTrashMenuEntry(Qt::Key key, bool pressed)
+void DolphinContextMenu::updateRemoveAction()
 {
-    if(m_mainWindow->activeViewContainer()->url().isLocalFile() && !m_showDeleteCommand && key == Qt::Key_Shift) {
-
-        // Set the current size as fixed size so that the menu isn't flickering when pressing shift.
-        m_popup->setFixedSize(m_popup->size());
-        if(pressed) {
-            m_mainWindow->actionCollection()->action("delete")->setVisible(true);
-            m_mainWindow->actionCollection()->action("move_to_trash")->setVisible(false);
-        }
-        else {
-            m_mainWindow->actionCollection()->action("delete")->setVisible(false);
-            m_mainWindow->actionCollection()->action("move_to_trash")->setVisible(true);
-        }
-
-        // This sets the menu back to a dynamic size followed by a forced resize incase the newly made visible action has bigger text.
-        m_popup->setFixedSize(QSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX));
-        m_popup->resize(m_popup->sizeHint());
-    }
+    const KActionCollection* collection = m_mainWindow->actionCollection();
+    const bool moveToTrash = capabilities().isLocal() && !m_shiftPressed;
+    const QAction* action = moveToTrash ? collection->action("move_to_trash") : collection->action("delete");
+    m_removeAction->setText(action->text());
+    m_removeAction->setIcon(action->icon());
+    m_removeAction->setShortcuts(action->shortcuts());
 }
 
 #include "dolphincontextmenu.moc"