diff --git a/screen-translator.pro b/screen-translator.pro index aab4d11..9861120 100644 --- a/screen-translator.pro +++ b/screen-translator.pro @@ -53,6 +53,7 @@ HEADERS += \ src/service/debug.h \ src/service/geometryutils.h \ src/service/globalaction.h \ + src/service/keysequenceedit.h \ src/service/runatsystemstart.h \ src/service/singleapplication.h \ src/service/updates.h \ @@ -90,6 +91,7 @@ SOURCES += \ src/service/debug.cpp \ src/service/geometryutils.cpp \ src/service/globalaction.cpp \ + src/service/keysequenceedit.cpp \ src/service/runatsystemstart.cpp \ src/service/singleapplication.cpp \ src/service/updates.cpp \ diff --git a/src/service/keysequenceedit.cpp b/src/service/keysequenceedit.cpp new file mode 100644 index 0000000..b072b7f --- /dev/null +++ b/src/service/keysequenceedit.cpp @@ -0,0 +1,71 @@ +#include "keysequenceedit.h" + +#include + +namespace service +{ +KeySequenceEdit::KeySequenceEdit(QWidget *parent) + : QLineEdit(parent) +{ + setPlaceholderText(tr("Press shortcut")); + setFocusPolicy(Qt::StrongFocus); + setAttribute(Qt::WA_MacShowFocusRect, true); + setAttribute(Qt::WA_InputMethodEnabled, false); +} + +const QKeySequence &KeySequenceEdit::keySequence() const +{ + return current_; +} + +void KeySequenceEdit::setKeySequence(const QKeySequence &newKeySequence) +{ + setKeySequence(newKeySequence, true); +} + +void KeySequenceEdit::setKeySequence(const QKeySequence ¤t, + bool updateFallback) +{ + current_ = current; + if (updateFallback) + fallback_ = current; + setText(current_.toString(QKeySequence::NativeText)); +} + +bool KeySequenceEdit::event(QEvent *e) +{ + switch (e->type()) { + case QEvent::Shortcut: return true; + case QEvent::ShortcutOverride: e->accept(); return true; + default: break; + } + + return QWidget::event(e); +} + +void KeySequenceEdit::keyPressEvent(QKeyEvent *event) +{ + const auto key = event->key(); + if (key == Qt::Key_Control || key == Qt::Key_Meta || key == Qt::Key_Alt || + key == Qt::Key_Shift || key == Qt::Key_unknown) { + return; + } + + if (event->key() == Qt::Key_Escape) { + setKeySequence(fallback_, false); + event->accept(); + return; + } + + if (event->key() == Qt::Key_Backspace) { + setKeySequence({}, false); + event->accept(); + return; + } + + QKeySequence seq = event->modifiers() + event->key(); + setKeySequence(seq, false); + event->accept(); +} + +} // namespace service diff --git a/src/service/keysequenceedit.h b/src/service/keysequenceedit.h new file mode 100644 index 0000000..4732c50 --- /dev/null +++ b/src/service/keysequenceedit.h @@ -0,0 +1,25 @@ +#pragma once + +#include + +namespace service +{ +class KeySequenceEdit : public QLineEdit +{ +public: + KeySequenceEdit(QWidget *parent = nullptr); + + const QKeySequence &keySequence() const; + void setKeySequence(const QKeySequence &newKeySequence); + bool event(QEvent *event) override; + +protected: + void keyPressEvent(QKeyEvent *event) override; + +private: + void setKeySequence(const QKeySequence ¤t, bool updateFallback); + QKeySequence current_; + QKeySequence fallback_; +}; + +} // namespace service diff --git a/src/settingseditor.ui b/src/settingseditor.ui index 9e86cee..2c3dc7b 100644 --- a/src/settingseditor.ui +++ b/src/settingseditor.ui @@ -221,7 +221,7 @@ - + @@ -231,7 +231,7 @@ - + @@ -241,7 +241,7 @@ - + @@ -251,7 +251,7 @@ - + @@ -268,7 +268,7 @@ - + @@ -775,6 +775,11 @@ QTableWidget
substitutionstable.h
+ + service::KeySequenceEdit + QWidget +
keysequenceedit.h
+
captureEdit diff --git a/src/trayicon.cpp b/src/trayicon.cpp index 0c58a80..4db7fe8 100644 --- a/src/trayicon.cpp +++ b/src/trayicon.cpp @@ -59,6 +59,16 @@ void TrayIcon::blockActions(bool block) { isActionsBlocked_ = block; updateActions(); + const auto actions = + QVector{captureAction_, repeatCaptureAction_, showLastAction_, + clipboardAction_, captureLockedAction_}; + for (const auto i : actions) { + if (block) { + GlobalAction::removeGlobal(i); + } else { + GlobalAction::makeGlobal(i); + } + } } void TrayIcon::setTaskActionsEnabled(bool isEnabled)