diff --git a/src/capture/capturearea.cpp b/src/capture/capturearea.cpp index 04c29a5..a9ed51a 100644 --- a/src/capture/capturearea.cpp +++ b/src/capture/capturearea.cpp @@ -48,3 +48,8 @@ QString CaptureArea::toolTip() const return doTranslation_ ? sourceLanguage_ + "->" + targetLanguage_ : sourceLanguage_; } + +bool CaptureArea::isLocked() const +{ + return isLocked_; +} diff --git a/src/capture/capturearea.h b/src/capture/capturearea.h index ab763f9..3edba8b 100644 --- a/src/capture/capturearea.h +++ b/src/capture/capturearea.h @@ -14,6 +14,7 @@ public: TaskPtr task(const QPixmap& pixmap) const; bool isValid() const; + bool isLocked() const; const QRect& rect() const; void setRect(const QRect& rect); @@ -24,6 +25,7 @@ private: QRect rect_; bool doTranslation_; + bool isLocked_{false}; LanguageId sourceLanguage_; LanguageId targetLanguage_; QStringList translators_; diff --git a/src/capture/captureareaeditor.cpp b/src/capture/captureareaeditor.cpp index 68700fc..52f9cb9 100644 --- a/src/capture/captureareaeditor.cpp +++ b/src/capture/captureareaeditor.cpp @@ -14,6 +14,7 @@ CaptureAreaEditor::CaptureAreaEditor(const CommonModels &models, QWidget *parent) : QWidget(parent) , doTranslation_(new QCheckBox(tr("Translate:"), this)) + , isLocked_(new QCheckBox(tr("Save (can capture via hotkey)"), this)) , sourceLanguage_(new QComboBox(this)) , targetLanguage_(new QComboBox(this)) { @@ -30,6 +31,9 @@ CaptureAreaEditor::CaptureAreaEditor(const CommonModels &models, layout->addWidget(doTranslation_, row, 0); layout->addWidget(targetLanguage_, row, 1); + ++row; + layout->addWidget(isLocked_, row, 0, 1, 2); + sourceLanguage_->setModel(models.sourceLanguageModel()); targetLanguage_->setModel(models.targetLanguageModel()); targetLanguage_->setEnabled(doTranslation_->isChecked()); @@ -59,6 +63,7 @@ void CaptureAreaEditor::swapLanguages() void CaptureAreaEditor::set(const CaptureArea &area) { + isLocked_->setChecked(area.isLocked()); doTranslation_->setChecked(area.doTranslation_); sourceLanguage_->setCurrentText(LanguageCodes::name(area.sourceLanguage_)); targetLanguage_->setCurrentText(LanguageCodes::name(area.targetLanguage_)); @@ -66,6 +71,7 @@ void CaptureAreaEditor::set(const CaptureArea &area) void CaptureAreaEditor::apply(CaptureArea &area) const { + area.isLocked_ = isLocked_->isChecked(); area.doTranslation_ = doTranslation_->isChecked(); area.sourceLanguage_ = LanguageCodes::idForName(sourceLanguage_->currentText()); diff --git a/src/capture/captureareaeditor.h b/src/capture/captureareaeditor.h index 0811070..0159c8c 100644 --- a/src/capture/captureareaeditor.h +++ b/src/capture/captureareaeditor.h @@ -22,6 +22,7 @@ private: void swapLanguages(); QCheckBox* doTranslation_; + QCheckBox* isLocked_; QComboBox* sourceLanguage_; QComboBox* targetLanguage_; }; diff --git a/src/capture/captureareaselector.cpp b/src/capture/captureareaselector.cpp index 9d5bc74..7efa331 100644 --- a/src/capture/captureareaselector.cpp +++ b/src/capture/captureareaselector.cpp @@ -35,6 +35,17 @@ void CaptureAreaSelector::activate() activateWindow(); } +bool CaptureAreaSelector::hasLocked() const +{ + return area_ && area_->isLocked(); +} + +void CaptureAreaSelector::captureLocked() +{ + SOFT_ASSERT(hasLocked(), return ); + capturer_.selected(*area_); +} + void CaptureAreaSelector::setScreenRects(const std::vector &screens) { auto helpRect = fontMetrics().boundingRect({}, 0, help_); @@ -150,7 +161,8 @@ void CaptureAreaSelector::drawCaptureArea(QPainter &painter, void CaptureAreaSelector::showEvent(QShowEvent * /*event*/) { editor_->hide(); - area_.reset(); + if (area_ && !area_->isLocked()) + area_.reset(); startSelectPos_ = currentSelectPos_ = QPoint(); } diff --git a/src/capture/captureareaselector.h b/src/capture/captureareaselector.h index 958cf63..7deec90 100644 --- a/src/capture/captureareaselector.h +++ b/src/capture/captureareaselector.h @@ -14,6 +14,8 @@ public: ~CaptureAreaSelector(); void activate(); + bool hasLocked() const; + void captureLocked(); void setScreenRects(const std::vector &screens); void updateSettings(); diff --git a/src/capture/capturer.cpp b/src/capture/capturer.cpp index e2ad589..51b0b26 100644 --- a/src/capture/capturer.cpp +++ b/src/capture/capturer.cpp @@ -28,6 +28,19 @@ void Capturer::capture() selector_->activate(); } +bool Capturer::canCaptureLocked() +{ + SOFT_ASSERT(selector_, return false); + return selector_->hasLocked(); +} + +void Capturer::captureLocked() +{ + updatePixmap(); + SOFT_ASSERT(selector_, return ); + selector_->captureLocked(); +} + void Capturer::updatePixmap() { const auto screens = QApplication::screens(); diff --git a/src/capture/capturer.h b/src/capture/capturer.h index abf75ef..e49afbe 100644 --- a/src/capture/capturer.h +++ b/src/capture/capturer.h @@ -12,6 +12,8 @@ public: ~Capturer(); void capture(); + bool canCaptureLocked(); + void captureLocked(); void repeatCapture(); void updateSettings(); diff --git a/src/manager.cpp b/src/manager.cpp index 22cc59f..08f23e0 100644 --- a/src/manager.cpp +++ b/src/manager.cpp @@ -83,6 +83,8 @@ void Manager::updateSettings() recognizer_->updateSettings(); translator_->updateSettings(); representer_->updateSettings(); + + tray_->setCaptureLockedEnabled(capturer_->canCaptureLocked()); } void Manager::setupProxy(const Settings &settings) @@ -145,6 +147,7 @@ void Manager::finishTask(const TaskPtr &task) void Manager::captured(const TaskPtr &task) { + tray_->setCaptureLockedEnabled(capturer_->canCaptureLocked()); tray_->blockActions(false); SOFT_ASSERT(task, return ); @@ -163,6 +166,7 @@ void Manager::captured(const TaskPtr &task) void Manager::captureCanceled() { + tray_->setCaptureLockedEnabled(capturer_->canCaptureLocked()); tray_->blockActions(false); } @@ -235,6 +239,12 @@ void Manager::repeatCapture() capturer_->repeatCapture(); } +void Manager::captureLocked() +{ + SOFT_ASSERT(capturer_, return ); + capturer_->captureLocked(); +} + void Manager::settings() { SettingsEditor editor(*this, *updater_); diff --git a/src/manager.h b/src/manager.h index 3f7c13d..e4309fc 100644 --- a/src/manager.h +++ b/src/manager.h @@ -20,6 +20,7 @@ public: void fatalError(const QString &text); void capture(); void repeatCapture(); + void captureLocked(); void showLast(); void settings(); void copyLastToClipboard(); diff --git a/src/settings.cpp b/src/settings.cpp index 3213d3a..53655a4 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -16,6 +16,7 @@ const QString qs_captureHotkey = "captureHotkey"; const QString qs_repeatCaptureHotkey = "repeatCaptureHotkey"; const QString qs_repeatHotkey = "repeatHotkey"; const QString qs_clipboardHotkey = "clipboardHotkey"; +const QString qs_captureLockedHotkey = "captureLockedHotkey"; const QString qs_resultShowType = "resultShowType"; const QString qs_proxyType = "proxyType"; const QString qs_proxyHostName = "proxyHostName"; @@ -145,6 +146,7 @@ void Settings::save() const settings.setValue(qs_repeatCaptureHotkey, repeatCaptureHotkey); settings.setValue(qs_repeatHotkey, showLastHotkey); settings.setValue(qs_clipboardHotkey, clipboardHotkey); + settings.setValue(qs_captureLockedHotkey, captureLockedHotkey); settings.setValue(qs_showMessageOnStart, showMessageOnStart); @@ -225,6 +227,8 @@ void Settings::load() showLastHotkey = settings.value(qs_repeatHotkey, showLastHotkey).toString(); clipboardHotkey = settings.value(qs_clipboardHotkey, clipboardHotkey).toString(); + captureLockedHotkey = + settings.value(qs_captureLockedHotkey, captureLockedHotkey).toString(); showMessageOnStart = settings.value(qs_showMessageOnStart, showMessageOnStart).toBool(); diff --git a/src/settings.h b/src/settings.h index 5f41e39..8eb2830 100644 --- a/src/settings.h +++ b/src/settings.h @@ -33,6 +33,7 @@ public: QString repeatCaptureHotkey{"Ctrl+Alt+S"}; QString showLastHotkey{"Ctrl+Alt+X"}; QString clipboardHotkey{"Ctrl+Alt+C"}; + QString captureLockedHotkey{"Ctrl+Alt+Q"}; bool showMessageOnStart{true}; bool runAtSystemStart{false}; diff --git a/src/settingseditor.cpp b/src/settingseditor.cpp index 62dea0b..be1573a 100644 --- a/src/settingseditor.cpp +++ b/src/settingseditor.cpp @@ -122,6 +122,8 @@ Settings SettingsEditor::settings() const ui->repeatCaptureEdit->keySequence().toString(); settings.showLastHotkey = ui->repeatEdit->keySequence().toString(); settings.clipboardHotkey = ui->clipboardEdit->keySequence().toString(); + settings.captureLockedHotkey = + ui->captureLockedEdit->keySequence().toString(); settings.showMessageOnStart = ui->showOnStart->isChecked(); @@ -182,6 +184,7 @@ void SettingsEditor::setSettings(const Settings &settings) ui->repeatCaptureEdit->setKeySequence(settings.repeatCaptureHotkey); ui->repeatEdit->setKeySequence(settings.showLastHotkey); ui->clipboardEdit->setKeySequence(settings.clipboardHotkey); + ui->captureLockedEdit->setKeySequence(settings.captureLockedHotkey); ui->showOnStart->setChecked(settings.showMessageOnStart); diff --git a/src/settingseditor.ui b/src/settingseditor.ui index e5e70e2..fe4414f 100644 --- a/src/settingseditor.ui +++ b/src/settingseditor.ui @@ -56,37 +56,30 @@ Shortcuts - - - - Capture - - + + - - - - + Repeat capture - + - + Show last result - - + + - + Copy result to clipboard @@ -94,7 +87,24 @@ - + + + + + + Capture + + + + + + + Capture saved areas + + + + + diff --git a/src/trayicon.cpp b/src/trayicon.cpp index 25b004a..5b8059b 100644 --- a/src/trayicon.cpp +++ b/src/trayicon.cpp @@ -44,6 +44,9 @@ void TrayIcon::updateSettings() failedActions << settings_.showLastHotkey; if (!GlobalAction::update(clipboardAction_, settings_.clipboardHotkey)) failedActions << settings_.clipboardHotkey; + if (!GlobalAction::update(captureLockedAction_, + settings_.captureLockedHotkey)) + failedActions << settings_.captureLockedHotkey; if (!failedActions.isEmpty()) { showError(tr("Failed to register global shortcuts:\n%1") @@ -63,6 +66,12 @@ void TrayIcon::setTaskActionsEnabled(bool isEnabled) updateActions(); } +void TrayIcon::setCaptureLockedEnabled(bool isEnabled) +{ + canCaptureLocked_ = isEnabled; + updateActions(); +} + void TrayIcon::setRepeatCaptureEnabled(bool isEnabled) { canRepeatCapture_ = isEnabled; @@ -73,7 +82,8 @@ void TrayIcon::updateActions() { if (isActionsBlocked_) { QVector blockable{captureAction_, repeatCaptureAction_, - showLastAction_, settingsAction_}; + showLastAction_, settingsAction_, + captureLockedAction_}; for (auto &action : blockable) action->setEnabled(false); return; } @@ -85,6 +95,7 @@ void TrayIcon::updateActions() for (auto &action : taskActions) action->setEnabled(gotTask_); repeatCaptureAction_->setEnabled(canRepeatCapture_); + captureLockedAction_->setEnabled(canCaptureLocked_); } void TrayIcon::setIcon(TrayIcon::Icon icon, Duration duration) @@ -188,6 +199,11 @@ QMenu *TrayIcon::contextMenu() connect(repeatCaptureAction_, &QAction::triggered, // this, [this] { manager_.repeatCapture(); }); } + { + captureLockedAction_ = menu->addAction(tr("Capture saved areas")); + connect(captureLockedAction_, &QAction::triggered, // + this, [this] { manager_.captureLocked(); }); + } { QMenu *translateMenu = menu->addMenu(tr("Result")); diff --git a/src/trayicon.h b/src/trayicon.h index 35cb176..9745dd8 100644 --- a/src/trayicon.h +++ b/src/trayicon.h @@ -17,6 +17,7 @@ public: void blockActions(bool block); void setTaskActionsEnabled(bool isEnabled); + void setCaptureLockedEnabled(bool isEnabled); void setRepeatCaptureEnabled(bool isEnabled); void setActiveTaskCount(int count); void resetFatalError(); @@ -40,6 +41,7 @@ private: std::unique_ptr tray_; QAction *captureAction_{nullptr}; + QAction *captureLockedAction_{nullptr}; QAction *repeatCaptureAction_{nullptr}; QAction *showLastAction_{nullptr}; QAction *clipboardAction_{nullptr}; @@ -53,4 +55,5 @@ private: bool gotTask_{false}; bool canRepeatCapture_{false}; bool isActionsBlocked_{false}; + bool canCaptureLocked_{false}; };