]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Fix DolphinRemoveAction Shift toggling on Wayland
authorElvis Angelaccio <elvis.angelaccio@kde.org>
Thu, 24 Aug 2017 16:33:27 +0000 (18:33 +0200)
committerElvis Angelaccio <elvis.angelaccio@kde.org>
Thu, 7 Sep 2017 19:31:42 +0000 (21:31 +0200)
QGuiApplication::queryKeyboardModifiers() does not work on Wayland [1].
We don't need it in the first place, since we already know (thanks to
the key events) whether Shift has been pressed or released.
So we can just pass this information to DolphinRemoveAction::update().

BUG: 354301

[1]: https://bugreports.qt.io/browse/QTBUG-62786

Differential Revision: https://phabricator.kde.org/D7519

src/dolphincontextmenu.cpp
src/dolphinpart.cpp
src/dolphinremoveaction.cpp
src/dolphinremoveaction.h

index b297fb7fb5c4fb875f517d86df6c3622c4b0ccb1..b4d249d761420d468248f6f9ec0b16d5bf13c8ff 100644 (file)
@@ -124,7 +124,7 @@ DolphinContextMenu::Command DolphinContextMenu::open()
 void DolphinContextMenu::keyPressEvent(QKeyEvent *ev)
 {
     if (m_removeAction && ev->key() == Qt::Key_Shift) {
-        m_removeAction->update();
+        m_removeAction->update(DolphinRemoveAction::ShiftState::Pressed);
     }
     QMenu::keyPressEvent(ev);
 }
@@ -132,7 +132,7 @@ void DolphinContextMenu::keyPressEvent(QKeyEvent *ev)
 void DolphinContextMenu::keyReleaseEvent(QKeyEvent *ev)
 {
     if (m_removeAction && ev->key() == Qt::Key_Shift) {
-        m_removeAction->update();
+        m_removeAction->update(DolphinRemoveAction::ShiftState::Released);
     }
     QMenu::keyReleaseEvent(ev);
 }
index c3862509664c64599a333f39c110af709e69582b..b3b47304e1b211e32bca7424331e27575870f63b 100644 (file)
@@ -597,6 +597,7 @@ void DolphinPart::setFilesToSelect(const QList<QUrl>& files)
 
 bool DolphinPart::eventFilter(QObject* obj, QEvent* event)
 {
+    using ShiftState = DolphinRemoveAction::ShiftState;
     const int type = event->type();
 
     if ((type == QEvent::KeyPress || type == QEvent::KeyRelease) && m_removeAction) {
@@ -604,7 +605,7 @@ bool DolphinPart::eventFilter(QObject* obj, QEvent* event)
         if (menu && menu->parent() == m_view) {
             QKeyEvent* ev = static_cast<QKeyEvent*>(event);
             if (ev->key() == Qt::Key_Shift) {
-                m_removeAction->update();
+                m_removeAction->update(type == QEvent::KeyPress ? ShiftState::Pressed : ShiftState::Released);
             }
         }
     }
index c471b2df6f27df0de1b2d214cc4549165ea13e8d..ce305993474efc832ead079983f11615062ac8d2 100644 (file)
@@ -1,5 +1,6 @@
 /***************************************************************************
- *   Copyright (C) 2013 by Dawit Alemayehu <adawit@kde.org                 *
+ *   Copyright (C) 2013 by Dawit Alemayehu <adawit@kde.org>                *
+ *   Copyright (C) 2017 by Elvis Angelaccio <elvis.angelaccio@kde.org>     *
  *                                                                         *
  *   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  *
@@ -39,13 +40,27 @@ void DolphinRemoveAction::slotRemoveActionTriggered()
     }
 }
 
-void DolphinRemoveAction::update()
+void DolphinRemoveAction::update(ShiftState shiftState)
 {
-    Q_ASSERT(m_collection);
-    if (qApp->queryKeyboardModifiers() & Qt::ShiftModifier) {
-        m_action = m_collection ? m_collection->action(KStandardAction::name(KStandardAction::DeleteFile)) : 0;
-    } else {
-        m_action = m_collection ? m_collection->action(KStandardAction::name(KStandardAction::MoveToTrash)) : 0;
+    if (!m_collection) {
+        m_action = nullptr;
+        return;
+    }
+
+    if (shiftState == ShiftState::Unknown) {
+        shiftState = QGuiApplication::keyboardModifiers() & Qt::ShiftModifier ? ShiftState::Pressed : ShiftState::Released;
+    }
+
+    switch (shiftState) {
+    case ShiftState::Pressed:
+        m_action = m_collection->action(KStandardAction::name(KStandardAction::DeleteFile));
+        break;
+    case ShiftState::Released:
+        m_action = m_collection->action(KStandardAction::name(KStandardAction::MoveToTrash));
+        break;
+    case ShiftState::Unknown:
+        Q_UNREACHABLE();
+        break;
     }
 
     if (m_action) {
index f9a1b98be147074fed57e21200329cd1dd400469..6ba25923af3f6c1019fa681a28c97db9e8c83768 100644 (file)
@@ -1,5 +1,6 @@
 /***************************************************************************
- *   Copyright (C) 2013 by Dawit Alemayehu <adawit@kde.org                 *
+ *   Copyright (C) 2013 by Dawit Alemayehu <adawit@kde.org>                *
+ *   Copyright (C) 2017 by Elvis Angelaccio <elvis.angelaccio@kde.org>     *
  *                                                                         *
  *   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  *
@@ -38,11 +39,20 @@ class DOLPHIN_EXPORT DolphinRemoveAction : public QAction
 {
   Q_OBJECT
 public:
+
+    enum class ShiftState {
+        Unknown,
+        Pressed,
+        Released
+    };
+
     DolphinRemoveAction(QObject* parent, KActionCollection* collection);
+
     /**
-     * Updates this action key based on the state of the Shift key.
+     * Updates this action key based on @p shiftState.
+     * Default value is QueryShiftState, meaning it will query QGuiApplication::modifiers().
      */
-    void update();
+    void update(ShiftState shiftState = ShiftState::Unknown);
 
 private Q_SLOTS:
     void slotRemoveActionTriggered();