From 777a57356b27753ff6022933b6223ed0d0d2ac12 Mon Sep 17 00:00:00 2001 From: Berthold Stoeger Date: Sat, 19 Feb 2022 14:06:58 +0100 Subject: [PATCH] profile: fix ESC in planner When in the planner, ESC should cancel the plan. However, when the user manipulates the dive-handles in the profile and presses ESC, first nothing happens, then an obscure message appears. The reason is that ESC "shortcuts" are introduced in two places. To fix this, remove the ESC shortcut in the profile (the planner widget cancels the plan anyway) and replace all the shortcuts in the profile with a simple override of the keyPressEvent(). The latter is not strictly necessary, but hopefully avoids further complications with multiple shortcuts. And the code is easier to follow too. Signed-off-by: Berthold Stoeger --- CHANGELOG.md | 1 + profile-widget/profilewidget2.cpp | 53 ++++++------------------------- profile-widget/profilewidget2.h | 18 ++++------- 3 files changed, 17 insertions(+), 55 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e29a4a9b0..10292e25f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +- planner: make ESC (cancel plan) work when moving handles - dive list: make dive guide visible in dive list [#3382] - general: rename dive master to dive guide - desktop: Don't lose cursor position in notes when switching between windows [#3369] diff --git a/profile-widget/profilewidget2.cpp b/profile-widget/profilewidget2.cpp index 2e0b96a3d..33991a7d5 100644 --- a/profile-widget/profilewidget2.cpp +++ b/profile-widget/profilewidget2.cpp @@ -68,13 +68,6 @@ ProfileWidget2::ProfileWidget2(DivePlannerPointsModel *plannerModelIn, double dp #ifndef SUBSURFACE_MOBILE setAcceptDrops(true); - addActionShortcut(Qt::Key_Escape, &ProfileWidget2::keyEscAction); - addActionShortcut(Qt::Key_Delete, &ProfileWidget2::keyDeleteAction); - addActionShortcut(Qt::Key_Up, &ProfileWidget2::keyUpAction); - addActionShortcut(Qt::Key_Down, &ProfileWidget2::keyDownAction); - addActionShortcut(Qt::Key_Left, &ProfileWidget2::keyLeftAction); - addActionShortcut(Qt::Key_Right, &ProfileWidget2::keyRightAction); - connect(Thumbnailer::instance(), &Thumbnailer::thumbnailChanged, this, &ProfileWidget2::updateThumbnail, Qt::QueuedConnection); connect(&diveListNotifier, &DiveListNotifier::picturesRemoved, this, &ProfileWidget2::picturesRemoved); connect(&diveListNotifier, &DiveListNotifier::picturesAdded, this, &ProfileWidget2::picturesAdded); @@ -123,14 +116,16 @@ ProfileWidget2::~ProfileWidget2() } #ifndef SUBSURFACE_MOBILE -void ProfileWidget2::addActionShortcut(const Qt::Key shortcut, void (ProfileWidget2::*slot)()) +void ProfileWidget2::keyPressEvent(QKeyEvent *e) { - QAction *action = new QAction(this); - action->setShortcut(shortcut); - action->setShortcutContext(Qt::WindowShortcut); - addAction(action); - connect(action, &QAction::triggered, this, slot); - actionsForKeys[shortcut] = action; + switch (e->key()) { + case Qt::Key_Delete: return keyDeleteAction(); + case Qt::Key_Up: return keyUpAction(); + case Qt::Key_Down: return keyDownAction(); + case Qt::Key_Left: return keyLeftAction(); + case Qt::Key_Right: return keyRightAction(); + } + QGraphicsView::keyPressEvent(e); } #endif // SUBSURFACE_MOBILE @@ -444,12 +439,6 @@ void ProfileWidget2::setEditState(const dive *d, int dc) mouseFollowerHorizontal->setVisible(true); mouseFollowerVertical->setVisible(true); disconnectTemporaryConnections(); - actionsForKeys[Qt::Key_Left]->setShortcut(Qt::Key_Left); - actionsForKeys[Qt::Key_Right]->setShortcut(Qt::Key_Right); - actionsForKeys[Qt::Key_Up]->setShortcut(Qt::Key_Up); - actionsForKeys[Qt::Key_Down]->setShortcut(Qt::Key_Down); - actionsForKeys[Qt::Key_Escape]->setShortcut(Qt::Key_Escape); - actionsForKeys[Qt::Key_Delete]->setShortcut(Qt::Key_Delete); connectPlannerModel(); @@ -470,12 +459,6 @@ void ProfileWidget2::setPlanState(const dive *d, int dc) mouseFollowerHorizontal->setVisible(true); mouseFollowerVertical->setVisible(true); disconnectTemporaryConnections(); - actionsForKeys[Qt::Key_Left]->setShortcut(Qt::Key_Left); - actionsForKeys[Qt::Key_Right]->setShortcut(Qt::Key_Right); - actionsForKeys[Qt::Key_Up]->setShortcut(Qt::Key_Up); - actionsForKeys[Qt::Key_Down]->setShortcut(Qt::Key_Down); - actionsForKeys[Qt::Key_Escape]->setShortcut(Qt::Key_Escape); - actionsForKeys[Qt::Key_Delete]->setShortcut(Qt::Key_Delete); connectPlannerModel(); @@ -810,10 +793,6 @@ void ProfileWidget2::disconnectTemporaryConnections() disconnect(plannerModel, &DivePlannerPointsModel::rowsMoved, this, &ProfileWidget2::pointsMoved); } #endif - Q_FOREACH (QAction *action, actionsForKeys.values()) { - action->setShortcut(QKeySequence()); - action->setShortcutContext(Qt::WidgetShortcut); - } } int ProfileWidget2::handleIndex(const DiveHandler *h) const @@ -1026,20 +1005,6 @@ void ProfileWidget2::keyDeleteAction() plannerModel->removeSelectedPoints(selectedIndices); } -void ProfileWidget2::keyEscAction() -{ - if ((currentState != EDIT && currentState != PLAN) || !plannerModel) - return; - - if (scene()->selectedItems().count()) { - scene()->clearSelection(); - return; - } - - if (plannerModel->isPlanner()) - plannerModel->cancelPlan(); -} - void ProfileWidget2::clearPictures() { pictures.clear(); diff --git a/profile-widget/profilewidget2.h b/profile-widget/profilewidget2.h index c4d8b483e..301976b0c 100644 --- a/profile-widget/profilewidget2.h +++ b/profile-widget/profilewidget2.h @@ -87,15 +87,6 @@ slots: // Necessary to call from QAction's signals. /* this is called for every move on the handlers. maybe we can speed up this a bit? */ void divePlannerHandlerMoved(); - - /* key press handlers */ - void keyEscAction(); - void keyDeleteAction(); - void keyUpAction(); - void keyDownAction(); - void keyLeftAction(); - void keyRightAction(); - void divePlannerHandlerClicked(); void divePlannerHandlerReleased(); #endif @@ -110,6 +101,7 @@ private: void mouseDoubleClickEvent(QMouseEvent *event) override; void mousePressEvent(QMouseEvent *event) override; void mouseReleaseEvent(QMouseEvent *event) override; + void keyPressEvent(QKeyEvent *e) override; #endif void dropEvent(QDropEvent *event) override; void dragEnterEvent(QDragEnterEvent *event) override; @@ -123,7 +115,6 @@ private: void setupItemOnScene(); void disconnectTemporaryConnections(); struct plot_data *getEntryFromPos(QPointF pos); - void addActionShortcut(const Qt::Key shortcut, void (ProfileWidget2::*slot)()); void clearPictures(); void plotPicturesInternal(const struct dive *d, bool synchronous); void updateThumbnails(); @@ -176,6 +167,12 @@ private: void calculatePictureYPositions(); void updateDurationLine(PictureEntry &e); void updateThumbnailPaintOrder(); + + void keyDeleteAction(); + void keyUpAction(); + void keyDownAction(); + void keyLeftAction(); + void keyRightAction(); #endif std::vector> handles; @@ -188,7 +185,6 @@ private: QGraphicsSimpleTextItem *createGas(); #endif friend class DiveHandler; - QHash actionsForKeys; bool shouldCalculateMax; // Calculate maximum time and depth (default). False when dragging handles. // We store a const pointer to the shown dive. However, the undo commands want