From 9007379242bd57e45db4d79922a20dd7e29b294f Mon Sep 17 00:00:00 2001 From: Gres Date: Tue, 22 Sep 2015 21:41:08 +0300 Subject: [PATCH 01/89] Code formatting with uncrustify. --- GlobalActionHelper.cpp | 133 ++-- GlobalActionHelper.h | 9 +- GoogleWebTranslator.cpp | 57 +- GoogleWebTranslator.h | 16 +- ImageProcessing.cpp | 125 ++-- ImageProcessing.h | 8 +- LanguageHelper.cpp | 305 ++++---- LanguageHelper.h | 19 +- Manager.cpp | 83 +- Manager.h | 24 +- ProcessingItem.cpp | 3 +- ProcessingItem.h | 19 +- Recognizer.cpp | 55 +- Recognizer.h | 15 +- ResultDialog.cpp | 34 +- ResultDialog.h | 9 +- ScreenTranslator.pro | 3 +- SelectionDialog.cpp | 98 +-- SelectionDialog.h | 13 +- Settings.h | 6 +- SettingsEditor.cpp | 64 +- SettingsEditor.h | 15 +- StAssert.h | 2 +- Translator.cpp | 66 +- Translator.h | 12 +- main.cpp | 12 +- uncrustify.cfg | 1578 +++++++++++++++++++++++++++++++++++++++ 27 files changed, 2114 insertions(+), 669 deletions(-) create mode 100644 uncrustify.cfg diff --git a/GlobalActionHelper.cpp b/GlobalActionHelper.cpp index 349265e..ca94a78 100644 --- a/GlobalActionHelper.cpp +++ b/GlobalActionHelper.cpp @@ -5,88 +5,82 @@ #include #include -QHash, QAction*> GlobalActionHelper::actions_; +QHash, QAction *> GlobalActionHelper::actions_; -bool GlobalActionHelper::nativeEventFilter(const QByteArray& eventType, - void* message, long* result) -{ +bool GlobalActionHelper::nativeEventFilter (const QByteArray &eventType, + void *message, long *result) { Q_UNUSED (eventType); Q_UNUSED (result); - MSG* msg = static_cast(message); - if (msg->message == WM_HOTKEY) - { - const quint32 keycode = HIWORD(msg->lParam); - const quint32 modifiers = LOWORD(msg->lParam); - QAction* action = actions_.value (qMakePair (keycode, modifiers)); + MSG *msg = static_cast(message); + if (msg->message == WM_HOTKEY) { + const quint32 keycode = HIWORD (msg->lParam); + const quint32 modifiers = LOWORD (msg->lParam); + QAction *action = actions_.value (qMakePair (keycode, modifiers)); Q_CHECK_PTR (action); action->activate (QAction::Trigger); } return false; } -void GlobalActionHelper::init() -{ +void GlobalActionHelper::init () { qApp->installNativeEventFilter (new GlobalActionHelper); } -bool GlobalActionHelper::makeGlobal(QAction* action) -{ +bool GlobalActionHelper::makeGlobal (QAction *action) { QKeySequence hotKey = action->shortcut (); - if (hotKey.isEmpty ()) - { + if (hotKey.isEmpty ()) { return true; } Qt::KeyboardModifiers allMods = Qt::ShiftModifier | Qt::ControlModifier | Qt::AltModifier | Qt::MetaModifier; - Qt::Key key = hotKey.isEmpty() ? - Qt::Key(0) : - Qt::Key((hotKey[0] ^ allMods) & hotKey[0]); - Qt::KeyboardModifiers mods = hotKey.isEmpty() ? - Qt::KeyboardModifiers(0) : - Qt::KeyboardModifiers(hotKey[0] & allMods); - const quint32 nativeKey = nativeKeycode(key); - const quint32 nativeMods = nativeModifiers(mods); - const bool res = registerHotKey(nativeKey, nativeMods); - if (res) - actions_.insert (qMakePair(nativeKey, nativeMods), action); - else - qWarning() << "Failed to register global hotkey:" << hotKey.toString(); + Qt::Key key = hotKey.isEmpty () ? + Qt::Key (0) : + Qt::Key ((hotKey[0] ^ allMods) & hotKey[0]); + Qt::KeyboardModifiers mods = hotKey.isEmpty () ? + Qt::KeyboardModifiers (0) : + Qt::KeyboardModifiers (hotKey[0] & allMods); + const quint32 nativeKey = nativeKeycode (key); + const quint32 nativeMods = nativeModifiers (mods); + const bool res = registerHotKey (nativeKey, nativeMods); + if (res) { + actions_.insert (qMakePair (nativeKey, nativeMods), action); + } + else { + qWarning () << "Failed to register global hotkey:" << hotKey.toString (); + } return res; } -bool GlobalActionHelper::removeGlobal(QAction *action) -{ +bool GlobalActionHelper::removeGlobal (QAction *action) { QKeySequence hotKey = action->shortcut (); - if (hotKey.isEmpty ()) - { + if (hotKey.isEmpty ()) { return true; } Qt::KeyboardModifiers allMods = Qt::ShiftModifier | Qt::ControlModifier | Qt::AltModifier | Qt::MetaModifier; - Qt::Key key = hotKey.isEmpty() ? - Qt::Key(0) : - Qt::Key((hotKey[0] ^ allMods) & hotKey[0]); - Qt::KeyboardModifiers mods = hotKey.isEmpty() ? - Qt::KeyboardModifiers(0) : - Qt::KeyboardModifiers(hotKey[0] & allMods); - const quint32 nativeKey = nativeKeycode(key); - const quint32 nativeMods = nativeModifiers(mods); - if (!actions_.contains (qMakePair(nativeKey, nativeMods))) - { + Qt::Key key = hotKey.isEmpty () ? + Qt::Key (0) : + Qt::Key ((hotKey[0] ^ allMods) & hotKey[0]); + Qt::KeyboardModifiers mods = hotKey.isEmpty () ? + Qt::KeyboardModifiers (0) : + Qt::KeyboardModifiers (hotKey[0] & allMods); + const quint32 nativeKey = nativeKeycode (key); + const quint32 nativeMods = nativeModifiers (mods); + if (!actions_.contains (qMakePair (nativeKey, nativeMods))) { return true; } - const bool res = unregisterHotKey(nativeKey, nativeMods); - if (res) - actions_.remove (qMakePair(nativeKey, nativeMods)); - else - qWarning() << "Failed to unregister global hotkey:" << hotKey.toString(); + const bool res = unregisterHotKey (nativeKey, nativeMods); + if (res) { + actions_.remove (qMakePair (nativeKey, nativeMods)); + } + else { + qWarning () << "Failed to unregister global hotkey:" << hotKey.toString (); + } return res; } -quint32 GlobalActionHelper::nativeKeycode(Qt::Key key) -{ - switch (key) - { +quint32 GlobalActionHelper::nativeKeycode (Qt::Key key) { + switch (key) { case Qt::Key_Escape: return VK_ESCAPE; case Qt::Key_Tab: @@ -191,9 +185,9 @@ quint32 GlobalActionHelper::nativeKeycode(Qt::Key key) return VK_MEDIA_PLAY_PAUSE; case Qt::Key_MediaStop: return VK_MEDIA_STOP; - // couldn't find those in VK_* - //case Qt::Key_MediaLast: - //case Qt::Key_MediaRecord: + // couldn't find those in VK_* + //case Qt::Key_MediaLast: + //case Qt::Key_MediaRecord: case Qt::Key_VolumeDown: return VK_VOLUME_DOWN; case Qt::Key_VolumeUp: @@ -201,7 +195,7 @@ quint32 GlobalActionHelper::nativeKeycode(Qt::Key key) case Qt::Key_VolumeMute: return VK_VOLUME_MUTE; - // numbers + // numbers case Qt::Key_0: case Qt::Key_1: case Qt::Key_2: @@ -214,7 +208,7 @@ quint32 GlobalActionHelper::nativeKeycode(Qt::Key key) case Qt::Key_9: return key; - // letters + // letters case Qt::Key_A: case Qt::Key_B: case Qt::Key_C: @@ -248,29 +242,30 @@ quint32 GlobalActionHelper::nativeKeycode(Qt::Key key) } } -quint32 GlobalActionHelper::nativeModifiers(Qt::KeyboardModifiers modifiers) -{ +quint32 GlobalActionHelper::nativeModifiers (Qt::KeyboardModifiers modifiers) { // MOD_ALT, MOD_CONTROL, (MOD_KEYUP), MOD_SHIFT, MOD_WIN quint32 native = 0; - if (modifiers & Qt::ShiftModifier) + if (modifiers & Qt::ShiftModifier) { native |= MOD_SHIFT; - if (modifiers & Qt::ControlModifier) + } + if (modifiers & Qt::ControlModifier) { native |= MOD_CONTROL; - if (modifiers & Qt::AltModifier) + } + if (modifiers & Qt::AltModifier) { native |= MOD_ALT; - if (modifiers & Qt::MetaModifier) + } + if (modifiers & Qt::MetaModifier) { native |= MOD_WIN; + } //if (modifiers & Qt::KeypadModifier) //if (modifiers & Qt::GroupSwitchModifier) return native; } -bool GlobalActionHelper::registerHotKey(quint32 nativeKey, quint32 nativeMods) -{ - return RegisterHotKey(0, nativeMods ^ nativeKey, nativeMods, nativeKey); +bool GlobalActionHelper::registerHotKey (quint32 nativeKey, quint32 nativeMods) { + return RegisterHotKey (0, nativeMods ^ nativeKey, nativeMods, nativeKey); } -bool GlobalActionHelper::unregisterHotKey(quint32 nativeKey, quint32 nativeMods) -{ - return UnregisterHotKey(0, nativeMods ^ nativeKey); +bool GlobalActionHelper::unregisterHotKey (quint32 nativeKey, quint32 nativeMods) { + return UnregisterHotKey (0, nativeMods ^ nativeKey); } diff --git a/GlobalActionHelper.h b/GlobalActionHelper.h index 05e2826..250b723 100644 --- a/GlobalActionHelper.h +++ b/GlobalActionHelper.h @@ -6,18 +6,17 @@ #include #include -class GlobalActionHelper : public QAbstractNativeEventFilter -{ +class GlobalActionHelper : public QAbstractNativeEventFilter { public: bool nativeEventFilter (const QByteArray &eventType, void *message, long *result); static void init (); - static bool makeGlobal (QAction* action); - static bool removeGlobal (QAction* action); + static bool makeGlobal (QAction *action); + static bool removeGlobal (QAction *action); private: - static QHash, QAction*> actions_; + static QHash, QAction *> actions_; static quint32 nativeKeycode (Qt::Key key); static quint32 nativeModifiers (Qt::KeyboardModifiers modifiers); diff --git a/GoogleWebTranslator.cpp b/GoogleWebTranslator.cpp index 74fc54f..aeb42e8 100644 --- a/GoogleWebTranslator.cpp +++ b/GoogleWebTranslator.cpp @@ -9,85 +9,84 @@ #include "Settings.h" #include "StAssert.h" -GoogleWebTranslator::GoogleWebTranslator() +GoogleWebTranslator::GoogleWebTranslator () : QObject (), view_ (new QWebView), - isLoadFinished_ (true), isTranslationFinished_ (false) { + isLoadFinished_ (true), isTranslationFinished_ (false) { - view_->settings()->setAttribute(QWebSettings::AutoLoadImages, false); - connect (view_, SIGNAL (loadStarted()), this, SLOT (loadStarted())); - connect (view_, SIGNAL (loadFinished(bool)), this, SLOT (loadFinished(bool))); + view_->settings ()->setAttribute (QWebSettings::AutoLoadImages, false); + connect (view_, SIGNAL (loadStarted ()), this, SLOT (loadStarted ())); + connect (view_, SIGNAL (loadFinished (bool)), this, SLOT (loadFinished (bool))); - connect (view_->page()->networkAccessManager(), SIGNAL (finished(QNetworkReply*)), - this, SLOT(replyFinished(QNetworkReply*))); + connect (view_->page ()->networkAccessManager (), SIGNAL (finished (QNetworkReply *)), + this, SLOT (replyFinished (QNetworkReply *))); applySettings (); } -GoogleWebTranslator::~GoogleWebTranslator() { +GoogleWebTranslator::~GoogleWebTranslator () { delete view_; } -void GoogleWebTranslator::translate(ProcessingItem item) { +void GoogleWebTranslator::translate (ProcessingItem item) { queue_.push_back (item); if (isLoadFinished_) { load (item); } } -void GoogleWebTranslator::applySettings(){ +void GoogleWebTranslator::applySettings () { QSettings settings; settings.beginGroup (settings_names::translationGroup); translationLanguage_ = settings.value (settings_names::translationLanguage, settings_values::translationLanguage).toString (); } -void GoogleWebTranslator::loadStarted() { +void GoogleWebTranslator::loadStarted () { isLoadFinished_ = false; isTranslationFinished_ = false; } -void GoogleWebTranslator::loadFinished(bool ok) { +void GoogleWebTranslator::loadFinished (bool ok) { isLoadFinished_ = true; if (ok && !isTranslationFinished_) { - return; + return; } - if (!queue_.isEmpty()) { - ProcessingItem item = queue_.front(); - queue_.pop_front(); + if (!queue_.isEmpty ()) { + ProcessingItem item = queue_.front (); + queue_.pop_front (); if (ok) { - QWebElementCollection result = view_->page()->mainFrame()->findAllElements("#result_box > span"); + QWebElementCollection result = view_->page ()->mainFrame ()->findAllElements ("#result_box > span"); item.translated = ""; - foreach (const QWebElement& element, result) { - item.translated += element.toInnerXml() + " "; + foreach (const QWebElement &element, result) { + item.translated += element.toInnerXml () + " "; } - emit translated(item, !item.translated.isEmpty()); + emit translated (item, !item.translated.isEmpty ()); } else { emit translated (item, false); } } - if (!queue_.isEmpty()) { - load (queue_.front()); + if (!queue_.isEmpty ()) { + load (queue_.front ()); } } -void GoogleWebTranslator::replyFinished(QNetworkReply *reply) -{ - if (reply->url().toString().contains ("/translate_a/single")) { +void GoogleWebTranslator::replyFinished (QNetworkReply *reply) { + if (reply->url ().toString ().contains ("/translate_a/single")) { isTranslationFinished_ = true; if (isLoadFinished_) { - QTimer::singleShot(2000, this, SLOT(loadFinished())); + QTimer::singleShot (2000, this, SLOT (loadFinished ())); } } } -void GoogleWebTranslator::load(const ProcessingItem &item) { +void GoogleWebTranslator::load (const ProcessingItem &item) { ST_ASSERT (!item.recognized.isEmpty ()); if (translationLanguage_.isEmpty ()) { emit error (tr ("Неверные парметры для перевода.")); return; } - QUrl url (QString ("https://translate.google.com/#auto/%1/%2").arg(translationLanguage_, item.recognized)); - view_->setUrl(url); + QUrl url (QString ("https://translate.google.com/#auto/%1/%2").arg (translationLanguage_, item.recognized)); + view_->setUrl (url); } diff --git a/GoogleWebTranslator.h b/GoogleWebTranslator.h index b48cc82..abe230f 100644 --- a/GoogleWebTranslator.h +++ b/GoogleWebTranslator.h @@ -9,12 +9,12 @@ class QWebView; class QUrl; class QNetworkReply; -class GoogleWebTranslator : public QObject -{ - Q_OBJECT +class GoogleWebTranslator : public QObject { + Q_OBJECT + public: - GoogleWebTranslator(); - ~GoogleWebTranslator(); + GoogleWebTranslator (); + ~GoogleWebTranslator (); signals: void translated (ProcessingItem item, bool success); @@ -26,11 +26,11 @@ class GoogleWebTranslator : public QObject private slots: void loadStarted (); - void loadFinished(bool ok=true); - void replyFinished(QNetworkReply * reply); + void loadFinished (bool ok = true); + void replyFinished (QNetworkReply *reply); private: - void load (const ProcessingItem& item); + void load (const ProcessingItem &item); private: QVector queue_; diff --git a/ImageProcessing.cpp b/ImageProcessing.cpp index e329674..cc2da6a 100644 --- a/ImageProcessing.cpp +++ b/ImageProcessing.cpp @@ -8,121 +8,120 @@ #include "StAssert.h" #ifdef WIN32 -#include -qint64 getFreeMemory () -{ +# include +qint64 getFreeMemory () { MEMORYSTATUSEX statex; statex.dwLength = sizeof (statex); - if (GlobalMemoryStatusEx (&statex)) - { + if (GlobalMemoryStatusEx (&statex)) { return statex.ullAvailPhys; } return -1; } #endif -Pix *convertImage(const QImage& image) -{ +Pix * convertImage (const QImage &image) { PIX *pix; - QImage swapped = image.rgbSwapped(); - int width = swapped.width(); - int height = swapped.height(); - int depth = swapped.depth(); - int wpl = swapped.bytesPerLine() / 4; + QImage swapped = image.rgbSwapped (); + int width = swapped.width (); + int height = swapped.height (); + int depth = swapped.depth (); + int wpl = swapped.bytesPerLine () / 4; - pix = pixCreate(width, height, depth); - pixSetWpl(pix, wpl); - pixSetColormap(pix, NULL); + pix = pixCreate (width, height, depth); + pixSetWpl (pix, wpl); + pixSetColormap (pix, NULL); l_uint32 *outData = pix->data; - for (int y = 0; y < height; y++) - { + for (int y = 0; y < height; y++) { l_uint32 *lines = outData + y * wpl; - QByteArray a((const char*)swapped.scanLine(y), swapped.bytesPerLine()); - for (int j = 0; j < a.size(); j++) - { + QByteArray a ((const char *)swapped.scanLine (y), swapped.bytesPerLine ()); + for (int j = 0; j < a.size (); j++) { *((l_uint8 *)lines + j) = a[j]; } } const qreal toDPM = 1.0 / 0.0254; - int resolutionX = swapped.dotsPerMeterX() / toDPM; - int resolutionY = swapped.dotsPerMeterY() / toDPM; + int resolutionX = swapped.dotsPerMeterX () / toDPM; + int resolutionY = swapped.dotsPerMeterY () / toDPM; - if (resolutionX < 300) resolutionX = 300; - if (resolutionY < 300) resolutionY = 300; - pixSetResolution(pix, resolutionX, resolutionY); + if (resolutionX < 300) { + resolutionX = 300; + } + if (resolutionY < 300) { + resolutionY = 300; + } + pixSetResolution (pix, resolutionX, resolutionY); - return pixEndianByteSwapNew(pix); + return pixEndianByteSwapNew (pix); } -QImage convertImage(Pix &image) -{ - int width = pixGetWidth(&image); - int height = pixGetHeight(&image); - int depth = pixGetDepth(&image); - int bytesPerLine = pixGetWpl(&image) * 4; - l_uint32 * datas = pixGetData(pixEndianByteSwapNew(&image)); +QImage convertImage (Pix &image) { + int width = pixGetWidth (&image); + int height = pixGetHeight (&image); + int depth = pixGetDepth (&image); + int bytesPerLine = pixGetWpl (&image) * 4; + l_uint32 *datas = pixGetData (pixEndianByteSwapNew (&image)); QImage::Format format; - if (depth == 1) + if (depth == 1) { format = QImage::Format_Mono; - else if (depth == 8) + } + else if (depth == 8) { format = QImage::Format_Indexed8; - else + } + else { format = QImage::Format_RGB32; + } - QImage result((uchar*)datas, width, height, bytesPerLine, format); + QImage result ((uchar *)datas, width, height, bytesPerLine, format); // Set resolution - l_int32 xres, yres; - pixGetResolution(&image, &xres, &yres); + l_int32 xres, yres; + pixGetResolution (&image, &xres, &yres); const qreal toDPM = 1.0 / 0.0254; - result.setDotsPerMeterX(xres * toDPM); - result.setDotsPerMeterY(yres * toDPM); + result.setDotsPerMeterX (xres * toDPM); + result.setDotsPerMeterY (yres * toDPM); // Handle pallete QVector _bwCT; - _bwCT.append(qRgb(255,255,255)); - _bwCT.append(qRgb(0,0,0)); + _bwCT.append (qRgb (255,255,255)); + _bwCT.append (qRgb (0,0,0)); - QVector _grayscaleCT(256); - for (int i = 0; i < 256; i++) { - _grayscaleCT.append(qRgb(i, i, i)); + QVector _grayscaleCT (256); + for (int i = 0; i < 256; i++) { + _grayscaleCT.append (qRgb (i, i, i)); } switch (depth) { case 1: - result.setColorTable(_bwCT); + result.setColorTable (_bwCT); break; case 8: - result.setColorTable(_grayscaleCT); + result.setColorTable (_grayscaleCT); break; default: - result.setColorTable(_grayscaleCT); + result.setColorTable (_grayscaleCT); } - if (result.isNull()) { - static QImage none(0,0,QImage::Format_Invalid); - qDebug("Invalid format!!!\n"); + if (result.isNull ()) { + static QImage none (0,0,QImage::Format_Invalid); + qDebug ("Invalid format!!!\n"); return none; } - return result.rgbSwapped(); + return result.rgbSwapped (); } -Pix *prepareImage(const QImage &image, int preferredScale) -{ - Pix* pix = convertImage (image); +Pix * prepareImage (const QImage &image, int preferredScale) { + Pix *pix = convertImage (image); ST_ASSERT (pix != NULL); - Pix* gray = pixConvertRGBToGray (pix, 0.0, 0.0, 0.0); + Pix *gray = pixConvertRGBToGray (pix, 0.0, 0.0, 0.0); ST_ASSERT (gray != NULL); pixDestroy (&pix); - Pix* scaled = gray; - if (preferredScale > 0) - { + Pix *scaled = gray; + if (preferredScale > 0) { float maxScaleX = MAX_INT16 / double (gray->w); float scaleX = std::min (float (preferredScale), maxScaleX); float maxScaleY = MAX_INT16 / double (gray->h); @@ -139,14 +138,12 @@ Pix *prepareImage(const QImage &image, int preferredScale) scaled = pixScale (gray, scale, scale); } ST_ASSERT (scaled != NULL); - if (scaled != gray) - { + if (scaled != gray) { pixDestroy (&gray); } return scaled; } -void cleanupImage(Pix **image) -{ +void cleanupImage (Pix **image) { pixDestroy (image); } diff --git a/ImageProcessing.h b/ImageProcessing.h index e8c3dc3..61c8c1c 100644 --- a/ImageProcessing.h +++ b/ImageProcessing.h @@ -6,13 +6,13 @@ class Pix; //! Convert QImage to Leptonica's PIX. -Pix* convertImage(const QImage& image); +Pix * convertImage (const QImage &image); //! Convert Leptonica's PIX to QImage. -QImage convertImage(Pix &image); +QImage convertImage (Pix &image); //! Propare image for OCR. -Pix* prepareImage (const QImage& image, int preferredScale); +Pix * prepareImage (const QImage &image, int preferredScale); //! Free allocated resources for image. -void cleanupImage (Pix** image); +void cleanupImage (Pix **image); #endif // IMAGEPROCESSING_H diff --git a/LanguageHelper.cpp b/LanguageHelper.cpp index 11c180e..fac4813 100644 --- a/LanguageHelper.cpp +++ b/LanguageHelper.cpp @@ -4,108 +4,89 @@ #include "LanguageHelper.h" #include "Settings.h" -LanguageHelper::LanguageHelper() -{ +LanguageHelper::LanguageHelper () { init (); } -QStringList LanguageHelper::availableOcrLanguagesUi() const -{ +QStringList LanguageHelper::availableOcrLanguagesUi () const { QStringList uiItems; - foreach (const QString& item, availableOcrLanguages_) - { + foreach (const QString &item, availableOcrLanguages_) { uiItems << ocrCodeToUi (item); } uiItems.sort (); return uiItems; } -const QStringList &LanguageHelper::availableOcrLanguages() const -{ +const QStringList &LanguageHelper::availableOcrLanguages () const { return availableOcrLanguages_; } -QStringList LanguageHelper::availableOcrLanguages(const QString &path) const -{ +QStringList LanguageHelper::availableOcrLanguages (const QString &path) const { QDir dir (path + "/tessdata/"); - if (!dir.exists ()) - { + if (!dir.exists ()) { return QStringList (); } QStringList items; QStringList files = dir.entryList (QStringList () << "*.traineddata", QDir::Files); - foreach (const QString& file, files) - { + foreach (const QString &file, files) { QString lang = file.left (file.indexOf (".")); items << lang; } return items; } -QStringList LanguageHelper::availableOcrLanguagesUi(const QString &path) const -{ +QStringList LanguageHelper::availableOcrLanguagesUi (const QString &path) const { QStringList uiItems, items; items = availableOcrLanguages (path); - foreach (const QString& item, items) - { + foreach (const QString &item, items) { uiItems << ocrCodeToUi (item); } uiItems.sort (); return uiItems; } -QStringList LanguageHelper::translateLanguagesUi() const -{ +QStringList LanguageHelper::translateLanguagesUi () const { QStringList uiItems = translateLanguages_.keys (); uiItems.sort (); return uiItems; } -QStringList LanguageHelper::translateLanguages() const -{ +QStringList LanguageHelper::translateLanguages () const { return translateLanguages_.values (); } -QString LanguageHelper::translateCodeToUi(const QString &text) const -{ +QString LanguageHelper::translateCodeToUi (const QString &text) const { return translateLanguages_.key (text, text); } -QString LanguageHelper::translateUiToCode(const QString &text) const -{ +QString LanguageHelper::translateUiToCode (const QString &text) const { return translateLanguages_.value (text, text); } -QString LanguageHelper::ocrCodeToUi(const QString &text) const -{ +QString LanguageHelper::ocrCodeToUi (const QString &text) const { return ocrLanguages_.key (text, text); } -QString LanguageHelper::ocrUiToCode(const QString &text) const -{ +QString LanguageHelper::ocrUiToCode (const QString &text) const { return ocrLanguages_.value (text, text); } -QString LanguageHelper::translateForOcrCode(const QString &text) const -{ +QString LanguageHelper::translateForOcrCode (const QString &text) const { QString ocrUi = ocrUiToCode (text); QString translate = translateCodeToUi (ocrUi); - if (translate == ocrUi) - { + if (translate == ocrUi) { translate = "auto"; } return translate; } -void LanguageHelper::init() -{ +void LanguageHelper::init () { initOcrLanguages (); initTranslateLanguages (); updateAvailableOcrLanguages (); } -void LanguageHelper::updateAvailableOcrLanguages() -{ +void LanguageHelper::updateAvailableOcrLanguages () { availableOcrLanguages_.clear (); QSettings settings; settings.beginGroup (settings_names::recogntionGroup); @@ -114,131 +95,129 @@ void LanguageHelper::updateAvailableOcrLanguages() availableOcrLanguages_ = availableOcrLanguages (tessDataPlace); } -void LanguageHelper::initTranslateLanguages() -{ - translateLanguages_.insert(QObject::tr("Afrikaans"),"af"); - translateLanguages_.insert(QObject::tr("Albanian"),"sq"); - translateLanguages_.insert(QObject::tr("Arabic"),"ar"); - translateLanguages_.insert(QObject::tr("Armenian"),"hy"); - translateLanguages_.insert(QObject::tr("Azerbaijani"),"az"); - translateLanguages_.insert(QObject::tr("Basque"),"eu"); - translateLanguages_.insert(QObject::tr("Belarusian"),"be"); - translateLanguages_.insert(QObject::tr("Bulgarian"),"bg"); - translateLanguages_.insert(QObject::tr("Catalan"),"ca"); - translateLanguages_.insert(QObject::tr("Chinese (Simplified)"),"zh-CN"); - translateLanguages_.insert(QObject::tr("Chinese (Traditional)"),"zh-TW"); - translateLanguages_.insert(QObject::tr("Croatian"),"hr"); - translateLanguages_.insert(QObject::tr("Czech"),"cs"); - translateLanguages_.insert(QObject::tr("Danish"),"da"); - translateLanguages_.insert(QObject::tr("Dutch"),"nl"); - translateLanguages_.insert(QObject::tr("English"),"en"); - translateLanguages_.insert(QObject::tr("Estonian"),"et"); - translateLanguages_.insert(QObject::tr("Filipino"),"tl"); - translateLanguages_.insert(QObject::tr("Finnish"),"fi"); - translateLanguages_.insert(QObject::tr("French"),"fr"); - translateLanguages_.insert(QObject::tr("Galician"),"gl"); - translateLanguages_.insert(QObject::tr("Georgian"),"ka"); - translateLanguages_.insert(QObject::tr("German"),"de"); - translateLanguages_.insert(QObject::tr("Greek"),"el"); - translateLanguages_.insert(QObject::tr("Haitian Creole"),"ht"); - translateLanguages_.insert(QObject::tr("Hebrew"),"iw"); - translateLanguages_.insert(QObject::tr("Hindi"),"hi"); - translateLanguages_.insert(QObject::tr("Hungarian"),"hu"); - translateLanguages_.insert(QObject::tr("Icelandic"),"is"); - translateLanguages_.insert(QObject::tr("Indonesian"),"id"); - translateLanguages_.insert(QObject::tr("Irish"),"ga"); - translateLanguages_.insert(QObject::tr("Italian"),"it"); - translateLanguages_.insert(QObject::tr("Japanese"),"ja"); - translateLanguages_.insert(QObject::tr("Korean"),"ko"); - translateLanguages_.insert(QObject::tr("Latvian"),"lv"); - translateLanguages_.insert(QObject::tr("Lithuanian"),"lt"); - translateLanguages_.insert(QObject::tr("Macedonian"),"mk"); - translateLanguages_.insert(QObject::tr("Malay"),"ms"); - translateLanguages_.insert(QObject::tr("Maltese"),"mt"); - translateLanguages_.insert(QObject::tr("Norwegian"),"no"); - translateLanguages_.insert(QObject::tr("Persian"),"fa"); - translateLanguages_.insert(QObject::tr("Polish"),"pl"); - translateLanguages_.insert(QObject::tr("Portuguese"),"pt"); - translateLanguages_.insert(QObject::tr("Romanian"),"ro"); - translateLanguages_.insert(QObject::tr("Russian"),"ru"); - translateLanguages_.insert(QObject::tr("Serbian"),"sr"); - translateLanguages_.insert(QObject::tr("Slovak"),"sk"); - translateLanguages_.insert(QObject::tr("Slovenian"),"sl"); - translateLanguages_.insert(QObject::tr("Spanish"),"es"); - translateLanguages_.insert(QObject::tr("Swahili"),"sw"); - translateLanguages_.insert(QObject::tr("Swedish"),"sv"); - translateLanguages_.insert(QObject::tr("Thai"),"th"); - translateLanguages_.insert(QObject::tr("Turkish"),"tr"); - translateLanguages_.insert(QObject::tr("Ukrainian"),"uk"); - translateLanguages_.insert(QObject::tr("Urdu"),"ur"); - translateLanguages_.insert(QObject::tr("Vietnamese"),"vi"); - translateLanguages_.insert(QObject::tr("Welsh"),"cy"); - translateLanguages_.insert(QObject::tr("Yiddish"),"yi"); +void LanguageHelper::initTranslateLanguages () { + translateLanguages_.insert (QObject::tr ("Afrikaans"),"af"); + translateLanguages_.insert (QObject::tr ("Albanian"),"sq"); + translateLanguages_.insert (QObject::tr ("Arabic"),"ar"); + translateLanguages_.insert (QObject::tr ("Armenian"),"hy"); + translateLanguages_.insert (QObject::tr ("Azerbaijani"),"az"); + translateLanguages_.insert (QObject::tr ("Basque"),"eu"); + translateLanguages_.insert (QObject::tr ("Belarusian"),"be"); + translateLanguages_.insert (QObject::tr ("Bulgarian"),"bg"); + translateLanguages_.insert (QObject::tr ("Catalan"),"ca"); + translateLanguages_.insert (QObject::tr ("Chinese (Simplified)"),"zh-CN"); + translateLanguages_.insert (QObject::tr ("Chinese (Traditional)"),"zh-TW"); + translateLanguages_.insert (QObject::tr ("Croatian"),"hr"); + translateLanguages_.insert (QObject::tr ("Czech"),"cs"); + translateLanguages_.insert (QObject::tr ("Danish"),"da"); + translateLanguages_.insert (QObject::tr ("Dutch"),"nl"); + translateLanguages_.insert (QObject::tr ("English"),"en"); + translateLanguages_.insert (QObject::tr ("Estonian"),"et"); + translateLanguages_.insert (QObject::tr ("Filipino"),"tl"); + translateLanguages_.insert (QObject::tr ("Finnish"),"fi"); + translateLanguages_.insert (QObject::tr ("French"),"fr"); + translateLanguages_.insert (QObject::tr ("Galician"),"gl"); + translateLanguages_.insert (QObject::tr ("Georgian"),"ka"); + translateLanguages_.insert (QObject::tr ("German"),"de"); + translateLanguages_.insert (QObject::tr ("Greek"),"el"); + translateLanguages_.insert (QObject::tr ("Haitian Creole"),"ht"); + translateLanguages_.insert (QObject::tr ("Hebrew"),"iw"); + translateLanguages_.insert (QObject::tr ("Hindi"),"hi"); + translateLanguages_.insert (QObject::tr ("Hungarian"),"hu"); + translateLanguages_.insert (QObject::tr ("Icelandic"),"is"); + translateLanguages_.insert (QObject::tr ("Indonesian"),"id"); + translateLanguages_.insert (QObject::tr ("Irish"),"ga"); + translateLanguages_.insert (QObject::tr ("Italian"),"it"); + translateLanguages_.insert (QObject::tr ("Japanese"),"ja"); + translateLanguages_.insert (QObject::tr ("Korean"),"ko"); + translateLanguages_.insert (QObject::tr ("Latvian"),"lv"); + translateLanguages_.insert (QObject::tr ("Lithuanian"),"lt"); + translateLanguages_.insert (QObject::tr ("Macedonian"),"mk"); + translateLanguages_.insert (QObject::tr ("Malay"),"ms"); + translateLanguages_.insert (QObject::tr ("Maltese"),"mt"); + translateLanguages_.insert (QObject::tr ("Norwegian"),"no"); + translateLanguages_.insert (QObject::tr ("Persian"),"fa"); + translateLanguages_.insert (QObject::tr ("Polish"),"pl"); + translateLanguages_.insert (QObject::tr ("Portuguese"),"pt"); + translateLanguages_.insert (QObject::tr ("Romanian"),"ro"); + translateLanguages_.insert (QObject::tr ("Russian"),"ru"); + translateLanguages_.insert (QObject::tr ("Serbian"),"sr"); + translateLanguages_.insert (QObject::tr ("Slovak"),"sk"); + translateLanguages_.insert (QObject::tr ("Slovenian"),"sl"); + translateLanguages_.insert (QObject::tr ("Spanish"),"es"); + translateLanguages_.insert (QObject::tr ("Swahili"),"sw"); + translateLanguages_.insert (QObject::tr ("Swedish"),"sv"); + translateLanguages_.insert (QObject::tr ("Thai"),"th"); + translateLanguages_.insert (QObject::tr ("Turkish"),"tr"); + translateLanguages_.insert (QObject::tr ("Ukrainian"),"uk"); + translateLanguages_.insert (QObject::tr ("Urdu"),"ur"); + translateLanguages_.insert (QObject::tr ("Vietnamese"),"vi"); + translateLanguages_.insert (QObject::tr ("Welsh"),"cy"); + translateLanguages_.insert (QObject::tr ("Yiddish"),"yi"); } -void LanguageHelper::initOcrLanguages() -{ - ocrLanguages_.insert(QObject::tr("Ancient Greek"),"grc"); - ocrLanguages_.insert(QObject::tr("Esperanto alternative"),"epo_alt"); - ocrLanguages_.insert(QObject::tr("English"),"eng"); - ocrLanguages_.insert(QObject::tr("Ukrainian"),"ukr"); - ocrLanguages_.insert(QObject::tr("Turkish"),"tur"); - ocrLanguages_.insert(QObject::tr("Thai"),"tha"); - ocrLanguages_.insert(QObject::tr("Tagalog"),"tgl"); - ocrLanguages_.insert(QObject::tr("Telugu"),"tel"); - ocrLanguages_.insert(QObject::tr("Tamil"),"tam"); - ocrLanguages_.insert(QObject::tr("Swedish"),"swe"); - ocrLanguages_.insert(QObject::tr("Swahili"),"swa"); - ocrLanguages_.insert(QObject::tr("Serbian"),"srp"); - ocrLanguages_.insert(QObject::tr("Albanian"),"sqi"); - ocrLanguages_.insert(QObject::tr("Spanish"),"spa"); - ocrLanguages_.insert(QObject::tr("Slovenian"),"slv"); - ocrLanguages_.insert(QObject::tr("Slovakian"),"slk"); - ocrLanguages_.insert(QObject::tr("Romanian"),"ron"); - ocrLanguages_.insert(QObject::tr("Portuguese"),"por"); - ocrLanguages_.insert(QObject::tr("Polish"),"pol"); - ocrLanguages_.insert(QObject::tr("Norwegian"),"nor"); - ocrLanguages_.insert(QObject::tr("Dutch"),"nld"); - ocrLanguages_.insert(QObject::tr("Malay"),"msa"); - ocrLanguages_.insert(QObject::tr("Maltese"),"mlt"); - ocrLanguages_.insert(QObject::tr("Macedonian"),"mkd"); - ocrLanguages_.insert(QObject::tr("Malayalam"),"mal"); - ocrLanguages_.insert(QObject::tr("Lithuanian"),"lit"); - ocrLanguages_.insert(QObject::tr("Latvian"),"lav"); - ocrLanguages_.insert(QObject::tr("Korean"),"kor"); - ocrLanguages_.insert(QObject::tr("Kannada"),"kan"); - ocrLanguages_.insert(QObject::tr("Italian"),"ita"); - ocrLanguages_.insert(QObject::tr("Icelandic"),"isl"); - ocrLanguages_.insert(QObject::tr("Indonesian"),"ind"); - ocrLanguages_.insert(QObject::tr("Cherokee"),"chr"); - ocrLanguages_.insert(QObject::tr("Hungarian"),"hun"); - ocrLanguages_.insert(QObject::tr("Croatian"),"hrv"); - ocrLanguages_.insert(QObject::tr("Hindi"),"hin"); - ocrLanguages_.insert(QObject::tr("Hebrew"),"heb"); - ocrLanguages_.insert(QObject::tr("Galician"),"glg"); - ocrLanguages_.insert(QObject::tr("Middle French (ca. 1400-1600)"),"frm"); - ocrLanguages_.insert(QObject::tr("Frankish"),"frk"); - ocrLanguages_.insert(QObject::tr("French"),"fra"); - ocrLanguages_.insert(QObject::tr("Finnish"),"fin"); - ocrLanguages_.insert(QObject::tr("Basque"),"eus"); - ocrLanguages_.insert(QObject::tr("Estonian"),"est"); - ocrLanguages_.insert(QObject::tr("Math / equation"),"equ"); - ocrLanguages_.insert(QObject::tr("Esperanto"),"epo"); - ocrLanguages_.insert(QObject::tr("Middle English (1100-1500)"),"enm"); - ocrLanguages_.insert(QObject::tr("Greek"),"ell"); - ocrLanguages_.insert(QObject::tr("German"),"deu"); - ocrLanguages_.insert(QObject::tr("Danish"),"dan"); - ocrLanguages_.insert(QObject::tr("Czech"),"ces"); - ocrLanguages_.insert(QObject::tr("Catalan"),"cat"); - ocrLanguages_.insert(QObject::tr("Bulgarian"),"bul"); - ocrLanguages_.insert(QObject::tr("Bengali"),"ben"); - ocrLanguages_.insert(QObject::tr("Belarusian"),"bel"); - ocrLanguages_.insert(QObject::tr("Azerbaijani"),"aze"); - ocrLanguages_.insert(QObject::tr("Arabic"),"ara"); - ocrLanguages_.insert(QObject::tr("Afrikaans"),"afr"); - ocrLanguages_.insert(QObject::tr("Japanese"),"jpn"); - ocrLanguages_.insert(QObject::tr("Chinese (Simplified)"),"chi_sim"); - ocrLanguages_.insert(QObject::tr("Chinese (Traditional)"),"chi_tra"); - ocrLanguages_.insert(QObject::tr("Russian"),"rus"); - ocrLanguages_.insert(QObject::tr("Vietnamese"),"vie"); +void LanguageHelper::initOcrLanguages () { + ocrLanguages_.insert (QObject::tr ("Ancient Greek"),"grc"); + ocrLanguages_.insert (QObject::tr ("Esperanto alternative"),"epo_alt"); + ocrLanguages_.insert (QObject::tr ("English"),"eng"); + ocrLanguages_.insert (QObject::tr ("Ukrainian"),"ukr"); + ocrLanguages_.insert (QObject::tr ("Turkish"),"tur"); + ocrLanguages_.insert (QObject::tr ("Thai"),"tha"); + ocrLanguages_.insert (QObject::tr ("Tagalog"),"tgl"); + ocrLanguages_.insert (QObject::tr ("Telugu"),"tel"); + ocrLanguages_.insert (QObject::tr ("Tamil"),"tam"); + ocrLanguages_.insert (QObject::tr ("Swedish"),"swe"); + ocrLanguages_.insert (QObject::tr ("Swahili"),"swa"); + ocrLanguages_.insert (QObject::tr ("Serbian"),"srp"); + ocrLanguages_.insert (QObject::tr ("Albanian"),"sqi"); + ocrLanguages_.insert (QObject::tr ("Spanish"),"spa"); + ocrLanguages_.insert (QObject::tr ("Slovenian"),"slv"); + ocrLanguages_.insert (QObject::tr ("Slovakian"),"slk"); + ocrLanguages_.insert (QObject::tr ("Romanian"),"ron"); + ocrLanguages_.insert (QObject::tr ("Portuguese"),"por"); + ocrLanguages_.insert (QObject::tr ("Polish"),"pol"); + ocrLanguages_.insert (QObject::tr ("Norwegian"),"nor"); + ocrLanguages_.insert (QObject::tr ("Dutch"),"nld"); + ocrLanguages_.insert (QObject::tr ("Malay"),"msa"); + ocrLanguages_.insert (QObject::tr ("Maltese"),"mlt"); + ocrLanguages_.insert (QObject::tr ("Macedonian"),"mkd"); + ocrLanguages_.insert (QObject::tr ("Malayalam"),"mal"); + ocrLanguages_.insert (QObject::tr ("Lithuanian"),"lit"); + ocrLanguages_.insert (QObject::tr ("Latvian"),"lav"); + ocrLanguages_.insert (QObject::tr ("Korean"),"kor"); + ocrLanguages_.insert (QObject::tr ("Kannada"),"kan"); + ocrLanguages_.insert (QObject::tr ("Italian"),"ita"); + ocrLanguages_.insert (QObject::tr ("Icelandic"),"isl"); + ocrLanguages_.insert (QObject::tr ("Indonesian"),"ind"); + ocrLanguages_.insert (QObject::tr ("Cherokee"),"chr"); + ocrLanguages_.insert (QObject::tr ("Hungarian"),"hun"); + ocrLanguages_.insert (QObject::tr ("Croatian"),"hrv"); + ocrLanguages_.insert (QObject::tr ("Hindi"),"hin"); + ocrLanguages_.insert (QObject::tr ("Hebrew"),"heb"); + ocrLanguages_.insert (QObject::tr ("Galician"),"glg"); + ocrLanguages_.insert (QObject::tr ("Middle French (ca. 1400-1600)"),"frm"); + ocrLanguages_.insert (QObject::tr ("Frankish"),"frk"); + ocrLanguages_.insert (QObject::tr ("French"),"fra"); + ocrLanguages_.insert (QObject::tr ("Finnish"),"fin"); + ocrLanguages_.insert (QObject::tr ("Basque"),"eus"); + ocrLanguages_.insert (QObject::tr ("Estonian"),"est"); + ocrLanguages_.insert (QObject::tr ("Math / equation"),"equ"); + ocrLanguages_.insert (QObject::tr ("Esperanto"),"epo"); + ocrLanguages_.insert (QObject::tr ("Middle English (1100-1500)"),"enm"); + ocrLanguages_.insert (QObject::tr ("Greek"),"ell"); + ocrLanguages_.insert (QObject::tr ("German"),"deu"); + ocrLanguages_.insert (QObject::tr ("Danish"),"dan"); + ocrLanguages_.insert (QObject::tr ("Czech"),"ces"); + ocrLanguages_.insert (QObject::tr ("Catalan"),"cat"); + ocrLanguages_.insert (QObject::tr ("Bulgarian"),"bul"); + ocrLanguages_.insert (QObject::tr ("Bengali"),"ben"); + ocrLanguages_.insert (QObject::tr ("Belarusian"),"bel"); + ocrLanguages_.insert (QObject::tr ("Azerbaijani"),"aze"); + ocrLanguages_.insert (QObject::tr ("Arabic"),"ara"); + ocrLanguages_.insert (QObject::tr ("Afrikaans"),"afr"); + ocrLanguages_.insert (QObject::tr ("Japanese"),"jpn"); + ocrLanguages_.insert (QObject::tr ("Chinese (Simplified)"),"chi_sim"); + ocrLanguages_.insert (QObject::tr ("Chinese (Traditional)"),"chi_tra"); + ocrLanguages_.insert (QObject::tr ("Russian"),"rus"); + ocrLanguages_.insert (QObject::tr ("Vietnamese"),"vie"); } diff --git a/LanguageHelper.h b/LanguageHelper.h index b9599e9..c602e59 100644 --- a/LanguageHelper.h +++ b/LanguageHelper.h @@ -4,27 +4,26 @@ #include #include -class LanguageHelper -{ +class LanguageHelper { public: LanguageHelper (); QStringList availableOcrLanguagesUi () const; - const QStringList& availableOcrLanguages () const; - QStringList availableOcrLanguagesUi (const QString& path) const; + const QStringList &availableOcrLanguages () const; + QStringList availableOcrLanguagesUi (const QString &path) const; QStringList translateLanguagesUi () const; QStringList translateLanguages () const; - QString translateCodeToUi (const QString& text) const; - QString translateUiToCode (const QString& text) const; - QString ocrCodeToUi (const QString& text) const; - QString ocrUiToCode (const QString& text) const; - QString translateForOcrCode (const QString& text) const; + QString translateCodeToUi (const QString &text) const; + QString translateUiToCode (const QString &text) const; + QString ocrCodeToUi (const QString &text) const; + QString ocrUiToCode (const QString &text) const; + QString translateForOcrCode (const QString &text) const; void updateAvailableOcrLanguages (); private: - QStringList availableOcrLanguages (const QString& path) const; + QStringList availableOcrLanguages (const QString &path) const; void init (); void initTranslateLanguages (); void initOcrLanguages (); diff --git a/Manager.cpp b/Manager.cpp index 213c47c..936dda5 100644 --- a/Manager.cpp +++ b/Manager.cpp @@ -20,41 +20,40 @@ #include "LanguageHelper.h" #include "StAssert.h" -Manager::Manager(QObject *parent) : - QObject(parent), +Manager::Manager (QObject *parent) : + QObject (parent), trayIcon_ (new QSystemTrayIcon (QIcon (":/images/icon.png"), this)), dictionary_ (new LanguageHelper), selection_ (new SelectionDialog (*dictionary_)), resultDialog_ (new ResultDialog), captureAction_ (NULL), repeatAction_ (NULL), clipboardAction_ (NULL), - useResultDialog_ (true) -{ + useResultDialog_ (true) { GlobalActionHelper::init (); qRegisterMetaType(); // Recognizer - Recognizer* recognizer = new Recognizer; + Recognizer *recognizer = new Recognizer; connect (selection_, SIGNAL (selected (ProcessingItem)), recognizer, SLOT (recognize (ProcessingItem))); connect (recognizer, SIGNAL (error (QString)), SLOT (showError (QString))); connect (this, SIGNAL (settingsEdited ()), recognizer, SLOT (applySettings ())); - QThread* recognizerThread = new QThread (this); + QThread *recognizerThread = new QThread (this); recognizer->moveToThread (recognizerThread); recognizerThread->start (); connect (qApp, SIGNAL (aboutToQuit ()), recognizerThread, SLOT (quit ())); // Translator - Translator* translator = new Translator; + Translator *translator = new Translator; connect (recognizer, SIGNAL (recognized (ProcessingItem)), translator, SLOT (translate (ProcessingItem))); connect (translator, SIGNAL (error (QString)), SLOT (showError (QString))); connect (this, SIGNAL (settingsEdited ()), translator, SLOT (applySettings ())); - QThread* translatorThread = new QThread (this); + QThread *translatorThread = new QThread (this); translator->moveToThread (translatorThread); translatorThread->start (); connect (qApp, SIGNAL (aboutToQuit ()), translatorThread, SLOT (quit ())); @@ -80,11 +79,10 @@ Manager::Manager(QObject *parent) : applySettings (); } -QMenu*Manager::trayContextMenu() -{ - QMenu* menu = new QMenu (); +QMenu * Manager::trayContextMenu () { + QMenu *menu = new QMenu (); captureAction_ = menu->addAction (tr ("Захват"), this, SLOT (capture ())); - QMenu* translateMenu = menu->addMenu (tr ("Перевод")); + QMenu *translateMenu = menu->addMenu (tr ("Перевод")); repeatAction_ = translateMenu->addAction (tr ("Повторить"), this, SLOT (showLast ())); clipboardAction_ = translateMenu->addAction (tr ("Скопировать"), this, @@ -95,8 +93,7 @@ QMenu*Manager::trayContextMenu() return menu; } -void Manager::applySettings() -{ +void Manager::applySettings () { QSettings settings; settings.beginGroup (settings_names::guiGroup); QString captureHotkey = settings.value (settings_names::captureHotkey, @@ -128,15 +125,13 @@ void Manager::applySettings() dictionary_->updateAvailableOcrLanguages (); } -Manager::~Manager() -{ +Manager::~Manager () { } -void Manager::capture() -{ - QList screens = QApplication::screens (); +void Manager::capture () { + QList screens = QApplication::screens (); ST_ASSERT (!screens.isEmpty ()); - QScreen* screen = screens.first (); + QScreen *screen = screens.first (); Q_CHECK_PTR (screen); WId desktopId = QApplication::desktop ()->winId (); QPixmap pixmap = screen->grabWindow (desktopId); @@ -144,27 +139,24 @@ void Manager::capture() emit showPixmap (pixmap); } -void Manager::settings() -{ +void Manager::settings () { SettingsEditor editor (*dictionary_); editor.setWindowIcon (trayIcon_->icon ()); connect (&editor, SIGNAL (settingsEdited ()), SIGNAL (settingsEdited ())); editor.exec (); } -void Manager::close() -{ +void Manager::close () { QApplication::quit (); } -void Manager::about() -{ +void Manager::about () { QString version = "1.2.3"; - QString text = tr ("Программа для распознавания текста на экране.\n"\ + QString text = tr ("Программа для распознавания текста на экране.\n" \ "Создана с использованием Qt, tesseract-ocr, Google Translate.\n" "Автор: Gres (translator@gres.biz)\n" "Версия: %1 от %2 %3").arg (version) - .arg (__DATE__).arg (__TIME__); + .arg (__DATE__).arg (__TIME__); QMessageBox message (QMessageBox::Information, tr ("О программе"), text, QMessageBox::Ok); @@ -172,31 +164,24 @@ void Manager::about() message.exec (); } -void Manager::processTrayAction(QSystemTrayIcon::ActivationReason reason) -{ - if (reason == QSystemTrayIcon::Trigger) - { +void Manager::processTrayAction (QSystemTrayIcon::ActivationReason reason) { + if (reason == QSystemTrayIcon::Trigger) { showLast (); } - else if (reason == QSystemTrayIcon::MiddleClick) - { + else if (reason == QSystemTrayIcon::MiddleClick) { copyLastToClipboard (); } } -void Manager::showLast() -{ - if (lastItem_.isValid ()) - { +void Manager::showLast () { + if (lastItem_.isValid ()) { showResult (lastItem_); } } -void Manager::copyLastToClipboard() -{ - if (lastItem_.isValid ()) - { - QClipboard* clipboard = QApplication::clipboard (); +void Manager::copyLastToClipboard () { + if (lastItem_.isValid ()) { + QClipboard *clipboard = QApplication::clipboard (); QString message = lastItem_.recognized + " - " + lastItem_.translated; clipboard->setText (message); trayIcon_->showMessage (tr ("Перевод"), @@ -205,23 +190,19 @@ void Manager::copyLastToClipboard() } } -void Manager::showResult(ProcessingItem item) -{ +void Manager::showResult (ProcessingItem item) { ST_ASSERT (item.isValid ()); lastItem_ = item; - if (useResultDialog_) - { + if (useResultDialog_) { resultDialog_->showResult (item); } - else - { + else { QString message = item.recognized + " - " + item.translated; trayIcon_->showMessage (tr ("Перевод"), message, QSystemTrayIcon::Information); } } -void Manager::showError(QString text) -{ +void Manager::showError (QString text) { qCritical () << text; trayIcon_->showMessage (tr ("Ошибка"), text, QSystemTrayIcon::Critical); } diff --git a/Manager.h b/Manager.h index 443f01c..03e0a21 100644 --- a/Manager.h +++ b/Manager.h @@ -13,11 +13,11 @@ class SelectionDialog; class ResultDialog; class LanguageHelper; -class Manager : public QObject -{ - Q_OBJECT +class Manager : public QObject { + Q_OBJECT + public: - explicit Manager(QObject *parent = 0); + explicit Manager (QObject *parent = 0); ~Manager (); signals: @@ -40,16 +40,16 @@ class Manager : public QObject void showError (QString text); private: - QMenu* trayContextMenu (); + QMenu * trayContextMenu (); private: - QSystemTrayIcon* trayIcon_; - LanguageHelper* dictionary_; - SelectionDialog* selection_; - ResultDialog* resultDialog_; - QAction* captureAction_; - QAction* repeatAction_; - QAction* clipboardAction_; + QSystemTrayIcon *trayIcon_; + LanguageHelper *dictionary_; + SelectionDialog *selection_; + ResultDialog *resultDialog_; + QAction *captureAction_; + QAction *repeatAction_; + QAction *clipboardAction_; ProcessingItem lastItem_; bool useResultDialog_; }; diff --git a/ProcessingItem.cpp b/ProcessingItem.cpp index f0f4102..2729b72 100644 --- a/ProcessingItem.cpp +++ b/ProcessingItem.cpp @@ -1,7 +1,6 @@ #include "ProcessingItem.h" -bool ProcessingItem::isValid() const -{ +bool ProcessingItem::isValid () const { bool valid = true; valid &= (!screenPos.isNull ()); valid &= (!source.isNull ()); diff --git a/ProcessingItem.h b/ProcessingItem.h index 3d43da7..914673c 100644 --- a/ProcessingItem.h +++ b/ProcessingItem.h @@ -3,18 +3,17 @@ #include -struct ProcessingItem -{ - QPoint screenPos; - QPixmap source; - QString recognized; - QString translated; +struct ProcessingItem { + QPoint screenPos; + QPixmap source; + QString recognized; + QString translated; - QString ocrLanguage; - QString sourceLanguage; + QString ocrLanguage; + QString sourceLanguage; - bool isValid () const; + bool isValid () const; }; -Q_DECLARE_METATYPE(ProcessingItem) +Q_DECLARE_METATYPE (ProcessingItem) #endif // PROCESSINGITEM_H diff --git a/Recognizer.cpp b/Recognizer.cpp index b99031a..895234b 100644 --- a/Recognizer.cpp +++ b/Recognizer.cpp @@ -9,22 +9,19 @@ #include "ImageProcessing.h" #include "StAssert.h" -Recognizer::Recognizer(QObject *parent) : - QObject(parent), - engine_ (NULL), imageScale_ (0) -{ +Recognizer::Recognizer (QObject *parent) : + QObject (parent), + engine_ (NULL), imageScale_ (0) { applySettings (); } -void Recognizer::applySettings() -{ +void Recognizer::applySettings () { QSettings settings; settings.beginGroup (settings_names::recogntionGroup); tessDataDir_ = settings.value (settings_names::tessDataPlace, settings_values::tessDataPlace).toString (); - if (tessDataDir_.right (1) != "/") - { + if (tessDataDir_.right (1) != "/") { tessDataDir_ += "/"; } ocrLanguage_ = settings.value (settings_names::ocrLanguage, @@ -35,22 +32,18 @@ void Recognizer::applySettings() initEngine (engine_, ocrLanguage_); } -bool Recognizer::initEngine(tesseract::TessBaseAPI *&engine, const QString& language) -{ - if (tessDataDir_.isEmpty () || language.isEmpty ()) - { +bool Recognizer::initEngine (tesseract::TessBaseAPI * &engine, const QString &language) { + if (tessDataDir_.isEmpty () || language.isEmpty ()) { emit error (tr ("Неверные параметры для OCR")); return false; } - if (engine != NULL) - { + if (engine != NULL) { delete engine; } - engine = new tesseract::TessBaseAPI(); - int result = engine->Init(qPrintable (tessDataDir_), qPrintable (language), + engine = new tesseract::TessBaseAPI (); + int result = engine->Init (qPrintable (tessDataDir_), qPrintable (language), tesseract::OEM_DEFAULT); - if (result != 0) - { + if (result != 0) { emit error (tr ("Ошибка инициализации OCR: %1").arg (result)); delete engine; engine = NULL; @@ -59,42 +52,36 @@ bool Recognizer::initEngine(tesseract::TessBaseAPI *&engine, const QString& lang return true; } -void Recognizer::recognize(ProcessingItem item) -{ +void Recognizer::recognize (ProcessingItem item) { ST_ASSERT (!item.source.isNull ()); bool isCustomLanguage = (!item.ocrLanguage.isEmpty () && item.ocrLanguage != ocrLanguage_); - tesseract::TessBaseAPI* engine = (isCustomLanguage) ? NULL : engine_; - if (engine == NULL) - { + tesseract::TessBaseAPI *engine = (isCustomLanguage) ? NULL : engine_; + if (engine == NULL) { QString language = (isCustomLanguage) ? item.ocrLanguage : ocrLanguage_; - if (!initEngine (engine, language)) - { + if (!initEngine (engine, language)) { return; } } - Pix* image = prepareImage (item.source.toImage (), imageScale_); + Pix *image = prepareImage (item.source.toImage (), imageScale_); ST_ASSERT (image != NULL); engine->SetImage (image); - char* outText = engine->GetUTF8Text(); - engine->Clear(); + char *outText = engine->GetUTF8Text (); + engine->Clear (); cleanupImage (&image); QString result = QString (outText).trimmed (); delete [] outText; - if (isCustomLanguage) - { + if (isCustomLanguage) { delete engine; } - if (!result.isEmpty ()) - { + if (!result.isEmpty ()) { item.recognized = result; emit recognized (item); } - else - { + else { emit error (tr ("Текст не распознан.")); } } diff --git a/Recognizer.h b/Recognizer.h index e2c9eb5..5cfde88 100644 --- a/Recognizer.h +++ b/Recognizer.h @@ -6,16 +6,15 @@ #include "ProcessingItem.h" -namespace tesseract -{ +namespace tesseract { class TessBaseAPI; } -class Recognizer : public QObject -{ - Q_OBJECT +class Recognizer : public QObject { + Q_OBJECT + public: - explicit Recognizer(QObject *parent = 0); + explicit Recognizer (QObject *parent = 0); signals: void recognized (ProcessingItem item); @@ -26,10 +25,10 @@ class Recognizer : public QObject void applySettings (); private: - bool initEngine (tesseract::TessBaseAPI*&engine, const QString &language); + bool initEngine (tesseract::TessBaseAPI * &engine, const QString &language); private: - tesseract::TessBaseAPI* engine_; + tesseract::TessBaseAPI *engine_; QString tessDataDir_; QString ocrLanguage_; diff --git a/ResultDialog.cpp b/ResultDialog.cpp index aeb8ef3..dbb1343 100644 --- a/ResultDialog.cpp +++ b/ResultDialog.cpp @@ -4,35 +4,30 @@ #include -ResultDialog::ResultDialog(QWidget *parent) : - QDialog(parent), - ui(new Ui::ResultDialog), - isShowAtCapturePos_ (true) -{ - ui->setupUi(this); +ResultDialog::ResultDialog (QWidget *parent) : + QDialog (parent), + ui (new Ui::ResultDialog), + isShowAtCapturePos_ (true) { + ui->setupUi (this); setWindowFlags (Qt::FramelessWindowHint | Qt::NoDropShadowWindowHint | Qt::WindowStaysOnTopHint); installEventFilter (this); } -ResultDialog::~ResultDialog() -{ +ResultDialog::~ResultDialog () { delete ui; } -bool ResultDialog::eventFilter(QObject* object, QEvent* event) -{ +bool ResultDialog::eventFilter (QObject *object, QEvent *event) { Q_UNUSED (object); - if (event->type () == QEvent::MouseButtonRelease) - { + if (event->type () == QEvent::MouseButtonRelease) { hide (); } return QDialog::eventFilter (object, event); } -void ResultDialog::showResult(ProcessingItem item) -{ +void ResultDialog::showResult (ProcessingItem item) { ST_ASSERT (!item.source.isNull ()); ST_ASSERT (!item.recognized.isEmpty ()); ST_ASSERT (!item.translated.isEmpty ()); @@ -45,21 +40,18 @@ void ResultDialog::showResult(ProcessingItem item) show (); adjustSize (); - QDesktopWidget* desktop = QApplication::desktop (); + QDesktopWidget *desktop = QApplication::desktop (); Q_CHECK_PTR (desktop); - if (isShowAtCapturePos_) - { + if (isShowAtCapturePos_) { QPoint correction = QPoint (ui->frame->lineWidth (), ui->frame->lineWidth ()); move (item.screenPos - correction); QRect screenRect = desktop->screenGeometry (this); int minY = screenRect.bottom () - height (); - if (y () > minY) - { + if (y () > minY) { move (x (), minY); } } - else - { + else { QRect screenRect = desktop->availableGeometry (this); ST_ASSERT (screenRect.isValid ()); diff --git a/ResultDialog.h b/ResultDialog.h index f4bcd15..0a21645 100644 --- a/ResultDialog.h +++ b/ResultDialog.h @@ -9,13 +9,12 @@ namespace Ui { class ResultDialog; } -class ResultDialog : public QDialog -{ - Q_OBJECT +class ResultDialog : public QDialog { + Q_OBJECT public: - explicit ResultDialog(QWidget *parent = 0); - ~ResultDialog(); + explicit ResultDialog (QWidget *parent = 0); + ~ResultDialog (); public: bool eventFilter (QObject *object, QEvent *event); diff --git a/ScreenTranslator.pro b/ScreenTranslator.pro index 8048c03..6656578 100644 --- a/ScreenTranslator.pro +++ b/ScreenTranslator.pro @@ -63,4 +63,5 @@ RC_FILE = app.rc OTHER_FILES += \ app.rc \ images/icon.ico \ - README.md + README.md \ + uncrustify.cfg diff --git a/SelectionDialog.cpp b/SelectionDialog.cpp index ebb77e3..58b7e81 100644 --- a/SelectionDialog.cpp +++ b/SelectionDialog.cpp @@ -8,57 +8,47 @@ #include #include -SelectionDialog::SelectionDialog(const LanguageHelper &dictionary, QWidget *parent) : - QDialog(parent), - ui(new Ui::SelectionDialog), dictionary_ (dictionary), - languageMenu_ (new QMenu) -{ - ui->setupUi(this); +SelectionDialog::SelectionDialog (const LanguageHelper &dictionary, QWidget *parent) : + QDialog (parent), + ui (new Ui::SelectionDialog), dictionary_ (dictionary), + languageMenu_ (new QMenu) { + ui->setupUi (this); setWindowFlags (Qt::FramelessWindowHint | Qt::NoDropShadowWindowHint | Qt::WindowStaysOnTopHint); - ui->label->setAutoFillBackground(false); + ui->label->setAutoFillBackground (false); ui->label->installEventFilter (this); updateMenu (); } -SelectionDialog::~SelectionDialog() -{ +SelectionDialog::~SelectionDialog () { delete ui; } -void SelectionDialog::updateMenu() -{ +void SelectionDialog::updateMenu () { Q_CHECK_PTR (languageMenu_); languageMenu_->clear (); QStringList languages = dictionary_.availableOcrLanguagesUi (); - if (languages.isEmpty ()) - { + if (languages.isEmpty ()) { return; } const int max = 10; - if (languages.size () <= max) - { - foreach (const QString& language, languages) - { + if (languages.size () <= max) { + foreach (const QString &language, languages) { languageMenu_->addAction (language); } } - else - { + else { int subIndex = max; - QMenu* subMenu = NULL; + QMenu *subMenu = NULL; QString prevLetter; - foreach (const QString& language, languages) - { + foreach (const QString &language, languages) { QString curLetter = language.left (1); - if (++subIndex >= max && prevLetter != curLetter) - { - if (subMenu != NULL) - { + if (++subIndex >= max && prevLetter != curLetter) { + if (subMenu != NULL) { subMenu->setTitle (subMenu->title () + " - " + prevLetter); } subMenu = languageMenu_->addMenu (curLetter); @@ -71,71 +61,56 @@ void SelectionDialog::updateMenu() } } -bool SelectionDialog::eventFilter(QObject* object, QEvent* event) -{ - if (object != ui->label) - { +bool SelectionDialog::eventFilter (QObject *object, QEvent *event) { + if (object != ui->label) { return QDialog::eventFilter (object, event); } - if (event->type () == QEvent::Show) - { + if (event->type () == QEvent::Show) { startSelectPos_ = currentSelectPos_ = QPoint (); } - else if (event->type () == QEvent::MouseButtonPress) - { - QMouseEvent* mouseEvent = static_cast (event); + else if (event->type () == QEvent::MouseButtonPress) { + QMouseEvent *mouseEvent = static_cast (event); if ((mouseEvent->button () == Qt::LeftButton || - mouseEvent->button () == Qt::RightButton) && startSelectPos_.isNull ()) - { + mouseEvent->button () == Qt::RightButton) && startSelectPos_.isNull ()) { startSelectPos_ = mouseEvent->pos (); } } - else if (event->type () == QEvent::MouseMove) - { - QMouseEvent* mouseEvent = static_cast (event); + else if (event->type () == QEvent::MouseMove) { + QMouseEvent *mouseEvent = static_cast (event); if ((mouseEvent->buttons () & Qt::LeftButton || - mouseEvent->buttons () & Qt::RightButton) && !startSelectPos_.isNull ()) - { + mouseEvent->buttons () & Qt::RightButton) && !startSelectPos_.isNull ()) { currentSelectPos_ = mouseEvent->pos (); ui->label->repaint (); } } - else if (event->type () == QEvent::Paint) - { + else if (event->type () == QEvent::Paint) { QRect selection = QRect (startSelectPos_, currentSelectPos_).normalized (); - if (selection.isValid ()) - { + if (selection.isValid ()) { QPainter painter (ui->label); painter.setPen (Qt::red); painter.drawRect (selection); } } - else if (event->type () == QEvent::MouseButtonRelease) - { - QMouseEvent* mouseEvent = static_cast (event); + else if (event->type () == QEvent::MouseButtonRelease) { + QMouseEvent *mouseEvent = static_cast (event); if (mouseEvent->button () == Qt::LeftButton || - mouseEvent->button () == Qt::RightButton) - { - if (startSelectPos_.isNull () || currentPixmap_.isNull ()) - { + mouseEvent->button () == Qt::RightButton) { + if (startSelectPos_.isNull () || currentPixmap_.isNull ()) { return QDialog::eventFilter (object, event); } QPoint endPos = mouseEvent->pos (); QRect selection = QRect (startSelectPos_, endPos).normalized (); QPixmap selectedPixmap = currentPixmap_.copy (selection); - if (!selectedPixmap.isNull ()) - { + if (!selectedPixmap.isNull ()) { ProcessingItem item; item.source = selectedPixmap; item.screenPos = selection.topLeft (); if (mouseEvent->button () == Qt::RightButton && - !languageMenu_->children ().isEmpty ()) - { - QAction* action = languageMenu_->exec (QCursor::pos ()); - if (action == NULL) - { + !languageMenu_->children ().isEmpty ()) { + QAction *action = languageMenu_->exec (QCursor::pos ()); + if (action == NULL) { reject (); return QDialog::eventFilter (object, event); } @@ -152,8 +127,7 @@ bool SelectionDialog::eventFilter(QObject* object, QEvent* event) return QDialog::eventFilter (object, event); } -void SelectionDialog::setPixmap(QPixmap pixmap) -{ +void SelectionDialog::setPixmap (QPixmap pixmap) { ST_ASSERT (!pixmap.isNull ()); currentPixmap_ = pixmap; QPalette palette = this->palette (); diff --git a/SelectionDialog.h b/SelectionDialog.h index 18fa890..178ff2d 100644 --- a/SelectionDialog.h +++ b/SelectionDialog.h @@ -12,13 +12,12 @@ namespace Ui { } class LanguageHelper; -class SelectionDialog : public QDialog -{ - Q_OBJECT +class SelectionDialog : public QDialog { + Q_OBJECT public: - explicit SelectionDialog(const LanguageHelper& dictionary, QWidget *parent = 0); - ~SelectionDialog(); + explicit SelectionDialog (const LanguageHelper &dictionary, QWidget *parent = 0); + ~SelectionDialog (); bool eventFilter (QObject *object, QEvent *event); @@ -31,11 +30,11 @@ class SelectionDialog : public QDialog private: Ui::SelectionDialog *ui; - const LanguageHelper& dictionary_; + const LanguageHelper &dictionary_; QPoint startSelectPos_; QPoint currentSelectPos_; QPixmap currentPixmap_; - QMenu* languageMenu_; + QMenu *languageMenu_; }; #endif // SELECTIONDIALOG_H diff --git a/Settings.h b/Settings.h index 3761466..8f705e0 100644 --- a/Settings.h +++ b/Settings.h @@ -3,8 +3,7 @@ #include -namespace settings_names -{ +namespace settings_names { //! UI const QString guiGroup = "GUI"; const QString geometry = "geometry"; @@ -26,8 +25,7 @@ namespace settings_names } -namespace settings_values -{ +namespace settings_values { const QString appName = "ScreenTranslator"; const QString companyName = "Gres"; diff --git a/SettingsEditor.cpp b/SettingsEditor.cpp index 1a44ac7..823493a 100644 --- a/SettingsEditor.cpp +++ b/SettingsEditor.cpp @@ -7,43 +7,38 @@ #include "Settings.h" -SettingsEditor::SettingsEditor(const LanguageHelper &dictionary, QWidget *parent) : - QDialog(parent), - ui(new Ui::SettingsEditor), dictionary_ (dictionary), - buttonGroup_ (new QButtonGroup (this)) -{ - ui->setupUi(this); +SettingsEditor::SettingsEditor (const LanguageHelper &dictionary, QWidget *parent) : + QDialog (parent), + ui (new Ui::SettingsEditor), dictionary_ (dictionary), + buttonGroup_ (new QButtonGroup (this)) { + ui->setupUi (this); buttonGroup_->addButton (ui->trayRadio, 0); buttonGroup_->addButton (ui->dialogRadio, 1); connect (ui->tessdataButton, SIGNAL (clicked ()), SLOT (openTessdataDialog ())); - connect (ui->tessdataEdit, SIGNAL (textChanged (const QString&)), - SLOT (initOcrLangCombo (const QString&))); + connect (ui->tessdataEdit, SIGNAL (textChanged (const QString &)), + SLOT (initOcrLangCombo (const QString &))); ui->translateLangCombo->addItems (dictionary_.translateLanguagesUi ()); loadSettings (); loadState (); } -SettingsEditor::~SettingsEditor() -{ +SettingsEditor::~SettingsEditor () { saveState (); delete ui; } -void SettingsEditor::done(int result) -{ - if (result == QDialog::Accepted) - { +void SettingsEditor::done (int result) { + if (result == QDialog::Accepted) { saveSettings (); emit settingsEdited (); } QDialog::done (result); } -void SettingsEditor::saveSettings() const -{ +void SettingsEditor::saveSettings () const { QSettings settings; settings.beginGroup (settings_names::guiGroup); settings.setValue (settings_names::captureHotkey, ui->captureEdit->text ()); @@ -69,65 +64,58 @@ void SettingsEditor::saveSettings() const settings.endGroup (); } -void SettingsEditor::openTessdataDialog() -{ +void SettingsEditor::openTessdataDialog () { QString path = QFileDialog::getExistingDirectory (this, tr ("Путь к tessdata")); - if (path.isEmpty ()) - { + if (path.isEmpty ()) { return; } QDir dir (path); - if (dir.dirName () == QString ("tessdata")) - { + if (dir.dirName () == QString ("tessdata")) { dir.cdUp (); } ui->tessdataEdit->setText (dir.path ()); } -void SettingsEditor::loadSettings() -{ +void SettingsEditor::loadSettings () { #define GET(FIELD) settings.value (settings_names::FIELD, settings_values::FIELD) QSettings settings; settings.beginGroup (settings_names::guiGroup); - ui->captureEdit->setText (GET(captureHotkey).toString ()); - ui->repeatEdit->setText (GET(repeatHotkey).toString ()); - ui->clipboardEdit->setText (GET(clipboardHotkey).toString ()); - QAbstractButton* button = buttonGroup_->button (GET(resultShowType).toInt ()); + ui->captureEdit->setText (GET (captureHotkey).toString ()); + ui->repeatEdit->setText (GET (repeatHotkey).toString ()); + ui->clipboardEdit->setText (GET (clipboardHotkey).toString ()); + QAbstractButton *button = buttonGroup_->button (GET (resultShowType).toInt ()); Q_CHECK_PTR (button); button->setChecked (true); settings.endGroup (); settings.beginGroup (settings_names::recogntionGroup); - ui->tessdataEdit->setText (GET(tessDataPlace).toString ()); - QString ocrLanguage = dictionary_.ocrCodeToUi (GET(ocrLanguage).toString ()); + ui->tessdataEdit->setText (GET (tessDataPlace).toString ()); + QString ocrLanguage = dictionary_.ocrCodeToUi (GET (ocrLanguage).toString ()); ui->ocrLangCombo->setCurrentText (ocrLanguage); - ui->imageScaleSpin->setValue (GET(imageScale).toInt ()); + ui->imageScaleSpin->setValue (GET (imageScale).toInt ()); settings.endGroup (); settings.beginGroup (settings_names::translationGroup); - QString trLanguage = dictionary_.translateCodeToUi (GET(translationLanguage).toString ()); + QString trLanguage = dictionary_.translateCodeToUi (GET (translationLanguage).toString ()); ui->translateLangCombo->setCurrentText (trLanguage); settings.endGroup (); #undef GET } -void SettingsEditor::saveState() const -{ +void SettingsEditor::saveState () const { QSettings settings; settings.beginGroup (settings_names::guiGroup); settings.setValue (objectName () + "_" + settings_names::geometry, saveGeometry ()); } -void SettingsEditor::loadState() -{ +void SettingsEditor::loadState () { QSettings settings; settings.beginGroup (settings_names::guiGroup); restoreGeometry (settings.value (objectName () + "_" + settings_names::geometry).toByteArray ()); } -void SettingsEditor::initOcrLangCombo(const QString &path) -{ +void SettingsEditor::initOcrLangCombo (const QString &path) { ui->ocrLangCombo->clear (); ui->ocrLangCombo->addItems (dictionary_.availableOcrLanguagesUi (path)); } diff --git a/SettingsEditor.h b/SettingsEditor.h index 20b7d39..2fb0861 100644 --- a/SettingsEditor.h +++ b/SettingsEditor.h @@ -10,13 +10,12 @@ namespace Ui { } class LanguageHelper; -class SettingsEditor : public QDialog -{ - Q_OBJECT +class SettingsEditor : public QDialog { + Q_OBJECT public: - explicit SettingsEditor(const LanguageHelper& dictionary, QWidget *parent = 0); - ~SettingsEditor(); + explicit SettingsEditor (const LanguageHelper &dictionary, QWidget *parent = 0); + ~SettingsEditor (); signals: void settingsEdited (); @@ -27,7 +26,7 @@ class SettingsEditor : public QDialog private slots: void saveSettings () const; void openTessdataDialog (); - void initOcrLangCombo (const QString& path); + void initOcrLangCombo (const QString &path); private: void loadSettings (); @@ -36,8 +35,8 @@ class SettingsEditor : public QDialog private: Ui::SettingsEditor *ui; - const LanguageHelper& dictionary_; - QButtonGroup* buttonGroup_; + const LanguageHelper &dictionary_; + QButtonGroup *buttonGroup_; }; #endif // SETTINGSEDITOR_H diff --git a/StAssert.h b/StAssert.h index edeab86..d330cee 100644 --- a/StAssert.h +++ b/StAssert.h @@ -7,7 +7,7 @@ # if defined(ST_NO_ASSERT) # define ST_ASSERT(CONDITION) # else -# define ST_ASSERT(CONDITION) assert(CONDITION) +# define ST_ASSERT(CONDITION) assert (CONDITION) # endif #endif diff --git a/Translator.cpp b/Translator.cpp index f4c8ff0..399d21d 100644 --- a/Translator.cpp +++ b/Translator.cpp @@ -12,32 +12,29 @@ #include "GoogleWebTranslator.h" #include "StAssert.h" -namespace -{ +namespace { const QString translateBaseUrl = "http://translate.google.com/translate_a/" "t?client=t&text=%1&sl=%2&tl=%3"; } -Translator::Translator(QObject *parent) : - QObject(parent), +Translator::Translator (QObject *parent) : + QObject (parent), network_ (this), - useAlternativeTranslation_ (false) -{ - connect (&network_, SIGNAL (finished (QNetworkReply*)), - SLOT (replyFinished (QNetworkReply*))); + useAlternativeTranslation_ (false) { + connect (&network_, SIGNAL (finished (QNetworkReply *)), + SLOT (replyFinished (QNetworkReply *))); - GoogleWebTranslator* googleWeb = new GoogleWebTranslator; + GoogleWebTranslator *googleWeb = new GoogleWebTranslator; connect (this, SIGNAL (translateAlternative (ProcessingItem)), googleWeb, SLOT (translate (ProcessingItem))); connect (googleWeb, SIGNAL (translated (ProcessingItem, bool)), - this, SLOT (translatedAlternative(ProcessingItem, bool))); + this, SLOT (translatedAlternative (ProcessingItem, bool))); connect (googleWeb, SIGNAL (error (QString)), this, SIGNAL (error (QString))); applySettings (); } -void Translator::applySettings() -{ +void Translator::applySettings () { QSettings settings; settings.beginGroup (settings_names::translationGroup); translationLanguage_ = settings.value (settings_names::translationLanguage, @@ -46,72 +43,61 @@ void Translator::applySettings() settings_values::sourceLanguage).toString (); } -void Translator::translate(ProcessingItem item) -{ +void Translator::translate (ProcessingItem item) { if (useAlternativeTranslation_) { - emit translateAlternative(item); + emit translateAlternative (item); return; } ST_ASSERT (!item.recognized.isEmpty ()); QString sourceLanguage = item.sourceLanguage.isEmpty () ? sourceLanguage_ : - item.sourceLanguage; - if (translationLanguage_.isEmpty () || sourceLanguage.isEmpty ()) - { + item.sourceLanguage; + if (translationLanguage_.isEmpty () || sourceLanguage.isEmpty ()) { emit error (tr ("Неверные парметры для перевода.")); return; } QUrl url (translateBaseUrl.arg (item.recognized, sourceLanguage, translationLanguage_)); - QNetworkReply* reply = network_.get (QNetworkRequest (url)); + QNetworkReply *reply = network_.get (QNetworkRequest (url)); items_.insert (reply, item); } -void Translator::translatedAlternative(ProcessingItem item, bool success) -{ - if (success) - { - emit translated(item); +void Translator::translatedAlternative (ProcessingItem item, bool success) { + if (success) { + emit translated (item); } - else - { + else { emit error (tr ("Ошибка альтернативного перевода текста: %1").arg (item.recognized)); } } -void Translator::replyFinished(QNetworkReply* reply) -{ +void Translator::replyFinished (QNetworkReply *reply) { ST_ASSERT (items_.contains (reply)); ProcessingItem item = items_.take (reply); ST_ASSERT (reply->isFinished ()); - if (reply->error () != QNetworkReply::NoError) - { + if (reply->error () != QNetworkReply::NoError) { useAlternativeTranslation_ = true; - emit translateAlternative(item); + emit translateAlternative (item); reply->deleteLater (); return; } QByteArray data = reply->readAll (); reply->deleteLater (); - while (data.indexOf (",,") != -1)//make json valid - { + while (data.indexOf (",,") != -1) {//make json valid data.replace (",,", ","); } QJsonParseError parseError; QJsonDocument document = QJsonDocument::fromJson (data, &parseError); - if (document.isEmpty ()) - { + if (document.isEmpty ()) { useAlternativeTranslation_ = true; - emit translateAlternative(item); + emit translateAlternative (item); return; } QJsonArray answerArray = document.array (); QJsonArray fullTranslation = answerArray.first ().toArray (); QString translation = ""; - foreach (QJsonValue part, fullTranslation) - { + foreach (QJsonValue part, fullTranslation) { QJsonArray partTranslation = part.toArray (); - if (partTranslation.isEmpty ()) - { + if (partTranslation.isEmpty ()) { continue; } translation += partTranslation.at (0).toString (); diff --git a/Translator.h b/Translator.h index 8ef0ff7..e28ea90 100644 --- a/Translator.h +++ b/Translator.h @@ -5,11 +5,11 @@ #include "ProcessingItem.h" -class Translator : public QObject -{ - Q_OBJECT +class Translator : public QObject { + Q_OBJECT + public: - explicit Translator(QObject *parent = 0); + explicit Translator (QObject *parent = 0); signals: void translated (ProcessingItem item); @@ -22,13 +22,13 @@ class Translator : public QObject void applySettings (); private slots: - void replyFinished (QNetworkReply* reply); + void replyFinished (QNetworkReply *reply); private: QNetworkAccessManager network_; QString translationLanguage_; QString sourceLanguage_; - QHash items_; + QHash items_; bool useAlternativeTranslation_; }; diff --git a/main.cpp b/main.cpp index 72d7a7b..af6516a 100644 --- a/main.cpp +++ b/main.cpp @@ -4,9 +4,8 @@ #include #include -int main(int argc, char *argv[]) -{ - QApplication a(argc, argv); +int main (int argc, char *argv[]) { + QApplication a (argc, argv); a.setQuitOnLastWindowClosed (false); a.setApplicationName (settings_values::appName); a.setOrganizationName (settings_values::companyName); @@ -14,12 +13,11 @@ int main(int argc, char *argv[]) QTranslator translator; // Set default to english. if (translator.load (QLocale::system (), "translation", "_", ":/translations") || - translator.load (":/translations/translation_en")) - { - a.installTranslator(&translator); + translator.load (":/translations/translation_en")) { + a.installTranslator (&translator); } Manager manager; - return a.exec(); + return a.exec (); } diff --git a/uncrustify.cfg b/uncrustify.cfg new file mode 100644 index 0000000..d589be4 --- /dev/null +++ b/uncrustify.cfg @@ -0,0 +1,1578 @@ +# Uncrustify 0.60 + +# +# General options +# + +# The type of line endings +newlines = auto # auto/lf/crlf/cr + +# The original size of tabs in the input +input_tab_size = 2 # number + +# The size of tabs in the output (only used if align_with_tabs=true) +output_tab_size = 2 # number + +# The ASCII value of the string escape char, usually 92 (\) or 94 (^). (Pawn) +string_escape_char = 92 # number + +# Alternate string escape char for Pawn. Only works right before the quote char. +string_escape_char2 = 0 # number + +# Allow interpreting '>=' and '>>=' as part of a template in 'void f(list>=val);'. +# If true (default), 'assert(x<0 && y>=3)' will be broken. +# Improvements to template detection may make this option obsolete. +tok_split_gte = false # false/true + +# Control what to do with the UTF-8 BOM (recommend 'remove') +utf8_bom = ignore # ignore/add/remove/force + +# If the file contains bytes with values between 128 and 255, but is not UTF-8, then output as UTF-8 +utf8_byte = false # false/true + +# Force the output encoding to UTF-8 +utf8_force = false # false/true + +# +# Indenting +# + +# The number of columns to indent per level. +# Usually 2, 3, 4, or 8. +indent_columns = 2 # number + +# The continuation indent. If non-zero, this overrides the indent of '(' and '=' continuation indents. +# For FreeBSD, this is set to 4. Negative value is absolute and not increased for each ( level +indent_continue = 0 # number + +# How to use tabs when indenting code +# 0=spaces only +# 1=indent with tabs to brace level, align with spaces +# 2=indent and align with tabs, using spaces when not on a tabstop +indent_with_tabs = 0 # number + +# Comments that are not a brace level are indented with tabs on a tabstop. +# Requires indent_with_tabs=2. If false, will use spaces. +indent_cmt_with_tabs = false # false/true + +# Whether to indent strings broken by '\' so that they line up +indent_align_string = false # false/true + +# The number of spaces to indent multi-line XML strings. +# Requires indent_align_string=True +indent_xml_string = 0 # number + +# Spaces to indent '{' from level +indent_brace = 0 # number + +# Whether braces are indented to the body level +indent_braces = false # false/true + +# Disabled indenting function braces if indent_braces is true +indent_braces_no_func = false # false/true + +# Disabled indenting class braces if indent_braces is true +indent_braces_no_class = false # false/true + +# Disabled indenting struct braces if indent_braces is true +indent_braces_no_struct = false # false/true + +# Indent based on the size of the brace parent, i.e. 'if' => 3 spaces, 'for' => 4 spaces, etc. +indent_brace_parent = false # false/true + +# Whether the 'namespace' body is indented +indent_namespace = true # false/true + +# The number of spaces to indent a namespace block +indent_namespace_level = 2 # number + +# If the body of the namespace is longer than this number, it won't be indented. +# Requires indent_namespace=true. Default=0 (no limit) +indent_namespace_limit = 0 # number + +# Whether the 'extern "C"' body is indented +indent_extern = true # false/true + +# Whether the 'class' body is indented +indent_class = true # false/true + +# Whether to indent the stuff after a leading class colon +indent_class_colon = true # false/true + +# Virtual indent from the ':' for member initializers. Default is 2 +indent_ctor_init_leading = 2 # number + +# Additional indenting for constructor initializer list +indent_ctor_init = 0 # number + +# False=treat 'else\nif' as 'else if' for indenting purposes +# True=indent the 'if' one level +indent_else_if = false # false/true + +# Amount to indent variable declarations after a open brace. neg=relative, pos=absolute +indent_var_def_blk = 0 # number + +# Indent continued variable declarations instead of aligning. +indent_var_def_cont = false # false/true + +# True: force indentation of function definition to start in column 1 +# False: use the default behavior +indent_func_def_force_col1 = false # false/true + +# True: indent continued function call parameters one indent level +# False: align parameters under the open paren +indent_func_call_param = false # false/true + +# Same as indent_func_call_param, but for function defs +indent_func_def_param = false # false/true + +# Same as indent_func_call_param, but for function protos +indent_func_proto_param = false # false/true + +# Same as indent_func_call_param, but for class declarations +indent_func_class_param = false # false/true + +# Same as indent_func_call_param, but for class variable constructors +indent_func_ctor_var_param = false # false/true + +# Same as indent_func_call_param, but for templates +indent_template_param = false # false/true + +# Double the indent for indent_func_xxx_param options +indent_func_param_double = false # false/true + +# Indentation column for standalone 'const' function decl/proto qualifier +indent_func_const = 0 # number + +# Indentation column for standalone 'throw' function decl/proto qualifier +indent_func_throw = 0 # number + +# The number of spaces to indent a continued '->' or '.' +# Usually set to 0, 1, or indent_columns. +indent_member = 0 # number + +# Spaces to indent single line ('//') comments on lines before code +indent_sing_line_comments = 0 # number + +# If set, will indent trailing single line ('//') comments relative +# to the code instead of trying to keep the same absolute column +indent_relative_single_line_comments = false # false/true + +# Spaces to indent 'case' from 'switch' +# Usually 0 or indent_columns. +indent_switch_case = 2 # number + +# Spaces to shift the 'case' line, without affecting any other lines +# Usually 0. +indent_case_shift = 0 # number + +# Spaces to indent '{' from 'case'. +# By default, the brace will appear under the 'c' in case. +# Usually set to 0 or indent_columns. +indent_case_brace = 2 # number + +# Whether to indent comments found in first column +indent_col1_comment = true # false/true + +# How to indent goto labels +# >0 : absolute column where 1 is the leftmost column +# <=0 : subtract from brace indent +indent_label = 1 # number + +# Same as indent_label, but for access specifiers that are followed by a colon +indent_access_spec = 1 # number + +# Indent the code after an access specifier by one level. +# If set, this option forces 'indent_access_spec=0' +indent_access_spec_body = true # false/true + +# If an open paren is followed by a newline, indent the next line so that it lines up after the open paren (not recommended) +indent_paren_nl = false # false/true + +# Controls the indent of a close paren after a newline. +# 0: Indent to body level +# 1: Align under the open paren +# 2: Indent to the brace level +indent_paren_close = 0 # number + +# Controls the indent of a comma when inside a paren.If TRUE, aligns under the open paren +indent_comma_paren = false # false/true + +# Controls the indent of a BOOL operator when inside a paren.If TRUE, aligns under the open paren +indent_bool_paren = false # false/true + +# If 'indent_bool_paren' is true, controls the indent of the first expression. If TRUE, aligns the first expression to the following ones +indent_first_bool_expr = false # false/true + +# If an open square is followed by a newline, indent the next line so that it lines up after the open square (not recommended) +indent_square_nl = false # false/true + +# Don't change the relative indent of ESQL/C 'EXEC SQL' bodies +indent_preserve_sql = false # false/true + +# Align continued statements at the '='. Default=True +# If FALSE or the '=' is followed by a newline, the next line is indent one tab. +indent_align_assign = true # false/true + +# Indent OC blocks at brace level instead of usual rules. +indent_oc_block = false # false/true + +# Indent OC blocks in a message relative to the parameter name. +# 0=use indent_oc_block rules, 1+=spaces to indent +indent_oc_block_msg = 0 # number + +# Minimum indent for subsequent parameters +indent_oc_msg_colon = 0 # number + +# +# Spacing options +# + +# Add or remove space around arithmetic operator '+', '-', '/', '*', etc +sp_arith = add # ignore/add/remove/force + +# Add or remove space around assignment operator '=', '+=', etc +sp_assign = add " # ignore/add/remove/force + +# Add or remove space around '=' in C++11 lambda capture specifications. Overrides sp_assign +sp_cpp_lambda_assign = ignore # ignore/add/remove/force + +# Add or remove space after the capture specification in C++11 lambda. +sp_cpp_lambda_paren = ignore # ignore/add/remove/force + +# Add or remove space around assignment operator '=' in a prototype +sp_assign_default = add # ignore/add/remove/force + +# Add or remove space before assignment operator '=', '+=', etc. Overrides sp_assign. +sp_before_assign = add # ignore/add/remove/force + +# Add or remove space after assignment operator '=', '+=', etc. Overrides sp_assign. +sp_after_assign = add # ignore/add/remove/force + +# Add or remove space around assignment '=' in enum +sp_enum_assign = add # ignore/add/remove/force + +# Add or remove space before assignment '=' in enum. Overrides sp_enum_assign. +sp_enum_before_assign = add # ignore/add/remove/force + +# Add or remove space after assignment '=' in enum. Overrides sp_enum_assign. +sp_enum_after_assign = add # ignore/add/remove/force + +# Add or remove space around preprocessor '##' concatenation operator. Default=Add +sp_pp_concat = add # ignore/add/remove/force + +# Add or remove space after preprocessor '#' stringify operator. Also affects the '#@' charizing operator. +sp_pp_stringify = ignore # ignore/add/remove/force + +# Add or remove space before preprocessor '#' stringify operator as in '#define x(y) L#y'. +sp_before_pp_stringify = ignore # ignore/add/remove/force + +# Add or remove space around boolean operators '&&' and '||' +sp_bool = add # ignore/add/remove/force + +# Add or remove space around compare operator '<', '>', '==', etc +sp_compare = add # ignore/add/remove/force + +# Add or remove space inside '(' and ')' +sp_inside_paren = ignore # ignore/add/remove/force + +# Add or remove space between nested parens +sp_paren_paren = ignore # ignore/add/remove/force + +# Whether to balance spaces inside nested parens +sp_balance_nested_parens = false # false/true + +# Add or remove space between ')' and '{' +sp_paren_brace = add # ignore/add/remove/force + +# Add or remove space before pointer star '*' +sp_before_ptr_star = add # ignore/add/remove/force + +# Add or remove space before pointer star '*' that isn't followed by a variable name +# If set to 'ignore', sp_before_ptr_star is used instead. +sp_before_unnamed_ptr_star = ignore # ignore/add/remove/force + +# Add or remove space between pointer stars '*' +sp_between_ptr_star = remove # ignore/add/remove/force + +# Add or remove space after pointer star '*', if followed by a word. +sp_after_ptr_star = remove # ignore/add/remove/force + +# Add or remove space after a pointer star '*', if followed by a func proto/def. +sp_after_ptr_star_func = add # ignore/add/remove/force + +# Add or remove space after a pointer star '*', if followed by an open paren (function types). +sp_ptr_star_paren = ignore # ignore/add/remove/force + +# Add or remove space before a pointer star '*', if followed by a func proto/def. +sp_before_ptr_star_func = ignore # ignore/add/remove/force + +# Add or remove space before a reference sign '&' +sp_before_byref = add # ignore/add/remove/force + +# Add or remove space before a reference sign '&' that isn't followed by a variable name +# If set to 'ignore', sp_before_byref is used instead. +sp_before_unnamed_byref = ignore # ignore/add/remove/force + +# Add or remove space after reference sign '&', if followed by a word. +sp_after_byref = remove # ignore/add/remove/force + +# Add or remove space after a reference sign '&', if followed by a func proto/def. +sp_after_byref_func = ignore # ignore/add/remove/force + +# Add or remove space before a reference sign '&', if followed by a func proto/def. +sp_before_byref_func = ignore # ignore/add/remove/force + +# Add or remove space between type and word. Default=Force +sp_after_type = force # ignore/add/remove/force + +# Add or remove space before the paren in the D constructs 'template Foo(' and 'class Foo('. +sp_before_template_paren = ignore # ignore/add/remove/force + +# Add or remove space in 'template <' vs 'template<'. +# If set to ignore, sp_before_angle is used. +sp_template_angle = ignore # ignore/add/remove/force + +# Add or remove space before '<>' +sp_before_angle = ignore # ignore/add/remove/force + +# Add or remove space inside '<' and '>' +sp_inside_angle = ignore # ignore/add/remove/force + +# Add or remove space after '<>' +sp_after_angle = ignore # ignore/add/remove/force + +# Add or remove space between '<>' and '(' as found in 'new List();' +sp_angle_paren = ignore # ignore/add/remove/force + +# Add or remove space between '<>' and a word as in 'List m;' +sp_angle_word = ignore # ignore/add/remove/force + +# Add or remove space between '>' and '>' in '>>' (template stuff C++/C# only). Default=Add +sp_angle_shift = add # ignore/add/remove/force + +# Permit removal of the space between '>>' in 'foo >' (C++11 only). Default=False +# sp_angle_shift cannot remove the space without this option. +sp_permit_cpp11_shift = false # false/true + +# Add or remove space before '(' of 'if', 'for', 'switch', and 'while' +sp_before_sparen = add # ignore/add/remove/force + +# Add or remove space inside if-condition '(' and ')' +sp_inside_sparen = ignore # ignore/add/remove/force + +# Add or remove space before if-condition ')'. Overrides sp_inside_sparen. +sp_inside_sparen_close = ignore # ignore/add/remove/force + +# Add or remove space before if-condition '('. Overrides sp_inside_sparen. +sp_inside_sparen_open = ignore # ignore/add/remove/force + +# Add or remove space after ')' of 'if', 'for', 'switch', and 'while' +sp_after_sparen = ignore # ignore/add/remove/force + +# Add or remove space between ')' and '{' of 'if', 'for', 'switch', and 'while' +sp_sparen_brace = ignore # ignore/add/remove/force + +# Add or remove space between 'invariant' and '(' in the D language. +sp_invariant_paren = ignore # ignore/add/remove/force + +# Add or remove space after the ')' in 'invariant (C) c' in the D language. +sp_after_invariant_paren = ignore # ignore/add/remove/force + +# Add or remove space before empty statement ';' on 'if', 'for' and 'while' +sp_special_semi = ignore # ignore/add/remove/force + +# Add or remove space before ';'. Default=Remove +sp_before_semi = remove # ignore/add/remove/force + +# Add or remove space before ';' in non-empty 'for' statements +sp_before_semi_for = ignore # ignore/add/remove/force + +# Add or remove space before a semicolon of an empty part of a for statement. +sp_before_semi_for_empty = ignore # ignore/add/remove/force + +# Add or remove space after ';', except when followed by a comment. Default=Add +sp_after_semi = add # ignore/add/remove/force + +# Add or remove space after ';' in non-empty 'for' statements. Default=Force +sp_after_semi_for = force # ignore/add/remove/force + +# Add or remove space after the final semicolon of an empty part of a for statement: for ( ; ; ). +sp_after_semi_for_empty = ignore # ignore/add/remove/force + +# Add or remove space before '[' (except '[]') +sp_before_square = ignore # ignore/add/remove/force + +# Add or remove space before '[]' +sp_before_squares = ignore # ignore/add/remove/force + +# Add or remove space inside a non-empty '[' and ']' +sp_inside_square = ignore # ignore/add/remove/force + +# Add or remove space after ',' +sp_after_comma = ignore # ignore/add/remove/force + +# Add or remove space before ',' +sp_before_comma = remove # ignore/add/remove/force + +# Add or remove space between an open paren and comma: '(,' vs '( ,' +sp_paren_comma = force # ignore/add/remove/force + +# Add or remove space before the variadic '...' when preceded by a non-punctuator +sp_before_ellipsis = ignore # ignore/add/remove/force + +# Add or remove space after class ':' +sp_after_class_colon = ignore # ignore/add/remove/force + +# Add or remove space before class ':' +sp_before_class_colon = ignore # ignore/add/remove/force + +# Add or remove space before case ':'. Default=Remove +sp_before_case_colon = remove # ignore/add/remove/force + +# Add or remove space between 'operator' and operator sign +sp_after_operator = ignore # ignore/add/remove/force + +# Add or remove space between the operator symbol and the open paren, as in 'operator ++(' +sp_after_operator_sym = ignore # ignore/add/remove/force + +# Add or remove space after C/D cast, i.e. 'cast(int)a' vs 'cast(int) a' or '(int)a' vs '(int) a' +sp_after_cast = ignore # ignore/add/remove/force + +# Add or remove spaces inside cast parens +sp_inside_paren_cast = ignore # ignore/add/remove/force + +# Add or remove space between the type and open paren in a C++ cast, i.e. 'int(exp)' vs 'int (exp)' +sp_cpp_cast_paren = ignore # ignore/add/remove/force + +# Add or remove space between 'sizeof' and '(' +sp_sizeof_paren = ignore # ignore/add/remove/force + +# Add or remove space after the tag keyword (Pawn) +sp_after_tag = ignore # ignore/add/remove/force + +# Add or remove space inside enum '{' and '}' +sp_inside_braces_enum = ignore # ignore/add/remove/force + +# Add or remove space inside struct/union '{' and '}' +sp_inside_braces_struct = ignore # ignore/add/remove/force + +# Add or remove space inside '{' and '}' +sp_inside_braces = ignore # ignore/add/remove/force + +# Add or remove space inside '{}' +sp_inside_braces_empty = ignore # ignore/add/remove/force + +# Add or remove space between return type and function name +# A minimum of 1 is forced except for pointer return types. +sp_type_func = add # ignore/add/remove/force + +# Add or remove space between function name and '(' on function declaration +sp_func_proto_paren = add # ignore/add/remove/force + +# Add or remove space between function name and '(' on function definition +sp_func_def_paren = add # ignore/add/remove/force + +# Add or remove space inside empty function '()' +sp_inside_fparens = remove # ignore/add/remove/force + +# Add or remove space inside function '(' and ')' +sp_inside_fparen = remove # ignore/add/remove/force + +# Add or remove space inside the first parens in the function type: 'void (*x)(...)' +sp_inside_tparen = ignore # ignore/add/remove/force + +# Add or remove between the parens in the function type: 'void (*x)(...)' +sp_after_tparen_close = ignore # ignore/add/remove/force + +# Add or remove space between ']' and '(' when part of a function call. +sp_square_fparen = ignore # ignore/add/remove/force + +# Add or remove space between ')' and '{' of function +sp_fparen_brace = add # ignore/add/remove/force + +# Add or remove space between function name and '(' on function calls +sp_func_call_paren = add # ignore/add/remove/force + +# Add or remove space between function name and '()' on function calls without parameters. +# If set to 'ignore' (the default), sp_func_call_paren is used. +sp_func_call_paren_empty = add # ignore/add/remove/force + +# Add or remove space between the user function name and '(' on function calls +# You need to set a keyword to be a user function, like this: 'set func_call_user _' in the config file. +sp_func_call_user_paren = ignore # ignore/add/remove/force + +# Add or remove space between a constructor/destructor and the open paren +sp_func_class_paren = add # ignore/add/remove/force + +# Add or remove space between 'return' and '(' +sp_return_paren = ignore # ignore/add/remove/force + +# Add or remove space between '__attribute__' and '(' +sp_attribute_paren = ignore # ignore/add/remove/force + +# Add or remove space between 'defined' and '(' in '#if defined (FOO)' +sp_defined_paren = ignore # ignore/add/remove/force + +# Add or remove space between 'throw' and '(' in 'throw (something)' +sp_throw_paren = ignore # ignore/add/remove/force + +# Add or remove space between 'throw' and anything other than '(' as in '@throw [...];' +sp_after_throw = ignore # ignore/add/remove/force + +# Add or remove space between 'catch' and '(' in 'catch (something) { }' +# If set to ignore, sp_before_sparen is used. +sp_catch_paren = ignore # ignore/add/remove/force + +# Add or remove space between 'version' and '(' in 'version (something) { }' (D language) +# If set to ignore, sp_before_sparen is used. +sp_version_paren = ignore # ignore/add/remove/force + +# Add or remove space between 'scope' and '(' in 'scope (something) { }' (D language) +# If set to ignore, sp_before_sparen is used. +sp_scope_paren = ignore # ignore/add/remove/force + +# Add or remove space between macro and value +sp_macro = ignore # ignore/add/remove/force + +# Add or remove space between macro function ')' and value +sp_macro_func = ignore # ignore/add/remove/force + +# Add or remove space between 'else' and '{' if on the same line +sp_else_brace = add # ignore/add/remove/force + +# Add or remove space between '}' and 'else' if on the same line +sp_brace_else = add # ignore/add/remove/force + +# Add or remove space between '}' and the name of a typedef on the same line +sp_brace_typedef = add # ignore/add/remove/force + +# Add or remove space between 'catch' and '{' if on the same line +sp_catch_brace = add # ignore/add/remove/force + +# Add or remove space between '}' and 'catch' if on the same line +sp_brace_catch = add # ignore/add/remove/force + +# Add or remove space between 'finally' and '{' if on the same line +sp_finally_brace = add # ignore/add/remove/force + +# Add or remove space between '}' and 'finally' if on the same line +sp_brace_finally = add # ignore/add/remove/force + +# Add or remove space between 'try' and '{' if on the same line +sp_try_brace = add # ignore/add/remove/force + +# Add or remove space between get/set and '{' if on the same line +sp_getset_brace = add # ignore/add/remove/force + +# Add or remove space before the '::' operator +sp_before_dc = ignore # ignore/add/remove/force + +# Add or remove space after the '::' operator +sp_after_dc = ignore # ignore/add/remove/force + +# Add or remove around the D named array initializer ':' operator +sp_d_array_colon = ignore # ignore/add/remove/force + +# Add or remove space after the '!' (not) operator. Default=Remove +sp_not = remove # ignore/add/remove/force + +# Add or remove space after the '~' (invert) operator. Default=Remove +sp_inv = remove # ignore/add/remove/force + +# Add or remove space after the '&' (address-of) operator. Default=Remove +# This does not affect the spacing after a '&' that is part of a type. +sp_addr = remove # ignore/add/remove/force + +# Add or remove space around the '.' or '->' operators. Default=Remove +sp_member = remove # ignore/add/remove/force + +# Add or remove space after the '*' (dereference) operator. Default=Remove +# This does not affect the spacing after a '*' that is part of a type. +sp_deref = remove # ignore/add/remove/force + +# Add or remove space after '+' or '-', as in 'x = -5' or 'y = +7'. Default=Remove +sp_sign = remove # ignore/add/remove/force + +# Add or remove space before or after '++' and '--', as in '(--x)' or 'y++;'. Default=Remove +sp_incdec = remove # ignore/add/remove/force + +# Add or remove space before a backslash-newline at the end of a line. Default=Add +sp_before_nl_cont = add # ignore/add/remove/force + +# Add or remove space after the scope '+' or '-', as in '-(void) foo;' or '+(int) bar;' +sp_after_oc_scope = ignore # ignore/add/remove/force + +# Add or remove space after the colon in message specs +# '-(int) f:(int) x;' vs '-(int) f: (int) x;' +sp_after_oc_colon = ignore # ignore/add/remove/force + +# Add or remove space before the colon in message specs +# '-(int) f: (int) x;' vs '-(int) f : (int) x;' +sp_before_oc_colon = ignore # ignore/add/remove/force + +# Add or remove space after the colon in immutable dictionary expression +# 'NSDictionary *test = @{@"foo" :@"bar"};' +sp_after_oc_dict_colon = ignore # ignore/add/remove/force + +# Add or remove space before the colon in immutable dictionary expression +# 'NSDictionary *test = @{@"foo" :@"bar"};' +sp_before_oc_dict_colon = ignore # ignore/add/remove/force + +# Add or remove space after the colon in message specs +# '[object setValue:1];' vs '[object setValue: 1];' +sp_after_send_oc_colon = ignore # ignore/add/remove/force + +# Add or remove space before the colon in message specs +# '[object setValue:1];' vs '[object setValue :1];' +sp_before_send_oc_colon = ignore # ignore/add/remove/force + +# Add or remove space after the (type) in message specs +# '-(int)f: (int) x;' vs '-(int)f: (int)x;' +sp_after_oc_type = ignore # ignore/add/remove/force + +# Add or remove space after the first (type) in message specs +# '-(int) f:(int)x;' vs '-(int)f:(int)x;' +sp_after_oc_return_type = ignore # ignore/add/remove/force + +# Add or remove space between '@selector' and '(' +# '@selector(msgName)' vs '@selector (msgName)' +# Also applies to @protocol() constructs +sp_after_oc_at_sel = ignore # ignore/add/remove/force + +# Add or remove space between '@selector(x)' and the following word +# '@selector(foo) a:' vs '@selector(foo)a:' +sp_after_oc_at_sel_parens = ignore # ignore/add/remove/force + +# Add or remove space inside '@selector' parens +# '@selector(foo)' vs '@selector( foo )' +# Also applies to @protocol() constructs +sp_inside_oc_at_sel_parens = ignore # ignore/add/remove/force + +# Add or remove space before a block pointer caret +# '^int (int arg){...}' vs. ' ^int (int arg){...}' +sp_before_oc_block_caret = ignore # ignore/add/remove/force + +# Add or remove space after a block pointer caret +# '^int (int arg){...}' vs. '^ int (int arg){...}' +sp_after_oc_block_caret = ignore # ignore/add/remove/force + +# Add or remove space between the receiver and selector in a message. +# '[receiver selector ...]' +sp_after_oc_msg_receiver = ignore # ignore/add/remove/force + +# Add or remove space after @property. +sp_after_oc_property = ignore # ignore/add/remove/force + +# Add or remove space around the ':' in 'b ? t : f' +sp_cond_colon = ignore # ignore/add/remove/force + +# Add or remove space around the '?' in 'b ? t : f' +sp_cond_question = ignore # ignore/add/remove/force + +# Fix the spacing between 'case' and the label. Only 'ignore' and 'force' make sense here. +sp_case_label = ignore # ignore/add/remove/force + +# Control the space around the D '..' operator. +sp_range = ignore # ignore/add/remove/force + +# Control the spacing after ':' in 'for (TYPE VAR : EXPR)' (Java) +sp_after_for_colon = ignore # ignore/add/remove/force + +# Control the spacing before ':' in 'for (TYPE VAR : EXPR)' (Java) +sp_before_for_colon = ignore # ignore/add/remove/force + +# Control the spacing in 'extern (C)' (D) +sp_extern_paren = ignore # ignore/add/remove/force + +# Control the space after the opening of a C++ comment '// A' vs '//A' +sp_cmt_cpp_start = ignore # ignore/add/remove/force + +# Controls the spaces between #else or #endif and a trailing comment +sp_endif_cmt = ignore # ignore/add/remove/force + +# Controls the spaces after 'new', 'delete', and 'delete[]' +sp_after_new = ignore # ignore/add/remove/force + +# Controls the spaces before a trailing or embedded comment +sp_before_tr_emb_cmt = ignore # ignore/add/remove/force + +# Number of spaces before a trailing or embedded comment +sp_num_before_tr_emb_cmt = 0 # number + +# Control space between a Java annotation and the open paren. +sp_annotation_paren = ignore # ignore/add/remove/force + +# +# Code alignment (not left column spaces/tabs) +# + +# Whether to keep non-indenting tabs +align_keep_tabs = false # false/true + +# Whether to use tabs for aligning +align_with_tabs = false # false/true + +# Whether to bump out to the next tab when aligning +align_on_tabstop = false # false/true + +# Whether to left-align numbers +align_number_left = false # false/true + +# Align variable definitions in prototypes and functions +align_func_params = false # false/true + +# Align parameters in single-line functions that have the same name. +# The function names must already be aligned with each other. +align_same_func_call_params = false # false/true + +# The span for aligning variable definitions (0=don't align) +align_var_def_span = 0 # number + +# How to align the star in variable definitions. +# 0=Part of the type 'void * foo;' +# 1=Part of the variable 'void *foo;' +# 2=Dangling 'void *foo;' +align_var_def_star_style = 1 # number + +# How to align the '&' in variable definitions. +# 0=Part of the type +# 1=Part of the variable +# 2=Dangling +align_var_def_amp_style = 1 # number + +# The threshold for aligning variable definitions (0=no limit) +align_var_def_thresh = 0 # number + +# The gap for aligning variable definitions +align_var_def_gap = 0 # number + +# Whether to align the colon in struct bit fields +align_var_def_colon = false # false/true + +# Whether to align any attribute after the variable name +align_var_def_attribute = false # false/true + +# Whether to align inline struct/enum/union variable definitions +align_var_def_inline = false # false/true + +# The span for aligning on '=' in assignments (0=don't align) +align_assign_span = 0 # number + +# The threshold for aligning on '=' in assignments (0=no limit) +align_assign_thresh = 10 # number + +# The span for aligning on '=' in enums (0=don't align) +align_enum_equ_span = 0 # number + +# The threshold for aligning on '=' in enums (0=no limit) +align_enum_equ_thresh = 0 # number + +# The span for aligning struct/union (0=don't align) +align_var_struct_span = 0 # number + +# The threshold for aligning struct/union member definitions (0=no limit) +align_var_struct_thresh = 0 # number + +# The gap for aligning struct/union member definitions +align_var_struct_gap = 0 # number + +# The span for aligning struct initializer values (0=don't align) +align_struct_init_span = 0 # number + +# The minimum space between the type and the synonym of a typedef +align_typedef_gap = 0 # number + +# The span for aligning single-line typedefs (0=don't align) +align_typedef_span = 0 # number + +# How to align typedef'd functions with other typedefs +# 0: Don't mix them at all +# 1: align the open paren with the types +# 2: align the function type name with the other type names +align_typedef_func = 0 # number + +# Controls the positioning of the '*' in typedefs. Just try it. +# 0: Align on typedef type, ignore '*' +# 1: The '*' is part of type name: typedef int *pint; +# 2: The '*' is part of the type, but dangling: typedef int *pint; +align_typedef_star_style = 0 # number + +# Controls the positioning of the '&' in typedefs. Just try it. +# 0: Align on typedef type, ignore '&' +# 1: The '&' is part of type name: typedef int &pint; +# 2: The '&' is part of the type, but dangling: typedef int &pint; +align_typedef_amp_style = 0 # number + +# The span for aligning comments that end lines (0=don't align) +align_right_cmt_span = 0 # number + +# If aligning comments, mix with comments after '}' and #endif with less than 3 spaces before the comment +align_right_cmt_mix = false # false/true + +# If a trailing comment is more than this number of columns away from the text it follows, +# it will qualify for being aligned. This has to be > 0 to do anything. +align_right_cmt_gap = 0 # number + +# Align trailing comment at or beyond column N; 'pulls in' comments as a bonus side effect (0=ignore) +align_right_cmt_at_col = 0 # number + +# The span for aligning function prototypes (0=don't align) +align_func_proto_span = 0 # number + +# Minimum gap between the return type and the function name. +align_func_proto_gap = 0 # number + +# Align function protos on the 'operator' keyword instead of what follows +align_on_operator = false # false/true + +# Whether to mix aligning prototype and variable declarations. +# If true, align_var_def_XXX options are used instead of align_func_proto_XXX options. +align_mix_var_proto = false # false/true + +# Align single-line functions with function prototypes, uses align_func_proto_span +align_single_line_func = false # false/true + +# Aligning the open brace of single-line functions. +# Requires align_single_line_func=true, uses align_func_proto_span +align_single_line_brace = false # false/true + +# Gap for align_single_line_brace. +align_single_line_brace_gap = 0 # number + +# The span for aligning ObjC msg spec (0=don't align) +align_oc_msg_spec_span = 0 # number + +# Whether to align macros wrapped with a backslash and a newline. +# This will not work right if the macro contains a multi-line comment. +align_nl_cont = false # false/true + +# # Align macro functions and variables together +align_pp_define_together = false # false/true + +# The minimum space between label and value of a preprocessor define +align_pp_define_gap = 0 # number + +# The span for aligning on '#define' bodies (0=don't align) +align_pp_define_span = 0 # number + +# Align lines that start with '<<' with previous '<<'. Default=true +align_left_shift = true # false/true + +# Span for aligning parameters in an Obj-C message call on the ':' (0=don't align) +align_oc_msg_colon_span = 0 # number + +# If true, always align with the first parameter, even if it is too short. +align_oc_msg_colon_first = false # false/true + +# Aligning parameters in an Obj-C '+' or '-' declaration on the ':' +align_oc_decl_colon = false # false/true + +# +# Newline adding and removing options +# + +# Whether to collapse empty blocks between '{' and '}' +nl_collapse_empty_body = false # false/true + +# Don't split one-line braced assignments - 'foo_t f = { 1, 2 };' +nl_assign_leave_one_liners = false # false/true + +# Don't split one-line braced statements inside a class xx { } body +nl_class_leave_one_liners = false # false/true + +# Don't split one-line enums: 'enum foo { BAR = 15 };' +nl_enum_leave_one_liners = false # false/true + +# Don't split one-line get or set functions +nl_getset_leave_one_liners = false # false/true + +# Don't split one-line function definitions - 'int foo() { return 0; }' +nl_func_leave_one_liners = false # false/true + +# Don't split one-line if/else statements - 'if(a) b++;' +nl_if_leave_one_liners = false # false/true + +# Don't split one-line OC messages +nl_oc_msg_leave_one_liner = false # false/true + +# Add or remove newlines at the start of the file +nl_start_of_file = ignore # ignore/add/remove/force + +# The number of newlines at the start of the file (only used if nl_start_of_file is 'add' or 'force' +nl_start_of_file_min = 0 # number + +# Add or remove newline at the end of the file +nl_end_of_file = ignore # ignore/add/remove/force + +# The number of newlines at the end of the file (only used if nl_end_of_file is 'add' or 'force') +nl_end_of_file_min = 0 # number + +# Add or remove newline between '=' and '{' +nl_assign_brace = ignore # ignore/add/remove/force + +# Add or remove newline between '=' and '[' (D only) +nl_assign_square = ignore # ignore/add/remove/force + +# Add or remove newline after '= [' (D only). Will also affect the newline before the ']' +nl_after_square_assign = ignore # ignore/add/remove/force + +# The number of blank lines after a block of variable definitions at the top of a function body +# 0 = No change (default) +nl_func_var_def_blk = 0 # number + +# The number of newlines before a block of typedefs +# 0 = No change (default) +nl_typedef_blk_start = 0 # number + +# The number of newlines after a block of typedefs +# 0 = No change (default) +nl_typedef_blk_end = 0 # number + +# The maximum consecutive newlines within a block of typedefs +# 0 = No change (default) +nl_typedef_blk_in = 0 # number + +# The number of newlines before a block of variable definitions not at the top of a function body +# 0 = No change (default) +nl_var_def_blk_start = 0 # number + +# The number of newlines after a block of variable definitions not at the top of a function body +# 0 = No change (default) +nl_var_def_blk_end = 0 # number + +# The maximum consecutive newlines within a block of variable definitions +# 0 = No change (default) +nl_var_def_blk_in = 0 # number + +# Add or remove newline between a function call's ')' and '{', as in: +# list_for_each(item, &list) { } +nl_fcall_brace = remove # ignore/add/remove/force + +# Add or remove newline between 'enum' and '{' +nl_enum_brace = remove # ignore/add/remove/force + +# Add or remove newline between 'struct and '{' +nl_struct_brace = remove # ignore/add/remove/force + +# Add or remove newline between 'union' and '{' +nl_union_brace = remove # ignore/add/remove/force + +# Add or remove newline between 'if' and '{' +nl_if_brace = remove # ignore/add/remove/force + +# Add or remove newline between '}' and 'else' +nl_brace_else = add # ignore/add/remove/force + +# Add or remove newline between 'else if' and '{' +# If set to ignore, nl_if_brace is used instead +nl_elseif_brace = remove # ignore/add/remove/force + +# Add or remove newline between 'else' and '{' +nl_else_brace = remove # ignore/add/remove/force + +# Add or remove newline between 'else' and 'if' +nl_else_if = remove # ignore/add/remove/force + +# Add or remove newline between '}' and 'finally' +nl_brace_finally = ignore # ignore/add/remove/force + +# Add or remove newline between 'finally' and '{' +nl_finally_brace = remove # ignore/add/remove/force + +# Add or remove newline between 'try' and '{' +nl_try_brace = remove # ignore/add/remove/force + +# Add or remove newline between get/set and '{' +nl_getset_brace = ignore # ignore/add/remove/force + +# Add or remove newline between 'for' and '{' +nl_for_brace = remove # ignore/add/remove/force + +# Add or remove newline between 'catch' and '{' +nl_catch_brace = remove # ignore/add/remove/force + +# Add or remove newline between '}' and 'catch' +nl_brace_catch = ignore # ignore/add/remove/force + +# Add or remove newline between 'while' and '{' +nl_while_brace = remove # ignore/add/remove/force + +# Add or remove newline between 'scope (x)' and '{' (D) +nl_scope_brace = ignore # ignore/add/remove/force + +# Add or remove newline between 'unittest' and '{' (D) +nl_unittest_brace = ignore # ignore/add/remove/force + +# Add or remove newline between 'version (x)' and '{' (D) +nl_version_brace = ignore # ignore/add/remove/force + +# Add or remove newline between 'using' and '{' +nl_using_brace = ignore # ignore/add/remove/force + +# Add or remove newline between two open or close braces. +# Due to general newline/brace handling, REMOVE may not work. +nl_brace_brace = ignore # ignore/add/remove/force + +# Add or remove newline between 'do' and '{' +nl_do_brace = remove # ignore/add/remove/force + +# Add or remove newline between '}' and 'while' of 'do' statement +nl_brace_while = add # ignore/add/remove/force + +# Add or remove newline between 'switch' and '{' +nl_switch_brace = remove # ignore/add/remove/force + +# Add a newline between ')' and '{' if the ')' is on a different line than the if/for/etc. +# Overrides nl_for_brace, nl_if_brace, nl_switch_brace, nl_while_switch, and nl_catch_brace. +nl_multi_line_cond = false # false/true + +# Force a newline in a define after the macro name for multi-line defines. +nl_multi_line_define = false # false/true + +# Whether to put a newline before 'case' statement +nl_before_case = false # false/true + +# Add or remove newline between ')' and 'throw' +nl_before_throw = ignore # ignore/add/remove/force + +# Whether to put a newline after 'case' statement +nl_after_case = false # false/true + +# Add or remove a newline between a case ':' and '{'. Overrides nl_after_case. +nl_case_colon_brace = ignore # ignore/add/remove/force + +# Newline between namespace and { +nl_namespace_brace = remove # ignore/add/remove/force + +# Add or remove newline between 'template<>' and whatever follows. +nl_template_class = ignore # ignore/add/remove/force + +# Add or remove newline between 'class' and '{' +nl_class_brace = remove # ignore/add/remove/force + +# Add or remove newline after each ',' in the constructor member initialization +nl_class_init_args = ignore # ignore/add/remove/force + +# Add or remove newline between return type and function name in a function definition +nl_func_type_name = ignore # ignore/add/remove/force + +# Add or remove newline between return type and function name inside a class {} +# Uses nl_func_type_name or nl_func_proto_type_name if set to ignore. +nl_func_type_name_class = ignore # ignore/add/remove/force + +# Add or remove newline between function scope and name in a definition +# Controls the newline after '::' in 'void A::f() { }' +nl_func_scope_name = ignore # ignore/add/remove/force + +# Add or remove newline between return type and function name in a prototype +nl_func_proto_type_name = ignore # ignore/add/remove/force + +# Add or remove newline between a function name and the opening '(' +nl_func_paren = ignore # ignore/add/remove/force + +# Add or remove newline between a function name and the opening '(' in the definition +nl_func_def_paren = ignore # ignore/add/remove/force + +# Add or remove newline after '(' in a function declaration +nl_func_decl_start = ignore # ignore/add/remove/force + +# Add or remove newline after '(' in a function definition +nl_func_def_start = ignore # ignore/add/remove/force + +# Overrides nl_func_decl_start when there is only one parameter. +nl_func_decl_start_single = ignore # ignore/add/remove/force + +# Overrides nl_func_def_start when there is only one parameter. +nl_func_def_start_single = ignore # ignore/add/remove/force + +# Add or remove newline after each ',' in a function declaration +nl_func_decl_args = ignore # ignore/add/remove/force + +# Add or remove newline after each ',' in a function definition +nl_func_def_args = ignore # ignore/add/remove/force + +# Add or remove newline before the ')' in a function declaration +nl_func_decl_end = ignore # ignore/add/remove/force + +# Add or remove newline before the ')' in a function definition +nl_func_def_end = ignore # ignore/add/remove/force + +# Overrides nl_func_decl_end when there is only one parameter. +nl_func_decl_end_single = ignore # ignore/add/remove/force + +# Overrides nl_func_def_end when there is only one parameter. +nl_func_def_end_single = ignore # ignore/add/remove/force + +# Add or remove newline between '()' in a function declaration. +nl_func_decl_empty = ignore # ignore/add/remove/force + +# Add or remove newline between '()' in a function definition. +nl_func_def_empty = ignore # ignore/add/remove/force + +# Whether to put each OC message parameter on a separate line +# See nl_oc_msg_leave_one_liner +nl_oc_msg_args = false # false/true + +# Add or remove newline between function signature and '{' +nl_fdef_brace = remove # ignore/add/remove/force + +# Add or remove a newline between the return keyword and return expression. +nl_return_expr = ignore # ignore/add/remove/force + +# Whether to put a newline after semicolons, except in 'for' statements +nl_after_semicolon = false # false/true + +# Whether to put a newline after brace open. +# This also adds a newline before the matching brace close. +nl_after_brace_open = false # false/true + +# If nl_after_brace_open and nl_after_brace_open_cmt are true, a newline is +# placed between the open brace and a trailing single-line comment. +nl_after_brace_open_cmt = false # false/true + +# Whether to put a newline after a virtual brace open with a non-empty body. +# These occur in un-braced if/while/do/for statement bodies. +nl_after_vbrace_open = false # false/true + +# Whether to put a newline after a virtual brace open with an empty body. +# These occur in un-braced if/while/do/for statement bodies. +nl_after_vbrace_open_empty = false # false/true + +# Whether to put a newline after a brace close. +# Does not apply if followed by a necessary ';'. +nl_after_brace_close = false # false/true + +# Whether to put a newline after a virtual brace close. +# Would add a newline before return in: 'if (foo) a++; return;' +nl_after_vbrace_close = false # false/true + +# Control the newline between the close brace and 'b' in: 'struct { int a; } b;' +# Affects enums, unions, and structures. If set to ignore, uses nl_after_brace_close +nl_brace_struct_var = ignore # ignore/add/remove/force + +# Whether to alter newlines in '#define' macros +nl_define_macro = false # false/true + +# Whether to not put blanks after '#ifxx', '#elxx', or before '#endif' +nl_squeeze_ifdef = false # false/true + +# Add or remove blank line before 'if' +nl_before_if = ignore # ignore/add/remove/force + +# Add or remove blank line after 'if' statement +nl_after_if = ignore # ignore/add/remove/force + +# Add or remove blank line before 'for' +nl_before_for = ignore # ignore/add/remove/force + +# Add or remove blank line after 'for' statement +nl_after_for = ignore # ignore/add/remove/force + +# Add or remove blank line before 'while' +nl_before_while = ignore # ignore/add/remove/force + +# Add or remove blank line after 'while' statement +nl_after_while = ignore # ignore/add/remove/force + +# Add or remove blank line before 'switch' +nl_before_switch = ignore # ignore/add/remove/force + +# Add or remove blank line after 'switch' statement +nl_after_switch = ignore # ignore/add/remove/force + +# Add or remove blank line before 'do' +nl_before_do = ignore # ignore/add/remove/force + +# Add or remove blank line after 'do/while' statement +nl_after_do = ignore # ignore/add/remove/force + +# Whether to double-space commented-entries in struct/enum +nl_ds_struct_enum_cmt = false # false/true + +# Whether to double-space before the close brace of a struct/union/enum +# (lower priority than 'eat_blanks_before_close_brace') +nl_ds_struct_enum_close_brace = false # false/true + +# Add or remove a newline around a class colon. +# Related to pos_class_colon, nl_class_init_args, and pos_comma. +nl_class_colon = ignore # ignore/add/remove/force + +# Change simple unbraced if statements into a one-liner +# 'if(b)\n i++;' => 'if(b) i++;' +nl_create_if_one_liner = false # false/true + +# Change simple unbraced for statements into a one-liner +# 'for (i=0;i<5;i++)\n foo(i);' => 'for (i=0;i<5;i++) foo(i);' +nl_create_for_one_liner = false # false/true + +# Change simple unbraced while statements into a one-liner +# 'while (i<5)\n foo(i++);' => 'while (i<5) foo(i++);' +nl_create_while_one_liner = false # false/true + +# +# Positioning options +# + +# The position of arithmetic operators in wrapped expressions +pos_arith = ignore # ignore/join/lead/lead_break/lead_force/trail/trail_break/trail_force + +# The position of assignment in wrapped expressions. +# Do not affect '=' followed by '{' +pos_assign = ignore # ignore/join/lead/lead_break/lead_force/trail/trail_break/trail_force + +# The position of boolean operators in wrapped expressions +pos_bool = ignore # ignore/join/lead/lead_break/lead_force/trail/trail_break/trail_force + +# The position of comparison operators in wrapped expressions +pos_compare = ignore # ignore/join/lead/lead_break/lead_force/trail/trail_break/trail_force + +# The position of conditional (b ? t : f) operators in wrapped expressions +pos_conditional = ignore # ignore/join/lead/lead_break/lead_force/trail/trail_break/trail_force + +# The position of the comma in wrapped expressions +pos_comma = trail # ignore/join/lead/lead_break/lead_force/trail/trail_break/trail_force + +# The position of the comma in the constructor initialization list +pos_class_comma = ignore # ignore/join/lead/lead_break/lead_force/trail/trail_break/trail_force + +# The position of colons between constructor and member initialization +pos_class_colon = ignore # ignore/join/lead/lead_break/lead_force/trail/trail_break/trail_force + +# +# Line Splitting options +# + +# Try to limit code width to N number of columns +code_width = 0 # number + +# Whether to fully split long 'for' statements at semi-colons +ls_for_split_full = false # false/true + +# Whether to fully split long function protos/calls at commas +ls_func_split_full = false # false/true + +# Whether to split lines as close to code_width as possible and ignore some groupings +ls_code_width = false # false/true + +# +# Blank line options +# + +# The maximum consecutive newlines +nl_max = 0 # number + +# The number of newlines after a function prototype, if followed by another function prototype +nl_after_func_proto = 0 # number + +# The number of newlines after a function prototype, if not followed by another function prototype +nl_after_func_proto_group = 0 # number + +# The number of newlines after '}' of a multi-line function body +nl_after_func_body = 0 # number + +# The number of newlines after '}' of a multi-line function body in a class declaration +nl_after_func_body_class = 0 # number + +# The number of newlines after '}' of a single line function body +nl_after_func_body_one_liner = 0 # number + +# The minimum number of newlines before a multi-line comment. +# Doesn't apply if after a brace open or another multi-line comment. +nl_before_block_comment = 0 # number + +# The minimum number of newlines before a single-line C comment. +# Doesn't apply if after a brace open or other single-line C comments. +nl_before_c_comment = 0 # number + +# The minimum number of newlines before a CPP comment. +# Doesn't apply if after a brace open or other CPP comments. +nl_before_cpp_comment = 0 # number + +# Whether to force a newline after a multi-line comment. +nl_after_multiline_comment = false # false/true + +# The number of newlines after '}' or ';' of a struct/enum/union definition +nl_after_struct = 0 # number + +# The number of newlines after '}' or ';' of a class definition +nl_after_class = 0 # number + +# The number of newlines before a 'private:', 'public:', 'protected:', 'signals:', or 'slots:' label. +# Will not change the newline count if after a brace open. +# 0 = No change. +nl_before_access_spec = 2 # number + +# The number of newlines after a 'private:', 'public:', 'protected:', 'signals:', or 'slots:' label. +# 0 = No change. +nl_after_access_spec = 0 # number + +# The number of newlines between a function def and the function comment. +# 0 = No change. +nl_comment_func_def = 0 # number + +# The number of newlines after a try-catch-finally block that isn't followed by a brace close. +# 0 = No change. +nl_after_try_catch_finally = 0 # number + +# The number of newlines before and after a property, indexer or event decl. +# 0 = No change. +nl_around_cs_property = 0 # number + +# The number of newlines between the get/set/add/remove handlers in C#. +# 0 = No change. +nl_between_get_set = 0 # number + +# Add or remove newline between C# property and the '{' +nl_property_brace = ignore # ignore/add/remove/force + +# Whether to remove blank lines after '{' +eat_blanks_after_open_brace = false # false/true + +# Whether to remove blank lines before '}' +eat_blanks_before_close_brace = false # false/true + +# How aggressively to remove extra newlines not in preproc. +# 0: No change +# 1: Remove most newlines not handled by other config +# 2: Remove all newlines and reformat completely by config +nl_remove_extra_newlines = 0 # number + +# Whether to put a blank line before 'return' statements, unless after an open brace. +nl_before_return = false # false/true + +# Whether to put a blank line after 'return' statements, unless followed by a close brace. +nl_after_return = false # false/true + +# Whether to put a newline after a Java annotation statement. +# Only affects annotations that are after a newline. +nl_after_annotation = ignore # ignore/add/remove/force + +# Controls the newline between two annotations. +nl_between_annotation = ignore # ignore/add/remove/force + +# +# Code modifying options (non-whitespace) +# + +# Add or remove braces on single-line 'do' statement +mod_full_brace_do = ignore # ignore/add/remove/force + +# Add or remove braces on single-line 'for' statement +mod_full_brace_for = add # ignore/add/remove/force + +# Add or remove braces on single-line function definitions. (Pawn) +mod_full_brace_function = add # ignore/add/remove/force + +# Add or remove braces on single-line 'if' statement. Will not remove the braces if they contain an 'else'. +mod_full_brace_if = add # ignore/add/remove/force + +# Make all if/elseif/else statements in a chain be braced or not. Overrides mod_full_brace_if. +# If any must be braced, they are all braced. If all can be unbraced, then the braces are removed. +mod_full_brace_if_chain = false # false/true + +# Don't remove braces around statements that span N newlines +mod_full_brace_nl = 0 # number + +# Add or remove braces on single-line 'while' statement +mod_full_brace_while = add # ignore/add/remove/force + +# Add or remove braces on single-line 'using ()' statement +mod_full_brace_using = ignore # ignore/add/remove/force + +# Add or remove unnecessary paren on 'return' statement +mod_paren_on_return = ignore # ignore/add/remove/force + +# Whether to change optional semicolons to real semicolons +mod_pawn_semicolon = false # false/true + +# Add parens on 'while' and 'if' statement around bools +mod_full_paren_if_bool = false # false/true + +# Whether to remove superfluous semicolons +mod_remove_extra_semicolon = false # false/true + +# If a function body exceeds the specified number of newlines and doesn't have a comment after +# the close brace, a comment will be added. +mod_add_long_function_closebrace_comment = 0 # number + +# If a switch body exceeds the specified number of newlines and doesn't have a comment after +# the close brace, a comment will be added. +mod_add_long_switch_closebrace_comment = 0 # number + +# If an #ifdef body exceeds the specified number of newlines and doesn't have a comment after +# the #endif, a comment will be added. +mod_add_long_ifdef_endif_comment = 0 # number + +# If an #ifdef or #else body exceeds the specified number of newlines and doesn't have a comment after +# the #else, a comment will be added. +mod_add_long_ifdef_else_comment = 0 # number + +# If TRUE, will sort consecutive single-line 'import' statements [Java, D] +mod_sort_import = false # false/true + +# If TRUE, will sort consecutive single-line 'using' statements [C#] +mod_sort_using = false # false/true + +# If TRUE, will sort consecutive single-line '#include' statements [C/C++] and '#import' statements [Obj-C] +# This is generally a bad idea, as it may break your code. +mod_sort_include = false # false/true + +# If TRUE, it will move a 'break' that appears after a fully braced 'case' before the close brace. +mod_move_case_break = false # false/true + +# Will add or remove the braces around a fully braced case statement. +# Will only remove the braces if there are no variable declarations in the block. +mod_case_brace = ignore # ignore/add/remove/force + +# If TRUE, it will remove a void 'return;' that appears as the last statement in a function. +mod_remove_empty_return = false # false/true + +# +# Comment modifications +# + +# Try to wrap comments at cmt_width columns +cmt_width = 0 # number + +# Set the comment reflow mode (default: 0) +# 0: no reflowing (apart from the line wrapping due to cmt_width) +# 1: no touching at all +# 2: full reflow +cmt_reflow_mode = 0 # number + +# If false, disable all multi-line comment changes, including cmt_width. keyword substitution, and leading chars. +# Default is true. +cmt_indent_multi = true # false/true + +# Whether to group c-comments that look like they are in a block +cmt_c_group = false # false/true + +# Whether to put an empty '/*' on the first line of the combined c-comment +cmt_c_nl_start = false # false/true + +# Whether to put a newline before the closing '*/' of the combined c-comment +cmt_c_nl_end = false # false/true + +# Whether to group cpp-comments that look like they are in a block +cmt_cpp_group = false # false/true + +# Whether to put an empty '/*' on the first line of the combined cpp-comment +cmt_cpp_nl_start = false # false/true + +# Whether to put a newline before the closing '*/' of the combined cpp-comment +cmt_cpp_nl_end = false # false/true + +# Whether to change cpp-comments into c-comments +cmt_cpp_to_c = false # false/true + +# Whether to put a star on subsequent comment lines +cmt_star_cont = false # false/true + +# The number of spaces to insert at the start of subsequent comment lines +cmt_sp_before_star_cont = 0 # number + +# The number of spaces to insert after the star on subsequent comment lines +cmt_sp_after_star_cont = 0 # number + +# For multi-line comments with a '*' lead, remove leading spaces if the first and last lines of +# the comment are the same length. Default=True +cmt_multi_check_last = true # false/true + +# The filename that contains text to insert at the head of a file if the file doesn't start with a C/C++ comment. +# Will substitute $(filename) with the current file's name. +cmt_insert_file_header = "" # string + +# The filename that contains text to insert at the end of a file if the file doesn't end with a C/C++ comment. +# Will substitute $(filename) with the current file's name. +cmt_insert_file_footer = "" # string + +# The filename that contains text to insert before a function implementation if the function isn't preceded with a C/C++ comment. +# Will substitute $(function) with the function name and $(javaparam) with the javadoc @param and @return stuff. +# Will also substitute $(fclass) with the class name: void CFoo::Bar() { ... } +cmt_insert_func_header = "" # string + +# The filename that contains text to insert before a class if the class isn't preceded with a C/C++ comment. +# Will substitute $(class) with the class name. +cmt_insert_class_header = "" # string + +# The filename that contains text to insert before a Obj-C message specification if the method isn't preceeded with a C/C++ comment. +# Will substitute $(message) with the function name and $(javaparam) with the javadoc @param and @return stuff. +cmt_insert_oc_msg_header = "" # string + +# If a preprocessor is encountered when stepping backwards from a function name, then +# this option decides whether the comment should be inserted. +# Affects cmt_insert_oc_msg_header, cmt_insert_func_header and cmt_insert_class_header. +cmt_insert_before_preproc = false # false/true + +# +# Preprocessor options +# + +# Control indent of preprocessors inside #if blocks at brace level 0 +pp_indent = remove # ignore/add/remove/force + +# Whether to indent #if/#else/#endif at the brace level (true) or from column 1 (false) +pp_indent_at_level = false # false/true + +# If pp_indent_at_level=false, specifies the number of columns to indent per level. Default=1. +pp_indent_count = 0 # number + +# Add or remove space after # based on pp_level of #if blocks +pp_space = add # ignore/add/remove/force + +# Sets the number of spaces added with pp_space +pp_space_count = 2 # number + +# The indent for #region and #endregion in C# and '#pragma region' in C/C++ +pp_indent_region = 0 # number + +# Whether to indent the code between #region and #endregion +pp_region_indent_code = false # false/true + +# If pp_indent_at_level=true, sets the indent for #if, #else, and #endif when not at file-level +pp_indent_if = 0 # number + +# Control whether to indent the code between #if, #else and #endif when not at file-level +pp_if_indent_code = false # false/true + +# Whether to indent '#define' at the brace level (true) or from column 1 (false) +pp_define_at_level = false # false/true + +# You can force a token to be a type with the 'type' option. +# Example: +# type myfoo1 myfoo2 +# +# You can create custom macro-based indentation using macro-open, +# macro-else and macro-close. +# Example: +# macro-open BEGIN_TEMPLATE_MESSAGE_MAP +# macro-open BEGIN_MESSAGE_MAP +# macro-close END_MESSAGE_MAP +# +# You can assign any keyword to any type with the set option. +# set func_call_user _ N_ +# +# The full syntax description of all custom definition config entries +# is shown below: +# +# define custom tokens as: +# - embed whitespace in token using '' escape character, or +# put token in quotes +# - these: ' " and ` are recognized as quote delimiters +# +# type token1 token2 token3 ... +# ^ optionally specify multiple tokens on a single line +# define def_token output_token +# ^ output_token is optional, then NULL is assumed +# macro-open token +# macro-close token +# macro-else token +# set id token1 token2 ... +# ^ optionally specify multiple tokens on a single line +# ^ id is one of the names in token_enum.h sans the CT_ prefix, +# e.g. PP_PRAGMA +# +# all tokens are separated by any mix of ',' commas, '=' equal signs +# and whitespace (space, tab) +# From bf2d19b6f0cea8b948c8854f3f5a16648c09aa31 Mon Sep 17 00:00:00 2001 From: Gres Date: Wed, 23 Sep 2015 20:51:20 +0300 Subject: [PATCH 02/89] Allow only 1 application instance. --- 3rd-party/qtsingleapplication/qtlocalpeer.cpp | 204 ++++++++++ 3rd-party/qtsingleapplication/qtlocalpeer.h | 77 ++++ .../qtsingleapplication/qtlockedfile.cpp | 193 ++++++++++ 3rd-party/qtsingleapplication/qtlockedfile.h | 97 +++++ .../qtsingleapplication/qtlockedfile_unix.cpp | 115 ++++++ .../qtsingleapplication/qtlockedfile_win.cpp | 211 +++++++++++ .../qtsingleapplication.cpp | 347 ++++++++++++++++++ .../qtsingleapplication/qtsingleapplication.h | 105 ++++++ .../qtsingleapplication.pri | 17 + .../qtsinglecoreapplication.cpp | 149 ++++++++ .../qtsinglecoreapplication.h | 71 ++++ .../qtsinglecoreapplication.pri | 10 + ScreenTranslator.pro | 2 + main.cpp | 7 +- 14 files changed, 1604 insertions(+), 1 deletion(-) create mode 100644 3rd-party/qtsingleapplication/qtlocalpeer.cpp create mode 100644 3rd-party/qtsingleapplication/qtlocalpeer.h create mode 100644 3rd-party/qtsingleapplication/qtlockedfile.cpp create mode 100644 3rd-party/qtsingleapplication/qtlockedfile.h create mode 100644 3rd-party/qtsingleapplication/qtlockedfile_unix.cpp create mode 100644 3rd-party/qtsingleapplication/qtlockedfile_win.cpp create mode 100644 3rd-party/qtsingleapplication/qtsingleapplication.cpp create mode 100644 3rd-party/qtsingleapplication/qtsingleapplication.h create mode 100644 3rd-party/qtsingleapplication/qtsingleapplication.pri create mode 100644 3rd-party/qtsingleapplication/qtsinglecoreapplication.cpp create mode 100644 3rd-party/qtsingleapplication/qtsinglecoreapplication.h create mode 100644 3rd-party/qtsingleapplication/qtsinglecoreapplication.pri diff --git a/3rd-party/qtsingleapplication/qtlocalpeer.cpp b/3rd-party/qtsingleapplication/qtlocalpeer.cpp new file mode 100644 index 0000000..c7ce527 --- /dev/null +++ b/3rd-party/qtsingleapplication/qtlocalpeer.cpp @@ -0,0 +1,204 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt Solutions component. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + + +#include "qtlocalpeer.h" +#include +#include +#include + +#if defined(Q_OS_WIN) +#include +#include +typedef BOOL(WINAPI*PProcessIdToSessionId)(DWORD,DWORD*); +static PProcessIdToSessionId pProcessIdToSessionId = 0; +#endif +#if defined(Q_OS_UNIX) +#include +#include +#include +#endif + +namespace QtLP_Private { +#include "qtlockedfile.cpp" +#if defined(Q_OS_WIN) +#include "qtlockedfile_win.cpp" +#else +#include "qtlockedfile_unix.cpp" +#endif +} + +const char* QtLocalPeer::ack = "ack"; + +QtLocalPeer::QtLocalPeer(QObject* parent, const QString &appId) + : QObject(parent), id(appId) +{ + QString prefix = id; + if (id.isEmpty()) { + id = QCoreApplication::applicationFilePath(); +#if defined(Q_OS_WIN) + id = id.toLower(); +#endif + prefix = id.section(QLatin1Char('/'), -1); + } + prefix.remove(QRegExp("[^a-zA-Z]")); + prefix.truncate(6); + + QByteArray idc = id.toUtf8(); + quint16 idNum = qChecksum(idc.constData(), idc.size()); + socketName = QLatin1String("qtsingleapp-") + prefix + + QLatin1Char('-') + QString::number(idNum, 16); + +#if defined(Q_OS_WIN) + if (!pProcessIdToSessionId) { + QLibrary lib("kernel32"); + pProcessIdToSessionId = (PProcessIdToSessionId)lib.resolve("ProcessIdToSessionId"); + } + if (pProcessIdToSessionId) { + DWORD sessionId = 0; + pProcessIdToSessionId(GetCurrentProcessId(), &sessionId); + socketName += QLatin1Char('-') + QString::number(sessionId, 16); + } +#else + socketName += QLatin1Char('-') + QString::number(::getuid(), 16); +#endif + + server = new QLocalServer(this); + QString lockName = QDir(QDir::tempPath()).absolutePath() + + QLatin1Char('/') + socketName + + QLatin1String("-lockfile"); + lockFile.setFileName(lockName); + lockFile.open(QIODevice::ReadWrite); +} + + + +bool QtLocalPeer::isClient() +{ + if (lockFile.isLocked()) + return false; + + if (!lockFile.lock(QtLP_Private::QtLockedFile::WriteLock, false)) + return true; + + bool res = server->listen(socketName); +#if defined(Q_OS_UNIX) && (QT_VERSION >= QT_VERSION_CHECK(4,5,0)) + // ### Workaround + if (!res && server->serverError() == QAbstractSocket::AddressInUseError) { + QFile::remove(QDir::cleanPath(QDir::tempPath())+QLatin1Char('/')+socketName); + res = server->listen(socketName); + } +#endif + if (!res) + qWarning("QtSingleCoreApplication: listen on local socket failed, %s", qPrintable(server->errorString())); + QObject::connect(server, SIGNAL(newConnection()), SLOT(receiveConnection())); + return false; +} + + +bool QtLocalPeer::sendMessage(const QString &message, int timeout) +{ + if (!isClient()) + return false; + + QLocalSocket socket; + bool connOk = false; + for(int i = 0; i < 2; i++) { + // Try twice, in case the other instance is just starting up + socket.connectToServer(socketName); + connOk = socket.waitForConnected(timeout/2); + if (connOk || i) + break; + int ms = 250; +#if defined(Q_OS_WIN) + Sleep(DWORD(ms)); +#else + struct timespec ts = { ms / 1000, (ms % 1000) * 1000 * 1000 }; + nanosleep(&ts, NULL); +#endif + } + if (!connOk) + return false; + + QByteArray uMsg(message.toUtf8()); + QDataStream ds(&socket); + ds.writeBytes(uMsg.constData(), uMsg.size()); + bool res = socket.waitForBytesWritten(timeout); + if (res) { + res &= socket.waitForReadyRead(timeout); // wait for ack + if (res) + res &= (socket.read(qstrlen(ack)) == ack); + } + return res; +} + + +void QtLocalPeer::receiveConnection() +{ + QLocalSocket* socket = server->nextPendingConnection(); + if (!socket) + return; + + while (socket->bytesAvailable() < (int)sizeof(quint32)) + socket->waitForReadyRead(); + QDataStream ds(socket); + QByteArray uMsg; + quint32 remaining; + ds >> remaining; + uMsg.resize(remaining); + int got = 0; + char* uMsgBuf = uMsg.data(); + do { + got = ds.readRawData(uMsgBuf, remaining); + remaining -= got; + uMsgBuf += got; + } while (remaining && got >= 0 && socket->waitForReadyRead(2000)); + if (got < 0) { + qWarning("QtLocalPeer: Message reception failed %s", socket->errorString().toLatin1().constData()); + delete socket; + return; + } + QString message(QString::fromUtf8(uMsg)); + socket->write(ack, qstrlen(ack)); + socket->waitForBytesWritten(1000); + socket->waitForDisconnected(1000); // make sure client reads ack + delete socket; + emit messageReceived(message); //### (might take a long time to return) +} diff --git a/3rd-party/qtsingleapplication/qtlocalpeer.h b/3rd-party/qtsingleapplication/qtlocalpeer.h new file mode 100644 index 0000000..1b533b1 --- /dev/null +++ b/3rd-party/qtsingleapplication/qtlocalpeer.h @@ -0,0 +1,77 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt Solutions component. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QTLOCALPEER_H +#define QTLOCALPEER_H + +#include +#include +#include + +#include "qtlockedfile.h" + +class QtLocalPeer : public QObject +{ + Q_OBJECT + +public: + QtLocalPeer(QObject *parent = 0, const QString &appId = QString()); + bool isClient(); + bool sendMessage(const QString &message, int timeout); + QString applicationId() const + { return id; } + +Q_SIGNALS: + void messageReceived(const QString &message); + +protected Q_SLOTS: + void receiveConnection(); + +protected: + QString id; + QString socketName; + QLocalServer* server; + QtLP_Private::QtLockedFile lockFile; + +private: + static const char* ack; +}; + +#endif // QTLOCALPEER_H diff --git a/3rd-party/qtsingleapplication/qtlockedfile.cpp b/3rd-party/qtsingleapplication/qtlockedfile.cpp new file mode 100644 index 0000000..c142a86 --- /dev/null +++ b/3rd-party/qtsingleapplication/qtlockedfile.cpp @@ -0,0 +1,193 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt Solutions component. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qtlockedfile.h" + +/*! + \class QtLockedFile + + \brief The QtLockedFile class extends QFile with advisory locking + functions. + + A file may be locked in read or write mode. Multiple instances of + \e QtLockedFile, created in multiple processes running on the same + machine, may have a file locked in read mode. Exactly one instance + may have it locked in write mode. A read and a write lock cannot + exist simultaneously on the same file. + + The file locks are advisory. This means that nothing prevents + another process from manipulating a locked file using QFile or + file system functions offered by the OS. Serialization is only + guaranteed if all processes that access the file use + QLockedFile. Also, while holding a lock on a file, a process + must not open the same file again (through any API), or locks + can be unexpectedly lost. + + The lock provided by an instance of \e QtLockedFile is released + whenever the program terminates. This is true even when the + program crashes and no destructors are called. +*/ + +/*! \enum QtLockedFile::LockMode + + This enum describes the available lock modes. + + \value ReadLock A read lock. + \value WriteLock A write lock. + \value NoLock Neither a read lock nor a write lock. +*/ + +/*! + Constructs an unlocked \e QtLockedFile object. This constructor + behaves in the same way as \e QFile::QFile(). + + \sa QFile::QFile() +*/ +QtLockedFile::QtLockedFile() + : QFile() +{ +#ifdef Q_OS_WIN + wmutex = 0; + rmutex = 0; +#endif + m_lock_mode = NoLock; +} + +/*! + Constructs an unlocked QtLockedFile object with file \a name. This + constructor behaves in the same way as \e QFile::QFile(const + QString&). + + \sa QFile::QFile() +*/ +QtLockedFile::QtLockedFile(const QString &name) + : QFile(name) +{ +#ifdef Q_OS_WIN + wmutex = 0; + rmutex = 0; +#endif + m_lock_mode = NoLock; +} + +/*! + Opens the file in OpenMode \a mode. + + This is identical to QFile::open(), with the one exception that the + Truncate mode flag is disallowed. Truncation would conflict with the + advisory file locking, since the file would be modified before the + write lock is obtained. If truncation is required, use resize(0) + after obtaining the write lock. + + Returns true if successful; otherwise false. + + \sa QFile::open(), QFile::resize() +*/ +bool QtLockedFile::open(OpenMode mode) +{ + if (mode & QIODevice::Truncate) { + qWarning("QtLockedFile::open(): Truncate mode not allowed."); + return false; + } + return QFile::open(mode); +} + +/*! + Returns \e true if this object has a in read or write lock; + otherwise returns \e false. + + \sa lockMode() +*/ +bool QtLockedFile::isLocked() const +{ + return m_lock_mode != NoLock; +} + +/*! + Returns the type of lock currently held by this object, or \e + QtLockedFile::NoLock. + + \sa isLocked() +*/ +QtLockedFile::LockMode QtLockedFile::lockMode() const +{ + return m_lock_mode; +} + +/*! + \fn bool QtLockedFile::lock(LockMode mode, bool block = true) + + Obtains a lock of type \a mode. The file must be opened before it + can be locked. + + If \a block is true, this function will block until the lock is + aquired. If \a block is false, this function returns \e false + immediately if the lock cannot be aquired. + + If this object already has a lock of type \a mode, this function + returns \e true immediately. If this object has a lock of a + different type than \a mode, the lock is first released and then a + new lock is obtained. + + This function returns \e true if, after it executes, the file is + locked by this object, and \e false otherwise. + + \sa unlock(), isLocked(), lockMode() +*/ + +/*! + \fn bool QtLockedFile::unlock() + + Releases a lock. + + If the object has no lock, this function returns immediately. + + This function returns \e true if, after it executes, the file is + not locked by this object, and \e false otherwise. + + \sa lock(), isLocked(), lockMode() +*/ + +/*! + \fn QtLockedFile::~QtLockedFile() + + Destroys the \e QtLockedFile object. If any locks were held, they + are released. +*/ diff --git a/3rd-party/qtsingleapplication/qtlockedfile.h b/3rd-party/qtsingleapplication/qtlockedfile.h new file mode 100644 index 0000000..84c18e5 --- /dev/null +++ b/3rd-party/qtsingleapplication/qtlockedfile.h @@ -0,0 +1,97 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt Solutions component. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QTLOCKEDFILE_H +#define QTLOCKEDFILE_H + +#include +#ifdef Q_OS_WIN +#include +#endif + +#if defined(Q_OS_WIN) +# if !defined(QT_QTLOCKEDFILE_EXPORT) && !defined(QT_QTLOCKEDFILE_IMPORT) +# define QT_QTLOCKEDFILE_EXPORT +# elif defined(QT_QTLOCKEDFILE_IMPORT) +# if defined(QT_QTLOCKEDFILE_EXPORT) +# undef QT_QTLOCKEDFILE_EXPORT +# endif +# define QT_QTLOCKEDFILE_EXPORT __declspec(dllimport) +# elif defined(QT_QTLOCKEDFILE_EXPORT) +# undef QT_QTLOCKEDFILE_EXPORT +# define QT_QTLOCKEDFILE_EXPORT __declspec(dllexport) +# endif +#else +# define QT_QTLOCKEDFILE_EXPORT +#endif + +namespace QtLP_Private { + +class QT_QTLOCKEDFILE_EXPORT QtLockedFile : public QFile +{ +public: + enum LockMode { NoLock = 0, ReadLock, WriteLock }; + + QtLockedFile(); + QtLockedFile(const QString &name); + ~QtLockedFile(); + + bool open(OpenMode mode); + + bool lock(LockMode mode, bool block = true); + bool unlock(); + bool isLocked() const; + LockMode lockMode() const; + +private: +#ifdef Q_OS_WIN + Qt::HANDLE wmutex; + Qt::HANDLE rmutex; + QVector rmutexes; + QString mutexname; + + Qt::HANDLE getMutexHandle(int idx, bool doCreate); + bool waitMutex(Qt::HANDLE mutex, bool doBlock); + +#endif + LockMode m_lock_mode; +}; +} +#endif diff --git a/3rd-party/qtsingleapplication/qtlockedfile_unix.cpp b/3rd-party/qtsingleapplication/qtlockedfile_unix.cpp new file mode 100644 index 0000000..976c1b9 --- /dev/null +++ b/3rd-party/qtsingleapplication/qtlockedfile_unix.cpp @@ -0,0 +1,115 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt Solutions component. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include +#include + +#include "qtlockedfile.h" + +bool QtLockedFile::lock(LockMode mode, bool block) +{ + if (!isOpen()) { + qWarning("QtLockedFile::lock(): file is not opened"); + return false; + } + + if (mode == NoLock) + return unlock(); + + if (mode == m_lock_mode) + return true; + + if (m_lock_mode != NoLock) + unlock(); + + struct flock fl; + fl.l_whence = SEEK_SET; + fl.l_start = 0; + fl.l_len = 0; + fl.l_type = (mode == ReadLock) ? F_RDLCK : F_WRLCK; + int cmd = block ? F_SETLKW : F_SETLK; + int ret = fcntl(handle(), cmd, &fl); + + if (ret == -1) { + if (errno != EINTR && errno != EAGAIN) + qWarning("QtLockedFile::lock(): fcntl: %s", strerror(errno)); + return false; + } + + + m_lock_mode = mode; + return true; +} + + +bool QtLockedFile::unlock() +{ + if (!isOpen()) { + qWarning("QtLockedFile::unlock(): file is not opened"); + return false; + } + + if (!isLocked()) + return true; + + struct flock fl; + fl.l_whence = SEEK_SET; + fl.l_start = 0; + fl.l_len = 0; + fl.l_type = F_UNLCK; + int ret = fcntl(handle(), F_SETLKW, &fl); + + if (ret == -1) { + qWarning("QtLockedFile::lock(): fcntl: %s", strerror(errno)); + return false; + } + + m_lock_mode = NoLock; + return true; +} + +QtLockedFile::~QtLockedFile() +{ + if (isOpen()) + unlock(); +} + diff --git a/3rd-party/qtsingleapplication/qtlockedfile_win.cpp b/3rd-party/qtsingleapplication/qtlockedfile_win.cpp new file mode 100644 index 0000000..5e21262 --- /dev/null +++ b/3rd-party/qtsingleapplication/qtlockedfile_win.cpp @@ -0,0 +1,211 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt Solutions component. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qtlockedfile.h" +#include +#include + +#define MUTEX_PREFIX "QtLockedFile mutex " +// Maximum number of concurrent read locks. Must not be greater than MAXIMUM_WAIT_OBJECTS +#define MAX_READERS MAXIMUM_WAIT_OBJECTS + +#if QT_VERSION >= 0x050000 +#define QT_WA(unicode, ansi) unicode +#endif + +Qt::HANDLE QtLockedFile::getMutexHandle(int idx, bool doCreate) +{ + if (mutexname.isEmpty()) { + QFileInfo fi(*this); + mutexname = QString::fromLatin1(MUTEX_PREFIX) + + fi.absoluteFilePath().toLower(); + } + QString mname(mutexname); + if (idx >= 0) + mname += QString::number(idx); + + Qt::HANDLE mutex; + if (doCreate) { + QT_WA( { mutex = CreateMutexW(NULL, FALSE, (TCHAR*)mname.utf16()); }, + { mutex = CreateMutexA(NULL, FALSE, mname.toLocal8Bit().constData()); } ); + if (!mutex) { + qErrnoWarning("QtLockedFile::lock(): CreateMutex failed"); + return 0; + } + } + else { + QT_WA( { mutex = OpenMutexW(SYNCHRONIZE | MUTEX_MODIFY_STATE, FALSE, (TCHAR*)mname.utf16()); }, + { mutex = OpenMutexA(SYNCHRONIZE | MUTEX_MODIFY_STATE, FALSE, mname.toLocal8Bit().constData()); } ); + if (!mutex) { + if (GetLastError() != ERROR_FILE_NOT_FOUND) + qErrnoWarning("QtLockedFile::lock(): OpenMutex failed"); + return 0; + } + } + return mutex; +} + +bool QtLockedFile::waitMutex(Qt::HANDLE mutex, bool doBlock) +{ + Q_ASSERT(mutex); + DWORD res = WaitForSingleObject(mutex, doBlock ? INFINITE : 0); + switch (res) { + case WAIT_OBJECT_0: + case WAIT_ABANDONED: + return true; + break; + case WAIT_TIMEOUT: + break; + default: + qErrnoWarning("QtLockedFile::lock(): WaitForSingleObject failed"); + } + return false; +} + + + +bool QtLockedFile::lock(LockMode mode, bool block) +{ + if (!isOpen()) { + qWarning("QtLockedFile::lock(): file is not opened"); + return false; + } + + if (mode == NoLock) + return unlock(); + + if (mode == m_lock_mode) + return true; + + if (m_lock_mode != NoLock) + unlock(); + + if (!wmutex && !(wmutex = getMutexHandle(-1, true))) + return false; + + if (!waitMutex(wmutex, block)) + return false; + + if (mode == ReadLock) { + int idx = 0; + for (; idx < MAX_READERS; idx++) { + rmutex = getMutexHandle(idx, false); + if (!rmutex || waitMutex(rmutex, false)) + break; + CloseHandle(rmutex); + } + bool ok = true; + if (idx >= MAX_READERS) { + qWarning("QtLockedFile::lock(): too many readers"); + rmutex = 0; + ok = false; + } + else if (!rmutex) { + rmutex = getMutexHandle(idx, true); + if (!rmutex || !waitMutex(rmutex, false)) + ok = false; + } + if (!ok && rmutex) { + CloseHandle(rmutex); + rmutex = 0; + } + ReleaseMutex(wmutex); + if (!ok) + return false; + } + else { + Q_ASSERT(rmutexes.isEmpty()); + for (int i = 0; i < MAX_READERS; i++) { + Qt::HANDLE mutex = getMutexHandle(i, false); + if (mutex) + rmutexes.append(mutex); + } + if (rmutexes.size()) { + DWORD res = WaitForMultipleObjects(rmutexes.size(), rmutexes.constData(), + TRUE, block ? INFINITE : 0); + if (res != WAIT_OBJECT_0 && res != WAIT_ABANDONED) { + if (res != WAIT_TIMEOUT) + qErrnoWarning("QtLockedFile::lock(): WaitForMultipleObjects failed"); + m_lock_mode = WriteLock; // trick unlock() to clean up - semiyucky + unlock(); + return false; + } + } + } + + m_lock_mode = mode; + return true; +} + +bool QtLockedFile::unlock() +{ + if (!isOpen()) { + qWarning("QtLockedFile::unlock(): file is not opened"); + return false; + } + + if (!isLocked()) + return true; + + if (m_lock_mode == ReadLock) { + ReleaseMutex(rmutex); + CloseHandle(rmutex); + rmutex = 0; + } + else { + foreach(Qt::HANDLE mutex, rmutexes) { + ReleaseMutex(mutex); + CloseHandle(mutex); + } + rmutexes.clear(); + ReleaseMutex(wmutex); + } + + m_lock_mode = QtLockedFile::NoLock; + return true; +} + +QtLockedFile::~QtLockedFile() +{ + if (isOpen()) + unlock(); + if (wmutex) + CloseHandle(wmutex); +} diff --git a/3rd-party/qtsingleapplication/qtsingleapplication.cpp b/3rd-party/qtsingleapplication/qtsingleapplication.cpp new file mode 100644 index 0000000..d0fb15d --- /dev/null +++ b/3rd-party/qtsingleapplication/qtsingleapplication.cpp @@ -0,0 +1,347 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt Solutions component. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + + +#include "qtsingleapplication.h" +#include "qtlocalpeer.h" +#include + + +/*! + \class QtSingleApplication qtsingleapplication.h + \brief The QtSingleApplication class provides an API to detect and + communicate with running instances of an application. + + This class allows you to create applications where only one + instance should be running at a time. I.e., if the user tries to + launch another instance, the already running instance will be + activated instead. Another usecase is a client-server system, + where the first started instance will assume the role of server, + and the later instances will act as clients of that server. + + By default, the full path of the executable file is used to + determine whether two processes are instances of the same + application. You can also provide an explicit identifier string + that will be compared instead. + + The application should create the QtSingleApplication object early + in the startup phase, and call isRunning() to find out if another + instance of this application is already running. If isRunning() + returns false, it means that no other instance is running, and + this instance has assumed the role as the running instance. In + this case, the application should continue with the initialization + of the application user interface before entering the event loop + with exec(), as normal. + + The messageReceived() signal will be emitted when the running + application receives messages from another instance of the same + application. When a message is received it might be helpful to the + user to raise the application so that it becomes visible. To + facilitate this, QtSingleApplication provides the + setActivationWindow() function and the activateWindow() slot. + + If isRunning() returns true, another instance is already + running. It may be alerted to the fact that another instance has + started by using the sendMessage() function. Also data such as + startup parameters (e.g. the name of the file the user wanted this + new instance to open) can be passed to the running instance with + this function. Then, the application should terminate (or enter + client mode). + + If isRunning() returns true, but sendMessage() fails, that is an + indication that the running instance is frozen. + + Here's an example that shows how to convert an existing + application to use QtSingleApplication. It is very simple and does + not make use of all QtSingleApplication's functionality (see the + examples for that). + + \code + // Original + int main(int argc, char **argv) + { + QApplication app(argc, argv); + + MyMainWidget mmw; + mmw.show(); + return app.exec(); + } + + // Single instance + int main(int argc, char **argv) + { + QtSingleApplication app(argc, argv); + + if (app.isRunning()) + return !app.sendMessage(someDataString); + + MyMainWidget mmw; + app.setActivationWindow(&mmw); + mmw.show(); + return app.exec(); + } + \endcode + + Once this QtSingleApplication instance is destroyed (normally when + the process exits or crashes), when the user next attempts to run the + application this instance will not, of course, be encountered. The + next instance to call isRunning() or sendMessage() will assume the + role as the new running instance. + + For console (non-GUI) applications, QtSingleCoreApplication may be + used instead of this class, to avoid the dependency on the QtGui + library. + + \sa QtSingleCoreApplication +*/ + + +void QtSingleApplication::sysInit(const QString &appId) +{ + actWin = 0; + peer = new QtLocalPeer(this, appId); + connect(peer, SIGNAL(messageReceived(const QString&)), SIGNAL(messageReceived(const QString&))); +} + + +/*! + Creates a QtSingleApplication object. The application identifier + will be QCoreApplication::applicationFilePath(). \a argc, \a + argv, and \a GUIenabled are passed on to the QAppliation constructor. + + If you are creating a console application (i.e. setting \a + GUIenabled to false), you may consider using + QtSingleCoreApplication instead. +*/ + +QtSingleApplication::QtSingleApplication(int &argc, char **argv, bool GUIenabled) + : QApplication(argc, argv, GUIenabled) +{ + sysInit(); +} + + +/*! + Creates a QtSingleApplication object with the application + identifier \a appId. \a argc and \a argv are passed on to the + QAppliation constructor. +*/ + +QtSingleApplication::QtSingleApplication(const QString &appId, int &argc, char **argv) + : QApplication(argc, argv) +{ + sysInit(appId); +} + +#if QT_VERSION < 0x050000 + +/*! + Creates a QtSingleApplication object. The application identifier + will be QCoreApplication::applicationFilePath(). \a argc, \a + argv, and \a type are passed on to the QAppliation constructor. +*/ +QtSingleApplication::QtSingleApplication(int &argc, char **argv, Type type) + : QApplication(argc, argv, type) +{ + sysInit(); +} + + +# if defined(Q_WS_X11) +/*! + Special constructor for X11, ref. the documentation of + QApplication's corresponding constructor. The application identifier + will be QCoreApplication::applicationFilePath(). \a dpy, \a visual, + and \a cmap are passed on to the QApplication constructor. +*/ +QtSingleApplication::QtSingleApplication(Display* dpy, Qt::HANDLE visual, Qt::HANDLE cmap) + : QApplication(dpy, visual, cmap) +{ + sysInit(); +} + +/*! + Special constructor for X11, ref. the documentation of + QApplication's corresponding constructor. The application identifier + will be QCoreApplication::applicationFilePath(). \a dpy, \a argc, \a + argv, \a visual, and \a cmap are passed on to the QApplication + constructor. +*/ +QtSingleApplication::QtSingleApplication(Display *dpy, int &argc, char **argv, Qt::HANDLE visual, Qt::HANDLE cmap) + : QApplication(dpy, argc, argv, visual, cmap) +{ + sysInit(); +} + +/*! + Special constructor for X11, ref. the documentation of + QApplication's corresponding constructor. The application identifier + will be \a appId. \a dpy, \a argc, \a + argv, \a visual, and \a cmap are passed on to the QApplication + constructor. +*/ +QtSingleApplication::QtSingleApplication(Display* dpy, const QString &appId, int argc, char **argv, Qt::HANDLE visual, Qt::HANDLE cmap) + : QApplication(dpy, argc, argv, visual, cmap) +{ + sysInit(appId); +} +# endif // Q_WS_X11 +#endif // QT_VERSION < 0x050000 + + +/*! + Returns true if another instance of this application is running; + otherwise false. + + This function does not find instances of this application that are + being run by a different user (on Windows: that are running in + another session). + + \sa sendMessage() +*/ + +bool QtSingleApplication::isRunning() +{ + return peer->isClient(); +} + + +/*! + Tries to send the text \a message to the currently running + instance. The QtSingleApplication object in the running instance + will emit the messageReceived() signal when it receives the + message. + + This function returns true if the message has been sent to, and + processed by, the current instance. If there is no instance + currently running, or if the running instance fails to process the + message within \a timeout milliseconds, this function return false. + + \sa isRunning(), messageReceived() +*/ +bool QtSingleApplication::sendMessage(const QString &message, int timeout) +{ + return peer->sendMessage(message, timeout); +} + + +/*! + Returns the application identifier. Two processes with the same + identifier will be regarded as instances of the same application. +*/ +QString QtSingleApplication::id() const +{ + return peer->applicationId(); +} + + +/*! + Sets the activation window of this application to \a aw. The + activation window is the widget that will be activated by + activateWindow(). This is typically the application's main window. + + If \a activateOnMessage is true (the default), the window will be + activated automatically every time a message is received, just prior + to the messageReceived() signal being emitted. + + \sa activateWindow(), messageReceived() +*/ + +void QtSingleApplication::setActivationWindow(QWidget* aw, bool activateOnMessage) +{ + actWin = aw; + if (activateOnMessage) + connect(peer, SIGNAL(messageReceived(const QString&)), this, SLOT(activateWindow())); + else + disconnect(peer, SIGNAL(messageReceived(const QString&)), this, SLOT(activateWindow())); +} + + +/*! + Returns the applications activation window if one has been set by + calling setActivationWindow(), otherwise returns 0. + + \sa setActivationWindow() +*/ +QWidget* QtSingleApplication::activationWindow() const +{ + return actWin; +} + + +/*! + De-minimizes, raises, and activates this application's activation window. + This function does nothing if no activation window has been set. + + This is a convenience function to show the user that this + application instance has been activated when he has tried to start + another instance. + + This function should typically be called in response to the + messageReceived() signal. By default, that will happen + automatically, if an activation window has been set. + + \sa setActivationWindow(), messageReceived(), initialize() +*/ +void QtSingleApplication::activateWindow() +{ + if (actWin) { + actWin->setWindowState(actWin->windowState() & ~Qt::WindowMinimized); + actWin->raise(); + actWin->activateWindow(); + } +} + + +/*! + \fn void QtSingleApplication::messageReceived(const QString& message) + + This signal is emitted when the current instance receives a \a + message from another instance of this application. + + \sa sendMessage(), setActivationWindow(), activateWindow() +*/ + + +/*! + \fn void QtSingleApplication::initialize(bool dummy = true) + + \obsolete +*/ diff --git a/3rd-party/qtsingleapplication/qtsingleapplication.h b/3rd-party/qtsingleapplication/qtsingleapplication.h new file mode 100644 index 0000000..049406f --- /dev/null +++ b/3rd-party/qtsingleapplication/qtsingleapplication.h @@ -0,0 +1,105 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt Solutions component. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QTSINGLEAPPLICATION_H +#define QTSINGLEAPPLICATION_H + +#include + +class QtLocalPeer; + +#if defined(Q_OS_WIN) +# if !defined(QT_QTSINGLEAPPLICATION_EXPORT) && !defined(QT_QTSINGLEAPPLICATION_IMPORT) +# define QT_QTSINGLEAPPLICATION_EXPORT +# elif defined(QT_QTSINGLEAPPLICATION_IMPORT) +# if defined(QT_QTSINGLEAPPLICATION_EXPORT) +# undef QT_QTSINGLEAPPLICATION_EXPORT +# endif +# define QT_QTSINGLEAPPLICATION_EXPORT __declspec(dllimport) +# elif defined(QT_QTSINGLEAPPLICATION_EXPORT) +# undef QT_QTSINGLEAPPLICATION_EXPORT +# define QT_QTSINGLEAPPLICATION_EXPORT __declspec(dllexport) +# endif +#else +# define QT_QTSINGLEAPPLICATION_EXPORT +#endif + +class QT_QTSINGLEAPPLICATION_EXPORT QtSingleApplication : public QApplication +{ + Q_OBJECT + +public: + QtSingleApplication(int &argc, char **argv, bool GUIenabled = true); + QtSingleApplication(const QString &id, int &argc, char **argv); +#if QT_VERSION < 0x050000 + QtSingleApplication(int &argc, char **argv, Type type); +# if defined(Q_WS_X11) + QtSingleApplication(Display* dpy, Qt::HANDLE visual = 0, Qt::HANDLE colormap = 0); + QtSingleApplication(Display *dpy, int &argc, char **argv, Qt::HANDLE visual = 0, Qt::HANDLE cmap= 0); + QtSingleApplication(Display* dpy, const QString &appId, int argc, char **argv, Qt::HANDLE visual = 0, Qt::HANDLE colormap = 0); +# endif // Q_WS_X11 +#endif // QT_VERSION < 0x050000 + + bool isRunning(); + QString id() const; + + void setActivationWindow(QWidget* aw, bool activateOnMessage = true); + QWidget* activationWindow() const; + + // Obsolete: + void initialize(bool dummy = true) + { isRunning(); Q_UNUSED(dummy) } + +public Q_SLOTS: + bool sendMessage(const QString &message, int timeout = 5000); + void activateWindow(); + + +Q_SIGNALS: + void messageReceived(const QString &message); + + +private: + void sysInit(const QString &appId = QString()); + QtLocalPeer *peer; + QWidget *actWin; +}; + +#endif // QTSINGLEAPPLICATION_H diff --git a/3rd-party/qtsingleapplication/qtsingleapplication.pri b/3rd-party/qtsingleapplication/qtsingleapplication.pri new file mode 100644 index 0000000..51f30cc --- /dev/null +++ b/3rd-party/qtsingleapplication/qtsingleapplication.pri @@ -0,0 +1,17 @@ +#include(../common.pri) +INCLUDEPATH += $$PWD +DEPENDPATH += $$PWD +QT *= network +greaterThan(QT_MAJOR_VERSION, 4): QT *= widgets + +qtsingleapplication-uselib:!qtsingleapplication-buildlib { + LIBS += -L$$QTSINGLEAPPLICATION_LIBDIR -l$$QTSINGLEAPPLICATION_LIBNAME +} else { + SOURCES += $$PWD/qtsingleapplication.cpp $$PWD/qtlocalpeer.cpp + HEADERS += $$PWD/qtsingleapplication.h $$PWD/qtlocalpeer.h +} + +win32 { + contains(TEMPLATE, lib):contains(CONFIG, shared):DEFINES += QT_QTSINGLEAPPLICATION_EXPORT + else:qtsingleapplication-uselib:DEFINES += QT_QTSINGLEAPPLICATION_IMPORT +} diff --git a/3rd-party/qtsingleapplication/qtsinglecoreapplication.cpp b/3rd-party/qtsingleapplication/qtsinglecoreapplication.cpp new file mode 100644 index 0000000..5634537 --- /dev/null +++ b/3rd-party/qtsingleapplication/qtsinglecoreapplication.cpp @@ -0,0 +1,149 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt Solutions component. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + + +#include "qtsinglecoreapplication.h" +#include "qtlocalpeer.h" + +/*! + \class QtSingleCoreApplication qtsinglecoreapplication.h + \brief A variant of the QtSingleApplication class for non-GUI applications. + + This class is a variant of QtSingleApplication suited for use in + console (non-GUI) applications. It is an extension of + QCoreApplication (instead of QApplication). It does not require + the QtGui library. + + The API and usage is identical to QtSingleApplication, except that + functions relating to the "activation window" are not present, for + obvious reasons. Please refer to the QtSingleApplication + documentation for explanation of the usage. + + A QtSingleCoreApplication instance can communicate to a + QtSingleApplication instance if they share the same application + id. Hence, this class can be used to create a light-weight + command-line tool that sends commands to a GUI application. + + \sa QtSingleApplication +*/ + +/*! + Creates a QtSingleCoreApplication object. The application identifier + will be QCoreApplication::applicationFilePath(). \a argc and \a + argv are passed on to the QCoreAppliation constructor. +*/ + +QtSingleCoreApplication::QtSingleCoreApplication(int &argc, char **argv) + : QCoreApplication(argc, argv) +{ + peer = new QtLocalPeer(this); + connect(peer, SIGNAL(messageReceived(const QString&)), SIGNAL(messageReceived(const QString&))); +} + + +/*! + Creates a QtSingleCoreApplication object with the application + identifier \a appId. \a argc and \a argv are passed on to the + QCoreAppliation constructor. +*/ +QtSingleCoreApplication::QtSingleCoreApplication(const QString &appId, int &argc, char **argv) + : QCoreApplication(argc, argv) +{ + peer = new QtLocalPeer(this, appId); + connect(peer, SIGNAL(messageReceived(const QString&)), SIGNAL(messageReceived(const QString&))); +} + + +/*! + Returns true if another instance of this application is running; + otherwise false. + + This function does not find instances of this application that are + being run by a different user (on Windows: that are running in + another session). + + \sa sendMessage() +*/ + +bool QtSingleCoreApplication::isRunning() +{ + return peer->isClient(); +} + + +/*! + Tries to send the text \a message to the currently running + instance. The QtSingleCoreApplication object in the running instance + will emit the messageReceived() signal when it receives the + message. + + This function returns true if the message has been sent to, and + processed by, the current instance. If there is no instance + currently running, or if the running instance fails to process the + message within \a timeout milliseconds, this function return false. + + \sa isRunning(), messageReceived() +*/ + +bool QtSingleCoreApplication::sendMessage(const QString &message, int timeout) +{ + return peer->sendMessage(message, timeout); +} + + +/*! + Returns the application identifier. Two processes with the same + identifier will be regarded as instances of the same application. +*/ + +QString QtSingleCoreApplication::id() const +{ + return peer->applicationId(); +} + + +/*! + \fn void QtSingleCoreApplication::messageReceived(const QString& message) + + This signal is emitted when the current instance receives a \a + message from another instance of this application. + + \sa sendMessage() +*/ diff --git a/3rd-party/qtsingleapplication/qtsinglecoreapplication.h b/3rd-party/qtsingleapplication/qtsinglecoreapplication.h new file mode 100644 index 0000000..b87fffe --- /dev/null +++ b/3rd-party/qtsingleapplication/qtsinglecoreapplication.h @@ -0,0 +1,71 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the Qt Solutions component. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of Digia Plc and its Subsidiary(-ies) nor the names +** of its contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QTSINGLECOREAPPLICATION_H +#define QTSINGLECOREAPPLICATION_H + +#include + +class QtLocalPeer; + +class QtSingleCoreApplication : public QCoreApplication +{ + Q_OBJECT + +public: + QtSingleCoreApplication(int &argc, char **argv); + QtSingleCoreApplication(const QString &id, int &argc, char **argv); + + bool isRunning(); + QString id() const; + +public Q_SLOTS: + bool sendMessage(const QString &message, int timeout = 5000); + + +Q_SIGNALS: + void messageReceived(const QString &message); + + +private: + QtLocalPeer* peer; +}; + +#endif // QTSINGLECOREAPPLICATION_H diff --git a/3rd-party/qtsingleapplication/qtsinglecoreapplication.pri b/3rd-party/qtsingleapplication/qtsinglecoreapplication.pri new file mode 100644 index 0000000..d2d6cc3 --- /dev/null +++ b/3rd-party/qtsingleapplication/qtsinglecoreapplication.pri @@ -0,0 +1,10 @@ +INCLUDEPATH += $$PWD +DEPENDPATH += $$PWD +HEADERS += $$PWD/qtsinglecoreapplication.h $$PWD/qtlocalpeer.h +SOURCES += $$PWD/qtsinglecoreapplication.cpp $$PWD/qtlocalpeer.cpp + +QT *= network + +win32:contains(TEMPLATE, lib):contains(CONFIG, shared) { + DEFINES += QT_QTSINGLECOREAPPLICATION_EXPORT=__declspec(dllexport) +} diff --git a/ScreenTranslator.pro b/ScreenTranslator.pro index 6656578..a76bb69 100644 --- a/ScreenTranslator.pro +++ b/ScreenTranslator.pro @@ -16,6 +16,8 @@ INCLUDEPATH += ../include LIBS += -L../bin -ltesseract -llept -ltiff -lgif -ljpeg -lz LIBS += -lWs2_32 +include(3rd-party/qtsingleapplication/qtsingleapplication.pri) + SOURCES += main.cpp\ Manager.cpp \ SettingsEditor.cpp \ diff --git a/main.cpp b/main.cpp index af6516a..1856300 100644 --- a/main.cpp +++ b/main.cpp @@ -1,11 +1,16 @@ #include #include +#include + #include #include int main (int argc, char *argv[]) { - QApplication a (argc, argv); + QtSingleApplication a (argc, argv); + if (a.sendMessage (QString ())) { + return 0; + } a.setQuitOnLastWindowClosed (false); a.setApplicationName (settings_values::appName); a.setOrganizationName (settings_values::companyName); From ced4b1c5c89d364f713730539f8145e7cda81139 Mon Sep 17 00:00:00 2001 From: Gres Date: Sun, 27 Sep 2015 18:16:37 +0300 Subject: [PATCH 03/89] Build configuration updated (now also includes linux builds). --- ScreenTranslator.pro | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/ScreenTranslator.pro b/ScreenTranslator.pro index a76bb69..2ad6709 100644 --- a/ScreenTranslator.pro +++ b/ScreenTranslator.pro @@ -11,10 +11,18 @@ greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = ScreenTranslator TEMPLATE = app -INCLUDEPATH += ../include +win32{ + RC_FILE = app.rc + INCLUDEPATH += ../mingw/include + LIBS += -L../mingw/lib -lws2_32 +} +linux{ + QT += x11extras + INCLUDEPATH += ../linux/include + LIBS += -L../linux/lib -lX11 +} -LIBS += -L../bin -ltesseract -llept -ltiff -lgif -ljpeg -lz -LIBS += -lWs2_32 +LIBS += -ltesseract -llept include(3rd-party/qtsingleapplication/qtsingleapplication.pri) @@ -58,10 +66,6 @@ TRANSLATIONS += \ translations/translation_en.ts \ translations/translation_ru.ts -win32{ -RC_FILE = app.rc -} - OTHER_FILES += \ app.rc \ images/icon.ico \ From 670fda2ac5df59cf334b6f7180da8b4ff0233862 Mon Sep 17 00:00:00 2001 From: Gres Date: Sun, 27 Sep 2015 18:16:52 +0300 Subject: [PATCH 04/89] Added linux support. --- GlobalActionHelper.cpp | 152 +++++++++++++++++++++++++++++++++-------- 1 file changed, 124 insertions(+), 28 deletions(-) diff --git a/GlobalActionHelper.cpp b/GlobalActionHelper.cpp index ca94a78..b1626ed 100644 --- a/GlobalActionHelper.cpp +++ b/GlobalActionHelper.cpp @@ -1,27 +1,10 @@ #include "GlobalActionHelper.h" -#include - #include #include QHash, QAction *> GlobalActionHelper::actions_; -bool GlobalActionHelper::nativeEventFilter (const QByteArray &eventType, - void *message, long *result) { - Q_UNUSED (eventType); - Q_UNUSED (result); - MSG *msg = static_cast(message); - if (msg->message == WM_HOTKEY) { - const quint32 keycode = HIWORD (msg->lParam); - const quint32 modifiers = LOWORD (msg->lParam); - QAction *action = actions_.value (qMakePair (keycode, modifiers)); - Q_CHECK_PTR (action); - action->activate (QAction::Trigger); - } - return false; -} - void GlobalActionHelper::init () { qApp->installNativeEventFilter (new GlobalActionHelper); } @@ -79,6 +62,129 @@ bool GlobalActionHelper::removeGlobal (QAction *action) { return res; } + + +#if defined(Q_OS_LINUX) +# include +# include +# include + +static bool error = false; + +static int customHandler (Display *display, XErrorEvent *event) { + Q_UNUSED (display); + switch (event->error_code) { + case BadAccess: + case BadValue: + case BadWindow: + if (event->request_code == 33 /* X_GrabKey */ || + event->request_code == 34 /* X_UngrabKey */) { + error = true; + } + default: + return 0; + } +} + +bool GlobalActionHelper::registerHotKey (quint32 nativeKey, quint32 nativeMods) { + Display *display = QX11Info::display (); + Window window = QX11Info::appRootWindow (); + Bool owner = True; + int pointer = GrabModeAsync; + int keyboard = GrabModeAsync; + error = false; + int (*handler)(Display *display, XErrorEvent *event) = XSetErrorHandler (customHandler); + XGrabKey (display, nativeKey, nativeMods, window, owner, pointer, keyboard); + // allow numlock + XGrabKey (display, nativeKey, nativeMods | Mod2Mask, window, owner, pointer, keyboard); + XSync (display, False); + XSetErrorHandler (handler); + return !error; +} + +bool GlobalActionHelper::unregisterHotKey (quint32 nativeKey, quint32 nativeMods) { + Display *display = QX11Info::display (); + Window window = QX11Info::appRootWindow (); + error = false; + int (*handler)(Display *display, XErrorEvent *event) = XSetErrorHandler (customHandler); + XUngrabKey (display, nativeKey, nativeMods, window); + // allow numlock + XUngrabKey (display, nativeKey, nativeMods | Mod2Mask, window); + XSync (display, False); + XSetErrorHandler (handler); + return !error; +} + +bool GlobalActionHelper::nativeEventFilter (const QByteArray &eventType, + void *message, long *result) { + Q_UNUSED (eventType); + Q_UNUSED (result); + xcb_generic_event_t *event = static_cast(message); + if (event->response_type == XCB_KEY_PRESS) { + xcb_key_press_event_t *keyEvent = static_cast(message); + const quint32 keycode = keyEvent->detail; + const quint32 modifiers = keyEvent->state & ~XCB_MOD_MASK_2; + QAction *action = actions_.value (qMakePair (keycode, modifiers)); + if (action) { + action->activate (QAction::Trigger); + } + } + return false; +} + +quint32 GlobalActionHelper::nativeKeycode (Qt::Key key) { + Display *display = QX11Info::display (); + KeySym keySym = XStringToKeysym (qPrintable (QKeySequence (key).toString ())); + return XKeysymToKeycode (display, keySym); +} + +quint32 GlobalActionHelper::nativeModifiers (Qt::KeyboardModifiers modifiers) { + quint32 native = 0; + if (modifiers & Qt::ShiftModifier) { + native |= ShiftMask; + } + if (modifiers & Qt::ControlModifier) { + native |= ControlMask; + } + if (modifiers & Qt::AltModifier) { + native |= Mod1Mask; + } + if (modifiers & Qt::MetaModifier) { + native |= Mod4Mask; + } + return native; +} + + + +#elif defined(Q_OS_WIN) +# include + + +bool GlobalActionHelper::registerHotKey (quint32 nativeKey, quint32 nativeMods) { + return RegisterHotKey (0, nativeMods ^ nativeKey, nativeMods, nativeKey); +} + +bool GlobalActionHelper::unregisterHotKey (quint32 nativeKey, quint32 nativeMods) { + return UnregisterHotKey (0, nativeMods ^ nativeKey); +} + +bool GlobalActionHelper::nativeEventFilter (const QByteArray &eventType, + void *message, long *result) { + Q_UNUSED (eventType); + Q_UNUSED (result); + MSG *msg = static_cast(message); + if (msg->message == WM_HOTKEY) { + const quint32 keycode = HIWORD (msg->lParam); + const quint32 modifiers = LOWORD (msg->lParam); + QAction *action = actions_.value (qMakePair (keycode, modifiers)); + if (action) { + action->activate (QAction::Trigger); + } + } + return false; +} + quint32 GlobalActionHelper::nativeKeycode (Qt::Key key) { switch (key) { case Qt::Key_Escape: @@ -185,9 +291,6 @@ quint32 GlobalActionHelper::nativeKeycode (Qt::Key key) { return VK_MEDIA_PLAY_PAUSE; case Qt::Key_MediaStop: return VK_MEDIA_STOP; - // couldn't find those in VK_* - //case Qt::Key_MediaLast: - //case Qt::Key_MediaRecord: case Qt::Key_VolumeDown: return VK_VOLUME_DOWN; case Qt::Key_VolumeUp: @@ -261,11 +364,4 @@ quint32 GlobalActionHelper::nativeModifiers (Qt::KeyboardModifiers modifiers) { //if (modifiers & Qt::GroupSwitchModifier) return native; } - -bool GlobalActionHelper::registerHotKey (quint32 nativeKey, quint32 nativeMods) { - return RegisterHotKey (0, nativeMods ^ nativeKey, nativeMods, nativeKey); -} - -bool GlobalActionHelper::unregisterHotKey (quint32 nativeKey, quint32 nativeMods) { - return UnregisterHotKey (0, nativeMods ^ nativeKey); -} +#endif From 26ddd92584b10ea4575e375cf6dd34fbbf8b144b Mon Sep 17 00:00:00 2001 From: Gres Date: Sun, 27 Sep 2015 18:57:50 +0300 Subject: [PATCH 05/89] Use QKeySequenceEdit in settings. --- SettingsEditor.cpp | 31 ++++++++++++++++--------------- SettingsEditor.ui | 44 +++++++++++++++++--------------------------- 2 files changed, 33 insertions(+), 42 deletions(-) diff --git a/SettingsEditor.cpp b/SettingsEditor.cpp index 823493a..43d2775 100644 --- a/SettingsEditor.cpp +++ b/SettingsEditor.cpp @@ -39,28 +39,29 @@ void SettingsEditor::done (int result) { } void SettingsEditor::saveSettings () const { + using namespace settings_names; QSettings settings; - settings.beginGroup (settings_names::guiGroup); - settings.setValue (settings_names::captureHotkey, ui->captureEdit->text ()); - settings.setValue (settings_names::repeatHotkey, ui->repeatEdit->text ()); - settings.setValue (settings_names::clipboardHotkey, ui->clipboardEdit->text ()); - settings.setValue (settings_names::resultShowType, buttonGroup_->checkedId ()); + settings.beginGroup (guiGroup); + settings.setValue (captureHotkey, ui->captureEdit->keySequence ().toString ()); + settings.setValue (repeatHotkey, ui->repeatEdit->keySequence ().toString ()); + settings.setValue (clipboardHotkey, ui->clipboardEdit->keySequence ().toString ()); + settings.setValue (resultShowType, buttonGroup_->checkedId ()); settings.endGroup (); - settings.beginGroup (settings_names::recogntionGroup); - settings.setValue (settings_names::tessDataPlace, ui->tessdataEdit->text ()); + settings.beginGroup (recogntionGroup); + settings.setValue (tessDataPlace, ui->tessdataEdit->text ()); QString ocrLanguage = dictionary_.ocrUiToCode (ui->ocrLangCombo->currentText ()); - settings.setValue (settings_names::ocrLanguage, ocrLanguage); - settings.setValue (settings_names::imageScale, ui->imageScaleSpin->value ()); + settings.setValue (ocrLanguage, ocrLanguage); + settings.setValue (imageScale, ui->imageScaleSpin->value ()); settings.endGroup (); - settings.beginGroup (settings_names::translationGroup); + settings.beginGroup (translationGroup); QString trLanguage = dictionary_.translateUiToCode (ui->translateLangCombo->currentText ()); - settings.setValue (settings_names::translationLanguage, trLanguage); + settings.setValue (translationLanguage, trLanguage); QString sourceLanguage = dictionary_.translateForOcrCode (ocrLanguage); - settings.setValue (settings_names::sourceLanguage, sourceLanguage); + settings.setValue (sourceLanguage, sourceLanguage); settings.endGroup (); } @@ -81,9 +82,9 @@ void SettingsEditor::loadSettings () { QSettings settings; settings.beginGroup (settings_names::guiGroup); - ui->captureEdit->setText (GET (captureHotkey).toString ()); - ui->repeatEdit->setText (GET (repeatHotkey).toString ()); - ui->clipboardEdit->setText (GET (clipboardHotkey).toString ()); + ui->captureEdit->setKeySequence (QKeySequence (GET (captureHotkey).toString ())); + ui->repeatEdit->setKeySequence (QKeySequence (GET (repeatHotkey).toString ())); + ui->clipboardEdit->setKeySequence (QKeySequence (GET (clipboardHotkey).toString ())); QAbstractButton *button = buttonGroup_->button (GET (resultShowType).toInt ()); Q_CHECK_PTR (button); button->setChecked (true); diff --git a/SettingsEditor.ui b/SettingsEditor.ui index 3f43331..fe625b1 100644 --- a/SettingsEditor.ui +++ b/SettingsEditor.ui @@ -7,7 +7,7 @@ 0 0 435 - 221 + 242 @@ -28,29 +28,10 @@ Захватить - - captureEdit - - - - - - - - <html><head/><body><p>Сочетание клавиш для перехода в режим захвата.</p></body></html> - - - Скопировать - - - captureEdit - - - - - + + @@ -60,13 +41,23 @@ Повторить - - captureEdit + + + + + + + + + <html><head/><body><p>Сочетание клавиш для перехода в режим захвата.</p></body></html> + + + Скопировать - - + + @@ -225,7 +216,6 @@ - captureEdit translateLangCombo tessdataEdit tessdataButton From 5c7220707e57b47e244ec0ea0219414ec16d0484 Mon Sep 17 00:00:00 2001 From: Gres Date: Sun, 27 Sep 2015 18:58:06 +0300 Subject: [PATCH 06/89] Trigger action only if it is enabled. --- GlobalActionHelper.cpp | 16 ++++++++-------- GlobalActionHelper.h | 1 + 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/GlobalActionHelper.cpp b/GlobalActionHelper.cpp index b1626ed..22eac9f 100644 --- a/GlobalActionHelper.cpp +++ b/GlobalActionHelper.cpp @@ -62,6 +62,12 @@ bool GlobalActionHelper::removeGlobal (QAction *action) { return res; } +void GlobalActionHelper::triggerHotKey (quint32 nativeKey, quint32 nativeMods) { + QAction *action = actions_.value (qMakePair (nativeKey, nativeMods)); + if (action && action->isEnabled ()) { + action->activate (QAction::Trigger); + } +} #if defined(Q_OS_LINUX) @@ -124,10 +130,7 @@ bool GlobalActionHelper::nativeEventFilter (const QByteArray &eventType, xcb_key_press_event_t *keyEvent = static_cast(message); const quint32 keycode = keyEvent->detail; const quint32 modifiers = keyEvent->state & ~XCB_MOD_MASK_2; - QAction *action = actions_.value (qMakePair (keycode, modifiers)); - if (action) { - action->activate (QAction::Trigger); - } + triggerHotKey (keycode, modifiers); } return false; } @@ -177,10 +180,7 @@ bool GlobalActionHelper::nativeEventFilter (const QByteArray &eventType, if (msg->message == WM_HOTKEY) { const quint32 keycode = HIWORD (msg->lParam); const quint32 modifiers = LOWORD (msg->lParam); - QAction *action = actions_.value (qMakePair (keycode, modifiers)); - if (action) { - action->activate (QAction::Trigger); - } + triggerHotKey (keycode, modifiers); } return false; } diff --git a/GlobalActionHelper.h b/GlobalActionHelper.h index 250b723..7924e51 100644 --- a/GlobalActionHelper.h +++ b/GlobalActionHelper.h @@ -22,6 +22,7 @@ class GlobalActionHelper : public QAbstractNativeEventFilter { static quint32 nativeModifiers (Qt::KeyboardModifiers modifiers); static bool registerHotKey (quint32 nativeKey, quint32 nativeMods); static bool unregisterHotKey (quint32 nativeKey, quint32 nativeMods); + static void triggerHotKey (quint32 nativeKey, quint32 nativeMods); }; From d46eb9c5bd903827602a6b3c2a214cee6138f8de Mon Sep 17 00:00:00 2001 From: Gres Date: Sun, 27 Sep 2015 18:58:50 +0300 Subject: [PATCH 07/89] Disable actions when settings editor is active. --- Manager.cpp | 8 ++++++++ Manager.h | 1 + 2 files changed, 9 insertions(+) diff --git a/Manager.cpp b/Manager.cpp index 936dda5..fd6656e 100644 --- a/Manager.cpp +++ b/Manager.cpp @@ -93,6 +93,12 @@ QMenu * Manager::trayContextMenu () { return menu; } +void Manager::setActionsEnabled (bool isEnabled) { + captureAction_->setEnabled (isEnabled); + repeatAction_->setEnabled (isEnabled); + clipboardAction_->setEnabled (isEnabled); +} + void Manager::applySettings () { QSettings settings; settings.beginGroup (settings_names::guiGroup); @@ -143,7 +149,9 @@ void Manager::settings () { SettingsEditor editor (*dictionary_); editor.setWindowIcon (trayIcon_->icon ()); connect (&editor, SIGNAL (settingsEdited ()), SIGNAL (settingsEdited ())); + setActionsEnabled (false); editor.exec (); + setActionsEnabled (true); } void Manager::close () { diff --git a/Manager.h b/Manager.h index 03e0a21..4f4eba0 100644 --- a/Manager.h +++ b/Manager.h @@ -41,6 +41,7 @@ class Manager : public QObject { private: QMenu * trayContextMenu (); + void setActionsEnabled (bool isEnabled); private: QSystemTrayIcon *trayIcon_; From 256e812401010165b0c76a38cf457c69f9f0e854 Mon Sep 17 00:00:00 2001 From: Gres Date: Sun, 27 Sep 2015 20:50:19 +0300 Subject: [PATCH 08/89] Added base support of multi-screen systems. --- Manager.cpp | 34 ++++++++++++++++++++-------------- Manager.h | 7 +++++-- SelectionDialog.cpp | 6 +++--- SelectionDialog.h | 4 +++- 4 files changed, 31 insertions(+), 20 deletions(-) diff --git a/Manager.cpp b/Manager.cpp index fd6656e..3932fc1 100644 --- a/Manager.cpp +++ b/Manager.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -24,7 +25,6 @@ Manager::Manager (QObject *parent) : QObject (parent), trayIcon_ (new QSystemTrayIcon (QIcon (":/images/icon.png"), this)), dictionary_ (new LanguageHelper), - selection_ (new SelectionDialog (*dictionary_)), resultDialog_ (new ResultDialog), captureAction_ (NULL), repeatAction_ (NULL), clipboardAction_ (NULL), useResultDialog_ (true) { @@ -33,7 +33,7 @@ Manager::Manager (QObject *parent) : // Recognizer Recognizer *recognizer = new Recognizer; - connect (selection_, SIGNAL (selected (ProcessingItem)), + connect (this, SIGNAL (selected (ProcessingItem)), recognizer, SLOT (recognize (ProcessingItem))); connect (recognizer, SIGNAL (error (QString)), SLOT (showError (QString))); @@ -61,12 +61,7 @@ Manager::Manager (QObject *parent) : connect (translator, SIGNAL (translated (ProcessingItem)), SLOT (showResult (ProcessingItem))); - connect (this, SIGNAL (showPixmap (QPixmap)), - selection_, SLOT (setPixmap (QPixmap))); - - connect (this, SIGNAL (settingsEdited ()), selection_, SLOT (updateMenu ())); connect (this, SIGNAL (settingsEdited ()), this, SLOT (applySettings ())); - selection_->setWindowIcon (trayIcon_->icon ()); resultDialog_->setWindowIcon (trayIcon_->icon ()); @@ -136,13 +131,24 @@ Manager::~Manager () { void Manager::capture () { QList screens = QApplication::screens (); - ST_ASSERT (!screens.isEmpty ()); - QScreen *screen = screens.first (); - Q_CHECK_PTR (screen); - WId desktopId = QApplication::desktop ()->winId (); - QPixmap pixmap = screen->grabWindow (desktopId); - ST_ASSERT (!pixmap.isNull ()); - emit showPixmap (pixmap); + foreach (QScreen * screen, screens) { + QRect geometry = screen->availableGeometry (); + QPixmap pixmap = screen->grabWindow (0, geometry.x (), geometry.y (), + geometry.width (), geometry.height ()); + QString name = screen->name (); + if (!selections_.contains (name)) { + SelectionDialog *selection = new SelectionDialog (*dictionary_); + selection->setWindowIcon (trayIcon_->icon ()); + connect (this, SIGNAL (closeSelections ()), selection, SLOT (close ())); + connect (this, SIGNAL (settingsEdited ()), selection, SLOT (updateMenu ())); + connect (selection, SIGNAL (selected (ProcessingItem)), SIGNAL (selected (ProcessingItem))); + connect (selection, SIGNAL (selected (ProcessingItem)), SIGNAL (closeSelections ())); + connect (selection, SIGNAL (rejected ()), SIGNAL (closeSelections ())); + selections_[name] = selection; + } + SelectionDialog *selection = selections_[name]; + selection->setPixmap (pixmap, geometry); + } } void Manager::settings () { diff --git a/Manager.h b/Manager.h index 4f4eba0..d105e69 100644 --- a/Manager.h +++ b/Manager.h @@ -3,6 +3,7 @@ #include #include +#include #include "ProcessingItem.h" @@ -21,7 +22,8 @@ class Manager : public QObject { ~Manager (); signals: - void showPixmap (QPixmap pixmap); + void selected (ProcessingItem item); + void closeSelections (); void settingsEdited (); private slots: @@ -46,7 +48,8 @@ class Manager : public QObject { private: QSystemTrayIcon *trayIcon_; LanguageHelper *dictionary_; - SelectionDialog *selection_; + //! Selection dialogs for each screen. Key - screen name. + QMap selections_; ResultDialog *resultDialog_; QAction *captureAction_; QAction *repeatAction_; diff --git a/SelectionDialog.cpp b/SelectionDialog.cpp index 58b7e81..4705bf2 100644 --- a/SelectionDialog.cpp +++ b/SelectionDialog.cpp @@ -120,20 +120,20 @@ bool SelectionDialog::eventFilter (QObject *object, QEvent *event) { ST_ASSERT (!item.sourceLanguage.isEmpty ()); } emit selected (item); - accept (); } } } return QDialog::eventFilter (object, event); } -void SelectionDialog::setPixmap (QPixmap pixmap) { +void SelectionDialog::setPixmap (QPixmap pixmap, const QRect &showGeometry) { ST_ASSERT (!pixmap.isNull ()); + ST_ASSERT (!showGeometry.isEmpty ()); currentPixmap_ = pixmap; QPalette palette = this->palette (); palette.setBrush (this->backgroundRole (), pixmap); this->setPalette (palette); - this->resize (pixmap.size ()); + this->setGeometry (showGeometry); show (); setFocus (); diff --git a/SelectionDialog.h b/SelectionDialog.h index 178ff2d..1d3c814 100644 --- a/SelectionDialog.h +++ b/SelectionDialog.h @@ -23,9 +23,11 @@ class SelectionDialog : public QDialog { signals: void selected (ProcessingItem pixmap); + void nothingSelected (); public slots: - void setPixmap (QPixmap pixmap); + //! Show pixmap with given geometry. + void setPixmap (QPixmap pixmap, const QRect &showGeometry); void updateMenu (); private: From bd6b417cd88097c632cb1eeea74c7e9f60deee24 Mon Sep 17 00:00:00 2001 From: Gres Date: Mon, 28 Sep 2015 22:12:38 +0300 Subject: [PATCH 09/89] Check for available memory on linux too. --- ImageProcessing.cpp | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/ImageProcessing.cpp b/ImageProcessing.cpp index cc2da6a..c69383e 100644 --- a/ImageProcessing.cpp +++ b/ImageProcessing.cpp @@ -7,7 +7,22 @@ #include "ImageProcessing.h" #include "StAssert.h" -#ifdef WIN32 +#if defined(Q_OS_LINUX) +# include +# include +qint64 getFreeMemory () { + std::string token; + std::ifstream file ("/proc/meminfo"); + qint64 freeMem = 0; + while (file >> token) { + if (token == "MemFree:" || token == "Buffers:" || token == "Cached:") { + unsigned long mem = 0; + freeMem += (file >> mem) ? mem : 0; + } + } + return freeMem * 1024; +} +#elif defined(Q_OS_WIN) # include qint64 getFreeMemory () { MEMORYSTATUSEX statex; @@ -128,16 +143,17 @@ Pix * prepareImage (const QImage &image, int preferredScale) { float scaleY = std::min (float (preferredScale), maxScaleY); float scale = std::min (scaleX, scaleY); -#ifdef WIN32 qint64 availableMemory = getFreeMemory () * 0.95; - qint32 actualSize = gray->w * gray->h * gray->d / 8; - float maxScaleMemory = float (availableMemory) / actualSize; - scale = std::min (scale, maxScaleMemory); -#endif - + if (availableMemory > 0) { + qint32 actualSize = gray->w * gray->h * gray->d / 8; + float maxScaleMemory = float (availableMemory) / actualSize; + scale = std::min (scale, maxScaleMemory); + } scaled = pixScale (gray, scale, scale); + if (scaled == NULL) { + scaled = gray; + } } - ST_ASSERT (scaled != NULL); if (scaled != gray) { pixDestroy (&gray); } From aa705b0ef5dcba85a914c3cffcf72179c864fd7c Mon Sep 17 00:00:00 2001 From: Gres Date: Mon, 28 Sep 2015 22:17:24 +0300 Subject: [PATCH 10/89] More proper app termination. --- Manager.cpp | 6 ++++++ Manager.h | 2 ++ 2 files changed, 8 insertions(+) diff --git a/Manager.cpp b/Manager.cpp index 3932fc1..26af69a 100644 --- a/Manager.cpp +++ b/Manager.cpp @@ -40,6 +40,7 @@ Manager::Manager (QObject *parent) : connect (this, SIGNAL (settingsEdited ()), recognizer, SLOT (applySettings ())); QThread *recognizerThread = new QThread (this); + threads_ << recognizerThread; recognizer->moveToThread (recognizerThread); recognizerThread->start (); connect (qApp, SIGNAL (aboutToQuit ()), recognizerThread, SLOT (quit ())); @@ -54,6 +55,7 @@ Manager::Manager (QObject *parent) : connect (this, SIGNAL (settingsEdited ()), translator, SLOT (applySettings ())); QThread *translatorThread = new QThread (this); + threads_ << translatorThread; translator->moveToThread (translatorThread); translatorThread->start (); connect (qApp, SIGNAL (aboutToQuit ()), translatorThread, SLOT (quit ())); @@ -127,6 +129,10 @@ void Manager::applySettings () { } Manager::~Manager () { + foreach (QThread * thread, threads_) { + thread->quit (); + thread->wait (1000000); + } } void Manager::capture () { diff --git a/Manager.h b/Manager.h index d105e69..a27a566 100644 --- a/Manager.h +++ b/Manager.h @@ -56,6 +56,8 @@ class Manager : public QObject { QAction *clipboardAction_; ProcessingItem lastItem_; bool useResultDialog_; + //! Used threads. For proper termination. + QList threads_; }; #endif // MANAGER_H From 4887441aebe4308c6fbd4c849ebbccfc73a2a85e Mon Sep 17 00:00:00 2001 From: Gres Date: Mon, 28 Sep 2015 22:57:51 +0300 Subject: [PATCH 11/89] Simplified applySettings method. --- Manager.cpp | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/Manager.cpp b/Manager.cpp index 26af69a..54ab28c 100644 --- a/Manager.cpp +++ b/Manager.cpp @@ -97,35 +97,31 @@ void Manager::setActionsEnabled (bool isEnabled) { } void Manager::applySettings () { +#define GET(NAME) settings.value (settings_names::NAME, settings_values::NAME) QSettings settings; settings.beginGroup (settings_names::guiGroup); - QString captureHotkey = settings.value (settings_names::captureHotkey, - settings_values::captureHotkey).toString (); + Q_CHECK_PTR (captureAction_); GlobalActionHelper::removeGlobal (captureAction_); - captureAction_->setShortcut (captureHotkey); + captureAction_->setShortcut (GET (captureHotkey).toString ()); GlobalActionHelper::makeGlobal (captureAction_); - QString repeatHotkey = settings.value (settings_names::repeatHotkey, - settings_values::repeatHotkey).toString (); Q_CHECK_PTR (repeatAction_); GlobalActionHelper::removeGlobal (repeatAction_); - repeatAction_->setShortcut (repeatHotkey); + repeatAction_->setShortcut (GET (repeatHotkey).toString ()); GlobalActionHelper::makeGlobal (repeatAction_); - QString clipboardHotkey = settings.value (settings_names::clipboardHotkey, - settings_values::clipboardHotkey).toString (); Q_CHECK_PTR (clipboardAction_); GlobalActionHelper::removeGlobal (clipboardAction_); - clipboardAction_->setShortcut (clipboardHotkey); + clipboardAction_->setShortcut (GET (clipboardHotkey).toString ()); GlobalActionHelper::makeGlobal (clipboardAction_); // Depends on SettingsEditor button indexes. 1==dialog - useResultDialog_ = settings.value (settings_names::resultShowType, - settings_values::resultShowType).toBool (); + useResultDialog_ = GET (resultShowType).toBool (); Q_CHECK_PTR (dictionary_); dictionary_->updateAvailableOcrLanguages (); +#undef GET } Manager::~Manager () { From 0fa1a6a1fc99ee0814976d0b7cbe66add7732991 Mon Sep 17 00:00:00 2001 From: Gres Date: Mon, 28 Sep 2015 23:17:56 +0300 Subject: [PATCH 12/89] Proper result show if taskbar is on top/left side of desktop. --- SelectionDialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SelectionDialog.cpp b/SelectionDialog.cpp index 4705bf2..5c0b96d 100644 --- a/SelectionDialog.cpp +++ b/SelectionDialog.cpp @@ -105,7 +105,7 @@ bool SelectionDialog::eventFilter (QObject *object, QEvent *event) { if (!selectedPixmap.isNull ()) { ProcessingItem item; item.source = selectedPixmap; - item.screenPos = selection.topLeft (); + item.screenPos = pos () + selection.topLeft (); if (mouseEvent->button () == Qt::RightButton && !languageMenu_->children ().isEmpty ()) { From 097405038b061d273778e3e0b26025d7f2ccdbc8 Mon Sep 17 00:00:00 2001 From: Gres Date: Mon, 28 Sep 2015 23:24:08 +0300 Subject: [PATCH 13/89] Code simplify. --- ResultDialog.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/ResultDialog.cpp b/ResultDialog.cpp index dbb1343..479263c 100644 --- a/ResultDialog.cpp +++ b/ResultDialog.cpp @@ -28,11 +28,7 @@ bool ResultDialog::eventFilter (QObject *object, QEvent *event) { } void ResultDialog::showResult (ProcessingItem item) { - ST_ASSERT (!item.source.isNull ()); - ST_ASSERT (!item.recognized.isEmpty ()); - ST_ASSERT (!item.translated.isEmpty ()); - ST_ASSERT (!item.screenPos.isNull ()); - + ST_ASSERT (item.isValid ()); ui->sourceLabel->setPixmap (item.source); ui->recognizeLabel->setText (item.recognized); ui->translateLabel->setText (item.translated); From bf6eea7f8e8aa28e83a22a867b6485476edf9f75 Mon Sep 17 00:00:00 2001 From: Gres Date: Tue, 29 Sep 2015 15:30:04 +0300 Subject: [PATCH 14/89] Added only OCR mode (without translation). --- Manager.cpp | 25 +++++++++++++++++++++---- Manager.h | 2 ++ ProcessingItem.cpp | 1 - Settings.h | 2 ++ SettingsEditor.cpp | 2 ++ SettingsEditor.ui | 22 ++++++++++++++++------ 6 files changed, 43 insertions(+), 11 deletions(-) diff --git a/Manager.cpp b/Manager.cpp index 54ab28c..45da884 100644 --- a/Manager.cpp +++ b/Manager.cpp @@ -35,6 +35,8 @@ Manager::Manager (QObject *parent) : Recognizer *recognizer = new Recognizer; connect (this, SIGNAL (selected (ProcessingItem)), recognizer, SLOT (recognize (ProcessingItem))); + connect (recognizer, SIGNAL (recognized (ProcessingItem)), + SIGNAL (recognized (ProcessingItem))); connect (recognizer, SIGNAL (error (QString)), SLOT (showError (QString))); connect (this, SIGNAL (settingsEdited ()), @@ -48,8 +50,10 @@ Manager::Manager (QObject *parent) : // Translator Translator *translator = new Translator; - connect (recognizer, SIGNAL (recognized (ProcessingItem)), + connect (this, SIGNAL (requestTranslate (ProcessingItem)), translator, SLOT (translate (ProcessingItem))); + connect (translator, SIGNAL (translated (ProcessingItem)), + SLOT (showResult (ProcessingItem))); connect (translator, SIGNAL (error (QString)), SLOT (showError (QString))); connect (this, SIGNAL (settingsEdited ()), @@ -60,9 +64,6 @@ Manager::Manager (QObject *parent) : translatorThread->start (); connect (qApp, SIGNAL (aboutToQuit ()), translatorThread, SLOT (quit ())); - connect (translator, SIGNAL (translated (ProcessingItem)), - SLOT (showResult (ProcessingItem))); - connect (this, SIGNAL (settingsEdited ()), this, SLOT (applySettings ())); resultDialog_->setWindowIcon (trayIcon_->icon ()); @@ -118,9 +119,25 @@ void Manager::applySettings () { // Depends on SettingsEditor button indexes. 1==dialog useResultDialog_ = GET (resultShowType).toBool (); + settings.endGroup (); Q_CHECK_PTR (dictionary_); dictionary_->updateAvailableOcrLanguages (); + + settings.beginGroup (settings_names::translationGroup); + bool doTranslation = GET (doTranslation).toBool (); + if (doTranslation) { + disconnect (this, SIGNAL (recognized (ProcessingItem)), + this, SLOT (showResult (ProcessingItem))); + connect (this, SIGNAL (recognized (ProcessingItem)), + this, SIGNAL (requestTranslate (ProcessingItem)), Qt::UniqueConnection); + } + else { + disconnect (this, SIGNAL (recognized (ProcessingItem)), + this, SIGNAL (requestTranslate (ProcessingItem))); + connect (this, SIGNAL (recognized (ProcessingItem)), + this, SLOT (showResult (ProcessingItem)), Qt::UniqueConnection); + } #undef GET } diff --git a/Manager.h b/Manager.h index a27a566..84f1774 100644 --- a/Manager.h +++ b/Manager.h @@ -23,6 +23,8 @@ class Manager : public QObject { signals: void selected (ProcessingItem item); + void recognized (ProcessingItem item); + void requestTranslate (ProcessingItem item); void closeSelections (); void settingsEdited (); diff --git a/ProcessingItem.cpp b/ProcessingItem.cpp index 2729b72..c24de1d 100644 --- a/ProcessingItem.cpp +++ b/ProcessingItem.cpp @@ -5,6 +5,5 @@ bool ProcessingItem::isValid () const { valid &= (!screenPos.isNull ()); valid &= (!source.isNull ()); valid &= (!recognized.isEmpty ()); - valid &= (!translated.isEmpty ()); return valid; } diff --git a/Settings.h b/Settings.h index 8f705e0..dc056f9 100644 --- a/Settings.h +++ b/Settings.h @@ -20,6 +20,7 @@ namespace settings_names { //! Translation const QString translationGroup = "Translation"; + const QString doTranslation = "doTranslation"; const QString sourceLanguage = "source_language"; const QString translationLanguage = "translation_language"; @@ -41,6 +42,7 @@ namespace settings_values { const int imageScale = 5; //! Translation + const bool doTranslation = true; const QString sourceLanguage = "auto"; const QString translationLanguage = "ru"; } diff --git a/SettingsEditor.cpp b/SettingsEditor.cpp index 43d2775..62eca4d 100644 --- a/SettingsEditor.cpp +++ b/SettingsEditor.cpp @@ -58,6 +58,7 @@ void SettingsEditor::saveSettings () const { settings.beginGroup (translationGroup); + settings.setValue (doTranslation, ui->doTranslationCombo->isChecked ()); QString trLanguage = dictionary_.translateUiToCode (ui->translateLangCombo->currentText ()); settings.setValue (translationLanguage, trLanguage); QString sourceLanguage = dictionary_.translateForOcrCode (ocrLanguage); @@ -98,6 +99,7 @@ void SettingsEditor::loadSettings () { settings.endGroup (); settings.beginGroup (settings_names::translationGroup); + ui->doTranslationCombo->setChecked (GET (doTranslation).toBool ()); QString trLanguage = dictionary_.translateCodeToUi (GET (translationLanguage).toString ()); ui->translateLangCombo->setCurrentText (trLanguage); settings.endGroup (); diff --git a/SettingsEditor.ui b/SettingsEditor.ui index fe625b1..a494e84 100644 --- a/SettingsEditor.ui +++ b/SettingsEditor.ui @@ -6,8 +6,8 @@ 0 0 - 435 - 242 + 518 + 274 @@ -145,14 +145,14 @@ Вывод результата - + Трей - + Окно @@ -171,7 +171,17 @@ Перевод - + + + + <html><head/><body><p>Необходимо ли переводить (вкл) распознанный текст.</p></body></html> + + + Переводить текст + + + + <html><head/><body><p>Язык, на который осуществляется перевод.</p></body></html> @@ -184,7 +194,7 @@ - + From 6d571984716d51ad4dccc782273f6270e80aebaa Mon Sep 17 00:00:00 2001 From: Gres Date: Tue, 29 Sep 2015 15:37:47 +0300 Subject: [PATCH 15/89] Better support of only OCR mode (cosmetic). --- Manager.cpp | 17 ++++++++++------- ResultDialog.cpp | 3 +++ ResultDialog.ui | 26 ++++++++++++++++++++++---- 3 files changed, 35 insertions(+), 11 deletions(-) diff --git a/Manager.cpp b/Manager.cpp index 45da884..8cdd67e 100644 --- a/Manager.cpp +++ b/Manager.cpp @@ -80,10 +80,10 @@ Manager::Manager (QObject *parent) : QMenu * Manager::trayContextMenu () { QMenu *menu = new QMenu (); captureAction_ = menu->addAction (tr ("Захват"), this, SLOT (capture ())); - QMenu *translateMenu = menu->addMenu (tr ("Перевод")); - repeatAction_ = translateMenu->addAction (tr ("Повторить"), this, + QMenu *translateMenu = menu->addMenu (tr ("Результат")); + repeatAction_ = translateMenu->addAction (tr ("Показать"), this, SLOT (showLast ())); - clipboardAction_ = translateMenu->addAction (tr ("Скопировать"), this, + clipboardAction_ = translateMenu->addAction (tr ("В буфер"), this, SLOT (copyLastToClipboard ())); menu->addAction (tr ("Настройки"), this, SLOT (settings ())); menu->addAction (tr ("О программе"), this, SLOT (about ())); @@ -215,10 +215,13 @@ void Manager::showLast () { void Manager::copyLastToClipboard () { if (lastItem_.isValid ()) { QClipboard *clipboard = QApplication::clipboard (); - QString message = lastItem_.recognized + " - " + lastItem_.translated; + QString message = lastItem_.recognized; + if (!lastItem_.translated.isEmpty ()) { + message += " - " + lastItem_.translated; + } clipboard->setText (message); - trayIcon_->showMessage (tr ("Перевод"), - tr ("Последний перевод был скопирован в буфер обмена."), + trayIcon_->showMessage (tr ("Результат"), + tr ("Последний результат был скопирован в буфер обмена."), QSystemTrayIcon::Information); } } @@ -231,7 +234,7 @@ void Manager::showResult (ProcessingItem item) { } else { QString message = item.recognized + " - " + item.translated; - trayIcon_->showMessage (tr ("Перевод"), message, QSystemTrayIcon::Information); + trayIcon_->showMessage (tr ("Результат"), message, QSystemTrayIcon::Information); } } diff --git a/ResultDialog.cpp b/ResultDialog.cpp index 479263c..caeb1bc 100644 --- a/ResultDialog.cpp +++ b/ResultDialog.cpp @@ -32,6 +32,9 @@ void ResultDialog::showResult (ProcessingItem item) { ui->sourceLabel->setPixmap (item.source); ui->recognizeLabel->setText (item.recognized); ui->translateLabel->setText (item.translated); + bool gotTranslation = !item.translated.isEmpty (); + ui->translateLabel->setVisible (gotTranslation); + ui->translateLine->setVisible (gotTranslation); show (); adjustSize (); diff --git a/ResultDialog.ui b/ResultDialog.ui index 92329f9..f7c8044 100644 --- a/ResultDialog.ui +++ b/ResultDialog.ui @@ -14,7 +14,16 @@ Результат - + + 0 + + + 0 + + + 0 + + 0 @@ -29,7 +38,16 @@ QFrame::Plain - + + 0 + + + 0 + + + 0 + + 0 @@ -49,7 +67,7 @@ - + Qt::Horizontal @@ -69,7 +87,7 @@ - + Qt::Horizontal From c380d9681521bc7bb674208d1d765b47cbddb637 Mon Sep 17 00:00:00 2001 From: Gres Date: Tue, 29 Sep 2015 17:50:37 +0300 Subject: [PATCH 16/89] Ui update (tooltips and label fixes). --- SettingsEditor.ui | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/SettingsEditor.ui b/SettingsEditor.ui index a494e84..dab1918 100644 --- a/SettingsEditor.ui +++ b/SettingsEditor.ui @@ -36,10 +36,10 @@ - <html><head/><body><p>Сочетание клавиш для перехода в режим захвата.</p></body></html> + <html><head/><body><p>Сочетание клавиш для повторного отображения последнего результата.</p></body></html> - Повторить + Показать @@ -49,7 +49,7 @@ - <html><head/><body><p>Сочетание клавиш для перехода в режим захвата.</p></body></html> + <html><head/><body><p>Сочетание клавиш для копирования последнего результата в буфер обмена.</p></body></html> Скопировать @@ -71,7 +71,7 @@ - <html><head/><body><p>Необходимо для распознавания.</p><p>Скачивается отсюда: <a href="https://code.google.com/p/tesseract-ocr/downloads/list"><span style=" text-decoration: underline; color:#0000ff;">https://code.google.com/p/tesseract-ocr/downloads/list</span></a></p></body></html> + <html><head/><body><p>Необходимо для распознавания.</p><p>Скачивается отсюда: <a href="https://github.com/tesseract-ocr/tessdata"><span style=" text-decoration: underline; color:#7593bc;">https://github.com/tesseract-ocr/tessdata</span></a></p><p>&quot;./&quot; означает, что папка &quot;tessdata&quot; находится в одной директории с исполняемым файлом программы.</p></body></html> Путь к tessdata @@ -107,7 +107,7 @@ - <html><head/><body><p>Масштабирование изображения для улучшения распознания. Больше - лучше (до определенных пределов), но медленнее.</p></body></html> + <html><head/><body><p>Масштабирование изображения для улучшения распознания. Больше - лучше (до определенных пределов), но медленнее и потребляет больше памяти.</p><p>Рекомендуемые значения от 5 до 10.</p></body></html> Увеличение масштаба From dd3d92edb6a3467a2b5947613de175b2e75a846c Mon Sep 17 00:00:00 2001 From: Gres Date: Tue, 29 Sep 2015 18:11:00 +0300 Subject: [PATCH 17/89] Activate selection and result dialogs when showing. --- ResultDialog.cpp | 1 + SelectionDialog.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/ResultDialog.cpp b/ResultDialog.cpp index caeb1bc..e263a0c 100644 --- a/ResultDialog.cpp +++ b/ResultDialog.cpp @@ -57,4 +57,5 @@ void ResultDialog::showResult (ProcessingItem item) { QPoint newPos (screenRect.width () - width (), screenRect.height () - height ()); move (newPos); } + activateWindow (); } diff --git a/SelectionDialog.cpp b/SelectionDialog.cpp index 5c0b96d..96e1d4b 100644 --- a/SelectionDialog.cpp +++ b/SelectionDialog.cpp @@ -136,5 +136,5 @@ void SelectionDialog::setPixmap (QPixmap pixmap, const QRect &showGeometry) { this->setGeometry (showGeometry); show (); - setFocus (); + activateWindow (); } From 9e85af0eaf5a478270ca55633a7d00f361eb11c1 Mon Sep 17 00:00:00 2001 From: Gres Date: Tue, 29 Sep 2015 18:14:56 +0300 Subject: [PATCH 18/89] Added possibility to capture image from last used screenshot (SelectionDialog). --- Manager.cpp | 65 +++++++++++++++--- Manager.h | 4 +- Settings.h | 2 + SettingsEditor.cpp | 2 + SettingsEditor.ui | 162 ++++++++++++++++++++++----------------------- 5 files changed, 145 insertions(+), 90 deletions(-) diff --git a/Manager.cpp b/Manager.cpp index 8cdd67e..2dddab5 100644 --- a/Manager.cpp +++ b/Manager.cpp @@ -26,7 +26,8 @@ Manager::Manager (QObject *parent) : trayIcon_ (new QSystemTrayIcon (QIcon (":/images/icon.png"), this)), dictionary_ (new LanguageHelper), resultDialog_ (new ResultDialog), - captureAction_ (NULL), repeatAction_ (NULL), clipboardAction_ (NULL), + captureAction_ (NULL), repeatCaptureAction_ (NULL), + repeatAction_ (NULL), clipboardAction_ (NULL), useResultDialog_ (true) { GlobalActionHelper::init (); qRegisterMetaType(); @@ -72,6 +73,7 @@ Manager::Manager (QObject *parent) : SLOT (processTrayAction (QSystemTrayIcon::ActivationReason))); trayIcon_->setContextMenu (trayContextMenu ()); + updateActionsState (); trayIcon_->show (); applySettings (); @@ -80,6 +82,8 @@ Manager::Manager (QObject *parent) : QMenu * Manager::trayContextMenu () { QMenu *menu = new QMenu (); captureAction_ = menu->addAction (tr ("Захват"), this, SLOT (capture ())); + repeatCaptureAction_ = menu->addAction (tr ("Повторить захват"), + this, SLOT (repeatCapture ())); QMenu *translateMenu = menu->addMenu (tr ("Результат")); repeatAction_ = translateMenu->addAction (tr ("Показать"), this, SLOT (showLast ())); @@ -91,10 +95,29 @@ QMenu * Manager::trayContextMenu () { return menu; } -void Manager::setActionsEnabled (bool isEnabled) { +void Manager::updateActionsState (bool isEnabled) { +#ifdef Q_OS_LINUX + // Avoid unneeded tray blinking (required to update context menu). + QList actions; + actions << captureAction_ << repeatCaptureAction_ << repeatAction_ << clipboardAction_; + QList states; + foreach (const QAction * action, actions) { + states << action->isEnabled (); + } +#endif captureAction_->setEnabled (isEnabled); - repeatAction_->setEnabled (isEnabled); - clipboardAction_->setEnabled (isEnabled); + repeatCaptureAction_->setEnabled (isEnabled && !selections_.isEmpty ()); + repeatAction_->setEnabled (isEnabled && lastItem_.isValid ()); + clipboardAction_->setEnabled (isEnabled && lastItem_.isValid ()); +#ifdef Q_OS_LINUX + for (int i = 0, end = actions.size (); i < end; ++i) { + if (states.at (i) != actions.at (i)->isEnabled ()) { + trayIcon_->hide (); + trayIcon_->show (); + break; + } + } +#endif } void Manager::applySettings () { @@ -107,6 +130,11 @@ void Manager::applySettings () { captureAction_->setShortcut (GET (captureHotkey).toString ()); GlobalActionHelper::makeGlobal (captureAction_); + Q_CHECK_PTR (repeatCaptureAction_); + GlobalActionHelper::removeGlobal (repeatCaptureAction_); + repeatCaptureAction_->setShortcut (GET (repeatCaptureHotkey).toString ()); + GlobalActionHelper::makeGlobal (repeatCaptureAction_); + Q_CHECK_PTR (repeatAction_); GlobalActionHelper::removeGlobal (repeatAction_); repeatAction_->setShortcut (GET (repeatHotkey).toString ()); @@ -168,15 +196,32 @@ void Manager::capture () { SelectionDialog *selection = selections_[name]; selection->setPixmap (pixmap, geometry); } + updateActionsState (); +} + +void Manager::repeatCapture () { + if (selections_.isEmpty ()) { + return; + } + QList screens = QApplication::screens (); + foreach (QScreen * screen, screens) { + QString name = screen->name (); + if (!selections_.contains (name)) { + continue; + } + SelectionDialog *selection = selections_[name]; + selection->show (); + selection->activateWindow (); + } } void Manager::settings () { SettingsEditor editor (*dictionary_); editor.setWindowIcon (trayIcon_->icon ()); connect (&editor, SIGNAL (settingsEdited ()), SIGNAL (settingsEdited ())); - setActionsEnabled (false); + updateActionsState (false); editor.exec (); - setActionsEnabled (true); + updateActionsState (true); } void Manager::close () { @@ -198,12 +243,15 @@ void Manager::about () { } void Manager::processTrayAction (QSystemTrayIcon::ActivationReason reason) { - if (reason == QSystemTrayIcon::Trigger) { + if (reason == QSystemTrayIcon::Trigger && repeatAction_->isEnabled ()) { showLast (); } - else if (reason == QSystemTrayIcon::MiddleClick) { + else if (reason == QSystemTrayIcon::MiddleClick && clipboardAction_->isEnabled ()) { copyLastToClipboard (); } + else if (reason == QSystemTrayIcon::DoubleClick && repeatCaptureAction_->isEnabled ()) { + repeatCapture (); + } } void Manager::showLast () { @@ -236,6 +284,7 @@ void Manager::showResult (ProcessingItem item) { QString message = item.recognized + " - " + item.translated; trayIcon_->showMessage (tr ("Результат"), message, QSystemTrayIcon::Information); } + updateActionsState (); } void Manager::showError (QString text) { diff --git a/Manager.h b/Manager.h index 84f1774..be0ba46 100644 --- a/Manager.h +++ b/Manager.h @@ -30,6 +30,7 @@ class Manager : public QObject { private slots: void capture (); + void repeatCapture (); void settings (); void close (); void about (); @@ -45,7 +46,7 @@ class Manager : public QObject { private: QMenu * trayContextMenu (); - void setActionsEnabled (bool isEnabled); + void updateActionsState (bool isEnabled = true); private: QSystemTrayIcon *trayIcon_; @@ -54,6 +55,7 @@ class Manager : public QObject { QMap selections_; ResultDialog *resultDialog_; QAction *captureAction_; + QAction *repeatCaptureAction_; QAction *repeatAction_; QAction *clipboardAction_; ProcessingItem lastItem_; diff --git a/Settings.h b/Settings.h index dc056f9..b7cf46f 100644 --- a/Settings.h +++ b/Settings.h @@ -8,6 +8,7 @@ namespace settings_names { const QString guiGroup = "GUI"; const QString geometry = "geometry"; const QString captureHotkey = "captureHotkey"; + const QString repeatCaptureHotkey = "repeatCaptureHotkey"; const QString repeatHotkey = "repeatHotkey"; const QString clipboardHotkey = "clipboardHotkey"; const QString resultShowType = "resultShowType"; @@ -32,6 +33,7 @@ namespace settings_values { //! UI const QString captureHotkey = "Ctrl+Alt+Z"; + const QString repeatCaptureHotkey = "Ctrl+Alt+S"; const QString repeatHotkey = "Ctrl+Alt+X"; const QString clipboardHotkey = "Ctrl+Alt+C"; const QString resultShowType = "1";//dialog diff --git a/SettingsEditor.cpp b/SettingsEditor.cpp index 62eca4d..5c3c89c 100644 --- a/SettingsEditor.cpp +++ b/SettingsEditor.cpp @@ -43,6 +43,7 @@ void SettingsEditor::saveSettings () const { QSettings settings; settings.beginGroup (guiGroup); settings.setValue (captureHotkey, ui->captureEdit->keySequence ().toString ()); + settings.setValue (repeatCaptureHotkey, ui->repeatCaptureEdit->keySequence ().toString ()); settings.setValue (repeatHotkey, ui->repeatEdit->keySequence ().toString ()); settings.setValue (clipboardHotkey, ui->clipboardEdit->keySequence ().toString ()); settings.setValue (resultShowType, buttonGroup_->checkedId ()); @@ -84,6 +85,7 @@ void SettingsEditor::loadSettings () { settings.beginGroup (settings_names::guiGroup); ui->captureEdit->setKeySequence (QKeySequence (GET (captureHotkey).toString ())); + ui->repeatCaptureEdit->setKeySequence (QKeySequence (GET (repeatCaptureHotkey).toString ())); ui->repeatEdit->setKeySequence (QKeySequence (GET (repeatHotkey).toString ())); ui->clipboardEdit->setKeySequence (QKeySequence (GET (clipboardHotkey).toString ())); QAbstractButton *button = buttonGroup_->button (GET (resultShowType).toInt ()); diff --git a/SettingsEditor.ui b/SettingsEditor.ui index dab1918..4db4394 100644 --- a/SettingsEditor.ui +++ b/SettingsEditor.ui @@ -6,61 +6,26 @@ 0 0 - 518 - 274 + 603 + 269 Настройки - - - - Горячие клавиши + + + + Qt::Vertical - - - - - <html><head/><body><p>Сочетание клавиш для перехода в режим захвата.</p></body></html> - - - Захватить - - - - - - - - - - <html><head/><body><p>Сочетание клавиш для повторного отображения последнего результата.</p></body></html> - - - Показать - - - - - - - - - - <html><head/><body><p>Сочетание клавиш для копирования последнего результата в буфер обмена.</p></body></html> - - - Скопировать - - - - - - - - + + + 20 + 1 + + + @@ -126,20 +91,17 @@ - - + + Qt::Horizontal - - - 0 - 20 - + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok - + - + Вывод результата @@ -165,7 +127,68 @@ - + + + + Горячие клавиши + + + + + + <html><head/><body><p>Сочетание клавиш для перехода в режим захвата.</p></body></html> + + + Захватить + + + + + + + + + + <html><head/><body><p>Сочетание клавиш для перехода в режим захвата, но с использованием последнего использованного, а не текущего, изображения.</p></body></html> + + + Захватить повторно + + + + + + + + + + <html><head/><body><p>Сочетание клавиш для повторного отображения последнего результата.</p></body></html> + + + Показать + + + + + + + + + + <html><head/><body><p>Сочетание клавиш для копирования последнего результата в буфер обмена.</p></body></html> + + + Скопировать + + + + + + + + + + Перевод @@ -200,29 +223,6 @@ - - - - Qt::Vertical - - - - 20 - 1 - - - - - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - From 3109444805d61f838b9b2375bef2398b2708e4c6 Mon Sep 17 00:00:00 2001 From: Gres Date: Tue, 29 Sep 2015 19:21:38 +0300 Subject: [PATCH 19/89] Added dependencies preparation scripts. --- .gitignore | 4 +++- 3rd-party/deps/get_deps.sh | 6 ++++++ 3rd-party/deps/make_deps.sh | 38 +++++++++++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+), 1 deletion(-) create mode 100755 3rd-party/deps/get_deps.sh create mode 100755 3rd-party/deps/make_deps.sh diff --git a/.gitignore b/.gitignore index a6f318a..571c6b0 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,6 @@ *.user *.exe -distr/content/ \ No newline at end of file +distr/content/ + +*.tar.gz diff --git a/3rd-party/deps/get_deps.sh b/3rd-party/deps/get_deps.sh new file mode 100755 index 0000000..09a64e0 --- /dev/null +++ b/3rd-party/deps/get_deps.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +wget -O leptonica.tar.gz http://www.leptonica.com/source/leptonica-1.72.tar.gz +wget -O tesseract.tar.gz https://github.com/tesseract-ocr/tesseract/archive/3.04.00.tar.gz +wget -O tessdata.tar.gz https://github.com/tesseract-ocr/tessdata/archive/3.04.00.tar.gz + diff --git a/3rd-party/deps/make_deps.sh b/3rd-party/deps/make_deps.sh new file mode 100755 index 0000000..9c72a5e --- /dev/null +++ b/3rd-party/deps/make_deps.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +WORK_DIR=linux + +#WORK_DIR=mingw +#HOST=i686-w64-mingw32 +#export PATH="/opt/mingw-4.9.3/mingw-w64-i686/bin:$PATH" + +#rm -rf $WORK_DIR +mkdir $WORK_DIR 2> /dev/null +set -e + +WORK_DIR=`realpath $WORK_DIR` +if [ ! -z "$HOST" ]; then HOST_ATTR="--host=$HOST"; fi + +echo "Building Leptonica" +tar zxf leptonica.tar.gz -C $WORK_DIR +LEPT_DIR=`ls $WORK_DIR | grep lept` +cd $WORK_DIR/$LEPT_DIR +./configure --prefix=$WORK_DIR --disable-programs $HOST_ATTR +make -j4 +make install +cd ../.. + +echo "Building Tesseract" +tar zxf tesseract.tar.gz -C $WORK_DIR +TESS_DIR=`ls $WORK_DIR | grep tess` +cd $WORK_DIR/$TESS_DIR +sed 's/vs2008/vs2010/g' -i ccutil/Makefile.in +sed 's/Windows\.h/windows\.h/g' -i opencl/openclwrapper.cpp +LIBLEPT_HEADERSDIR=$WORK_DIR/include LIBS=-L$WORK_DIR/lib ./configure --prefix=$WORK_DIR --disable-tessdata-prefix $HOST_ATTR +make -j4 +make install +cd ../.. + +find -name '*.dll' -exec cp {} $WORK_DIR/lib \; + +echo "Done" From 4c51e264b5251c89500e89787a5eb671f36a4187 Mon Sep 17 00:00:00 2001 From: Gres Date: Wed, 30 Sep 2015 19:48:21 +0300 Subject: [PATCH 20/89] Ignore small selection (less 3x3). --- SelectionDialog.cpp | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/SelectionDialog.cpp b/SelectionDialog.cpp index 96e1d4b..f2b04ad 100644 --- a/SelectionDialog.cpp +++ b/SelectionDialog.cpp @@ -102,25 +102,27 @@ bool SelectionDialog::eventFilter (QObject *object, QEvent *event) { QPoint endPos = mouseEvent->pos (); QRect selection = QRect (startSelectPos_, endPos).normalized (); QPixmap selectedPixmap = currentPixmap_.copy (selection); - if (!selectedPixmap.isNull ()) { - ProcessingItem item; - item.source = selectedPixmap; - item.screenPos = pos () + selection.topLeft (); - - if (mouseEvent->button () == Qt::RightButton && - !languageMenu_->children ().isEmpty ()) { - QAction *action = languageMenu_->exec (QCursor::pos ()); - if (action == NULL) { - reject (); - return QDialog::eventFilter (object, event); - } - item.ocrLanguage = dictionary_.ocrUiToCode (action->text ()); - ST_ASSERT (!item.ocrLanguage.isEmpty ()); - item.sourceLanguage = dictionary_.translateForOcrCode (item.ocrLanguage); - ST_ASSERT (!item.sourceLanguage.isEmpty ()); - } - emit selected (item); + if (selectedPixmap.width () < 3 || selectedPixmap.height () < 3) { + reject (); + return QDialog::eventFilter (object, event); } + ProcessingItem item; + item.source = selectedPixmap; + item.screenPos = pos () + selection.topLeft (); + + if (mouseEvent->button () == Qt::RightButton && + !languageMenu_->children ().isEmpty ()) { + QAction *action = languageMenu_->exec (QCursor::pos ()); + if (action == NULL) { + reject (); + return QDialog::eventFilter (object, event); + } + item.ocrLanguage = dictionary_.ocrUiToCode (action->text ()); + ST_ASSERT (!item.ocrLanguage.isEmpty ()); + item.sourceLanguage = dictionary_.translateForOcrCode (item.ocrLanguage); + ST_ASSERT (!item.sourceLanguage.isEmpty ()); + } + emit selected (item); } } return QDialog::eventFilter (object, event); From fb1d25f91416912ba191bbb061cfc01243ecd4b5 Mon Sep 17 00:00:00 2001 From: Gres Date: Wed, 30 Sep 2015 19:49:10 +0300 Subject: [PATCH 21/89] Added possibility to select image several times without closing SelectionDialog. --- Manager.cpp | 13 ++++++++++--- Manager.h | 3 ++- ProcessingItem.h | 2 ++ ResultDialog.cpp | 5 +++-- ScreenTranslator.pro | 5 +++-- SelectionDialog.cpp | 4 +++- 6 files changed, 23 insertions(+), 9 deletions(-) diff --git a/Manager.cpp b/Manager.cpp index 2dddab5..ecbbfec 100644 --- a/Manager.cpp +++ b/Manager.cpp @@ -34,7 +34,7 @@ Manager::Manager (QObject *parent) : // Recognizer Recognizer *recognizer = new Recognizer; - connect (this, SIGNAL (selected (ProcessingItem)), + connect (this, SIGNAL (requestRecognize (ProcessingItem)), recognizer, SLOT (recognize (ProcessingItem))); connect (recognizer, SIGNAL (recognized (ProcessingItem)), SIGNAL (recognized (ProcessingItem))); @@ -188,8 +188,8 @@ void Manager::capture () { selection->setWindowIcon (trayIcon_->icon ()); connect (this, SIGNAL (closeSelections ()), selection, SLOT (close ())); connect (this, SIGNAL (settingsEdited ()), selection, SLOT (updateMenu ())); - connect (selection, SIGNAL (selected (ProcessingItem)), SIGNAL (selected (ProcessingItem))); - connect (selection, SIGNAL (selected (ProcessingItem)), SIGNAL (closeSelections ())); + connect (selection, SIGNAL (selected (ProcessingItem)), + SLOT (handleSelection (ProcessingItem))); connect (selection, SIGNAL (rejected ()), SIGNAL (closeSelections ())); selections_[name] = selection; } @@ -199,6 +199,13 @@ void Manager::capture () { updateActionsState (); } +void Manager::handleSelection (ProcessingItem item) { + emit requestRecognize (item); + if (!(item.modifiers & Qt::ControlModifier)) { + emit closeSelections (); + } +} + void Manager::repeatCapture () { if (selections_.isEmpty ()) { return; diff --git a/Manager.h b/Manager.h index be0ba46..ba06f6d 100644 --- a/Manager.h +++ b/Manager.h @@ -22,7 +22,7 @@ class Manager : public QObject { ~Manager (); signals: - void selected (ProcessingItem item); + void requestRecognize (ProcessingItem item); void recognized (ProcessingItem item); void requestTranslate (ProcessingItem item); void closeSelections (); @@ -41,6 +41,7 @@ class Manager : public QObject { void processTrayAction (QSystemTrayIcon::ActivationReason reason); + void handleSelection (ProcessingItem item); void showResult (ProcessingItem item); void showError (QString text); diff --git a/ProcessingItem.h b/ProcessingItem.h index 914673c..7d6ca8c 100644 --- a/ProcessingItem.h +++ b/ProcessingItem.h @@ -12,6 +12,8 @@ struct ProcessingItem { QString ocrLanguage; QString sourceLanguage; + Qt::KeyboardModifiers modifiers; + bool isValid () const; }; Q_DECLARE_METATYPE (ProcessingItem) diff --git a/ResultDialog.cpp b/ResultDialog.cpp index e263a0c..85c615f 100644 --- a/ResultDialog.cpp +++ b/ResultDialog.cpp @@ -10,7 +10,7 @@ ResultDialog::ResultDialog (QWidget *parent) : isShowAtCapturePos_ (true) { ui->setupUi (this); setWindowFlags (Qt::FramelessWindowHint | Qt::NoDropShadowWindowHint | - Qt::WindowStaysOnTopHint); + Qt::WindowStaysOnTopHint | Qt::X11BypassWindowManagerHint); installEventFilter (this); } @@ -21,7 +21,8 @@ ResultDialog::~ResultDialog () { bool ResultDialog::eventFilter (QObject *object, QEvent *event) { Q_UNUSED (object); - if (event->type () == QEvent::MouseButtonRelease) { + if (event->type () == QEvent::MouseButtonRelease || + event->type () == QEvent::WindowDeactivate) { hide (); } return QDialog::eventFilter (object, event); diff --git a/ScreenTranslator.pro b/ScreenTranslator.pro index 2ad6709..8af33c0 100644 --- a/ScreenTranslator.pro +++ b/ScreenTranslator.pro @@ -19,7 +19,7 @@ win32{ linux{ QT += x11extras INCLUDEPATH += ../linux/include - LIBS += -L../linux/lib -lX11 + LIBS += -L../linux/lib -lX11 -Wl,-rpath,. } LIBS += -ltesseract -llept @@ -70,4 +70,5 @@ OTHER_FILES += \ app.rc \ images/icon.ico \ README.md \ - uncrustify.cfg + uncrustify.cfg\ + TODO.md diff --git a/SelectionDialog.cpp b/SelectionDialog.cpp index f2b04ad..3bbc9e8 100644 --- a/SelectionDialog.cpp +++ b/SelectionDialog.cpp @@ -14,7 +14,7 @@ SelectionDialog::SelectionDialog (const LanguageHelper &dictionary, QWidget *par languageMenu_ (new QMenu) { ui->setupUi (this); setWindowFlags (Qt::FramelessWindowHint | Qt::NoDropShadowWindowHint | - Qt::WindowStaysOnTopHint); + Qt::WindowStaysOnTopHint | Qt::X11BypassWindowManagerHint); ui->label->setAutoFillBackground (false); ui->label->installEventFilter (this); @@ -101,6 +101,7 @@ bool SelectionDialog::eventFilter (QObject *object, QEvent *event) { } QPoint endPos = mouseEvent->pos (); QRect selection = QRect (startSelectPos_, endPos).normalized (); + startSelectPos_ = currentSelectPos_ = QPoint (); QPixmap selectedPixmap = currentPixmap_.copy (selection); if (selectedPixmap.width () < 3 || selectedPixmap.height () < 3) { reject (); @@ -109,6 +110,7 @@ bool SelectionDialog::eventFilter (QObject *object, QEvent *event) { ProcessingItem item; item.source = selectedPixmap; item.screenPos = pos () + selection.topLeft (); + item.modifiers = mouseEvent->modifiers (); if (mouseEvent->button () == Qt::RightButton && !languageMenu_->children ().isEmpty ()) { From 5b166cba4cac3e8c439d0acf38eb1a060b302dd5 Mon Sep 17 00:00:00 2001 From: Gres Date: Wed, 30 Sep 2015 20:20:33 +0300 Subject: [PATCH 22/89] Update languages menu moved to LanguageHelper from SelectionDialog. --- LanguageHelper.cpp | 33 +++++++++++++++++++++++++++++++++ LanguageHelper.h | 4 ++++ Manager.cpp | 2 +- SelectionDialog.cpp | 37 +++---------------------------------- SelectionDialog.h | 2 +- 5 files changed, 42 insertions(+), 36 deletions(-) diff --git a/LanguageHelper.cpp b/LanguageHelper.cpp index fac4813..0f55977 100644 --- a/LanguageHelper.cpp +++ b/LanguageHelper.cpp @@ -3,6 +3,7 @@ #include "LanguageHelper.h" #include "Settings.h" +#include "StAssert.h" LanguageHelper::LanguageHelper () { init (); @@ -95,6 +96,38 @@ void LanguageHelper::updateAvailableOcrLanguages () { availableOcrLanguages_ = availableOcrLanguages (tessDataPlace); } +void LanguageHelper::updateMenu (QMenu *menu, const QStringList &languages, int groupSize) const { + ST_ASSERT (menu != NULL); + menu->clear (); + if (languages.isEmpty ()) { + return; + } + + if (languages.size () <= groupSize) { + foreach (const QString &language, languages) { + menu->addAction (language); + } + } + else { + int subIndex = groupSize; + QMenu *subMenu = NULL; + QString prevLetter; + foreach (const QString &language, languages) { + QString curLetter = language.left (1); + if (++subIndex >= groupSize && prevLetter != curLetter) { + if (subMenu != NULL) { + subMenu->setTitle (subMenu->title () + " - " + prevLetter); + } + subMenu = menu->addMenu (curLetter); + subIndex = 0; + } + prevLetter = curLetter; + subMenu->addAction (language); + } + subMenu->setTitle (subMenu->title () + " - " + prevLetter); + } +} + void LanguageHelper::initTranslateLanguages () { translateLanguages_.insert (QObject::tr ("Afrikaans"),"af"); translateLanguages_.insert (QObject::tr ("Albanian"),"sq"); diff --git a/LanguageHelper.h b/LanguageHelper.h index c602e59..be8d7f7 100644 --- a/LanguageHelper.h +++ b/LanguageHelper.h @@ -3,6 +3,7 @@ #include #include +#include class LanguageHelper { public: @@ -22,6 +23,9 @@ class LanguageHelper { void updateAvailableOcrLanguages (); + //! Update languages menu. Group items into submenus if needed. + void updateMenu (QMenu *menu, const QStringList &languages, int groupSize = 10) const; + private: QStringList availableOcrLanguages (const QString &path) const; void init (); diff --git a/Manager.cpp b/Manager.cpp index ecbbfec..8ca61bb 100644 --- a/Manager.cpp +++ b/Manager.cpp @@ -187,7 +187,7 @@ void Manager::capture () { SelectionDialog *selection = new SelectionDialog (*dictionary_); selection->setWindowIcon (trayIcon_->icon ()); connect (this, SIGNAL (closeSelections ()), selection, SLOT (close ())); - connect (this, SIGNAL (settingsEdited ()), selection, SLOT (updateMenu ())); + connect (this, SIGNAL (settingsEdited ()), selection, SLOT (applySettings ())); connect (selection, SIGNAL (selected (ProcessingItem)), SLOT (handleSelection (ProcessingItem))); connect (selection, SIGNAL (rejected ()), SIGNAL (closeSelections ())); diff --git a/SelectionDialog.cpp b/SelectionDialog.cpp index 3bbc9e8..ec63fce 100644 --- a/SelectionDialog.cpp +++ b/SelectionDialog.cpp @@ -19,46 +19,15 @@ SelectionDialog::SelectionDialog (const LanguageHelper &dictionary, QWidget *par ui->label->setAutoFillBackground (false); ui->label->installEventFilter (this); - updateMenu (); + applySettings (); } SelectionDialog::~SelectionDialog () { delete ui; } -void SelectionDialog::updateMenu () { - Q_CHECK_PTR (languageMenu_); - languageMenu_->clear (); - QStringList languages = dictionary_.availableOcrLanguagesUi (); - if (languages.isEmpty ()) { - return; - } - - const int max = 10; - - if (languages.size () <= max) { - foreach (const QString &language, languages) { - languageMenu_->addAction (language); - } - } - else { - int subIndex = max; - QMenu *subMenu = NULL; - QString prevLetter; - foreach (const QString &language, languages) { - QString curLetter = language.left (1); - if (++subIndex >= max && prevLetter != curLetter) { - if (subMenu != NULL) { - subMenu->setTitle (subMenu->title () + " - " + prevLetter); - } - subMenu = languageMenu_->addMenu (curLetter); - subIndex = 0; - } - prevLetter = curLetter; - subMenu->addAction (language); - } - subMenu->setTitle (subMenu->title () + " - " + prevLetter); - } +void SelectionDialog::applySettings () { + dictionary_.updateMenu (languageMenu_, dictionary_.availableOcrLanguagesUi ()); } bool SelectionDialog::eventFilter (QObject *object, QEvent *event) { diff --git a/SelectionDialog.h b/SelectionDialog.h index 1d3c814..58dda6c 100644 --- a/SelectionDialog.h +++ b/SelectionDialog.h @@ -28,7 +28,7 @@ class SelectionDialog : public QDialog { public slots: //! Show pixmap with given geometry. void setPixmap (QPixmap pixmap, const QRect &showGeometry); - void updateMenu (); + void applySettings (); private: Ui::SelectionDialog *ui; From 1f5d6c73bd28dd7080254cce4b8ca3126b39c1ff Mon Sep 17 00:00:00 2001 From: Gres Date: Wed, 30 Sep 2015 20:38:55 +0300 Subject: [PATCH 23/89] Added ability to repeat image recognition with another OCR language from ResultDialog. --- Manager.cpp | 6 +++++- ResultDialog.cpp | 38 ++++++++++++++++++++++++++++++++++---- ResultDialog.h | 15 ++++++++++++++- 3 files changed, 53 insertions(+), 6 deletions(-) diff --git a/Manager.cpp b/Manager.cpp index 8ca61bb..9c0ffb5 100644 --- a/Manager.cpp +++ b/Manager.cpp @@ -25,7 +25,7 @@ Manager::Manager (QObject *parent) : QObject (parent), trayIcon_ (new QSystemTrayIcon (QIcon (":/images/icon.png"), this)), dictionary_ (new LanguageHelper), - resultDialog_ (new ResultDialog), + resultDialog_ (new ResultDialog (*dictionary_)), captureAction_ (NULL), repeatCaptureAction_ (NULL), repeatAction_ (NULL), clipboardAction_ (NULL), useResultDialog_ (true) { @@ -66,7 +66,11 @@ Manager::Manager (QObject *parent) : connect (qApp, SIGNAL (aboutToQuit ()), translatorThread, SLOT (quit ())); connect (this, SIGNAL (settingsEdited ()), this, SLOT (applySettings ())); + resultDialog_->setWindowIcon (trayIcon_->icon ()); + connect (this, SIGNAL (settingsEdited ()), resultDialog_, SLOT (applySettings ())); + connect (resultDialog_, SIGNAL (requestRecognize (ProcessingItem)), + this, SIGNAL (requestRecognize (ProcessingItem))); connect (trayIcon_, SIGNAL (activated (QSystemTrayIcon::ActivationReason)), diff --git a/ResultDialog.cpp b/ResultDialog.cpp index 85c615f..8550037 100644 --- a/ResultDialog.cpp +++ b/ResultDialog.cpp @@ -1,28 +1,57 @@ #include "ResultDialog.h" #include "ui_ResultDialog.h" #include "StAssert.h" +#include "LanguageHelper.h" #include +#include +#include -ResultDialog::ResultDialog (QWidget *parent) : +ResultDialog::ResultDialog (const LanguageHelper &dictionary, QWidget *parent) : QDialog (parent), ui (new Ui::ResultDialog), - isShowAtCapturePos_ (true) { + dictionary_ (dictionary), isShowAtCapturePos_ (true), + contextMenu_ (NULL), recognizeSubMenu_ (NULL) { ui->setupUi (this); setWindowFlags (Qt::FramelessWindowHint | Qt::NoDropShadowWindowHint | Qt::WindowStaysOnTopHint | Qt::X11BypassWindowManagerHint); installEventFilter (this); + createContextMenu (); + applySettings (); } ResultDialog::~ResultDialog () { + delete contextMenu_; delete ui; } +void ResultDialog::applySettings () { + dictionary_.updateMenu (recognizeSubMenu_, dictionary_.availableOcrLanguagesUi ()); +} + +void ResultDialog::createContextMenu () { + contextMenu_ = new QMenu (); + recognizeSubMenu_ = contextMenu_->addMenu (tr ("Распознать другой язык")); +} + bool ResultDialog::eventFilter (QObject *object, QEvent *event) { Q_UNUSED (object); - if (event->type () == QEvent::MouseButtonRelease || - event->type () == QEvent::WindowDeactivate) { + if (event->type () == QEvent::MouseButtonPress) { + Qt::MouseButton button = static_cast(event)->button (); + if (button == Qt::RightButton) { + QAction *action = contextMenu_->exec (QCursor::pos ()); + QWidget *subMenu = action->parentWidget (); + if (recognizeSubMenu_->isAncestorOf (subMenu)) { + ProcessingItem item = lastItem_; + item.translated = item.recognized = QString (); + item.ocrLanguage = dictionary_.ocrUiToCode (action->text ()); + emit requestRecognize (item); + } + } + hide (); + } + else if (event->type () == QEvent::WindowDeactivate) { hide (); } return QDialog::eventFilter (object, event); @@ -30,6 +59,7 @@ bool ResultDialog::eventFilter (QObject *object, QEvent *event) { void ResultDialog::showResult (ProcessingItem item) { ST_ASSERT (item.isValid ()); + lastItem_ = item; ui->sourceLabel->setPixmap (item.source); ui->recognizeLabel->setText (item.recognized); ui->translateLabel->setText (item.translated); diff --git a/ResultDialog.h b/ResultDialog.h index 0a21645..ab2be8f 100644 --- a/ResultDialog.h +++ b/ResultDialog.h @@ -2,29 +2,42 @@ #define RESULTDIALOG_H #include +#include #include "ProcessingItem.h" namespace Ui { class ResultDialog; } +class LanguageHelper; class ResultDialog : public QDialog { Q_OBJECT public: - explicit ResultDialog (QWidget *parent = 0); + explicit ResultDialog (const LanguageHelper &dictionary, QWidget *parent = 0); ~ResultDialog (); + signals: + void requestRecognize (ProcessingItem item); + public: bool eventFilter (QObject *object, QEvent *event); public slots: void showResult (ProcessingItem item); + void applySettings (); + + private: + void createContextMenu (); private: Ui::ResultDialog *ui; + const LanguageHelper &dictionary_; bool isShowAtCapturePos_; + QMenu *contextMenu_; + QMenu *recognizeSubMenu_; + ProcessingItem lastItem_; }; #endif // RESULTDIALOG_H From 283b596ef1a49de46d965ea1e49a34287ba8bd92 Mon Sep 17 00:00:00 2001 From: Gres Date: Wed, 30 Sep 2015 20:49:05 +0300 Subject: [PATCH 24/89] Last showing item now stores only in ResultDialog. --- Manager.cpp | 20 +++++++++++--------- Manager.h | 1 - ResultDialog.cpp | 8 ++++++-- ResultDialog.h | 3 ++- 4 files changed, 19 insertions(+), 13 deletions(-) diff --git a/Manager.cpp b/Manager.cpp index 9c0ffb5..1c5afdc 100644 --- a/Manager.cpp +++ b/Manager.cpp @@ -111,8 +111,9 @@ void Manager::updateActionsState (bool isEnabled) { #endif captureAction_->setEnabled (isEnabled); repeatCaptureAction_->setEnabled (isEnabled && !selections_.isEmpty ()); - repeatAction_->setEnabled (isEnabled && lastItem_.isValid ()); - clipboardAction_->setEnabled (isEnabled && lastItem_.isValid ()); + const ProcessingItem &lastItem = resultDialog_->item (); + repeatAction_->setEnabled (isEnabled && lastItem.isValid ()); + clipboardAction_->setEnabled (isEnabled && lastItem.isValid ()); #ifdef Q_OS_LINUX for (int i = 0, end = actions.size (); i < end; ++i) { if (states.at (i) != actions.at (i)->isEnabled ()) { @@ -266,17 +267,19 @@ void Manager::processTrayAction (QSystemTrayIcon::ActivationReason reason) { } void Manager::showLast () { - if (lastItem_.isValid ()) { - showResult (lastItem_); + const ProcessingItem &item = resultDialog_->item (); + if (item.isValid ()) { + showResult (item); } } void Manager::copyLastToClipboard () { - if (lastItem_.isValid ()) { + const ProcessingItem &item = resultDialog_->item (); + if (item.isValid ()) { QClipboard *clipboard = QApplication::clipboard (); - QString message = lastItem_.recognized; - if (!lastItem_.translated.isEmpty ()) { - message += " - " + lastItem_.translated; + QString message = item.recognized; + if (!item.translated.isEmpty ()) { + message += " - " + item.translated; } clipboard->setText (message); trayIcon_->showMessage (tr ("Результат"), @@ -287,7 +290,6 @@ void Manager::copyLastToClipboard () { void Manager::showResult (ProcessingItem item) { ST_ASSERT (item.isValid ()); - lastItem_ = item; if (useResultDialog_) { resultDialog_->showResult (item); } diff --git a/Manager.h b/Manager.h index ba06f6d..184a503 100644 --- a/Manager.h +++ b/Manager.h @@ -59,7 +59,6 @@ class Manager : public QObject { QAction *repeatCaptureAction_; QAction *repeatAction_; QAction *clipboardAction_; - ProcessingItem lastItem_; bool useResultDialog_; //! Used threads. For proper termination. QList threads_; diff --git a/ResultDialog.cpp b/ResultDialog.cpp index 8550037..2e618bb 100644 --- a/ResultDialog.cpp +++ b/ResultDialog.cpp @@ -26,6 +26,10 @@ ResultDialog::~ResultDialog () { delete ui; } +const ProcessingItem &ResultDialog::item () const { + return item_; +} + void ResultDialog::applySettings () { dictionary_.updateMenu (recognizeSubMenu_, dictionary_.availableOcrLanguagesUi ()); } @@ -43,7 +47,7 @@ bool ResultDialog::eventFilter (QObject *object, QEvent *event) { QAction *action = contextMenu_->exec (QCursor::pos ()); QWidget *subMenu = action->parentWidget (); if (recognizeSubMenu_->isAncestorOf (subMenu)) { - ProcessingItem item = lastItem_; + ProcessingItem item = item_; item.translated = item.recognized = QString (); item.ocrLanguage = dictionary_.ocrUiToCode (action->text ()); emit requestRecognize (item); @@ -59,7 +63,7 @@ bool ResultDialog::eventFilter (QObject *object, QEvent *event) { void ResultDialog::showResult (ProcessingItem item) { ST_ASSERT (item.isValid ()); - lastItem_ = item; + item_ = item; ui->sourceLabel->setPixmap (item.source); ui->recognizeLabel->setText (item.recognized); ui->translateLabel->setText (item.translated); diff --git a/ResultDialog.h b/ResultDialog.h index ab2be8f..3e7f8c7 100644 --- a/ResultDialog.h +++ b/ResultDialog.h @@ -22,6 +22,7 @@ class ResultDialog : public QDialog { void requestRecognize (ProcessingItem item); public: + const ProcessingItem &item () const; bool eventFilter (QObject *object, QEvent *event); public slots: @@ -37,7 +38,7 @@ class ResultDialog : public QDialog { bool isShowAtCapturePos_; QMenu *contextMenu_; QMenu *recognizeSubMenu_; - ProcessingItem lastItem_; + ProcessingItem item_; }; #endif // RESULTDIALOG_H From 54f809707cac51b86116fe888ba287b649bfc74c Mon Sep 17 00:00:00 2001 From: Gres Date: Wed, 30 Sep 2015 21:04:25 +0300 Subject: [PATCH 25/89] Added ability to copy last result to clipboard from ResultDialog. --- Manager.cpp | 1 + ResultDialog.cpp | 6 +++++- ResultDialog.h | 2 ++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Manager.cpp b/Manager.cpp index 1c5afdc..bc84b3c 100644 --- a/Manager.cpp +++ b/Manager.cpp @@ -71,6 +71,7 @@ Manager::Manager (QObject *parent) : connect (this, SIGNAL (settingsEdited ()), resultDialog_, SLOT (applySettings ())); connect (resultDialog_, SIGNAL (requestRecognize (ProcessingItem)), this, SIGNAL (requestRecognize (ProcessingItem))); + connect (resultDialog_, SIGNAL (requestClipboard ()), SLOT (copyLastToClipboard ())); connect (trayIcon_, SIGNAL (activated (QSystemTrayIcon::ActivationReason)), diff --git a/ResultDialog.cpp b/ResultDialog.cpp index 2e618bb..a7a0838 100644 --- a/ResultDialog.cpp +++ b/ResultDialog.cpp @@ -11,7 +11,7 @@ ResultDialog::ResultDialog (const LanguageHelper &dictionary, QWidget *parent) : QDialog (parent), ui (new Ui::ResultDialog), dictionary_ (dictionary), isShowAtCapturePos_ (true), - contextMenu_ (NULL), recognizeSubMenu_ (NULL) { + contextMenu_ (NULL), recognizeSubMenu_ (NULL), clipboardAction_ (NULL) { ui->setupUi (this); setWindowFlags (Qt::FramelessWindowHint | Qt::NoDropShadowWindowHint | Qt::WindowStaysOnTopHint | Qt::X11BypassWindowManagerHint); @@ -37,6 +37,7 @@ void ResultDialog::applySettings () { void ResultDialog::createContextMenu () { contextMenu_ = new QMenu (); recognizeSubMenu_ = contextMenu_->addMenu (tr ("Распознать другой язык")); + clipboardAction_ = contextMenu_->addAction (tr ("Скопировать в буфер")); } bool ResultDialog::eventFilter (QObject *object, QEvent *event) { @@ -52,6 +53,9 @@ bool ResultDialog::eventFilter (QObject *object, QEvent *event) { item.ocrLanguage = dictionary_.ocrUiToCode (action->text ()); emit requestRecognize (item); } + else if (action == clipboardAction_) { + emit requestClipboard (); + } } hide (); } diff --git a/ResultDialog.h b/ResultDialog.h index 3e7f8c7..911c765 100644 --- a/ResultDialog.h +++ b/ResultDialog.h @@ -20,6 +20,7 @@ class ResultDialog : public QDialog { signals: void requestRecognize (ProcessingItem item); + void requestClipboard (); // Assume that slot will be called immediately. public: const ProcessingItem &item () const; @@ -38,6 +39,7 @@ class ResultDialog : public QDialog { bool isShowAtCapturePos_; QMenu *contextMenu_; QMenu *recognizeSubMenu_; + QAction *clipboardAction_; ProcessingItem item_; }; From 6358629269220029a891f2b4ad5f3c03ecedf21c Mon Sep 17 00:00:00 2001 From: Gres Date: Wed, 30 Sep 2015 21:05:02 +0300 Subject: [PATCH 26/89] Show "Copied to clipboard" message only when copying after tray icon click. --- Manager.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Manager.cpp b/Manager.cpp index bc84b3c..d884264 100644 --- a/Manager.cpp +++ b/Manager.cpp @@ -261,6 +261,9 @@ void Manager::processTrayAction (QSystemTrayIcon::ActivationReason reason) { } else if (reason == QSystemTrayIcon::MiddleClick && clipboardAction_->isEnabled ()) { copyLastToClipboard (); + trayIcon_->showMessage (tr ("Результат"), + tr ("Последний результат был скопирован в буфер обмена."), + QSystemTrayIcon::Information); } else if (reason == QSystemTrayIcon::DoubleClick && repeatCaptureAction_->isEnabled ()) { repeatCapture (); @@ -283,9 +286,6 @@ void Manager::copyLastToClipboard () { message += " - " + item.translated; } clipboard->setText (message); - trayIcon_->showMessage (tr ("Результат"), - tr ("Последний результат был скопирован в буфер обмена."), - QSystemTrayIcon::Information); } } From f33c0431b990af33bc2cfe1c9c4fea92e1f20efb Mon Sep 17 00:00:00 2001 From: Gres Date: Wed, 30 Sep 2015 21:24:39 +0300 Subject: [PATCH 27/89] More correct submenu detection. --- ResultDialog.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/ResultDialog.cpp b/ResultDialog.cpp index a7a0838..81ea1ed 100644 --- a/ResultDialog.cpp +++ b/ResultDialog.cpp @@ -46,8 +46,7 @@ bool ResultDialog::eventFilter (QObject *object, QEvent *event) { Qt::MouseButton button = static_cast(event)->button (); if (button == Qt::RightButton) { QAction *action = contextMenu_->exec (QCursor::pos ()); - QWidget *subMenu = action->parentWidget (); - if (recognizeSubMenu_->isAncestorOf (subMenu)) { + if (recognizeSubMenu_->findChildren ().contains (action)) { ProcessingItem item = item_; item.translated = item.recognized = QString (); item.ocrLanguage = dictionary_.ocrUiToCode (action->text ()); From 3e499b86c54f7888b220e4d82cd7989d72f3b953 Mon Sep 17 00:00:00 2001 From: Gres Date: Wed, 30 Sep 2015 21:25:45 +0300 Subject: [PATCH 28/89] Added ability to retranslate item from ResultDialog. --- GoogleWebTranslator.cpp | 4 +++- Manager.cpp | 2 ++ ProcessingItem.h | 1 + ResultDialog.cpp | 11 ++++++++++- ResultDialog.h | 2 ++ Translator.cpp | 4 +++- 6 files changed, 21 insertions(+), 3 deletions(-) diff --git a/GoogleWebTranslator.cpp b/GoogleWebTranslator.cpp index aeb42e8..f5127f9 100644 --- a/GoogleWebTranslator.cpp +++ b/GoogleWebTranslator.cpp @@ -87,6 +87,8 @@ void GoogleWebTranslator::load (const ProcessingItem &item) { emit error (tr ("Неверные парметры для перевода.")); return; } - QUrl url (QString ("https://translate.google.com/#auto/%1/%2").arg (translationLanguage_, item.recognized)); + QString translateLanguage = (item.translateLanguage.isEmpty ()) + ? translationLanguage_ : item.translateLanguage; + QUrl url (QString ("https://translate.google.com/#auto/%1/%2").arg (translateLanguage, item.recognized)); view_->setUrl (url); } diff --git a/Manager.cpp b/Manager.cpp index d884264..7c23659 100644 --- a/Manager.cpp +++ b/Manager.cpp @@ -71,6 +71,8 @@ Manager::Manager (QObject *parent) : connect (this, SIGNAL (settingsEdited ()), resultDialog_, SLOT (applySettings ())); connect (resultDialog_, SIGNAL (requestRecognize (ProcessingItem)), this, SIGNAL (requestRecognize (ProcessingItem))); + connect (resultDialog_, SIGNAL (requestTranslate (ProcessingItem)), + this, SIGNAL (requestTranslate (ProcessingItem))); connect (resultDialog_, SIGNAL (requestClipboard ()), SLOT (copyLastToClipboard ())); diff --git a/ProcessingItem.h b/ProcessingItem.h index 7d6ca8c..d2dc272 100644 --- a/ProcessingItem.h +++ b/ProcessingItem.h @@ -11,6 +11,7 @@ struct ProcessingItem { QString ocrLanguage; QString sourceLanguage; + QString translateLanguage; Qt::KeyboardModifiers modifiers; diff --git a/ResultDialog.cpp b/ResultDialog.cpp index 81ea1ed..3d90eac 100644 --- a/ResultDialog.cpp +++ b/ResultDialog.cpp @@ -11,7 +11,8 @@ ResultDialog::ResultDialog (const LanguageHelper &dictionary, QWidget *parent) : QDialog (parent), ui (new Ui::ResultDialog), dictionary_ (dictionary), isShowAtCapturePos_ (true), - contextMenu_ (NULL), recognizeSubMenu_ (NULL), clipboardAction_ (NULL) { + contextMenu_ (NULL), recognizeSubMenu_ (NULL), translateSubMenu_ (NULL), + clipboardAction_ (NULL) { ui->setupUi (this); setWindowFlags (Qt::FramelessWindowHint | Qt::NoDropShadowWindowHint | Qt::WindowStaysOnTopHint | Qt::X11BypassWindowManagerHint); @@ -32,11 +33,13 @@ const ProcessingItem &ResultDialog::item () const { void ResultDialog::applySettings () { dictionary_.updateMenu (recognizeSubMenu_, dictionary_.availableOcrLanguagesUi ()); + dictionary_.updateMenu (translateSubMenu_, dictionary_.translateLanguagesUi ()); } void ResultDialog::createContextMenu () { contextMenu_ = new QMenu (); recognizeSubMenu_ = contextMenu_->addMenu (tr ("Распознать другой язык")); + translateSubMenu_ = contextMenu_->addMenu (tr ("Перевести на другой язык")); clipboardAction_ = contextMenu_->addAction (tr ("Скопировать в буфер")); } @@ -52,6 +55,12 @@ bool ResultDialog::eventFilter (QObject *object, QEvent *event) { item.ocrLanguage = dictionary_.ocrUiToCode (action->text ()); emit requestRecognize (item); } + else if (translateSubMenu_->findChildren ().contains (action)) { + ProcessingItem item = item_; + item.translated.clear (); + item.translateLanguage = dictionary_.translateUiToCode (action->text ()); + emit requestTranslate (item); + } else if (action == clipboardAction_) { emit requestClipboard (); } diff --git a/ResultDialog.h b/ResultDialog.h index 911c765..cda4a12 100644 --- a/ResultDialog.h +++ b/ResultDialog.h @@ -20,6 +20,7 @@ class ResultDialog : public QDialog { signals: void requestRecognize (ProcessingItem item); + void requestTranslate (ProcessingItem item); void requestClipboard (); // Assume that slot will be called immediately. public: @@ -39,6 +40,7 @@ class ResultDialog : public QDialog { bool isShowAtCapturePos_; QMenu *contextMenu_; QMenu *recognizeSubMenu_; + QMenu *translateSubMenu_; QAction *clipboardAction_; ProcessingItem item_; }; diff --git a/Translator.cpp b/Translator.cpp index 399d21d..ac7d5f1 100644 --- a/Translator.cpp +++ b/Translator.cpp @@ -55,7 +55,9 @@ void Translator::translate (ProcessingItem item) { emit error (tr ("Неверные парметры для перевода.")); return; } - QUrl url (translateBaseUrl.arg (item.recognized, sourceLanguage, translationLanguage_)); + QString translateLanguage = (item.translateLanguage.isEmpty ()) + ? translationLanguage_ : item.translateLanguage; + QUrl url (translateBaseUrl.arg (item.recognized, sourceLanguage, translateLanguage)); QNetworkReply *reply = network_.get (QNetworkRequest (url)); items_.insert (reply, item); } From 77757ff3c67049c19af09b971d8fc1b7636c3560 Mon Sep 17 00:00:00 2001 From: Gres Date: Wed, 30 Sep 2015 21:28:00 +0300 Subject: [PATCH 29/89] Removed obsolete code. --- ResultDialog.cpp | 23 +++++++---------------- ResultDialog.h | 1 - 2 files changed, 7 insertions(+), 17 deletions(-) diff --git a/ResultDialog.cpp b/ResultDialog.cpp index 3d90eac..9dc8986 100644 --- a/ResultDialog.cpp +++ b/ResultDialog.cpp @@ -10,7 +10,7 @@ ResultDialog::ResultDialog (const LanguageHelper &dictionary, QWidget *parent) : QDialog (parent), ui (new Ui::ResultDialog), - dictionary_ (dictionary), isShowAtCapturePos_ (true), + dictionary_ (dictionary), contextMenu_ (NULL), recognizeSubMenu_ (NULL), translateSubMenu_ (NULL), clipboardAction_ (NULL) { ui->setupUi (this); @@ -88,21 +88,12 @@ void ResultDialog::showResult (ProcessingItem item) { QDesktopWidget *desktop = QApplication::desktop (); Q_CHECK_PTR (desktop); - if (isShowAtCapturePos_) { - QPoint correction = QPoint (ui->frame->lineWidth (), ui->frame->lineWidth ()); - move (item.screenPos - correction); - QRect screenRect = desktop->screenGeometry (this); - int minY = screenRect.bottom () - height (); - if (y () > minY) { - move (x (), minY); - } - } - else { - - QRect screenRect = desktop->availableGeometry (this); - ST_ASSERT (screenRect.isValid ()); - QPoint newPos (screenRect.width () - width (), screenRect.height () - height ()); - move (newPos); + QPoint correction = QPoint (ui->frame->lineWidth (), ui->frame->lineWidth ()); + move (item.screenPos - correction); + QRect screenRect = desktop->screenGeometry (this); + int minY = screenRect.bottom () - height (); + if (y () > minY) { + move (x (), minY); } activateWindow (); } diff --git a/ResultDialog.h b/ResultDialog.h index cda4a12..e3edd0a 100644 --- a/ResultDialog.h +++ b/ResultDialog.h @@ -37,7 +37,6 @@ class ResultDialog : public QDialog { private: Ui::ResultDialog *ui; const LanguageHelper &dictionary_; - bool isShowAtCapturePos_; QMenu *contextMenu_; QMenu *recognizeSubMenu_; QMenu *translateSubMenu_; From 381df69650fa983a52da559f4ad78231dbddd51b Mon Sep 17 00:00:00 2001 From: Gres Date: Wed, 30 Sep 2015 21:33:18 +0300 Subject: [PATCH 30/89] More correct result positioning on screen. --- ResultDialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ResultDialog.cpp b/ResultDialog.cpp index 9dc8986..7145ccc 100644 --- a/ResultDialog.cpp +++ b/ResultDialog.cpp @@ -88,7 +88,7 @@ void ResultDialog::showResult (ProcessingItem item) { QDesktopWidget *desktop = QApplication::desktop (); Q_CHECK_PTR (desktop); - QPoint correction = QPoint (ui->frame->lineWidth (), ui->frame->lineWidth ()); + QPoint correction = QPoint ((width () - item.source.width ()) / 2, ui->frame->lineWidth ()); move (item.screenPos - correction); QRect screenRect = desktop->screenGeometry (this); int minY = screenRect.bottom () - height (); From f3c4f1c5b5625c1d1305bfd00fa2c29e045df339 Mon Sep 17 00:00:00 2001 From: Gres Date: Thu, 1 Oct 2015 20:49:53 +0300 Subject: [PATCH 31/89] Added ability to correct recognized text. --- Manager.cpp | 13 +++++++++++++ Manager.h | 1 + ResultDialog.cpp | 8 +++++++- ResultDialog.h | 2 ++ 4 files changed, 23 insertions(+), 1 deletion(-) diff --git a/Manager.cpp b/Manager.cpp index 7c23659..94ebd7b 100644 --- a/Manager.cpp +++ b/Manager.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include "Settings.h" #include "SettingsEditor.h" @@ -74,6 +75,8 @@ Manager::Manager (QObject *parent) : connect (resultDialog_, SIGNAL (requestTranslate (ProcessingItem)), this, SIGNAL (requestTranslate (ProcessingItem))); connect (resultDialog_, SIGNAL (requestClipboard ()), SLOT (copyLastToClipboard ())); + connect (resultDialog_, SIGNAL (requestEdition (ProcessingItem)), + this, SLOT (editRecognized (ProcessingItem))); connect (trayIcon_, SIGNAL (activated (QSystemTrayIcon::ActivationReason)), @@ -272,6 +275,16 @@ void Manager::processTrayAction (QSystemTrayIcon::ActivationReason reason) { } } +void Manager::editRecognized (ProcessingItem item) { + ST_ASSERT (item.isValid ()); + QString fixed = QInputDialog::getMultiLineText ( + NULL, tr ("Правка"), tr ("Исправьте распознанный текст"), item.recognized); + if (!fixed.isEmpty ()) { + item.recognized = fixed; + showResult (item); + } +} + void Manager::showLast () { const ProcessingItem &item = resultDialog_->item (); if (item.isValid ()) { diff --git a/Manager.h b/Manager.h index 184a503..ceb84be 100644 --- a/Manager.h +++ b/Manager.h @@ -41,6 +41,7 @@ class Manager : public QObject { void processTrayAction (QSystemTrayIcon::ActivationReason reason); + void editRecognized (ProcessingItem item); void handleSelection (ProcessingItem item); void showResult (ProcessingItem item); void showError (QString text); diff --git a/ResultDialog.cpp b/ResultDialog.cpp index 7145ccc..747cf00 100644 --- a/ResultDialog.cpp +++ b/ResultDialog.cpp @@ -12,7 +12,7 @@ ResultDialog::ResultDialog (const LanguageHelper &dictionary, QWidget *parent) : ui (new Ui::ResultDialog), dictionary_ (dictionary), contextMenu_ (NULL), recognizeSubMenu_ (NULL), translateSubMenu_ (NULL), - clipboardAction_ (NULL) { + clipboardAction_ (NULL), correctAction_ (NULL) { ui->setupUi (this); setWindowFlags (Qt::FramelessWindowHint | Qt::NoDropShadowWindowHint | Qt::WindowStaysOnTopHint | Qt::X11BypassWindowManagerHint); @@ -41,6 +41,7 @@ void ResultDialog::createContextMenu () { recognizeSubMenu_ = contextMenu_->addMenu (tr ("Распознать другой язык")); translateSubMenu_ = contextMenu_->addMenu (tr ("Перевести на другой язык")); clipboardAction_ = contextMenu_->addAction (tr ("Скопировать в буфер")); + correctAction_ = contextMenu_->addAction (tr ("Исправить распознанный текст")); } bool ResultDialog::eventFilter (QObject *object, QEvent *event) { @@ -64,6 +65,11 @@ bool ResultDialog::eventFilter (QObject *object, QEvent *event) { else if (action == clipboardAction_) { emit requestClipboard (); } + else if (action == correctAction_) { + emit requestEdition (item_); + // Return because Manager calls showResult() before hide() otherwise. + return QDialog::eventFilter (object, event); + } } hide (); } diff --git a/ResultDialog.h b/ResultDialog.h index e3edd0a..6574d7e 100644 --- a/ResultDialog.h +++ b/ResultDialog.h @@ -22,6 +22,7 @@ class ResultDialog : public QDialog { void requestRecognize (ProcessingItem item); void requestTranslate (ProcessingItem item); void requestClipboard (); // Assume that slot will be called immediately. + void requestEdition (ProcessingItem item); public: const ProcessingItem &item () const; @@ -41,6 +42,7 @@ class ResultDialog : public QDialog { QMenu *recognizeSubMenu_; QMenu *translateSubMenu_; QAction *clipboardAction_; + QAction *correctAction_; ProcessingItem item_; }; From 01d969968e2d768099163c01fa2f383770fe776d Mon Sep 17 00:00:00 2001 From: Gres Date: Thu, 8 Oct 2015 18:36:02 +0300 Subject: [PATCH 32/89] Added WebTranslator class. --- ScreenTranslator.pro | 3 + Settings.h | 2 + SettingsEditor.cpp | 2 + SettingsEditor.ui | 27 +++++++-- WebTranslator.cpp | 124 +++++++++++++++++++++++++++++++++++++++++ WebTranslator.h | 53 ++++++++++++++++++ WebTranslatorProxy.cpp | 25 +++++++++ WebTranslatorProxy.h | 38 +++++++++++++ translators/google.js | 31 +++++++++++ 9 files changed, 300 insertions(+), 5 deletions(-) create mode 100644 WebTranslator.cpp create mode 100644 WebTranslator.h create mode 100644 WebTranslatorProxy.cpp create mode 100644 WebTranslatorProxy.h create mode 100644 translators/google.js diff --git a/ScreenTranslator.pro b/ScreenTranslator.pro index 8af33c0..4d9d2ef 100644 --- a/ScreenTranslator.pro +++ b/ScreenTranslator.pro @@ -37,6 +37,7 @@ SOURCES += main.cpp\ ProcessingItem.cpp \ ImageProcessing.cpp \ LanguageHelper.cpp \ + WebTranslator.cpp \ GoogleWebTranslator.cpp HEADERS += \ @@ -51,6 +52,7 @@ HEADERS += \ ResultDialog.h \ ImageProcessing.h \ LanguageHelper.h \ + WebTranslator.h \ GoogleWebTranslator.h \ StAssert.h @@ -71,4 +73,5 @@ OTHER_FILES += \ images/icon.ico \ README.md \ uncrustify.cfg\ + translators/google.js \ TODO.md diff --git a/Settings.h b/Settings.h index b7cf46f..da45ae3 100644 --- a/Settings.h +++ b/Settings.h @@ -24,6 +24,7 @@ namespace settings_names { const QString doTranslation = "doTranslation"; const QString sourceLanguage = "source_language"; const QString translationLanguage = "translation_language"; + const QString translationTimeout = "translation_timeout"; } @@ -47,6 +48,7 @@ namespace settings_values { const bool doTranslation = true; const QString sourceLanguage = "auto"; const QString translationLanguage = "ru"; + const int translationTimeout = 15; // secs } #endif // SETTINGS_H diff --git a/SettingsEditor.cpp b/SettingsEditor.cpp index 5c3c89c..0fc694f 100644 --- a/SettingsEditor.cpp +++ b/SettingsEditor.cpp @@ -64,6 +64,7 @@ void SettingsEditor::saveSettings () const { settings.setValue (translationLanguage, trLanguage); QString sourceLanguage = dictionary_.translateForOcrCode (ocrLanguage); settings.setValue (sourceLanguage, sourceLanguage); + settings.setValue (translationTimeout, ui->translateTimeoutSpin->value ()); settings.endGroup (); } @@ -104,6 +105,7 @@ void SettingsEditor::loadSettings () { ui->doTranslationCombo->setChecked (GET (doTranslation).toBool ()); QString trLanguage = dictionary_.translateCodeToUi (GET (translationLanguage).toString ()); ui->translateLangCombo->setCurrentText (trLanguage); + ui->translateTimeoutSpin->setValue (GET (translationTimeout).toInt ()); settings.endGroup (); #undef GET } diff --git a/SettingsEditor.ui b/SettingsEditor.ui index 4db4394..c255e6a 100644 --- a/SettingsEditor.ui +++ b/SettingsEditor.ui @@ -7,7 +7,7 @@ 0 0 603 - 269 + 296 @@ -194,7 +194,7 @@ Перевод - + <html><head/><body><p>Необходимо ли переводить (вкл) распознанный текст.</p></body></html> @@ -204,20 +204,37 @@ - + + + + <html><head/><body><p>Максимальное время, которое может быть затрачено на перевод, чтобы он не считался &quot;зависшим&quot;.</p></body></html> + + + Максимальное время перевода: + + + + + + + сек. + + + + <html><head/><body><p>Язык, на который осуществляется перевод.</p></body></html> - Язык результата + Язык результата: translateLangCombo - + diff --git a/WebTranslator.cpp b/WebTranslator.cpp new file mode 100644 index 0000000..a5b3cf9 --- /dev/null +++ b/WebTranslator.cpp @@ -0,0 +1,124 @@ +#include +#include +#include +#include +#include + +#include "WebTranslator.h" +#include "ProcessingItem.h" +#include "Settings.h" +#include "StAssert.h" +#include "WebTranslatorProxy.h" + +WebTranslator::WebTranslator () + : QObject (), + proxy_ (new WebTranslatorProxy (this)), view_ (new QWebView), isReady_ (true) { + + view_->settings ()->setAttribute (QWebSettings::AutoLoadImages, false); + view_->settings ()->setAttribute (QWebSettings::DeveloperExtrasEnabled, true); + + connect (view_, SIGNAL (loadFinished (bool)), SLOT (loadFinished (bool))); + connect (view_->page ()->mainFrame (), SIGNAL (javaScriptWindowObjectCleared ()), + this, SLOT (addProxyToView ())); + connect (view_->page ()->networkAccessManager (), SIGNAL (finished (QNetworkReply *)), + this, SLOT (replyFinished (QNetworkReply *))); + + translationTimeout_.setSingleShot (true); + connect (&translationTimeout_, SIGNAL (timeout ()), SLOT (abortTranslation ())); + + connect (proxy_, SIGNAL (error (QString)), SLOT (proxyError (QString))); + connect (proxy_, SIGNAL (translated (QString)), SLOT (proxyTranslated (QString))); + + applySettings (); +} + +WebTranslator::~WebTranslator () { + delete view_; +} + +void WebTranslator::addProxyToView () { + view_->page ()->mainFrame ()->addToJavaScriptWindowObject ("st_wtp", proxy_); + view_->page ()->mainFrame ()->evaluateJavaScript (script_); +} + +void WebTranslator::translate (ProcessingItem item) { + queue_.push_back (item); + translateQueued (); +} + +void WebTranslator::translateQueued () { + if (isReady_ && !script_.isEmpty () && !queue_.isEmpty ()) { + isReady_ = false; + runScriptForItem (queue_.first ()); + translationTimeout_.start (); + } +} + +void WebTranslator::runScriptForItem (const ProcessingItem &item) { + ST_ASSERT (!script_.isEmpty ()); + proxy_->setItem (item); + view_->page ()->mainFrame ()->evaluateJavaScript ("translate();"); +} + +void WebTranslator::proxyError (const QString &message) { + emit error (message); + finishTranslation (); +} + +void WebTranslator::proxyTranslated (const QString &text) { + if (!queue_.isEmpty () && queue_.first ().recognized == proxy_->sourceText ()) { + ProcessingItem &item = queue_.first (); + item.translated = text; + emit translated (item); + } + finishTranslation (); +} + +void WebTranslator::abortTranslation () { + emit error (tr ("Перевод отменен по таймауту.")); + finishTranslation (); +} + +void WebTranslator::loadFinished (bool ok) { + if (!ok) { + QString url = view_->url ().toString (); + emit error (tr ("Ошибка загрузки страницы (%1) для перевода.").arg (url)); + finishTranslation (); + } +} + +void WebTranslator::finishTranslation () { + translationTimeout_.stop (); + if (!queue_.isEmpty ()) { + queue_.pop_front (); + } + isReady_ = true; + translateQueued (); +} + +void WebTranslator::replyFinished (QNetworkReply *reply) { + emit proxy_->resourceLoaded (reply->url ().toString ()); +} + +void WebTranslator::applySettings () { + QSettings settings; + settings.beginGroup (settings_names::translationGroup); +#define GET(NAME) settings.value (settings_names::NAME, settings_values::NAME) + translationTimeout_.setInterval (GET (translationTimeout).toInt () * 1000); +#undef GET + + QFile f ("translators/google.js"); + if (f.open (QFile::ReadOnly)) { + script_ = QString::fromUtf8 (f.readAll ()); + if (script_.isEmpty ()) { + emit error (tr ("Пустой сценарий для перевода. Перевод недоступен.")); + } + } + else { + emit error (tr ("Не считан сценарий для перевода. Перевод недоступен.")); + } +} + +void WebTranslator::setDebugMode (bool isOn) { + view_->setVisible (isOn); +} diff --git a/WebTranslator.h b/WebTranslator.h new file mode 100644 index 0000000..7f79114 --- /dev/null +++ b/WebTranslator.h @@ -0,0 +1,53 @@ +#ifndef WEBTRANSLATOR_H +#define WEBTRANSLATOR_H + +#include +#include +#include + +#include "ProcessingItem.h" + +class QWebView; +class QNetworkReply; + +class WebTranslatorProxy; + +class WebTranslator : public QObject { + Q_OBJECT + + public: + explicit WebTranslator (); + ~WebTranslator (); + + signals: + void translated (ProcessingItem item); + void error (QString text); + + public slots: + void translate (ProcessingItem item); + void applySettings (); + void setDebugMode (bool isOn); + + private slots: + void loadFinished (bool ok); + void replyFinished (QNetworkReply *reply); + void addProxyToView (); + void abortTranslation (); + void proxyError (const QString &message); + void proxyTranslated (const QString &text); + + private: + void translateQueued (); + void runScriptForItem (const ProcessingItem &item); + void finishTranslation (); + + private: + WebTranslatorProxy *proxy_; + QWebView *view_; + QVector queue_; + bool isReady_; + QString script_; + QTimer translationTimeout_; +}; + +#endif // WEBTRANSLATOR_H diff --git a/WebTranslatorProxy.cpp b/WebTranslatorProxy.cpp new file mode 100644 index 0000000..b298baa --- /dev/null +++ b/WebTranslatorProxy.cpp @@ -0,0 +1,25 @@ +#include "WebTranslatorProxy.h" +#include "ProcessingItem.h" + +WebTranslatorProxy::WebTranslatorProxy (QObject *parent) + : QObject (parent) { +} + +void WebTranslatorProxy::setItem (const ProcessingItem &item) { + sourceText_ = item.recognized; + sourceLanguage_ = item.ocrLanguage; + resultLanguage_ = item.translateLanguage; +} + +const QString &WebTranslatorProxy::sourceText () const { + return sourceText_; +} + +const QString &WebTranslatorProxy::sourceLanguage () const { + return sourceLanguage_; +} + +const QString &WebTranslatorProxy::resultLanguage () const { + return resultLanguage_; +} + diff --git a/WebTranslatorProxy.h b/WebTranslatorProxy.h new file mode 100644 index 0000000..1ff4220 --- /dev/null +++ b/WebTranslatorProxy.h @@ -0,0 +1,38 @@ +#ifndef WEBTRANSLATORPROXY_H +#define WEBTRANSLATORPROXY_H + +#include + +class ProcessingItem; + +/*! + * \brief Proxy class between WebTranslator and QWebView. + */ +class WebTranslatorProxy : public QObject { + Q_OBJECT + Q_PROPERTY (QString sourceText READ sourceText) + Q_PROPERTY (QString sourceLanguage READ sourceLanguage) + Q_PROPERTY (QString resultLanguage READ resultLanguage) + + public: + explicit WebTranslatorProxy (QObject *parent = 0); + + void setItem (const ProcessingItem &item); + + const QString &sourceText () const; + const QString &sourceLanguage () const; + const QString &resultLanguage () const; + + signals: + void translated (const QString &text); + void error (const QString &message); + + void resourceLoaded (const QString &url); + + private: + QString sourceText_; + QString sourceLanguage_; + QString resultLanguage_; +}; + +#endif // WEBTRANSLATORPROXY_H diff --git a/translators/google.js b/translators/google.js new file mode 100644 index 0000000..11f0499 --- /dev/null +++ b/translators/google.js @@ -0,0 +1,31 @@ +var isPageLoaded = false; +var isTranslationFinished = false; // async translation request + +function checkFinished () { + if (!isPageLoaded || !isTranslationFinished) return; + setTimeout(function () { + var spans = [].slice.call (document.querySelectorAll ('#result_box > span')); + var text = spans.reduce (function (res, i) { + return res + ' ' + i.innerText; + }, ''); + st_wtp.translated (text); + }, 500); // wait for gui fill +} +function onResourceLoad (url) { + if (url.indexOf ('/translate_a/single') > -1) { + isTranslationFinished = true; + checkFinished (); + } +} +st_wtp.resourceLoaded.connect (onResourceLoad); +function onPageLoad () { + isPageLoaded = true; + checkFinished (); +} +window.onload = onPageLoad(); + +function translate (){ + var url = 'https://translate.google.com/#auto/' + + st_wtp.resultLanguage + '/' + st_wtp.sourceText; + window.location = url; +} From e38449b928480850d954d50330c0cc6954d0c19c Mon Sep 17 00:00:00 2001 From: Gres Date: Thu, 8 Oct 2015 18:38:16 +0300 Subject: [PATCH 33/89] Replaced Translator and GoogleWebTranslator with WebTranslator. --- GoogleWebTranslator.cpp | 94 ---------------------------------- GoogleWebTranslator.h | 43 ---------------- Manager.cpp | 16 +++--- Manager.h | 1 + ScreenTranslator.pro | 6 +-- Translator.cpp | 109 ---------------------------------------- Translator.h | 36 ------------- 7 files changed, 12 insertions(+), 293 deletions(-) delete mode 100644 GoogleWebTranslator.cpp delete mode 100644 GoogleWebTranslator.h delete mode 100644 Translator.cpp delete mode 100644 Translator.h diff --git a/GoogleWebTranslator.cpp b/GoogleWebTranslator.cpp deleted file mode 100644 index f5127f9..0000000 --- a/GoogleWebTranslator.cpp +++ /dev/null @@ -1,94 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#include "GoogleWebTranslator.h" -#include "Settings.h" -#include "StAssert.h" - -GoogleWebTranslator::GoogleWebTranslator () - : QObject (), view_ (new QWebView), - isLoadFinished_ (true), isTranslationFinished_ (false) { - - view_->settings ()->setAttribute (QWebSettings::AutoLoadImages, false); - connect (view_, SIGNAL (loadStarted ()), this, SLOT (loadStarted ())); - connect (view_, SIGNAL (loadFinished (bool)), this, SLOT (loadFinished (bool))); - - connect (view_->page ()->networkAccessManager (), SIGNAL (finished (QNetworkReply *)), - this, SLOT (replyFinished (QNetworkReply *))); - applySettings (); -} - -GoogleWebTranslator::~GoogleWebTranslator () { - delete view_; -} - -void GoogleWebTranslator::translate (ProcessingItem item) { - queue_.push_back (item); - if (isLoadFinished_) { - load (item); - } -} - -void GoogleWebTranslator::applySettings () { - QSettings settings; - settings.beginGroup (settings_names::translationGroup); - translationLanguage_ = settings.value (settings_names::translationLanguage, - settings_values::translationLanguage).toString (); -} - -void GoogleWebTranslator::loadStarted () { - isLoadFinished_ = false; - isTranslationFinished_ = false; -} - -void GoogleWebTranslator::loadFinished (bool ok) { - isLoadFinished_ = true; - if (ok && !isTranslationFinished_) { - return; - } - - if (!queue_.isEmpty ()) { - ProcessingItem item = queue_.front (); - queue_.pop_front (); - if (ok) { - QWebElementCollection result = view_->page ()->mainFrame ()->findAllElements ("#result_box > span"); - item.translated = ""; - foreach (const QWebElement &element, result) { - item.translated += element.toInnerXml () + " "; - } - emit translated (item, !item.translated.isEmpty ()); - } - else { - emit translated (item, false); - } - } - - if (!queue_.isEmpty ()) { - load (queue_.front ()); - } -} - -void GoogleWebTranslator::replyFinished (QNetworkReply *reply) { - if (reply->url ().toString ().contains ("/translate_a/single")) { - isTranslationFinished_ = true; - if (isLoadFinished_) { - QTimer::singleShot (2000, this, SLOT (loadFinished ())); - } - } -} - -void GoogleWebTranslator::load (const ProcessingItem &item) { - ST_ASSERT (!item.recognized.isEmpty ()); - if (translationLanguage_.isEmpty ()) { - emit error (tr ("Неверные парметры для перевода.")); - return; - } - QString translateLanguage = (item.translateLanguage.isEmpty ()) - ? translationLanguage_ : item.translateLanguage; - QUrl url (QString ("https://translate.google.com/#auto/%1/%2").arg (translateLanguage, item.recognized)); - view_->setUrl (url); -} diff --git a/GoogleWebTranslator.h b/GoogleWebTranslator.h deleted file mode 100644 index abe230f..0000000 --- a/GoogleWebTranslator.h +++ /dev/null @@ -1,43 +0,0 @@ -#ifndef GOOGLEWEBTRANSLATOR_H -#define GOOGLEWEBTRANSLATOR_H - -#include - -#include "ProcessingItem.h" - -class QWebView; -class QUrl; -class QNetworkReply; - -class GoogleWebTranslator : public QObject { - Q_OBJECT - - public: - GoogleWebTranslator (); - ~GoogleWebTranslator (); - - signals: - void translated (ProcessingItem item, bool success); - void error (QString text); - - public slots: - void translate (ProcessingItem item); - void applySettings (); - - private slots: - void loadStarted (); - void loadFinished (bool ok = true); - void replyFinished (QNetworkReply *reply); - - private: - void load (const ProcessingItem &item); - - private: - QVector queue_; - QString translationLanguage_; - QWebView *view_; - bool isLoadFinished_; - bool isTranslationFinished_; -}; - -#endif // GOOGLEWEBTRANSLATOR_H diff --git a/Manager.cpp b/Manager.cpp index 94ebd7b..3228f39 100644 --- a/Manager.cpp +++ b/Manager.cpp @@ -17,7 +17,7 @@ #include "SelectionDialog.h" #include "GlobalActionHelper.h" #include "Recognizer.h" -#include "Translator.h" +#include "WebTranslator.h" #include "ResultDialog.h" #include "LanguageHelper.h" #include "StAssert.h" @@ -51,7 +51,7 @@ Manager::Manager (QObject *parent) : // Translator - Translator *translator = new Translator; + WebTranslator *translator = new WebTranslator; connect (this, SIGNAL (requestTranslate (ProcessingItem)), translator, SLOT (translate (ProcessingItem))); connect (translator, SIGNAL (translated (ProcessingItem)), @@ -60,11 +60,6 @@ Manager::Manager (QObject *parent) : SLOT (showError (QString))); connect (this, SIGNAL (settingsEdited ()), translator, SLOT (applySettings ())); - QThread *translatorThread = new QThread (this); - threads_ << translatorThread; - translator->moveToThread (translatorThread); - translatorThread->start (); - connect (qApp, SIGNAL (aboutToQuit ()), translatorThread, SLOT (quit ())); connect (this, SIGNAL (settingsEdited ()), this, SLOT (applySettings ())); @@ -160,6 +155,10 @@ void Manager::applySettings () { useResultDialog_ = GET (resultShowType).toBool (); settings.endGroup (); + settings.beginGroup (settings_names::translationGroup); + defaultTranslationLanguage_ = GET (translationLanguage).toString (); + settings.endGroup (); + Q_CHECK_PTR (dictionary_); dictionary_->updateAvailableOcrLanguages (); @@ -211,6 +210,9 @@ void Manager::capture () { } void Manager::handleSelection (ProcessingItem item) { + if (item.translateLanguage.isEmpty ()) { + item.translateLanguage = defaultTranslationLanguage_; + } emit requestRecognize (item); if (!(item.modifiers & Qt::ControlModifier)) { emit closeSelections (); diff --git a/Manager.h b/Manager.h index ceb84be..070d465 100644 --- a/Manager.h +++ b/Manager.h @@ -63,6 +63,7 @@ class Manager : public QObject { bool useResultDialog_; //! Used threads. For proper termination. QList threads_; + QString defaultTranslationLanguage_; }; #endif // MANAGER_H diff --git a/ScreenTranslator.pro b/ScreenTranslator.pro index 4d9d2ef..b783173 100644 --- a/ScreenTranslator.pro +++ b/ScreenTranslator.pro @@ -32,13 +32,12 @@ SOURCES += main.cpp\ SelectionDialog.cpp \ GlobalActionHelper.cpp \ Recognizer.cpp \ - Translator.cpp \ ResultDialog.cpp \ ProcessingItem.cpp \ ImageProcessing.cpp \ LanguageHelper.cpp \ WebTranslator.cpp \ - GoogleWebTranslator.cpp + WebTranslatorProxy.cpp HEADERS += \ Manager.h \ @@ -46,14 +45,13 @@ HEADERS += \ SelectionDialog.h \ GlobalActionHelper.h \ Recognizer.h \ - Translator.h \ Settings.h \ ProcessingItem.h \ ResultDialog.h \ ImageProcessing.h \ LanguageHelper.h \ WebTranslator.h \ - GoogleWebTranslator.h \ + WebTranslatorProxy.h \ StAssert.h FORMS += \ diff --git a/Translator.cpp b/Translator.cpp deleted file mode 100644 index ac7d5f1..0000000 --- a/Translator.cpp +++ /dev/null @@ -1,109 +0,0 @@ -#include "Translator.h" - -#include -#include -#include -#include -#include -#include -#include - -#include "Settings.h" -#include "GoogleWebTranslator.h" -#include "StAssert.h" - -namespace { - const QString translateBaseUrl = "http://translate.google.com/translate_a/" - "t?client=t&text=%1&sl=%2&tl=%3"; -} - -Translator::Translator (QObject *parent) : - QObject (parent), - network_ (this), - useAlternativeTranslation_ (false) { - connect (&network_, SIGNAL (finished (QNetworkReply *)), - SLOT (replyFinished (QNetworkReply *))); - - GoogleWebTranslator *googleWeb = new GoogleWebTranslator; - connect (this, SIGNAL (translateAlternative (ProcessingItem)), - googleWeb, SLOT (translate (ProcessingItem))); - connect (googleWeb, SIGNAL (translated (ProcessingItem, bool)), - this, SLOT (translatedAlternative (ProcessingItem, bool))); - connect (googleWeb, SIGNAL (error (QString)), this, SIGNAL (error (QString))); - - applySettings (); -} - -void Translator::applySettings () { - QSettings settings; - settings.beginGroup (settings_names::translationGroup); - translationLanguage_ = settings.value (settings_names::translationLanguage, - settings_values::translationLanguage).toString (); - sourceLanguage_ = settings.value (settings_names::sourceLanguage, - settings_values::sourceLanguage).toString (); -} - -void Translator::translate (ProcessingItem item) { - if (useAlternativeTranslation_) { - emit translateAlternative (item); - return; - } - ST_ASSERT (!item.recognized.isEmpty ()); - QString sourceLanguage = item.sourceLanguage.isEmpty () ? sourceLanguage_ : - item.sourceLanguage; - if (translationLanguage_.isEmpty () || sourceLanguage.isEmpty ()) { - emit error (tr ("Неверные парметры для перевода.")); - return; - } - QString translateLanguage = (item.translateLanguage.isEmpty ()) - ? translationLanguage_ : item.translateLanguage; - QUrl url (translateBaseUrl.arg (item.recognized, sourceLanguage, translateLanguage)); - QNetworkReply *reply = network_.get (QNetworkRequest (url)); - items_.insert (reply, item); -} - -void Translator::translatedAlternative (ProcessingItem item, bool success) { - if (success) { - emit translated (item); - } - else { - emit error (tr ("Ошибка альтернативного перевода текста: %1").arg (item.recognized)); - } -} - -void Translator::replyFinished (QNetworkReply *reply) { - ST_ASSERT (items_.contains (reply)); - ProcessingItem item = items_.take (reply); - ST_ASSERT (reply->isFinished ()); - if (reply->error () != QNetworkReply::NoError) { - useAlternativeTranslation_ = true; - emit translateAlternative (item); - reply->deleteLater (); - return; - } - QByteArray data = reply->readAll (); - reply->deleteLater (); - - while (data.indexOf (",,") != -1) {//make json valid - data.replace (",,", ","); - } - QJsonParseError parseError; - QJsonDocument document = QJsonDocument::fromJson (data, &parseError); - if (document.isEmpty ()) { - useAlternativeTranslation_ = true; - emit translateAlternative (item); - return; - } - QJsonArray answerArray = document.array (); - QJsonArray fullTranslation = answerArray.first ().toArray (); - QString translation = ""; - foreach (QJsonValue part, fullTranslation) { - QJsonArray partTranslation = part.toArray (); - if (partTranslation.isEmpty ()) { - continue; - } - translation += partTranslation.at (0).toString (); - } - item.translated = translation; - emit translated (item); -} diff --git a/Translator.h b/Translator.h deleted file mode 100644 index e28ea90..0000000 --- a/Translator.h +++ /dev/null @@ -1,36 +0,0 @@ -#ifndef TRANSLATOR_H -#define TRANSLATOR_H - -#include - -#include "ProcessingItem.h" - -class Translator : public QObject { - Q_OBJECT - - public: - explicit Translator (QObject *parent = 0); - - signals: - void translated (ProcessingItem item); - void translateAlternative (ProcessingItem item); - void error (QString text); - - public slots: - void translate (ProcessingItem item); - void translatedAlternative (ProcessingItem item, bool success); - void applySettings (); - - private slots: - void replyFinished (QNetworkReply *reply); - - private: - QNetworkAccessManager network_; - QString translationLanguage_; - QString sourceLanguage_; - QHash items_; - bool useAlternativeTranslation_; - -}; - -#endif // TRANSLATOR_H From 56a7469260dff1dec8ab1d4d659199c936935968 Mon Sep 17 00:00:00 2001 From: Gres Date: Thu, 8 Oct 2015 20:07:45 +0300 Subject: [PATCH 34/89] Mark item as translated even on error (to show at least recognized text). --- WebTranslator.cpp | 8 ++++++-- WebTranslator.h | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/WebTranslator.cpp b/WebTranslator.cpp index a5b3cf9..02820fd 100644 --- a/WebTranslator.cpp +++ b/WebTranslator.cpp @@ -71,7 +71,7 @@ void WebTranslator::proxyTranslated (const QString &text) { item.translated = text; emit translated (item); } - finishTranslation (); + finishTranslation (false); } void WebTranslator::abortTranslation () { @@ -87,9 +87,13 @@ void WebTranslator::loadFinished (bool ok) { } } -void WebTranslator::finishTranslation () { +void WebTranslator::finishTranslation (bool markAsTranslated) { translationTimeout_.stop (); + view_->stop (); if (!queue_.isEmpty ()) { + if (markAsTranslated) { + emit translated (queue_.first ()); + } queue_.pop_front (); } isReady_ = true; diff --git a/WebTranslator.h b/WebTranslator.h index 7f79114..dd77204 100644 --- a/WebTranslator.h +++ b/WebTranslator.h @@ -39,7 +39,7 @@ class WebTranslator : public QObject { private: void translateQueued (); void runScriptForItem (const ProcessingItem &item); - void finishTranslation (); + void finishTranslation (bool markAsTranslated = true); private: WebTranslatorProxy *proxy_; From 186395f692cdaeaa22914bb9a0d30d4c5a3386fd Mon Sep 17 00:00:00 2001 From: Gres Date: Thu, 8 Oct 2015 20:08:23 +0300 Subject: [PATCH 35/89] Enabled local storage (yandex requires it). --- WebTranslator.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/WebTranslator.cpp b/WebTranslator.cpp index 02820fd..2b657f8 100644 --- a/WebTranslator.cpp +++ b/WebTranslator.cpp @@ -16,6 +16,7 @@ WebTranslator::WebTranslator () view_->settings ()->setAttribute (QWebSettings::AutoLoadImages, false); view_->settings ()->setAttribute (QWebSettings::DeveloperExtrasEnabled, true); + view_->settings ()->setAttribute (QWebSettings::LocalStorageEnabled, true); connect (view_, SIGNAL (loadFinished (bool)), SLOT (loadFinished (bool))); connect (view_->page ()->mainFrame (), SIGNAL (javaScriptWindowObjectCleared ()), From 67a4c8e0ea1154b99c6c3af1c143ad8ed8e59151 Mon Sep 17 00:00:00 2001 From: Gres Date: Fri, 9 Oct 2015 23:18:22 +0300 Subject: [PATCH 36/89] Added TranslatorHelper class. --- ScreenTranslator.pro | 10 ++++-- Settings.h | 2 ++ TranslatorHelper.cpp | 74 ++++++++++++++++++++++++++++++++++++++++++++ TranslatorHelper.h | 27 ++++++++++++++++ 4 files changed, 111 insertions(+), 2 deletions(-) create mode 100644 TranslatorHelper.cpp create mode 100644 TranslatorHelper.h diff --git a/ScreenTranslator.pro b/ScreenTranslator.pro index b783173..77d9091 100644 --- a/ScreenTranslator.pro +++ b/ScreenTranslator.pro @@ -10,6 +10,7 @@ greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = ScreenTranslator TEMPLATE = app +CONFIG += c++11 win32{ RC_FILE = app.rc @@ -37,7 +38,8 @@ SOURCES += main.cpp\ ImageProcessing.cpp \ LanguageHelper.cpp \ WebTranslator.cpp \ - WebTranslatorProxy.cpp + WebTranslatorProxy.cpp \ + TranslatorHelper.cpp HEADERS += \ Manager.h \ @@ -52,7 +54,8 @@ HEADERS += \ LanguageHelper.h \ WebTranslator.h \ WebTranslatorProxy.h \ - StAssert.h + StAssert.h \ + TranslatorHelper.h FORMS += \ SettingsEditor.ui \ @@ -71,5 +74,8 @@ OTHER_FILES += \ images/icon.ico \ README.md \ uncrustify.cfg\ + images/README.md \ translators/google.js \ + translators/yandex.js \ + translators/bing.js \ TODO.md diff --git a/Settings.h b/Settings.h index da45ae3..e80a1bf 100644 --- a/Settings.h +++ b/Settings.h @@ -25,6 +25,7 @@ namespace settings_names { const QString sourceLanguage = "source_language"; const QString translationLanguage = "translation_language"; const QString translationTimeout = "translation_timeout"; + const QString translators = "translators"; } @@ -49,6 +50,7 @@ namespace settings_values { const QString sourceLanguage = "auto"; const QString translationLanguage = "ru"; const int translationTimeout = 15; // secs + const QString translators = ""; } #endif // SETTINGS_H diff --git a/TranslatorHelper.cpp b/TranslatorHelper.cpp new file mode 100644 index 0000000..f79ddc4 --- /dev/null +++ b/TranslatorHelper.cpp @@ -0,0 +1,74 @@ +#include +#include +#include + +#include "TranslatorHelper.h" +#include "Settings.h" + +TranslatorHelper::TranslatorHelper () + : translatorsDir_ ("translators"), currentIndex_ (0) { +} + +void TranslatorHelper::setEnabledTranslators (const QStringList &enabled) const { + QSettings settings; + settings.beginGroup (settings_names::translationGroup); + settings.setValue (settings_names::translators, enabled.join ("|")); +} + +QStringList TranslatorHelper::possibleTranslators (QStringList &enabled) const { +#define GET(FIELD) settings.value (settings_names::FIELD, settings_values::FIELD) + QSettings settings; + settings.beginGroup (settings_names::translationGroup); + QStringList exist = QDir (translatorsDir_).entryList (QStringList () << "*.js", QDir::Files); + QStringList saved = GET (translators).toString ().split ("|", QString::SkipEmptyParts); + QStringList on, off; + std::copy_if (saved.begin (), saved.end (), std::back_inserter (on), [&](const QString &i) { + return exist.contains (i); + }); + on = on.isEmpty () ? exist : on; + + std::copy_if (exist.begin (), exist.end (), std::back_inserter (off), [&](const QString &i) { + return !on.contains (i); + }); + + enabled = on; + return (on + off); +#undef GET +} + +QStringList TranslatorHelper::enabledTranslatorScripts () const { + QStringList enabled; + possibleTranslators (enabled); + QStringList scripts; + foreach (const QString &name, enabled) { + QFile f (translatorsDir_ + QDir::separator () + name); + if (f.open (QFile::ReadOnly)) { + QString script = QString::fromUtf8 (f.readAll ()); + if (!script.isEmpty ()) { + scripts << script; + } + } + } + return scripts; +} + +void TranslatorHelper::loadScripts () { + scripts_ = enabledTranslatorScripts (); +} + +void TranslatorHelper::newItem () { + currentIndex_ = 0; +} + +QString TranslatorHelper::currentScript () const { + return (currentIndex_ < scripts_.size () ? scripts_.at (currentIndex_) : QString ()); +} + +QString TranslatorHelper::nextScript () { + ++currentIndex_; + return currentScript (); +} + +bool TranslatorHelper::gotScripts () const { + return !scripts_.isEmpty (); +} diff --git a/TranslatorHelper.h b/TranslatorHelper.h new file mode 100644 index 0000000..40370d8 --- /dev/null +++ b/TranslatorHelper.h @@ -0,0 +1,27 @@ +#ifndef TRANSLATORHELPER_H +#define TRANSLATORHELPER_H + +#include + +class TranslatorHelper { + public: + TranslatorHelper (); + + QStringList possibleTranslators (QStringList &enabled) const; + QStringList enabledTranslatorScripts () const; + + void setEnabledTranslators (const QStringList &enabled) const; + + void loadScripts (); + void newItem (); + QString currentScript () const; + QString nextScript (); + bool gotScripts () const; + + private: + QString translatorsDir_; + QStringList scripts_; + int currentIndex_; +}; + +#endif // TRANSLATORHELPER_H From 6bacb14c5613e3d829b05a91db12928f2b772219 Mon Sep 17 00:00:00 2001 From: Gres Date: Fri, 9 Oct 2015 23:20:03 +0300 Subject: [PATCH 37/89] Removed script error message support. Now it should return empty result if fails. --- WebTranslator.cpp | 6 ------ WebTranslator.h | 1 - WebTranslatorProxy.h | 1 - 3 files changed, 8 deletions(-) diff --git a/WebTranslator.cpp b/WebTranslator.cpp index 2b657f8..8f16317 100644 --- a/WebTranslator.cpp +++ b/WebTranslator.cpp @@ -27,7 +27,6 @@ WebTranslator::WebTranslator () translationTimeout_.setSingleShot (true); connect (&translationTimeout_, SIGNAL (timeout ()), SLOT (abortTranslation ())); - connect (proxy_, SIGNAL (error (QString)), SLOT (proxyError (QString))); connect (proxy_, SIGNAL (translated (QString)), SLOT (proxyTranslated (QString))); applySettings (); @@ -61,11 +60,6 @@ void WebTranslator::runScriptForItem (const ProcessingItem &item) { view_->page ()->mainFrame ()->evaluateJavaScript ("translate();"); } -void WebTranslator::proxyError (const QString &message) { - emit error (message); - finishTranslation (); -} - void WebTranslator::proxyTranslated (const QString &text) { if (!queue_.isEmpty () && queue_.first ().recognized == proxy_->sourceText ()) { ProcessingItem &item = queue_.first (); diff --git a/WebTranslator.h b/WebTranslator.h index dd77204..4d8f911 100644 --- a/WebTranslator.h +++ b/WebTranslator.h @@ -33,7 +33,6 @@ class WebTranslator : public QObject { void replyFinished (QNetworkReply *reply); void addProxyToView (); void abortTranslation (); - void proxyError (const QString &message); void proxyTranslated (const QString &text); private: diff --git a/WebTranslatorProxy.h b/WebTranslatorProxy.h index 1ff4220..20ee7f8 100644 --- a/WebTranslatorProxy.h +++ b/WebTranslatorProxy.h @@ -25,7 +25,6 @@ class WebTranslatorProxy : public QObject { signals: void translated (const QString &text); - void error (const QString &message); void resourceLoaded (const QString &url); From 3a564e85a83b57a795ce706d3c208f35328a40a5 Mon Sep 17 00:00:00 2001 From: Gres Date: Fri, 9 Oct 2015 23:33:35 +0300 Subject: [PATCH 38/89] Added support of several translators. --- WebTranslator.cpp | 67 ++++++++++++++++++++++++++++------------------- WebTranslator.h | 5 ++-- 2 files changed, 43 insertions(+), 29 deletions(-) diff --git a/WebTranslator.cpp b/WebTranslator.cpp index 8f16317..e4ac24d 100644 --- a/WebTranslator.cpp +++ b/WebTranslator.cpp @@ -9,10 +9,12 @@ #include "Settings.h" #include "StAssert.h" #include "WebTranslatorProxy.h" +#include "TranslatorHelper.h" WebTranslator::WebTranslator () : QObject (), - proxy_ (new WebTranslatorProxy (this)), view_ (new QWebView), isReady_ (true) { + proxy_ (new WebTranslatorProxy (this)), view_ (new QWebView), + translatorHelper_ (new TranslatorHelper), isReady_ (true) { view_->settings ()->setAttribute (QWebSettings::AutoLoadImages, false); view_->settings ()->setAttribute (QWebSettings::DeveloperExtrasEnabled, true); @@ -29,16 +31,18 @@ WebTranslator::WebTranslator () connect (proxy_, SIGNAL (translated (QString)), SLOT (proxyTranslated (QString))); - applySettings (); + // Delay because it can emit signal that is not connected yet. + QTimer::singleShot (500, this, SLOT (applySettings ())); } WebTranslator::~WebTranslator () { + delete translatorHelper_; delete view_; } void WebTranslator::addProxyToView () { view_->page ()->mainFrame ()->addToJavaScriptWindowObject ("st_wtp", proxy_); - view_->page ()->mainFrame ()->evaluateJavaScript (script_); + view_->page ()->mainFrame ()->evaluateJavaScript (translatorHelper_->currentScript ()); } void WebTranslator::translate (ProcessingItem item) { @@ -47,21 +51,20 @@ void WebTranslator::translate (ProcessingItem item) { } void WebTranslator::translateQueued () { - if (isReady_ && !script_.isEmpty () && !queue_.isEmpty ()) { - isReady_ = false; - runScriptForItem (queue_.first ()); - translationTimeout_.start (); + if (isReady_ && !queue_.isEmpty ()) { + translatorHelper_->newItem (); + proxy_->setItem (queue_.first ()); + if (!tryNextTranslator (true)) { + return; + } } } -void WebTranslator::runScriptForItem (const ProcessingItem &item) { - ST_ASSERT (!script_.isEmpty ()); - proxy_->setItem (item); - view_->page ()->mainFrame ()->evaluateJavaScript ("translate();"); -} - void WebTranslator::proxyTranslated (const QString &text) { if (!queue_.isEmpty () && queue_.first ().recognized == proxy_->sourceText ()) { + if (text.isEmpty () && tryNextTranslator ()) { + return; + } ProcessingItem &item = queue_.first (); item.translated = text; emit translated (item); @@ -70,12 +73,14 @@ void WebTranslator::proxyTranslated (const QString &text) { } void WebTranslator::abortTranslation () { - emit error (tr ("Перевод отменен по таймауту.")); - finishTranslation (); + if (!tryNextTranslator ()) { + emit error (tr ("Перевод отменен по таймауту.")); + finishTranslation (); + } } void WebTranslator::loadFinished (bool ok) { - if (!ok) { + if (!ok && !tryNextTranslator ()) { QString url = view_->url ().toString (); emit error (tr ("Ошибка загрузки страницы (%1) для перевода.").arg (url)); finishTranslation (); @@ -95,6 +100,21 @@ void WebTranslator::finishTranslation (bool markAsTranslated) { translateQueued (); } +bool WebTranslator::tryNextTranslator (bool firstTime) { + QString script = firstTime ? translatorHelper_->currentScript () + : translatorHelper_->nextScript (); + if (script.isEmpty ()) { + return false; + } + translationTimeout_.stop (); + view_->stop (); + addProxyToView (); + view_->page ()->mainFrame ()->evaluateJavaScript ("translate();"); + isReady_ = false; + translationTimeout_.start (); + return true; +} + void WebTranslator::replyFinished (QNetworkReply *reply) { emit proxy_->resourceLoaded (reply->url ().toString ()); } @@ -104,18 +124,11 @@ void WebTranslator::applySettings () { settings.beginGroup (settings_names::translationGroup); #define GET(NAME) settings.value (settings_names::NAME, settings_values::NAME) translationTimeout_.setInterval (GET (translationTimeout).toInt () * 1000); + translatorHelper_->loadScripts (); + if (!translatorHelper_->gotScripts ()) { + emit error (tr ("Нет сценариев для перевода. Измените настройки.")); + } #undef GET - - QFile f ("translators/google.js"); - if (f.open (QFile::ReadOnly)) { - script_ = QString::fromUtf8 (f.readAll ()); - if (script_.isEmpty ()) { - emit error (tr ("Пустой сценарий для перевода. Перевод недоступен.")); - } - } - else { - emit error (tr ("Не считан сценарий для перевода. Перевод недоступен.")); - } } void WebTranslator::setDebugMode (bool isOn) { diff --git a/WebTranslator.h b/WebTranslator.h index 4d8f911..8cb60ba 100644 --- a/WebTranslator.h +++ b/WebTranslator.h @@ -11,6 +11,7 @@ class QWebView; class QNetworkReply; class WebTranslatorProxy; +class TranslatorHelper; class WebTranslator : public QObject { Q_OBJECT @@ -37,15 +38,15 @@ class WebTranslator : public QObject { private: void translateQueued (); - void runScriptForItem (const ProcessingItem &item); void finishTranslation (bool markAsTranslated = true); + bool tryNextTranslator (bool firstTime = false); private: WebTranslatorProxy *proxy_; QWebView *view_; + TranslatorHelper *translatorHelper_; QVector queue_; bool isReady_; - QString script_; QTimer translationTimeout_; }; From a7ffec88274c370424abd196d8651b864b77edc1 Mon Sep 17 00:00:00 2001 From: Gres Date: Fri, 9 Oct 2015 23:33:49 +0300 Subject: [PATCH 39/89] Added and updated translators. --- translators/bing.js | 33 +++++++++++++++++++++++++++++++++ translators/google.js | 7 +++++-- translators/yandex.js | 31 +++++++++++++++++++++++++++++++ 3 files changed, 69 insertions(+), 2 deletions(-) create mode 100644 translators/bing.js create mode 100644 translators/yandex.js diff --git a/translators/bing.js b/translators/bing.js new file mode 100644 index 0000000..7e476be --- /dev/null +++ b/translators/bing.js @@ -0,0 +1,33 @@ +var isPageLoaded = false; +var isTranslationFinished = false; // async translation request +var isScheduled = false; + +function checkFinished () { + if (!isPageLoaded || !isTranslationFinished || isScheduled) return; + isScheduled = true; + setTimeout(function () { + var spans = [].slice.call (document.querySelectorAll ('#OutputText span')); + var text = spans.reduce (function (res, i) { + return res + i.innerText; + }, ''); + st_wtp.translated (text); + }, 500); // wait for gui fill +} +function onResourceLoad (url) { + if (url.indexOf ('/api.microsofttranslator.com/') > -1) { + isTranslationFinished = true; + checkFinished (); + } +} +st_wtp.resourceLoaded.connect (onResourceLoad); +function onPageLoad () { + isPageLoaded = true; + checkFinished (); +} +window.onload = onPageLoad(); + +function translate (){ + var url = 'https://bing.com/translator/?text=' + st_wtp.sourceText + '#auto/' + + st_wtp.resultLanguage; + window.location = encodeURI (url); +} diff --git a/translators/google.js b/translators/google.js index 11f0499..7cc4b54 100644 --- a/translators/google.js +++ b/translators/google.js @@ -1,14 +1,17 @@ var isPageLoaded = false; var isTranslationFinished = false; // async translation request +var isScheduled = false; function checkFinished () { - if (!isPageLoaded || !isTranslationFinished) return; + if (!isPageLoaded || !isTranslationFinished || isScheduled) return; + isScheduled = true; setTimeout(function () { var spans = [].slice.call (document.querySelectorAll ('#result_box > span')); var text = spans.reduce (function (res, i) { return res + ' ' + i.innerText; }, ''); st_wtp.translated (text); + isTranslationFinished = isScheduled = false; }, 500); // wait for gui fill } function onResourceLoad (url) { @@ -27,5 +30,5 @@ window.onload = onPageLoad(); function translate (){ var url = 'https://translate.google.com/#auto/' + st_wtp.resultLanguage + '/' + st_wtp.sourceText; - window.location = url; + window.location = encodeURI (url); } diff --git a/translators/yandex.js b/translators/yandex.js new file mode 100644 index 0000000..01d71e1 --- /dev/null +++ b/translators/yandex.js @@ -0,0 +1,31 @@ +var isPageLoaded = false; +var isTranslationFinished = true; // async translation request +var isScheduled = false; + +function checkFinished () { + if (!isPageLoaded || !isTranslationFinished || isScheduled) return; + isScheduled = true; + setTimeout(function () { + var spans = [].slice.call (document.querySelectorAll ('#translation > span')); + var text = spans.reduce (function (res, i) { + return res + i.innerText; + }, ''); + st_wtp.translated (text); + }, 500); // wait for gui fill +} +function onResourceLoad (url) { +} +st_wtp.resourceLoaded.connect (onResourceLoad); +function onPageLoad () { + isPageLoaded = true; + checkFinished (); +} +window.onload = onPageLoad(); + +function translate (){ + var url = 'https://translate.yandex.ru/?text=' + st_wtp.sourceText + '&lang=auto-' + + st_wtp.resultLanguage; + url = url.replace(new RegExp(' ','g') , '%20') + console.log(encodeURI(url)); + window.location = (url); +} From 90cce0a3705fcd4c5adaa93fda50a82a77b3ce86 Mon Sep 17 00:00:00 2001 From: Gres Date: Fri, 9 Oct 2015 23:34:03 +0300 Subject: [PATCH 40/89] Added translator debug mode. --- Settings.h | 2 ++ WebTranslator.cpp | 2 ++ 2 files changed, 4 insertions(+) diff --git a/Settings.h b/Settings.h index e80a1bf..040bba5 100644 --- a/Settings.h +++ b/Settings.h @@ -25,6 +25,7 @@ namespace settings_names { const QString sourceLanguage = "source_language"; const QString translationLanguage = "translation_language"; const QString translationTimeout = "translation_timeout"; + const QString translationDebugMode = "translation_debug"; const QString translators = "translators"; } @@ -50,6 +51,7 @@ namespace settings_values { const QString sourceLanguage = "auto"; const QString translationLanguage = "ru"; const int translationTimeout = 15; // secs + const bool translationDebugMode = false; const QString translators = ""; } diff --git a/WebTranslator.cpp b/WebTranslator.cpp index e4ac24d..9166f95 100644 --- a/WebTranslator.cpp +++ b/WebTranslator.cpp @@ -128,6 +128,8 @@ void WebTranslator::applySettings () { if (!translatorHelper_->gotScripts ()) { emit error (tr ("Нет сценариев для перевода. Измените настройки.")); } + bool debugMode = GET (translationDebugMode).toBool (); + setDebugMode (debugMode); #undef GET } From 468a6fd039f4ac8c6f6ad69492ba63af51c3ac12 Mon Sep 17 00:00:00 2001 From: Gres Date: Fri, 9 Oct 2015 23:34:24 +0300 Subject: [PATCH 41/89] SettingsEditor updated. Added rescent translator settings. --- SettingsEditor.cpp | 42 +++- SettingsEditor.h | 2 + SettingsEditor.ui | 507 +++++++++++++++++++++++++-------------------- 3 files changed, 325 insertions(+), 226 deletions(-) diff --git a/SettingsEditor.cpp b/SettingsEditor.cpp index 0fc694f..1f452eb 100644 --- a/SettingsEditor.cpp +++ b/SettingsEditor.cpp @@ -1,15 +1,17 @@ #include "SettingsEditor.h" #include "ui_SettingsEditor.h" #include "LanguageHelper.h" +#include "TranslatorHelper.h" #include #include +#include #include "Settings.h" SettingsEditor::SettingsEditor (const LanguageHelper &dictionary, QWidget *parent) : QDialog (parent), - ui (new Ui::SettingsEditor), dictionary_ (dictionary), + ui (new Ui::SettingsEditor), translatorHelper_ (new TranslatorHelper), dictionary_ (dictionary), buttonGroup_ (new QButtonGroup (this)) { ui->setupUi (this); @@ -27,6 +29,7 @@ SettingsEditor::SettingsEditor (const LanguageHelper &dictionary, QWidget *paren SettingsEditor::~SettingsEditor () { saveState (); + delete translatorHelper_; delete ui; } @@ -52,19 +55,32 @@ void SettingsEditor::saveSettings () const { settings.beginGroup (recogntionGroup); settings.setValue (tessDataPlace, ui->tessdataEdit->text ()); - QString ocrLanguage = dictionary_.ocrUiToCode (ui->ocrLangCombo->currentText ()); - settings.setValue (ocrLanguage, ocrLanguage); + QString ocrLanguageVal = dictionary_.ocrUiToCode (ui->ocrLangCombo->currentText ()); + settings.setValue (ocrLanguage, ocrLanguageVal); settings.setValue (imageScale, ui->imageScaleSpin->value ()); settings.endGroup (); settings.beginGroup (translationGroup); - settings.setValue (doTranslation, ui->doTranslationCombo->isChecked ()); + settings.setValue (doTranslation, ui->doTranslationCheck->isChecked ()); + settings.setValue (translationDebugMode, ui->translatorDebugCheck->isChecked ()); QString trLanguage = dictionary_.translateUiToCode (ui->translateLangCombo->currentText ()); settings.setValue (translationLanguage, trLanguage); - QString sourceLanguage = dictionary_.translateForOcrCode (ocrLanguage); - settings.setValue (sourceLanguage, sourceLanguage); + QString sourceLanguageVal = dictionary_.translateForOcrCode (ocrLanguage); + settings.setValue (sourceLanguage, sourceLanguageVal); settings.setValue (translationTimeout, ui->translateTimeoutSpin->value ()); + + {//Translators + QStringList enabled; + for (int i = 0, end = ui->translatorList->count (); i < end; ++i) { + QListWidgetItem *item = ui->translatorList->item (i); + if (item->checkState () == Qt::Checked) { + enabled << item->text (); + } + } + translatorHelper_->setEnabledTranslators (enabled); + } + settings.endGroup (); } @@ -102,10 +118,22 @@ void SettingsEditor::loadSettings () { settings.endGroup (); settings.beginGroup (settings_names::translationGroup); - ui->doTranslationCombo->setChecked (GET (doTranslation).toBool ()); + ui->doTranslationCheck->setChecked (GET (doTranslation).toBool ()); + ui->translatorDebugCheck->setChecked (GET (translationDebugMode).toBool ()); QString trLanguage = dictionary_.translateCodeToUi (GET (translationLanguage).toString ()); ui->translateLangCombo->setCurrentText (trLanguage); ui->translateTimeoutSpin->setValue (GET (translationTimeout).toInt ()); + + {// Translators + QStringList enabled; + ui->translatorList->addItems (translatorHelper_->possibleTranslators (enabled)); + for (int i = 0, end = ui->translatorList->count (); i < end; ++i) { + QListWidgetItem *item = ui->translatorList->item (i); + Qt::CheckState state = enabled.contains (item->text ()) ? Qt::Checked : Qt::Unchecked; + item->setCheckState (state); + } + } + settings.endGroup (); #undef GET } diff --git a/SettingsEditor.h b/SettingsEditor.h index 2fb0861..0558bc2 100644 --- a/SettingsEditor.h +++ b/SettingsEditor.h @@ -9,6 +9,7 @@ namespace Ui { class SettingsEditor; } class LanguageHelper; +class TranslatorHelper; class SettingsEditor : public QDialog { Q_OBJECT @@ -35,6 +36,7 @@ class SettingsEditor : public QDialog { private: Ui::SettingsEditor *ui; + TranslatorHelper *translatorHelper_; const LanguageHelper &dictionary_; QButtonGroup *buttonGroup_; }; diff --git a/SettingsEditor.ui b/SettingsEditor.ui index c255e6a..c74df95 100644 --- a/SettingsEditor.ui +++ b/SettingsEditor.ui @@ -6,92 +6,15 @@ 0 0 - 603 - 296 + 509 + 338 Настройки - - - - - Qt::Vertical - - - - 20 - 1 - - - - - - - - Распознавание - - - - - - <html><head/><body><p>Необходимо для распознавания.</p><p>Скачивается отсюда: <a href="https://github.com/tesseract-ocr/tessdata"><span style=" text-decoration: underline; color:#7593bc;">https://github.com/tesseract-ocr/tessdata</span></a></p><p>&quot;./&quot; означает, что папка &quot;tessdata&quot; находится в одной директории с исполняемым файлом программы.</p></body></html> - - - Путь к tessdata - - - tessdataEdit - - - - - - - - - - ... - - - - - - - <html><head/><body><p>Заполняется на основании содержания tessdata</p></body></html> - - - Язык распознавания - - - ocrLangCombo - - - - - - - <html><head/><body><p>Масштабирование изображения для улучшения распознания. Больше - лучше (до определенных пределов), но медленнее и потребляет больше памяти.</p><p>Рекомендуемые значения от 5 до 10.</p></body></html> - - - Увеличение масштаба - - - imageScaleSpin - - - - - - - - - - - - - + + Qt::Horizontal @@ -101,154 +24,300 @@ - - - - Вывод результата + + + + 0 - - - - - Трей - - - - - - - Окно - - - true - - - - - - - - - - Горячие клавиши - - - - - - <html><head/><body><p>Сочетание клавиш для перехода в режим захвата.</p></body></html> - - - Захватить - - - - - - - - - - <html><head/><body><p>Сочетание клавиш для перехода в режим захвата, но с использованием последнего использованного, а не текущего, изображения.</p></body></html> - - - Захватить повторно - - - - - - - - - - <html><head/><body><p>Сочетание клавиш для повторного отображения последнего результата.</p></body></html> - - - Показать - - - - - - - - - - <html><head/><body><p>Сочетание клавиш для копирования последнего результата в буфер обмена.</p></body></html> - - - Скопировать - - - - - - - - - - - - - Перевод - - - - - - <html><head/><body><p>Необходимо ли переводить (вкл) распознанный текст.</p></body></html> - - - Переводить текст - - - - - - - <html><head/><body><p>Максимальное время, которое может быть затрачено на перевод, чтобы он не считался &quot;зависшим&quot;.</p></body></html> - - - Максимальное время перевода: - - - - - - - сек. - - - - - - - <html><head/><body><p>Язык, на который осуществляется перевод.</p></body></html> - - - Язык результата: - - - translateLangCombo - - - - - - - + + + Общее + + + + + + Горячие клавиши + + + + + + <html><head/><body><p>Сочетание клавиш для перехода в режим захвата.</p></body></html> + + + Захватить + + + + + + + + + + <html><head/><body><p>Сочетание клавиш для перехода в режим захвата, но с использованием последнего использованного, а не текущего, изображения.</p></body></html> + + + Захватить повторно + + + + + + + + + + <html><head/><body><p>Сочетание клавиш для повторного отображения последнего результата.</p></body></html> + + + Показать + + + + + + + + + + <html><head/><body><p>Сочетание клавиш для копирования последнего результата в буфер обмена.</p></body></html> + + + Скопировать + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 270 + + + + + + + + Вывод результата + + + + + + Трей + + + + + + + Окно + + + true + + + + + + + + + + + Распознавание + + + + + + <html><head/><body><p>Необходимо для распознавания.</p><p>Скачивается отсюда: <a href="https://github.com/tesseract-ocr/tessdata"><span style=" text-decoration: underline; color:#7593bc;">https://github.com/tesseract-ocr/tessdata</span></a></p><p>&quot;./&quot; означает, что папка &quot;tessdata&quot; находится в одной директории с исполняемым файлом программы.</p></body></html> + + + Путь к tessdata + + + tessdataEdit + + + + + + + + + + ... + + + + + + + <html><head/><body><p>Заполняется на основании содержания tessdata</p></body></html> + + + Язык распознавания + + + ocrLangCombo + + + + + + + + + + <html><head/><body><p>Масштабирование изображения для улучшения распознания. Больше - лучше (до определенных пределов), но медленнее и потребляет больше памяти.</p><p>Рекомендуемые значения от 5 до 10.</p></body></html> + + + Увеличение масштаба + + + imageScaleSpin + + + + + + + + + + Qt::Vertical + + + + 20 + 132 + + + + + + + + + Перевод + + + + + + <html><head/><body><p>Необходимо ли переводить (вкл) распознанный текст.</p></body></html> + + + Переводить текст + + + + + + + <html><head/><body><p>Отображает окно переводчика. Следует использовать только для разработки переводчиков.</p></body></html> + + + Режим отладки + + + + + + + <html><head/><body><p>Максимальное время, которое может быть затрачено на перевод, чтобы он не считался &quot;зависшим&quot;.</p></body></html> + + + Максимальное время перевода: + + + + + + + <html><head/><body><p>Язык, на который осуществляется перевод.</p></body></html> + + + Язык результата: + + + translateLangCombo + + + + + + + Переводчики: + + + Qt::AlignCenter + + + + + + + + + + сек. + + + + + + + <html><head/><body><p>Отображены в порядке убывания приоритета.</p></body></html> + + + QAbstractItemView::NoEditTriggers + + + QAbstractItemView::InternalMove + + + Qt::MoveAction + + + + + - translateLangCombo + tabWidget + captureEdit + repeatCaptureEdit + repeatEdit + clipboardEdit + trayRadio + dialogRadio tessdataEdit tessdataButton ocrLangCombo imageScaleSpin - buttonBox + doTranslationCheck + translatorDebugCheck + translateTimeoutSpin + translateLangCombo + translatorList From 2a1ee13b46cebb7e05ac386b4a1c475e768c8c91 Mon Sep 17 00:00:00 2001 From: Gres Date: Fri, 9 Oct 2015 23:36:58 +0300 Subject: [PATCH 42/89] Readme update. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index df927c9..f70307d 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ Usage Features -------- -* Many OCR languages (can be modified dynamicly) +* Many OCR languages (can be modified dynamically) * Global hotkeys for main actions * Copy last translation to clipboard * Repeat last translation @@ -27,7 +27,7 @@ Limitations ----------- * Works only on primary screen * Can not capture some dynamic web-pages -* Not very precise OCR (need better preprocessing steps) +* Not very precise OCR Used software ------------- From 9083a7ca6c77cfaf1f040e48685eb37b3278be12 Mon Sep 17 00:00:00 2001 From: Gres Date: Fri, 9 Oct 2015 23:56:48 +0300 Subject: [PATCH 43/89] Pass ProcessingItem through Translator event if it should not be translated (allow user to choose it be key modifiers). --- Manager.cpp | 23 +++++------------------ Manager.h | 2 +- WebTranslator.cpp | 4 ++++ 3 files changed, 10 insertions(+), 19 deletions(-) diff --git a/Manager.cpp b/Manager.cpp index 3228f39..071c713 100644 --- a/Manager.cpp +++ b/Manager.cpp @@ -29,7 +29,7 @@ Manager::Manager (QObject *parent) : resultDialog_ (new ResultDialog (*dictionary_)), captureAction_ (NULL), repeatCaptureAction_ (NULL), repeatAction_ (NULL), clipboardAction_ (NULL), - useResultDialog_ (true) { + useResultDialog_ (true), doTranslation_ (true) { GlobalActionHelper::init (); qRegisterMetaType(); @@ -38,7 +38,7 @@ Manager::Manager (QObject *parent) : connect (this, SIGNAL (requestRecognize (ProcessingItem)), recognizer, SLOT (recognize (ProcessingItem))); connect (recognizer, SIGNAL (recognized (ProcessingItem)), - SIGNAL (recognized (ProcessingItem))); + this, SIGNAL (requestTranslate (ProcessingItem))); connect (recognizer, SIGNAL (error (QString)), SLOT (showError (QString))); connect (this, SIGNAL (settingsEdited ()), @@ -157,25 +157,11 @@ void Manager::applySettings () { settings.beginGroup (settings_names::translationGroup); defaultTranslationLanguage_ = GET (translationLanguage).toString (); + doTranslation_ = GET (doTranslation).toBool (); settings.endGroup (); Q_CHECK_PTR (dictionary_); dictionary_->updateAvailableOcrLanguages (); - - settings.beginGroup (settings_names::translationGroup); - bool doTranslation = GET (doTranslation).toBool (); - if (doTranslation) { - disconnect (this, SIGNAL (recognized (ProcessingItem)), - this, SLOT (showResult (ProcessingItem))); - connect (this, SIGNAL (recognized (ProcessingItem)), - this, SIGNAL (requestTranslate (ProcessingItem)), Qt::UniqueConnection); - } - else { - disconnect (this, SIGNAL (recognized (ProcessingItem)), - this, SIGNAL (requestTranslate (ProcessingItem))); - connect (this, SIGNAL (recognized (ProcessingItem)), - this, SLOT (showResult (ProcessingItem)), Qt::UniqueConnection); - } #undef GET } @@ -210,7 +196,8 @@ void Manager::capture () { } void Manager::handleSelection (ProcessingItem item) { - if (item.translateLanguage.isEmpty ()) { + bool altMod = item.modifiers & Qt::AltModifier; + if ((doTranslation_ && !altMod) || (!doTranslation_ && altMod)) { item.translateLanguage = defaultTranslationLanguage_; } emit requestRecognize (item); diff --git a/Manager.h b/Manager.h index 070d465..90111d2 100644 --- a/Manager.h +++ b/Manager.h @@ -23,7 +23,6 @@ class Manager : public QObject { signals: void requestRecognize (ProcessingItem item); - void recognized (ProcessingItem item); void requestTranslate (ProcessingItem item); void closeSelections (); void settingsEdited (); @@ -64,6 +63,7 @@ class Manager : public QObject { //! Used threads. For proper termination. QList threads_; QString defaultTranslationLanguage_; + bool doTranslation_; }; #endif // MANAGER_H diff --git a/WebTranslator.cpp b/WebTranslator.cpp index 9166f95..8aafbfa 100644 --- a/WebTranslator.cpp +++ b/WebTranslator.cpp @@ -46,6 +46,10 @@ void WebTranslator::addProxyToView () { } void WebTranslator::translate (ProcessingItem item) { + if (item.translateLanguage.isEmpty ()) { + emit translated (item); + return; + } queue_.push_back (item); translateQueued (); } From 350fa4cd7239a5a1d5ae5520d915e047b6541422 Mon Sep 17 00:00:00 2001 From: Gres Date: Sat, 10 Oct 2015 00:06:10 +0300 Subject: [PATCH 44/89] Auto retranslate item after user edition if it should be. --- Manager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Manager.cpp b/Manager.cpp index 071c713..ab16d76 100644 --- a/Manager.cpp +++ b/Manager.cpp @@ -270,7 +270,7 @@ void Manager::editRecognized (ProcessingItem item) { NULL, tr ("Правка"), tr ("Исправьте распознанный текст"), item.recognized); if (!fixed.isEmpty ()) { item.recognized = fixed; - showResult (item); + emit requestTranslate (item); } } From a7977a1f0ed5a998b4e2d3d14e3d6d9ae418b09a Mon Sep 17 00:00:00 2001 From: Gres Date: Sat, 10 Oct 2015 00:20:14 +0300 Subject: [PATCH 45/89] Added ability to copy selected image to clipboard. --- Manager.cpp | 10 ++++++++++ Manager.h | 1 + ResultDialog.cpp | 6 +++++- ResultDialog.h | 2 ++ 4 files changed, 18 insertions(+), 1 deletion(-) diff --git a/Manager.cpp b/Manager.cpp index ab16d76..192deb5 100644 --- a/Manager.cpp +++ b/Manager.cpp @@ -70,6 +70,8 @@ Manager::Manager (QObject *parent) : connect (resultDialog_, SIGNAL (requestTranslate (ProcessingItem)), this, SIGNAL (requestTranslate (ProcessingItem))); connect (resultDialog_, SIGNAL (requestClipboard ()), SLOT (copyLastToClipboard ())); + connect (resultDialog_, SIGNAL (requestImageClipboard ()), + SLOT (copyLastImageToClipboard ())); connect (resultDialog_, SIGNAL (requestEdition (ProcessingItem)), this, SLOT (editRecognized (ProcessingItem))); @@ -293,6 +295,14 @@ void Manager::copyLastToClipboard () { } } +void Manager::copyLastImageToClipboard () { + const ProcessingItem &item = resultDialog_->item (); + if (item.isValid ()) { + QClipboard *clipboard = QApplication::clipboard (); + clipboard->setPixmap (item.source); + } +} + void Manager::showResult (ProcessingItem item) { ST_ASSERT (item.isValid ()); if (useResultDialog_) { diff --git a/Manager.h b/Manager.h index 90111d2..710d6cb 100644 --- a/Manager.h +++ b/Manager.h @@ -35,6 +35,7 @@ class Manager : public QObject { void about (); void showLast (); void copyLastToClipboard (); + void copyLastImageToClipboard (); void applySettings (); diff --git a/ResultDialog.cpp b/ResultDialog.cpp index 747cf00..86ed792 100644 --- a/ResultDialog.cpp +++ b/ResultDialog.cpp @@ -12,7 +12,7 @@ ResultDialog::ResultDialog (const LanguageHelper &dictionary, QWidget *parent) : ui (new Ui::ResultDialog), dictionary_ (dictionary), contextMenu_ (NULL), recognizeSubMenu_ (NULL), translateSubMenu_ (NULL), - clipboardAction_ (NULL), correctAction_ (NULL) { + clipboardAction_ (NULL), imageClipboardAction_ (NULL), correctAction_ (NULL) { ui->setupUi (this); setWindowFlags (Qt::FramelessWindowHint | Qt::NoDropShadowWindowHint | Qt::WindowStaysOnTopHint | Qt::X11BypassWindowManagerHint); @@ -41,6 +41,7 @@ void ResultDialog::createContextMenu () { recognizeSubMenu_ = contextMenu_->addMenu (tr ("Распознать другой язык")); translateSubMenu_ = contextMenu_->addMenu (tr ("Перевести на другой язык")); clipboardAction_ = contextMenu_->addAction (tr ("Скопировать в буфер")); + imageClipboardAction_ = contextMenu_->addAction (tr ("Скопировать рисунок в буфер")); correctAction_ = contextMenu_->addAction (tr ("Исправить распознанный текст")); } @@ -65,6 +66,9 @@ bool ResultDialog::eventFilter (QObject *object, QEvent *event) { else if (action == clipboardAction_) { emit requestClipboard (); } + else if (action == imageClipboardAction_) { + emit requestImageClipboard (); + } else if (action == correctAction_) { emit requestEdition (item_); // Return because Manager calls showResult() before hide() otherwise. diff --git a/ResultDialog.h b/ResultDialog.h index 6574d7e..efb54d4 100644 --- a/ResultDialog.h +++ b/ResultDialog.h @@ -22,6 +22,7 @@ class ResultDialog : public QDialog { void requestRecognize (ProcessingItem item); void requestTranslate (ProcessingItem item); void requestClipboard (); // Assume that slot will be called immediately. + void requestImageClipboard (); // Assume that slot will be called immediately. void requestEdition (ProcessingItem item); public: @@ -42,6 +43,7 @@ class ResultDialog : public QDialog { QMenu *recognizeSubMenu_; QMenu *translateSubMenu_; QAction *clipboardAction_; + QAction *imageClipboardAction_; QAction *correctAction_; ProcessingItem item_; }; From fd78dde8376eaf44fb5c30d43b9d6553e45678d6 Mon Sep 17 00:00:00 2001 From: Gres Date: Sat, 10 Oct 2015 00:20:54 +0300 Subject: [PATCH 46/89] Remove obsolete file. --- ScreenTranslator.pro | 1 - 1 file changed, 1 deletion(-) diff --git a/ScreenTranslator.pro b/ScreenTranslator.pro index 77d9091..b7abe99 100644 --- a/ScreenTranslator.pro +++ b/ScreenTranslator.pro @@ -74,7 +74,6 @@ OTHER_FILES += \ images/icon.ico \ README.md \ uncrustify.cfg\ - images/README.md \ translators/google.js \ translators/yandex.js \ translators/bing.js \ From 0fd694787a03dc127c37f54f21f7140bc90992dc Mon Sep 17 00:00:00 2001 From: Gres Date: Sat, 10 Oct 2015 13:33:18 +0300 Subject: [PATCH 47/89] Added ability to automatically fix defined recognition errors. --- Recognizer.cpp | 9 +++-- Recognizer.h | 2 + RecognizerHelper.cpp | 78 +++++++++++++++++++++++++++++++++++++++ RecognizerHelper.h | 33 +++++++++++++++++ ScreenTranslator.pro | 6 ++- SettingsEditor.cpp | 87 +++++++++++++++++++++++++++++++++++++++++++- SettingsEditor.h | 9 +++++ SettingsEditor.ui | 47 ++++++++++++++++++------ 8 files changed, 253 insertions(+), 18 deletions(-) create mode 100644 RecognizerHelper.cpp create mode 100644 RecognizerHelper.h diff --git a/Recognizer.cpp b/Recognizer.cpp index 895234b..caa274f 100644 --- a/Recognizer.cpp +++ b/Recognizer.cpp @@ -8,10 +8,11 @@ #include "Settings.h" #include "ImageProcessing.h" #include "StAssert.h" +#include "RecognizerHelper.h" Recognizer::Recognizer (QObject *parent) : QObject (parent), - engine_ (NULL), imageScale_ (0) { + engine_ (NULL), recognizerHelper_ (new RecognizerHelper), imageScale_ (0) { applySettings (); } @@ -19,6 +20,8 @@ void Recognizer::applySettings () { QSettings settings; settings.beginGroup (settings_names::recogntionGroup); + recognizerHelper_->load (); + tessDataDir_ = settings.value (settings_names::tessDataPlace, settings_values::tessDataPlace).toString (); if (tessDataDir_.right (1) != "/") { @@ -57,8 +60,8 @@ void Recognizer::recognize (ProcessingItem item) { bool isCustomLanguage = (!item.ocrLanguage.isEmpty () && item.ocrLanguage != ocrLanguage_); tesseract::TessBaseAPI *engine = (isCustomLanguage) ? NULL : engine_; + QString language = (isCustomLanguage) ? item.ocrLanguage : ocrLanguage_; if (engine == NULL) { - QString language = (isCustomLanguage) ? item.ocrLanguage : ocrLanguage_; if (!initEngine (engine, language)) { return; } @@ -78,7 +81,7 @@ void Recognizer::recognize (ProcessingItem item) { } if (!result.isEmpty ()) { - item.recognized = result; + item.recognized = recognizerHelper_->substitute (result, language); emit recognized (item); } else { diff --git a/Recognizer.h b/Recognizer.h index 5cfde88..b7e5760 100644 --- a/Recognizer.h +++ b/Recognizer.h @@ -9,6 +9,7 @@ namespace tesseract { class TessBaseAPI; } +class RecognizerHelper; class Recognizer : public QObject { Q_OBJECT @@ -29,6 +30,7 @@ class Recognizer : public QObject { private: tesseract::TessBaseAPI *engine_; + RecognizerHelper *recognizerHelper_; QString tessDataDir_; QString ocrLanguage_; diff --git a/RecognizerHelper.cpp b/RecognizerHelper.cpp new file mode 100644 index 0000000..844c9c9 --- /dev/null +++ b/RecognizerHelper.cpp @@ -0,0 +1,78 @@ +#include + +#include "RecognizerHelper.h" + +RecognizerHelper::RecognizerHelper () + : fileName_ ("subs.csv") { +} + +void RecognizerHelper::load () { + subs_.clear (); + QFile f (fileName_); + if (!f.open (QFile::ReadOnly)) { + return; + } + QByteArray data = f.readAll (); + f.close (); + QStringList lines = QString::fromUtf8 (data).split ('\n', QString::SkipEmptyParts); + foreach (const QString &line, lines) { + QStringList parts = line.mid (1, line.size () - 2).split ("\",\""); // remove " + if (parts.size () < 3) { + continue; + } + subs_.append (Sub (parts[0], parts[1], parts[2])); + } +} + +void RecognizerHelper::save () { + QFile f (fileName_); + if (!f.open (QFile::WriteOnly)) { + return; + } + foreach (const Sub &sub, subs_) { + QStringList parts = QStringList () << sub.language << sub.source << sub.target; + QString line = "\"" + parts.join ("\",\"") + "\"\n"; + f.write (line.toUtf8 ()); + } + f.close (); +} + +QString RecognizerHelper::substitute (const QString &source, const QString &language) const { + QString result = source; + while (true) { + int bestMatchIndex = -1; + int bestMatchLen = 0; + int index = -1; + foreach (const Sub &sub, subs_) { + ++index; + if (sub.language != language || !result.contains (sub.source)) { + continue; + } + int len = sub.source.length (); + if (len > bestMatchLen) { + bestMatchLen = len; + bestMatchIndex = index; + } + } + if (bestMatchIndex > -1) { + const Sub &sub = subs_.at (bestMatchIndex); + result.replace (sub.source, sub.target); + continue; + } + break; + } + + return result; +} + +const RecognizerHelper::Subs &RecognizerHelper::subs () const { + return subs_; +} + +void RecognizerHelper::setSubs (const Subs &subs) { + subs_ = subs; +} + +RecognizerHelper::Sub::Sub (const QString &language, const QString &source, const QString &target) + : language (language), source (source), target (target) { +} diff --git a/RecognizerHelper.h b/RecognizerHelper.h new file mode 100644 index 0000000..eff2e15 --- /dev/null +++ b/RecognizerHelper.h @@ -0,0 +1,33 @@ +#ifndef RECOGNIZERHELPER_H +#define RECOGNIZERHELPER_H + +#include + +class RecognizerHelper { + public: + struct Sub { + Sub (const QString &language = QString (), const QString &source = QString (), + const QString &target = QString ()); + QString language; + QString source; + QString target; + }; + typedef QList Subs; + + public: + RecognizerHelper (); + + void load (); + void save (); + + QString substitute (const QString &source, const QString& language) const; + + const Subs &subs () const; + void setSubs (const Subs &subs); + + private: + QString fileName_; + Subs subs_; +}; + +#endif // RECOGNIZERHELPER_H diff --git a/ScreenTranslator.pro b/ScreenTranslator.pro index b7abe99..0147d6a 100644 --- a/ScreenTranslator.pro +++ b/ScreenTranslator.pro @@ -39,7 +39,8 @@ SOURCES += main.cpp\ LanguageHelper.cpp \ WebTranslator.cpp \ WebTranslatorProxy.cpp \ - TranslatorHelper.cpp + TranslatorHelper.cpp \ + RecognizerHelper.cpp HEADERS += \ Manager.h \ @@ -55,7 +56,8 @@ HEADERS += \ WebTranslator.h \ WebTranslatorProxy.h \ StAssert.h \ - TranslatorHelper.h + TranslatorHelper.h \ + RecognizerHelper.h FORMS += \ SettingsEditor.ui \ diff --git a/SettingsEditor.cpp b/SettingsEditor.cpp index 1f452eb..eddf170 100644 --- a/SettingsEditor.cpp +++ b/SettingsEditor.cpp @@ -2,6 +2,8 @@ #include "ui_SettingsEditor.h" #include "LanguageHelper.h" #include "TranslatorHelper.h" +#include "RecognizerHelper.h" +#include "StAssert.h" #include #include @@ -11,7 +13,8 @@ SettingsEditor::SettingsEditor (const LanguageHelper &dictionary, QWidget *parent) : QDialog (parent), - ui (new Ui::SettingsEditor), translatorHelper_ (new TranslatorHelper), dictionary_ (dictionary), + ui (new Ui::SettingsEditor), translatorHelper_ (new TranslatorHelper), + recognizerHelper_ (new RecognizerHelper), dictionary_ (dictionary), buttonGroup_ (new QButtonGroup (this)) { ui->setupUi (this); @@ -22,6 +25,9 @@ SettingsEditor::SettingsEditor (const LanguageHelper &dictionary, QWidget *paren connect (ui->tessdataEdit, SIGNAL (textChanged (const QString &)), SLOT (initOcrLangCombo (const QString &))); + connect (ui->recognizerFixTable, SIGNAL (itemChanged (QTableWidgetItem *)), + SLOT (recognizerFixTableItemChanged (QTableWidgetItem *))); + ui->translateLangCombo->addItems (dictionary_.translateLanguagesUi ()); loadSettings (); loadState (); @@ -29,6 +35,7 @@ SettingsEditor::SettingsEditor (const LanguageHelper &dictionary, QWidget *paren SettingsEditor::~SettingsEditor () { saveState (); + delete recognizerHelper_; delete translatorHelper_; delete ui; } @@ -58,8 +65,29 @@ void SettingsEditor::saveSettings () const { QString ocrLanguageVal = dictionary_.ocrUiToCode (ui->ocrLangCombo->currentText ()); settings.setValue (ocrLanguage, ocrLanguageVal); settings.setValue (imageScale, ui->imageScaleSpin->value ()); - settings.endGroup (); + { //Recognizer substitutions + RecognizerHelper::Subs subs; + QTableWidget *t = ui->recognizerFixTable; // Shortcut + for (int i = 0, end = t->rowCount () - 1; i < end; ++i) { + QComboBox *combo = static_cast(t->cellWidget (i, SubsColLanguage)); + QString langUi = combo->currentText (); + RecognizerHelper::Sub sub; + sub.language = dictionary_.ocrUiToCode (langUi); +#define GET(COL) (t->item (i, COL) ? t->item (i, COL)->text () : QString ()) + sub.source = GET (SubsColSource); + sub.target = GET (SubsColTarget); +#undef GET + if (langUi.isEmpty () || sub.language == langUi || sub.source.isEmpty ()) { + continue; + } + subs.append (sub); + } + recognizerHelper_->setSubs (subs); + recognizerHelper_->save (); + } + + settings.endGroup (); settings.beginGroup (translationGroup); settings.setValue (doTranslation, ui->doTranslationCheck->isChecked ()); @@ -115,8 +143,28 @@ void SettingsEditor::loadSettings () { QString ocrLanguage = dictionary_.ocrCodeToUi (GET (ocrLanguage).toString ()); ui->ocrLangCombo->setCurrentText (ocrLanguage); ui->imageScaleSpin->setValue (GET (imageScale).toInt ()); + + {//Recognizer substitutions + recognizerHelper_->load (); + RecognizerHelper::Subs subs = recognizerHelper_->subs (); + ui->recognizerFixTable->setRowCount (subs.size ()); + int row = 0; + foreach (const RecognizerHelper::Sub & sub, subs) { + if (!initSubsTableRow (row, sub.language)) { + continue; + } + ui->recognizerFixTable->setItem (row, SubsColSource, new QTableWidgetItem (sub.source)); + ui->recognizerFixTable->setItem (row, SubsColTarget, new QTableWidgetItem (sub.target)); + ++row; + } + ui->recognizerFixTable->setRowCount (row + 1); + initSubsTableRow (row); + ui->recognizerFixTable->resizeColumnsToContents (); + } + settings.endGroup (); + settings.beginGroup (settings_names::translationGroup); ui->doTranslationCheck->setChecked (GET (doTranslation).toBool ()); ui->translatorDebugCheck->setChecked (GET (translationDebugMode).toBool ()); @@ -138,6 +186,23 @@ void SettingsEditor::loadSettings () { #undef GET } +bool SettingsEditor::initSubsTableRow (int row, const QString &languageCode) { + QString lang = dictionary_.ocrCodeToUi (languageCode); + if (!languageCode.isEmpty () && lang == languageCode) { + return false; + } + QComboBox *langCombo = new QComboBox (ui->recognizerFixTable); + langCombo->setModel (ui->ocrLangCombo->model ()); + if (!languageCode.isEmpty ()) { + langCombo->setCurrentText (lang); + } + else { + langCombo->setCurrentIndex (ui->ocrLangCombo->currentIndex ()); + } + ui->recognizerFixTable->setCellWidget (row, SubsColLanguage, langCombo); + return true; +} + void SettingsEditor::saveState () const { QSettings settings; settings.beginGroup (settings_names::guiGroup); @@ -154,3 +219,21 @@ void SettingsEditor::initOcrLangCombo (const QString &path) { ui->ocrLangCombo->clear (); ui->ocrLangCombo->addItems (dictionary_.availableOcrLanguagesUi (path)); } + +void SettingsEditor::recognizerFixTableItemChanged (QTableWidgetItem *item) { + ST_ASSERT (item->column () < 3); + int row = item->row (); + QTableWidget *t = ui->recognizerFixTable; +#define CHECK(COL) (!t->item (row, COL) || t->item (row, COL)->text ().isEmpty ()) + bool isRowEmpty = CHECK (SubsColSource) && CHECK (SubsColTarget); +#undef CHECK + int lastRow = ui->recognizerFixTable->rowCount () - 1; + if (isRowEmpty && row != lastRow) { + ui->recognizerFixTable->removeRow (row); + } + else if (!isRowEmpty && row == lastRow) { + int newRow = lastRow + 1; + ui->recognizerFixTable->insertRow (newRow); + initSubsTableRow (newRow); + } +} diff --git a/SettingsEditor.h b/SettingsEditor.h index 0558bc2..6cb5796 100644 --- a/SettingsEditor.h +++ b/SettingsEditor.h @@ -5,15 +5,21 @@ #include #include +class QTableWidgetItem; namespace Ui { class SettingsEditor; } class LanguageHelper; class TranslatorHelper; +class RecognizerHelper; class SettingsEditor : public QDialog { Q_OBJECT + enum SubsCol { + SubsColLanguage = 0, SubsColSource, SubsColTarget + }; + public: explicit SettingsEditor (const LanguageHelper &dictionary, QWidget *parent = 0); ~SettingsEditor (); @@ -28,15 +34,18 @@ class SettingsEditor : public QDialog { void saveSettings () const; void openTessdataDialog (); void initOcrLangCombo (const QString &path); + void recognizerFixTableItemChanged (QTableWidgetItem *item); private: void loadSettings (); void saveState () const; void loadState (); + bool initSubsTableRow (int row, const QString &languageCode = QString ()); private: Ui::SettingsEditor *ui; TranslatorHelper *translatorHelper_; + RecognizerHelper *recognizerHelper_; const LanguageHelper &dictionary_; QButtonGroup *buttonGroup_; }; diff --git a/SettingsEditor.ui b/SettingsEditor.ui index c74df95..18bea41 100644 --- a/SettingsEditor.ui +++ b/SettingsEditor.ui @@ -140,7 +140,7 @@ Распознавание - + @@ -196,18 +196,43 @@ - - - - Qt::Vertical + + + + <html><head/><body><p>Символы, регулярно распознаваемые с ошибками. При обнаружении будут заменены на указанные.</p></body></html> - - - 20 - 132 - + + Исправления: - + + Qt::AlignCenter + + + + + + + QAbstractItemView::SelectRows + + + true + + + + Язык + + + + + Исходный текст + + + + + Исправление + + + From b6461fa3a92c799989b414a23707607258b2bab2 Mon Sep 17 00:00:00 2001 From: Gres Date: Sat, 10 Oct 2015 14:45:57 +0300 Subject: [PATCH 48/89] Added ability to set proxy. --- Manager.cpp | 12 +++++ ScreenTranslator.pro | 6 ++- Settings.h | 13 +++++- SettingsEditor.cpp | 44 ++++++++++++++++++ SettingsEditor.ui | 107 ++++++++++++++++++++++++++++++++++++------- Utils.cpp | 13 ++++++ Utils.h | 8 ++++ 7 files changed, 183 insertions(+), 20 deletions(-) create mode 100644 Utils.cpp create mode 100644 Utils.h diff --git a/Manager.cpp b/Manager.cpp index 192deb5..0f2eb5d 100644 --- a/Manager.cpp +++ b/Manager.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include "Settings.h" #include "SettingsEditor.h" @@ -21,6 +22,7 @@ #include "ResultDialog.h" #include "LanguageHelper.h" #include "StAssert.h" +#include "Utils.h" Manager::Manager (QObject *parent) : QObject (parent), @@ -155,6 +157,16 @@ void Manager::applySettings () { // Depends on SettingsEditor button indexes. 1==dialog useResultDialog_ = GET (resultShowType).toBool (); + + QNetworkProxy proxy = QNetworkProxy::applicationProxy (); + proxy.setType (QNetworkProxy::ProxyType (GET (proxyType).toInt ())); + proxy.setHostName (GET (proxyHostName).toString ()); + proxy.setPort (GET (proxyPort).toInt ()); + proxy.setUser (GET (proxyUser).toString ()); + if (GET (proxySavePassword).toBool ()) { + proxy.setPassword (encode (GET (proxyPassword).toString ())); + } + QNetworkProxy::setApplicationProxy (proxy); settings.endGroup (); settings.beginGroup (settings_names::translationGroup); diff --git a/ScreenTranslator.pro b/ScreenTranslator.pro index 0147d6a..1376116 100644 --- a/ScreenTranslator.pro +++ b/ScreenTranslator.pro @@ -40,7 +40,8 @@ SOURCES += main.cpp\ WebTranslator.cpp \ WebTranslatorProxy.cpp \ TranslatorHelper.cpp \ - RecognizerHelper.cpp + RecognizerHelper.cpp \ + Utils.cpp HEADERS += \ Manager.h \ @@ -57,7 +58,8 @@ HEADERS += \ WebTranslatorProxy.h \ StAssert.h \ TranslatorHelper.h \ - RecognizerHelper.h + RecognizerHelper.h \ + Utils.h FORMS += \ SettingsEditor.ui \ diff --git a/Settings.h b/Settings.h index 040bba5..0c705a3 100644 --- a/Settings.h +++ b/Settings.h @@ -12,6 +12,12 @@ namespace settings_names { const QString repeatHotkey = "repeatHotkey"; const QString clipboardHotkey = "clipboardHotkey"; const QString resultShowType = "resultShowType"; + const QString proxyType = "proxyType"; + const QString proxyHostName = "proxyHostName"; + const QString proxyPort = "proxyPort"; + const QString proxyUser = "proxyUser"; + const QString proxyPassword = "proxyPassword"; + const QString proxySavePassword = "proxySavePassword"; //! Recognition const QString recogntionGroup = "Recognition"; @@ -27,7 +33,6 @@ namespace settings_names { const QString translationTimeout = "translation_timeout"; const QString translationDebugMode = "translation_debug"; const QString translators = "translators"; - } namespace settings_values { @@ -40,6 +45,12 @@ namespace settings_values { const QString repeatHotkey = "Ctrl+Alt+X"; const QString clipboardHotkey = "Ctrl+Alt+C"; const QString resultShowType = "1";//dialog + const int proxyType = 0; + const QString proxyHostName = ""; + const int proxyPort = 8080; + const QString proxyUser = ""; + const QString proxyPassword = ""; + const bool proxySavePassword = false; //! Recognition const QString tessDataPlace = "./"; diff --git a/SettingsEditor.cpp b/SettingsEditor.cpp index eddf170..b5887aa 100644 --- a/SettingsEditor.cpp +++ b/SettingsEditor.cpp @@ -4,10 +4,13 @@ #include "TranslatorHelper.h" #include "RecognizerHelper.h" #include "StAssert.h" +#include "Utils.h" #include #include #include +#include +#include #include "Settings.h" @@ -29,6 +32,22 @@ SettingsEditor::SettingsEditor (const LanguageHelper &dictionary, QWidget *paren SLOT (recognizerFixTableItemChanged (QTableWidgetItem *))); ui->translateLangCombo->addItems (dictionary_.translateLanguagesUi ()); + + typedef QNetworkProxy::ProxyType ProxyType; + QMap proxyTypeNames; + proxyTypeNames.insert (QNetworkProxy::NoProxy, tr ("Нет")); + proxyTypeNames.insert (QNetworkProxy::Socks5Proxy, tr ("SOCKS 5")); + proxyTypeNames.insert (QNetworkProxy::HttpProxy, tr ("HTTP")); + QList proxyOrder; + proxyOrder << QNetworkProxy::NoProxy << QNetworkProxy::Socks5Proxy << QNetworkProxy::HttpProxy; + foreach (ProxyType type, proxyOrder) { + ui->proxyTypeCombo->addItem (proxyTypeNames.value (type)); + } + + QRegExp urlRegexp (R"(^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$)"); + ui->proxyHostEdit->setValidator (new QRegExpValidator (urlRegexp, ui->proxyHostEdit)); + ui->proxyPassEdit->setEchoMode (QLineEdit::PasswordEchoOnEdit); + loadSettings (); loadState (); } @@ -57,6 +76,20 @@ void SettingsEditor::saveSettings () const { settings.setValue (repeatHotkey, ui->repeatEdit->keySequence ().toString ()); settings.setValue (clipboardHotkey, ui->clipboardEdit->keySequence ().toString ()); settings.setValue (resultShowType, buttonGroup_->checkedId ()); + settings.setValue (proxyType, ui->proxyTypeCombo->currentIndex ()); + settings.setValue (proxyHostName, ui->proxyHostEdit->text ()); + settings.setValue (proxyPort, ui->proxyPortSpin->value ()); + settings.setValue (proxyUser, ui->proxyUserEdit->text ()); + if (ui->proxySaveCheck->isChecked ()) { + settings.setValue (proxyPassword, encode (ui->proxyPassEdit->text ())); + } + else { + settings.remove (proxyPassword); + QNetworkProxy proxy = QNetworkProxy::applicationProxy (); + proxy.setPassword (ui->proxyPassEdit->text ()); + QNetworkProxy::setApplicationProxy (proxy); + } + settings.setValue (proxySavePassword, ui->proxySaveCheck->isChecked ()); settings.endGroup (); @@ -136,6 +169,17 @@ void SettingsEditor::loadSettings () { QAbstractButton *button = buttonGroup_->button (GET (resultShowType).toInt ()); Q_CHECK_PTR (button); button->setChecked (true); + ui->proxyTypeCombo->setCurrentIndex (GET (proxyType).toInt ()); + ui->proxyHostEdit->setText (GET (proxyHostName).toString ()); + ui->proxyPortSpin->setValue (GET (proxyPort).toInt ()); + ui->proxyUserEdit->setText (GET (proxyUser).toString ()); + ui->proxySaveCheck->setChecked (GET (proxySavePassword).toBool ()); + if (ui->proxySaveCheck->isChecked ()) { + ui->proxyPassEdit->setText (encode (GET (proxyPassword).toString ())); + } + else { + ui->proxyPassEdit->setText (QNetworkProxy::applicationProxy ().password ()); + } settings.endGroup (); settings.beginGroup (settings_names::recogntionGroup); diff --git a/SettingsEditor.ui b/SettingsEditor.ui index 18bea41..201f45d 100644 --- a/SettingsEditor.ui +++ b/SettingsEditor.ui @@ -6,8 +6,8 @@ 0 0 - 509 - 338 + 553 + 456 @@ -34,7 +34,7 @@ Общее - + Горячие клавиши @@ -95,20 +95,7 @@ - - - - Qt::Vertical - - - - 20 - 270 - - - - - + Вывод результата @@ -134,6 +121,92 @@ + + + + Прокси + + + + + + Тип: + + + + + + + + + + Пользователь: + + + + + + + + + + Адрес: + + + + + + + + + + Пароль: + + + + + + + + + + Порт: + + + + + + + 1 + + + 65535 + + + + + + + Сохранять пароль (небезопасно) + + + + + + + + + + Qt::Vertical + + + + 20 + 270 + + + + diff --git a/Utils.cpp b/Utils.cpp new file mode 100644 index 0000000..d9d1430 --- /dev/null +++ b/Utils.cpp @@ -0,0 +1,13 @@ +#include "Utils.h" + +QString encode (const QString &source) { + if (source.isEmpty ()) { + return source; + } + char encKeys[] = {14, 26, 99, 43}; + std::string result = source.toStdString (); + for (int i = 0, end = result.size (); i < end; ++i) { + result [i] = result[i] ^ encKeys[ i % sizeof(encKeys)]; + } + return QString::fromUtf8 (result.data ()); +} diff --git a/Utils.h b/Utils.h new file mode 100644 index 0000000..2614507 --- /dev/null +++ b/Utils.h @@ -0,0 +1,8 @@ +#ifndef UTILS_H +#define UTILS_H + +#include + +QString encode (const QString &source); + +#endif // UTILS_H From 811b232c8162e7ccfff10292e0e17ef6ec15fce8 Mon Sep 17 00:00:00 2001 From: Gres Date: Sat, 10 Oct 2015 19:05:38 +0300 Subject: [PATCH 49/89] ProcessingItem finishes its way to Manager even if there are errors on the way. --- Recognizer.cpp | 3 ++- WebTranslator.cpp | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Recognizer.cpp b/Recognizer.cpp index caa274f..f1c0f07 100644 --- a/Recognizer.cpp +++ b/Recognizer.cpp @@ -63,6 +63,7 @@ void Recognizer::recognize (ProcessingItem item) { QString language = (isCustomLanguage) ? item.ocrLanguage : ocrLanguage_; if (engine == NULL) { if (!initEngine (engine, language)) { + emit recognized (item); return; } } @@ -82,9 +83,9 @@ void Recognizer::recognize (ProcessingItem item) { if (!result.isEmpty ()) { item.recognized = recognizerHelper_->substitute (result, language); - emit recognized (item); } else { emit error (tr ("Текст не распознан.")); } + emit recognized (item); } diff --git a/WebTranslator.cpp b/WebTranslator.cpp index 8aafbfa..1a9b166 100644 --- a/WebTranslator.cpp +++ b/WebTranslator.cpp @@ -46,7 +46,7 @@ void WebTranslator::addProxyToView () { } void WebTranslator::translate (ProcessingItem item) { - if (item.translateLanguage.isEmpty ()) { + if (!item.isValid () || item.translateLanguage.isEmpty ()) { emit translated (item); return; } From 45978ec013830e04705018fed801feec00b7026b Mon Sep 17 00:00:00 2001 From: Gres Date: Sat, 10 Oct 2015 19:07:25 +0300 Subject: [PATCH 50/89] Icons updated. Now use 4 icon types depending on internal state. --- Manager.cpp | 41 ++++++++++++++++++++++++++++++++++++---- Manager.h | 8 ++++++++ Recources.qrc | 5 ++++- images/STIconBlue.png | Bin 0 -> 3985 bytes images/STIconGreen.png | Bin 0 -> 4151 bytes images/STIconOrange.png | Bin 0 -> 3774 bytes images/STIconRed.png | Bin 0 -> 4054 bytes images/icon.ico | Bin 32038 -> 99678 bytes images/icon.png | Bin 6644 -> 0 bytes 9 files changed, 49 insertions(+), 5 deletions(-) create mode 100644 images/STIconBlue.png create mode 100644 images/STIconGreen.png create mode 100644 images/STIconOrange.png create mode 100644 images/STIconRed.png delete mode 100644 images/icon.png diff --git a/Manager.cpp b/Manager.cpp index 0f2eb5d..4ee2372 100644 --- a/Manager.cpp +++ b/Manager.cpp @@ -26,12 +26,13 @@ Manager::Manager (QObject *parent) : QObject (parent), - trayIcon_ (new QSystemTrayIcon (QIcon (":/images/icon.png"), this)), + trayIcon_ (new QSystemTrayIcon (this)), dictionary_ (new LanguageHelper), resultDialog_ (new ResultDialog (*dictionary_)), captureAction_ (NULL), repeatCaptureAction_ (NULL), repeatAction_ (NULL), clipboardAction_ (NULL), - useResultDialog_ (true), doTranslation_ (true) { + useResultDialog_ (true), doTranslation_ (true), itemProcessingCount_ (0) { + updateNormalIcon (); GlobalActionHelper::init (); qRegisterMetaType(); @@ -215,6 +216,8 @@ void Manager::handleSelection (ProcessingItem item) { item.translateLanguage = defaultTranslationLanguage_; } emit requestRecognize (item); + ++itemProcessingCount_; + updateNormalIcon (); if (!(item.modifiers & Qt::ControlModifier)) { emit closeSelections (); } @@ -279,7 +282,6 @@ void Manager::processTrayAction (QSystemTrayIcon::ActivationReason reason) { } void Manager::editRecognized (ProcessingItem item) { - ST_ASSERT (item.isValid ()); QString fixed = QInputDialog::getMultiLineText ( NULL, tr ("Правка"), tr ("Исправьте распознанный текст"), item.recognized); if (!fixed.isEmpty ()) { @@ -316,7 +318,13 @@ void Manager::copyLastImageToClipboard () { } void Manager::showResult (ProcessingItem item) { - ST_ASSERT (item.isValid ()); + --itemProcessingCount_; + if (!item.isValid ()) { + // delay because it can show error + QTimer::singleShot (3000, this, SLOT (updateNormalIcon ())); + return; + } + changeIcon (IconTypeSuccess); if (useResultDialog_) { resultDialog_->showResult (item); } @@ -329,5 +337,30 @@ void Manager::showResult (ProcessingItem item) { void Manager::showError (QString text) { qCritical () << text; + changeIcon (IconTypeError); trayIcon_->showMessage (tr ("Ошибка"), text, QSystemTrayIcon::Critical); } + +void Manager::changeIcon (int iconType, int timeoutMsec) { + QString fileName; + switch (iconType) { + case IconTypeSuccess: + fileName = ":/images/STIconGreen.png"; + break; + case IconTypeError: + fileName = ":/images/STIconRed.png"; + break; + default: + return; + } + trayIcon_->setIcon (QIcon (fileName)); + if (timeoutMsec > 0) { + QTimer::singleShot (timeoutMsec, this, SLOT (updateNormalIcon ())); + } +} + +void Manager::updateNormalIcon () { + QString fileName = itemProcessingCount_ > 0 + ? ":/images/STIconOrange.png" : ":/images/STIconBlue.png"; + trayIcon_->setIcon (QIcon (fileName)); +} diff --git a/Manager.h b/Manager.h index 710d6cb..adcf665 100644 --- a/Manager.h +++ b/Manager.h @@ -17,6 +17,10 @@ class LanguageHelper; class Manager : public QObject { Q_OBJECT + enum IconType { + IconTypeNormal, IconTypeWorking, IconTypeError, IconTypeSuccess + }; + public: explicit Manager (QObject *parent = 0); ~Manager (); @@ -46,9 +50,12 @@ class Manager : public QObject { void showResult (ProcessingItem item); void showError (QString text); + void updateNormalIcon (); + private: QMenu * trayContextMenu (); void updateActionsState (bool isEnabled = true); + void changeIcon (int iconType, int timeoutMsec = 3000); private: QSystemTrayIcon *trayIcon_; @@ -65,6 +72,7 @@ class Manager : public QObject { QList threads_; QString defaultTranslationLanguage_; bool doTranslation_; + int itemProcessingCount_; }; #endif // MANAGER_H diff --git a/Recources.qrc b/Recources.qrc index 920e5ba..67a7a5f 100644 --- a/Recources.qrc +++ b/Recources.qrc @@ -2,6 +2,9 @@ translations/translation_en.qm translations/translation_ru.qm - images/icon.png + images/STIconBlue.png + images/STIconGreen.png + images/STIconOrange.png + images/STIconRed.png diff --git a/images/STIconBlue.png b/images/STIconBlue.png new file mode 100644 index 0000000000000000000000000000000000000000..7ca2c3ce53608988b24b234da0f0ac5ad991158f GIT binary patch literal 3985 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 h;reP){C~niFgI?I0#`1>(@>%C)-{y)uCYRdos literal 0 HcmV?d00001 diff --git a/images/STIconGreen.png b/images/STIconGreen.png new file mode 100644 index 0000000000000000000000000000000000000000..4892af19502615d9bfabb16daf31821e8e699492 GIT binary patch literal 4151 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 literal 0 HcmV?d00001 diff --git a/images/STIconRed.png b/images/STIconRed.png new file mode 100644 index 0000000000000000000000000000000000000000..672c57396cc5506c921c4cfa82b69c4a10009943 GIT binary patch literal 4054 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 ueSFeJbldUG6)lgNFand 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 diff --git a/images/icon.png b/images/icon.png deleted file mode 100644 index 17fc2c577ac8d248bba645111a42edce7ba6e572..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6644 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D03UQkSaefwW^{L9 za%BKeVQFr3E>1;MAU{7pKR-VpGcGkQHRs9$VE_ObUP(kjRCr#+n|n;vSGLD_8xV=e zA1G=fCW?B^l@4{hbqXyE(4o~@`jBGn)Ul&bTI`c*Yv0hPPpGA(+S1mxdQIA^|B+}L zP0UT5;Fud76XQwL#)t_*l3uU1Cx_XOVyU}9TY_Rwb)?4DcYi!ip@7oxNNPqKfn+VuUfKPelP0M=a z4V(7rn>Gy+vfik(DG-oZ_nu7zeENH9Y|IDiY}DEfmPnuR>l-X~!-p1q<2AkkJ#PBM zqCfoDVj4cO_>G$^5oJ>#Aq@gD-dkHJk_W>n(D|$1u)@`^TM;A_@wpIU z^7%cNc5`Sy3j(I`d?x*5tgpAUjUQS{{YRGgVWY)wVyurC^9HE?+q(Eo?iB4GlIK#b*E@2Lf^dRLnG3fR)R!_7XrZd--*%eEBu2f`lqQSMvQb zeqVwYl+%6zo>Tn(I?Kfaav)#^)}IUk;~*eaV`Km#+P2TCP--Fb0gn3@cUZY)zN;{ zJ0Do}`)h6Kn)SAjDNq8bd61iB0EYo`96+bAZX2$C z4)7NMees2t?9%hAtm_2?A}&F~Maa1TN#`J;4bo0Q-f^bTVW!dn^{Ku!23}AL;Z=-V z%J_5ff-H<7osyA+8%{zP_!Qhfqvb{z#|D*KLzVgfZc35FTwiD8MqcJG^0!l zN*!eG`*7E@C@jS<1E3f1{eT}J;Q0YBu=WhVS3HkA7kGX81+(WM0ePJ<9Q5F#b9e- ze>?MWAIcoXJRBlxPBjs3xI$a^V>q;0b335C!ax{4!l0~Y=8)P1XIE#!St;9 zP+ySH2MOJ*3LTJe1`>|qb^929J0wV#DoB`zUbkSJ-%i3H@Xa;>>)(R)=M!wI8Du@I zf6u@_p@b~bj(c_iz8CPanjgg-09exqc!t~CGePiG0I#ezt9UB#`oxL=5%P#(NHFpU zKP2=+LN6qAK|(v@`WXKwNRTe;A)y))=7*Djz6n~guPfsLd^Bz!hubF;^)mpU4fuIj zzZ!NoGRRH_Y$X_-M2Yk3Hd;6C*~h#eAm|MOFPC<}V_jKZ;01hHmD%5);1yZ^WPk|$ zrZ#G;XGEO5hqT$4O2(8D2?LPO2MOJfaGvo`;(@J@Ae}Y_NtmbA2_iDkH(B|LlD2Cm zVapd53-~0!rxWyM0=@+BRdlr80sn~|Wd8k3dMbD90enB;{eU+jzLD!YmKS)rbR>8I zUs_@Ix8(tOyfQ$Dh#5ixafA3_#1WSSg9JY$^fPV`Y^tslW_8sM`4UjX>!fL}vL-@|aL1Adb?c$PaO%?*KszYQXRDWjmN_~AtYqz@tio#d6@;|*)@hUMs501;V88Zv^xM4rpnq&E_=?e^oe^*(xy3OyBKn&_2 z5KA}3rR~Z~@P@?@F&B@Rgrp#G+PDqt34o3TbP_Tat7}Oq1^i0DH}jw(u8#rEGf)r9 zodS~Pq`mf5pT)+G_+7z^?B!4V!xVEI64qG{B%Ie$OkB{))QmT*gosk~&PK)}Ns!__ z6%-`2cJi7E@TmYVWZr0LX#ji+41B(mq$C7h(Rt2oHG>pe^yt3^fmgtLxEh#BIG}gF`KRN+dtB }|aei-9_v)OmxGnl~{mR-k_oUNIF(<$e61H~`3K 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 Date: Sat, 10 Oct 2015 19:11:21 +0300 Subject: [PATCH 51/89] Settings tab order updated. --- SettingsEditor.ui | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/SettingsEditor.ui b/SettingsEditor.ui index 201f45d..cc031a3 100644 --- a/SettingsEditor.ui +++ b/SettingsEditor.ui @@ -407,10 +407,17 @@ clipboardEdit trayRadio dialogRadio + proxyTypeCombo + proxyHostEdit + proxyPortSpin + proxyUserEdit + proxyPassEdit + proxySaveCheck tessdataEdit tessdataButton ocrLangCombo imageScaleSpin + recognizerFixTable doTranslationCheck translatorDebugCheck translateTimeoutSpin @@ -426,8 +433,8 @@ accept() - 248 - 254 + 256 + 447 157 @@ -442,8 +449,8 @@ reject() - 316 - 260 + 324 + 447 286 From 1c922db961bca8e57ad9e7a686d85b18401eceeb Mon Sep 17 00:00:00 2001 From: Gres Date: Sat, 10 Oct 2015 19:39:38 +0300 Subject: [PATCH 52/89] Added qss to ResultDialog. --- ResultDialog.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/ResultDialog.cpp b/ResultDialog.cpp index 86ed792..3917799 100644 --- a/ResultDialog.cpp +++ b/ResultDialog.cpp @@ -17,6 +17,14 @@ ResultDialog::ResultDialog (const LanguageHelper &dictionary, QWidget *parent) : setWindowFlags (Qt::FramelessWindowHint | Qt::NoDropShadowWindowHint | Qt::WindowStaysOnTopHint | Qt::X11BypassWindowManagerHint); + QString styleSheet = + "#recognizeLabel, #translateLabel {" + "color: black;" + "background: qlineargradient(x1:0, y1:0, x2:1, y2:1," + "stop:0 darkGray, stop: 0.5 lightGray, stop:1 darkGray);" + "}"; + setStyleSheet (styleSheet); + installEventFilter (this); createContextMenu (); applySettings (); From c1dab33e7c9df9ad807770e5d7feb5ceb1ff760f Mon Sep 17 00:00:00 2001 From: Gres Date: Sat, 10 Oct 2015 21:00:29 +0300 Subject: [PATCH 53/89] Updated ocr<->translation codes functions. --- LanguageHelper.cpp | 21 +++++++++++++++------ LanguageHelper.h | 3 ++- SelectionDialog.cpp | 2 +- SettingsEditor.cpp | 2 +- 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/LanguageHelper.cpp b/LanguageHelper.cpp index 0f55977..6ebe82d 100644 --- a/LanguageHelper.cpp +++ b/LanguageHelper.cpp @@ -72,13 +72,22 @@ QString LanguageHelper::ocrUiToCode (const QString &text) const { return ocrLanguages_.value (text, text); } -QString LanguageHelper::translateForOcrCode (const QString &text) const { - QString ocrUi = ocrUiToCode (text); - QString translate = translateCodeToUi (ocrUi); - if (translate == ocrUi) { - translate = "auto"; +QString LanguageHelper::ocrToTranslateCodes (const QString &text) const { + QString ocrUi = ocrCodeToUi (text); + QString translateCode = translateUiToCode (ocrUi); + if (translateCode == ocrUi) { + translateCode = "auto"; } - return translate; + return translateCode; +} + +QString LanguageHelper::translateToOcrCodes (const QString &text) const { + QString translateUi = translateCodeToUi (text); + QString ocrCode = ocrUiToCode (translateUi); + if (translateUi == ocrCode) { + return QString (); + } + return ocrCode; } void LanguageHelper::init () { diff --git a/LanguageHelper.h b/LanguageHelper.h index be8d7f7..ac04d86 100644 --- a/LanguageHelper.h +++ b/LanguageHelper.h @@ -19,7 +19,8 @@ class LanguageHelper { QString translateUiToCode (const QString &text) const; QString ocrCodeToUi (const QString &text) const; QString ocrUiToCode (const QString &text) const; - QString translateForOcrCode (const QString &text) const; + QString ocrToTranslateCodes (const QString &text) const; + QString translateToOcrCodes (const QString &text) const; void updateAvailableOcrLanguages (); diff --git a/SelectionDialog.cpp b/SelectionDialog.cpp index ec63fce..7024055 100644 --- a/SelectionDialog.cpp +++ b/SelectionDialog.cpp @@ -90,7 +90,7 @@ bool SelectionDialog::eventFilter (QObject *object, QEvent *event) { } item.ocrLanguage = dictionary_.ocrUiToCode (action->text ()); ST_ASSERT (!item.ocrLanguage.isEmpty ()); - item.sourceLanguage = dictionary_.translateForOcrCode (item.ocrLanguage); + item.sourceLanguage = dictionary_.ocrToTranslateCodes (item.ocrLanguage); ST_ASSERT (!item.sourceLanguage.isEmpty ()); } emit selected (item); diff --git a/SettingsEditor.cpp b/SettingsEditor.cpp index b5887aa..5d2dd89 100644 --- a/SettingsEditor.cpp +++ b/SettingsEditor.cpp @@ -127,7 +127,7 @@ void SettingsEditor::saveSettings () const { settings.setValue (translationDebugMode, ui->translatorDebugCheck->isChecked ()); QString trLanguage = dictionary_.translateUiToCode (ui->translateLangCombo->currentText ()); settings.setValue (translationLanguage, trLanguage); - QString sourceLanguageVal = dictionary_.translateForOcrCode (ocrLanguage); + QString sourceLanguageVal = dictionary_.ocrToTranslateCodes (ocrLanguage); settings.setValue (sourceLanguage, sourceLanguageVal); settings.setValue (translationTimeout, ui->translateTimeoutSpin->value ()); From a57e0b1af81e314773690a5418dbd5a75d97bfa7 Mon Sep 17 00:00:00 2001 From: Gres Date: Sat, 10 Oct 2015 21:04:28 +0300 Subject: [PATCH 54/89] Manager now sets ocrLanguage instead of recognizer. Last one checks input item for validity. --- Manager.cpp | 10 ++++++++++ Manager.h | 1 + ProcessingItem.cpp | 7 +++++-- ProcessingItem.h | 2 +- Recognizer.cpp | 8 +++++--- 5 files changed, 22 insertions(+), 6 deletions(-) diff --git a/Manager.cpp b/Manager.cpp index 4ee2372..9171a69 100644 --- a/Manager.cpp +++ b/Manager.cpp @@ -170,6 +170,10 @@ void Manager::applySettings () { QNetworkProxy::setApplicationProxy (proxy); settings.endGroup (); + settings.beginGroup (settings_names::recogntionGroup); + defaultOrcLanguage_ = GET (ocrLanguage).toString (); + settings.endGroup (); + settings.beginGroup (settings_names::translationGroup); defaultTranslationLanguage_ = GET (translationLanguage).toString (); doTranslation_ = GET (doTranslation).toBool (); @@ -215,6 +219,12 @@ void Manager::handleSelection (ProcessingItem item) { if ((doTranslation_ && !altMod) || (!doTranslation_ && altMod)) { item.translateLanguage = defaultTranslationLanguage_; } + if (item.ocrLanguage.isEmpty ()) { + item.ocrLanguage = defaultOrcLanguage_; + } + if (item.sourceLanguage.isEmpty ()) { + item.sourceLanguage = dictionary_->ocrToTranslateCodes (item.ocrLanguage); + } emit requestRecognize (item); ++itemProcessingCount_; updateNormalIcon (); diff --git a/Manager.h b/Manager.h index adcf665..c1e0f6b 100644 --- a/Manager.h +++ b/Manager.h @@ -71,6 +71,7 @@ class Manager : public QObject { //! Used threads. For proper termination. QList threads_; QString defaultTranslationLanguage_; + QString defaultOrcLanguage_; bool doTranslation_; int itemProcessingCount_; }; diff --git a/ProcessingItem.cpp b/ProcessingItem.cpp index c24de1d..396357e 100644 --- a/ProcessingItem.cpp +++ b/ProcessingItem.cpp @@ -1,9 +1,12 @@ #include "ProcessingItem.h" -bool ProcessingItem::isValid () const { +bool ProcessingItem::isValid (bool checkOnlyInput) const { bool valid = true; valid &= (!screenPos.isNull ()); valid &= (!source.isNull ()); - valid &= (!recognized.isEmpty ()); + valid &= (!ocrLanguage.isEmpty ()); + if (!checkOnlyInput) { + valid &= (!recognized.isEmpty ()); + } return valid; } diff --git a/ProcessingItem.h b/ProcessingItem.h index d2dc272..2f603b0 100644 --- a/ProcessingItem.h +++ b/ProcessingItem.h @@ -15,7 +15,7 @@ struct ProcessingItem { Qt::KeyboardModifiers modifiers; - bool isValid () const; + bool isValid (bool checkOnlyInput = false) const; }; Q_DECLARE_METATYPE (ProcessingItem) diff --git a/Recognizer.cpp b/Recognizer.cpp index f1c0f07..ce94ace 100644 --- a/Recognizer.cpp +++ b/Recognizer.cpp @@ -56,9 +56,11 @@ bool Recognizer::initEngine (tesseract::TessBaseAPI * &engine, const QString &la } void Recognizer::recognize (ProcessingItem item) { - ST_ASSERT (!item.source.isNull ()); - bool isCustomLanguage = (!item.ocrLanguage.isEmpty () && - item.ocrLanguage != ocrLanguage_); + if (!item.isValid (true)) { + emit recognized (item); + return; + } + bool isCustomLanguage = (item.ocrLanguage != ocrLanguage_); tesseract::TessBaseAPI *engine = (isCustomLanguage) ? NULL : engine_; QString language = (isCustomLanguage) ? item.ocrLanguage : ocrLanguage_; if (engine == NULL) { From 027c7b46a009be44a0b7dee76f9f67cd74fd6aa0 Mon Sep 17 00:00:00 2001 From: Gres Date: Sat, 10 Oct 2015 21:05:12 +0300 Subject: [PATCH 55/89] Added ability to swap translation/ocr languages. --- Manager.cpp | 16 +++++++++++++++- ProcessingItem.cpp | 5 +++++ ProcessingItem.h | 2 ++ SelectionDialog.cpp | 18 +++++++++++++----- SelectionDialog.h | 1 + 5 files changed, 36 insertions(+), 6 deletions(-) diff --git a/Manager.cpp b/Manager.cpp index 9171a69..4bca036 100644 --- a/Manager.cpp +++ b/Manager.cpp @@ -216,12 +216,26 @@ void Manager::capture () { void Manager::handleSelection (ProcessingItem item) { bool altMod = item.modifiers & Qt::AltModifier; - if ((doTranslation_ && !altMod) || (!doTranslation_ && altMod)) { + bool doTranslation = (doTranslation_ && !altMod) || (!doTranslation_ && altMod); + if (doTranslation) { item.translateLanguage = defaultTranslationLanguage_; } if (item.ocrLanguage.isEmpty ()) { item.ocrLanguage = defaultOrcLanguage_; } + if (item.swapLanguages_) { + QString translate = (item.translateLanguage.isEmpty ()) + ? defaultTranslationLanguage_ : item.translateLanguage; + if (doTranslation) { + item.translateLanguage = dictionary_->ocrToTranslateCodes (item.ocrLanguage); + } + item.sourceLanguage.clear (); + item.ocrLanguage = dictionary_->translateToOcrCodes (translate); + if (item.ocrLanguage.isEmpty ()) { + showError (tr ("Не найден подходящий язык распознавания.")); + return; + } + } if (item.sourceLanguage.isEmpty ()) { item.sourceLanguage = dictionary_->ocrToTranslateCodes (item.ocrLanguage); } diff --git a/ProcessingItem.cpp b/ProcessingItem.cpp index 396357e..df08fb1 100644 --- a/ProcessingItem.cpp +++ b/ProcessingItem.cpp @@ -1,5 +1,10 @@ #include "ProcessingItem.h" +ProcessingItem::ProcessingItem () + : swapLanguages_ (false) { + +} + bool ProcessingItem::isValid (bool checkOnlyInput) const { bool valid = true; valid &= (!screenPos.isNull ()); diff --git a/ProcessingItem.h b/ProcessingItem.h index 2f603b0..c5b7576 100644 --- a/ProcessingItem.h +++ b/ProcessingItem.h @@ -4,6 +4,7 @@ #include struct ProcessingItem { + ProcessingItem (); QPoint screenPos; QPixmap source; QString recognized; @@ -14,6 +15,7 @@ struct ProcessingItem { QString translateLanguage; Qt::KeyboardModifiers modifiers; + bool swapLanguages_; bool isValid (bool checkOnlyInput = false) const; }; diff --git a/SelectionDialog.cpp b/SelectionDialog.cpp index 7024055..8aa0084 100644 --- a/SelectionDialog.cpp +++ b/SelectionDialog.cpp @@ -11,7 +11,7 @@ SelectionDialog::SelectionDialog (const LanguageHelper &dictionary, QWidget *parent) : QDialog (parent), ui (new Ui::SelectionDialog), dictionary_ (dictionary), - languageMenu_ (new QMenu) { + languageMenu_ (new QMenu), swapLanguagesAction_ (NULL) { ui->setupUi (this); setWindowFlags (Qt::FramelessWindowHint | Qt::NoDropShadowWindowHint | Qt::WindowStaysOnTopHint | Qt::X11BypassWindowManagerHint); @@ -28,6 +28,9 @@ SelectionDialog::~SelectionDialog () { void SelectionDialog::applySettings () { dictionary_.updateMenu (languageMenu_, dictionary_.availableOcrLanguagesUi ()); + if (!languageMenu_->isEmpty ()) { + swapLanguagesAction_ = languageMenu_->addAction (tr ("Поменять язык текста и перевода")); + } } bool SelectionDialog::eventFilter (QObject *object, QEvent *event) { @@ -88,10 +91,15 @@ bool SelectionDialog::eventFilter (QObject *object, QEvent *event) { reject (); return QDialog::eventFilter (object, event); } - item.ocrLanguage = dictionary_.ocrUiToCode (action->text ()); - ST_ASSERT (!item.ocrLanguage.isEmpty ()); - item.sourceLanguage = dictionary_.ocrToTranslateCodes (item.ocrLanguage); - ST_ASSERT (!item.sourceLanguage.isEmpty ()); + if (action == swapLanguagesAction_) { + item.swapLanguages_ = true; + } + else { + item.ocrLanguage = dictionary_.ocrUiToCode (action->text ()); + ST_ASSERT (!item.ocrLanguage.isEmpty ()); + item.sourceLanguage = dictionary_.ocrToTranslateCodes (item.ocrLanguage); + ST_ASSERT (!item.sourceLanguage.isEmpty ()); + } } emit selected (item); } diff --git a/SelectionDialog.h b/SelectionDialog.h index 58dda6c..b126658 100644 --- a/SelectionDialog.h +++ b/SelectionDialog.h @@ -37,6 +37,7 @@ class SelectionDialog : public QDialog { QPoint currentSelectPos_; QPixmap currentPixmap_; QMenu *languageMenu_; + QAction *swapLanguagesAction_; }; #endif // SELECTIONDIALOG_H From 1d211d1baf4c1feb7760b8f8977d6f36d2b942b6 Mon Sep 17 00:00:00 2001 From: Gres Date: Sat, 10 Oct 2015 21:05:28 +0300 Subject: [PATCH 56/89] Added some usage tips in about window. --- Manager.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/Manager.cpp b/Manager.cpp index 4bca036..87b2656 100644 --- a/Manager.cpp +++ b/Manager.cpp @@ -283,8 +283,21 @@ void Manager::about () { "Автор: Gres (translator@gres.biz)\n" "Версия: %1 от %2 %3").arg (version) .arg (__DATE__).arg (__TIME__); + QString tips = tr ("\n\nПодсказки.\n" + "Клик по иконке в трее:\n" + "* левой кнопкой - отобразить последний результат\n" + "* средней кнопкой - скопировать последний результат в буфер обмена\n" +#ifdef Q_OS_WIN + "* двойной клик - повторный захват последнего экрана\n" +#endif + "\n" + "Захвата изображения при зажатых кнопках:\n" + "* Ctrl - не выходить из режима захвата\n" + "* Alt - выполнить перевод, если в настройках он выключен " + "(и наоборот, не выполнять, если включен)\n" + ""); - QMessageBox message (QMessageBox::Information, tr ("О программе"), text, + QMessageBox message (QMessageBox::Information, tr ("О программе"), text + tips, QMessageBox::Ok); message.setIconPixmap (trayIcon_->icon ().pixmap (QSize (64, 64))); message.exec (); From a4d3dd90fd26c82396e94bc22ed645b1bdc3fb9d Mon Sep 17 00:00:00 2001 From: Gres Date: Sun, 11 Oct 2015 18:33:19 +0300 Subject: [PATCH 57/89] Proxy fix. --- Manager.cpp | 4 +++- SettingsEditor.cpp | 7 +++---- Utils.cpp | 8 ++++++++ Utils.h | 2 ++ 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/Manager.cpp b/Manager.cpp index 87b2656..7f6ffe9 100644 --- a/Manager.cpp +++ b/Manager.cpp @@ -160,7 +160,9 @@ void Manager::applySettings () { useResultDialog_ = GET (resultShowType).toBool (); QNetworkProxy proxy = QNetworkProxy::applicationProxy (); - proxy.setType (QNetworkProxy::ProxyType (GET (proxyType).toInt ())); + QList proxyTypes = proxyTypeOrder (); + int proxyTypeIndex = std::min (GET (proxyType).toInt (), proxyTypes.size ()); + proxy.setType (QNetworkProxy::ProxyType (proxyTypes.at (std::max (proxyTypeIndex, 0)))); proxy.setHostName (GET (proxyHostName).toString ()); proxy.setPort (GET (proxyPort).toInt ()); proxy.setUser (GET (proxyUser).toString ()); diff --git a/SettingsEditor.cpp b/SettingsEditor.cpp index 5d2dd89..5537196 100644 --- a/SettingsEditor.cpp +++ b/SettingsEditor.cpp @@ -38,10 +38,9 @@ SettingsEditor::SettingsEditor (const LanguageHelper &dictionary, QWidget *paren proxyTypeNames.insert (QNetworkProxy::NoProxy, tr ("Нет")); proxyTypeNames.insert (QNetworkProxy::Socks5Proxy, tr ("SOCKS 5")); proxyTypeNames.insert (QNetworkProxy::HttpProxy, tr ("HTTP")); - QList proxyOrder; - proxyOrder << QNetworkProxy::NoProxy << QNetworkProxy::Socks5Proxy << QNetworkProxy::HttpProxy; - foreach (ProxyType type, proxyOrder) { - ui->proxyTypeCombo->addItem (proxyTypeNames.value (type)); + QList proxyOrder = proxyTypeOrder (); + foreach (int type, proxyOrder) { + ui->proxyTypeCombo->addItem (proxyTypeNames.value (QNetworkProxy::ProxyType (type))); } QRegExp urlRegexp (R"(^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$)"); diff --git a/Utils.cpp b/Utils.cpp index d9d1430..1af0e1d 100644 --- a/Utils.cpp +++ b/Utils.cpp @@ -1,3 +1,5 @@ +#include + #include "Utils.h" QString encode (const QString &source) { @@ -11,3 +13,9 @@ QString encode (const QString &source) { } return QString::fromUtf8 (result.data ()); } + +QList proxyTypeOrder () { + QList proxyOrder; + proxyOrder << QNetworkProxy::NoProxy << QNetworkProxy::Socks5Proxy << QNetworkProxy::HttpProxy; + return proxyOrder; +} diff --git a/Utils.h b/Utils.h index 2614507..680c36a 100644 --- a/Utils.h +++ b/Utils.h @@ -5,4 +5,6 @@ QString encode (const QString &source); +QList proxyTypeOrder (); + #endif // UTILS_H From e5e9950cfc6a82c89becd6494b9638221c90b1c2 Mon Sep 17 00:00:00 2001 From: Gres Date: Sun, 11 Oct 2015 18:33:55 +0300 Subject: [PATCH 58/89] Memory leaks and "leaks" fixes. --- ImageProcessing.cpp | 3 ++- Manager.cpp | 6 ++++++ SelectionDialog.cpp | 1 + 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/ImageProcessing.cpp b/ImageProcessing.cpp index c69383e..8caf0c9 100644 --- a/ImageProcessing.cpp +++ b/ImageProcessing.cpp @@ -68,7 +68,8 @@ Pix * convertImage (const QImage &image) { } pixSetResolution (pix, resolutionX, resolutionY); - return pixEndianByteSwapNew (pix); + pixEndianByteSwap (pix); + return pix; } QImage convertImage (Pix &image) { diff --git a/Manager.cpp b/Manager.cpp index 7f6ffe9..38c44ad 100644 --- a/Manager.cpp +++ b/Manager.cpp @@ -187,6 +187,12 @@ void Manager::applySettings () { } Manager::~Manager () { + foreach (SelectionDialog * selection, selections_.values ()) { + selection->hide (); + delete selection; + } + trayIcon_->hide (); + delete trayIcon_->contextMenu (); foreach (QThread * thread, threads_) { thread->quit (); thread->wait (1000000); diff --git a/SelectionDialog.cpp b/SelectionDialog.cpp index 8aa0084..56daed3 100644 --- a/SelectionDialog.cpp +++ b/SelectionDialog.cpp @@ -23,6 +23,7 @@ SelectionDialog::SelectionDialog (const LanguageHelper &dictionary, QWidget *par } SelectionDialog::~SelectionDialog () { + delete languageMenu_; delete ui; } From c79f40cf6d221cecaad29dff5b32e09ea449d80e Mon Sep 17 00:00:00 2001 From: Gres Date: Sun, 11 Oct 2015 18:34:24 +0300 Subject: [PATCH 59/89] Translations updated. --- translations/translation_en.ts | 613 +++++++++++++++++++++++---------- translations/translation_ru.ts | 613 +++++++++++++++++++++++---------- 2 files changed, 880 insertions(+), 346 deletions(-) diff --git a/translations/translation_en.ts b/translations/translation_en.ts index 6f7c0a0..c473fb9 100644 --- a/translations/translation_en.ts +++ b/translations/translation_en.ts @@ -4,59 +4,122 @@ GoogleWebTranslator - Неверные парметры для перевода. - Wrong translation parameters. + Wrong translation parameters. Manager - + Захват Capture - - - Перевод - Translation + Translation - Повторить - Repeat + Repeat - Скопировать - Copy + Copy - + + Повторить захват + Retry capture + + + + + + Результат + Result + + + + Показать + Show + + + + В буфер + To clipboard + + + Настройки Settings - - + + О программе About - + Выход Exit - + + Не найден подходящий язык распознавания. + Failed to find selected recognition language. + + + Программа для распознавания текста на экране. Создана с использованием Qt, tesseract-ocr, Google Translate. Автор: Gres (translator@gres.biz) Версия: %1 от %2 %3 Screen text recognition and translation program. \n Uses Qt, tesseract-ocr, Google Translate. \n Author: Gres (translator@gres.biz) \n Version: %1 from %2 %3 + + + + +Подсказки. +Клик по иконке в трее: +* левой кнопкой - отобразить последний результат +* средней кнопкой - скопировать последний результат в буфер обмена +* двойной клик - повторный захват последнего экрана + +Захвата изображения при зажатых кнопках: +* Ctrl - не выходить из режима захвата +* Alt - выполнить перевод, если в настройках он выключен (и наоборот, не выполнять, если включен) + + + +Tips. +Tray icon click: +* left button - show last result +* middle button - copy last result to clipboard +* double click - repeat last screen capture + +Key modifiers what capturing : +* Ctrl - do not exit from capture mode +* Alt - make translation if it is disabled in settings (or do not make, if it is enabled) + + + + + Последний результат был скопирован в буфер обмена. + Last result has been copied to clipboard. + + + + Правка + Correction + + + + Исправьте распознанный текст + Correct recognized text + Программа для распознавания текста на экране. Создана с использованием Qt, tesseract-ocr, Google Translate. @@ -64,12 +127,11 @@ Screen text recognition and translation program. \n Uses Qt, tesseract-ocr, Google Translate. \n Author: Gres (translator@gres.biz) - Последний перевод был скопирован в буфер обмена. - Last translation has been copied to the clipboard. + Last translation has been copied to the clipboard. - + Ошибка Error @@ -77,415 +139,415 @@ QObject - - + + Afrikaans Afrikaans - - + + Albanian Albanian - - + + Arabic Arabic - + Armenian Armenian - - + + Azerbaijani Azerbaijani - - + + Basque Basque - - + + Belarusian Belarusian - - + + Bulgarian Bulgarian - - + + Catalan Catalan - - + + Chinese (Simplified) Chinese (Simplified) - - + + Chinese (Traditional) Chinese (Traditional) - - + + Croatian Croatian - - + + Czech Czech - - + + Danish Danish - - + + Dutch Dutch - - + + English English - - + + Estonian Estonian - + Filipino Filipino - - + + Finnish Finnish - - + + French French - - + + Galician Galician - + Georgian Georgian - - + + German German - - + + Greek Greek - + Haitian Creole Haitian Creole - - + + Hebrew Hebrew - - + + Hindi Hindi - - + + Hungarian Hungarian - - + + Icelandic Icelandic - - + + Indonesian Indonesian - + Irish Irish - - + + Italian Italian - - + + Japanese Japanese - - + + Korean Korean - - + + Latvian Latvian - - + + Lithuanian Lithuanian - - + + Macedonian Macedonian - - + + Malay Malay - - + + Maltese Maltese - - + + Norwegian Norwegian - + Persian Persian - - + + Polish Polish - - + + Portuguese Portuguese - - + + Romanian Romanian - - + + Russian Russian - - + + Serbian Serbian - + Slovak Slovak - - + + Slovenian Slovenian - - + + Spanish Spanish - - + + Swahili Swahili - - + + Swedish Swedish - - + + Thai Thai - - + + Turkish Turkish - - + + Ukrainian Ukrainian - + Urdu Urdu - - + + Vietnamese Vietnamese - + Welsh Welsh - + Yiddish Yiddish - + Ancient Greek Ancient Greek - + Esperanto alternative - + Tagalog Tagalog - + Telugu Telugu - + Tamil Tamil - + Slovakian Slovakian - + Malayalam Malayalam - + Kannada Kannada - + Cherokee Cherokee - + Middle French (ca. 1400-1600) Middle French - + Frankish Frankish - + Math / equation Math / equation - + Esperanto Esperanto - + Middle English (1100-1500) Middle English - + Bengali Bengali @@ -493,17 +555,17 @@ Recognizer - + Неверные параметры для OCR Wrong parameters for OCR - + Ошибка инициализации OCR: %1 OCR initialization error: %1 - + Текст не распознан. Failed to recognize text. @@ -515,6 +577,31 @@ Результат Result + + + Распознать другой язык + Recognize another language + + + + Перевести на другой язык + Translate to another language + + + + Скопировать в буфер + Copy to clipboard + + + + Скопировать рисунок в буфер + Copy image to clibpoard + + + + Исправить распознанный текст + Correct recognized text + SelectionDialog @@ -523,6 +610,11 @@ Dialog Selection + + + Поменять язык текста и перевода + Swap recognition/translation languages + SettingsEditor @@ -532,102 +624,246 @@ Settings - + + Общее + General + + + Горячие клавиши Hotkeys - - - + <html><head/><body><p>Сочетание клавиш для перехода в режим захвата.</p></body></html> <html><head/><body><p>Keys combination to enter capture mode.</p></body></html> - + Захватить Capture - + + <html><head/><body><p>Сочетание клавиш для перехода в режим захвата, но с использованием последнего использованного, а не текущего, изображения.</p></body></html> + <html><head/><body><p>Keys combination to enter capture mode, but with last used image instead of current.</p></body></html> + + + + Захватить повторно + Repeat capture + + + + <html><head/><body><p>Сочетание клавиш для повторного отображения последнего результата.</p></body></html> + <html><head/><body><p>Keys combination to show last result again.</p></body></html> + + + + Показать + Show + + + + <html><head/><body><p>Сочетание клавиш для копирования последнего результата в буфер обмена.</p></body></html> + <html><head/><body><p>Keys combination to copy last result to clipboard.</p></body></html> + + + Скопировать Copy - Повторить - Repeat + Repeat - + Распознавание Recognition - <html><head/><body><p>Необходимо для распознавания.</p><p>Скачивается отсюда: <a href="https://code.google.com/p/tesseract-ocr/downloads/list"><span style=" text-decoration: underline; color:#0000ff;">https://code.google.com/p/tesseract-ocr/downloads/list</span></a></p></body></html> - <html><head/><body><p>Required for recognition.</p><p>Can me downloaded from there: <a href="https://code.google.com/p/tesseract-ocr/downloads/list"><span style=" text-decoration: underline; color:#0000ff;">https://code.google.com/p/tesseract-ocr/downloads/list</span></a></p></body></html> + <html><head/><body><p>Required for recognition.</p><p>Can me downloaded from there: <a href="https://code.google.com/p/tesseract-ocr/downloads/list"><span style=" text-decoration: underline; color:#0000ff;">https://code.google.com/p/tesseract-ocr/downloads/list</span></a></p></body></html> - - + + Путь к tessdata Tessdata path - + ... ... - + <html><head/><body><p>Заполняется на основании содержания tessdata</p></body></html> <html><head/><body><p>Values depend on tessdata contents</p></body></html> - + Язык распознавания Recognition language - <html><head/><body><p>Масштабирование изображения для улучшения распознания. Больше - лучше (до определенных пределов), но медленнее.</p></body></html> - <html><head/><body><p>Image scaling for better recognition. More is better (reasonable), but slower.</p></body></html> + <html><head/><body><p>Image scaling for better recognition. More is better (reasonable), but slower.</p></body></html> - + Увеличение масштаба Scale factor - + Вывод результата Result representation - + Трей Tray - + Окно Window - + + Прокси + Proxy + + + + Тип: + Type: + + + + Пользователь: + User: + + + + Адрес: + Host: + + + + Пароль: + Password: + + + + Порт: + Port: + + + + Сохранять пароль (небезопасно) + Save password (unsafe) + + + + <html><head/><body><p>Необходимо для распознавания.</p><p>Скачивается отсюда: <a href="https://github.com/tesseract-ocr/tessdata"><span style=" text-decoration: underline; color:#7593bc;">https://github.com/tesseract-ocr/tessdata</span></a></p><p>&quot;./&quot; означает, что папка &quot;tessdata&quot; находится в одной директории с исполняемым файлом программы.</p></body></html> + <html><head/><body><p>Required for recognition.</p><p>Can me downloaded from there: <a href="https://github.com/tesseract-ocr/tessdata"><span style=" text-decoration: underline; color:#7593bc;">https://github.com/tesseract-ocr/tessdata</span></a></p><p>&quot;./&quot; means that .&quot;tessdata&quot; is in the same folder as program's binary</p></body></html> + + + + <html><head/><body><p>Масштабирование изображения для улучшения распознания. Больше - лучше (до определенных пределов), но медленнее и потребляет больше памяти.</p><p>Рекомендуемые значения от 5 до 10.</p></body></html> + <html><head/><body><p>Image scaling can improve recognition results. More is better (up to reasonable limits), but slower and consumes more memory.</p><p>Recommended values are between 5 and 10.</p></body></html> + + + + <html><head/><body><p>Символы, регулярно распознаваемые с ошибками. При обнаружении будут заменены на указанные.</p></body></html> + <html><head/><body><p>Symbols to replace in recognition results. Allows to avoid repeating errors.</p></body></html> + + + + Исправления: + Substitutions: + + + + Язык + Language + + + + Исходный текст + Source + + + + Исправление + Target + + + Перевод Translation - + + <html><head/><body><p>Необходимо ли переводить (вкл) распознанный текст.</p></body></html> + <html><head/><body><p>If enabled - recognized text will be translated. Only recognize otherwise.</p></body></html> + + + + Переводить текст + Translate text + + + + <html><head/><body><p>Отображает окно переводчика. Следует использовать только для разработки переводчиков.</p></body></html> + <html><head/><body><p>Displays translator's window. Should me used only for new translators development.</p></body></html> + + + + Режим отладки + Debug mode + + + + <html><head/><body><p>Максимальное время, которое может быть затрачено на перевод, чтобы он не считался &quot;зависшим&quot;.</p></body></html> + <html><head/><body><p>Max time of translation process.</p></body></html> + + + + Максимальное время перевода: + Max translation time: + + + <html><head/><body><p>Язык, на который осуществляется перевод.</p></body></html> <html><head/><body><p>Translated text language.</p></body></html> - + + Язык результата: + Translation language: + + + + Переводчики: + Translators: + + + + сек. + secs. + + + + <html><head/><body><p>Отображены в порядке убывания приоритета.</p></body></html> + <html><head/><body><p>Sorted by priority descending.</p></body></html> + + Язык результата - Result language + Result language Afrikaans @@ -917,18 +1153,31 @@ Bengali Bengali + + + Нет + None + + + + SOCKS 5 + SOCKS 5 + + + + HTTP + HTTP + Translator - Неверные парметры для перевода. - Wrong translation parameters. + Wrong translation parameters. - Ошибка альтернативного перевода текста: %1 - Failed to translate with alternative method: %1 + Failed to translate with alternative method: %1 Ошибка перевода: %1 @@ -939,4 +1188,22 @@ Translation parsing error: %1 (%2) + + WebTranslator + + + Перевод отменен по таймауту. + Translation timed out. + + + + Ошибка загрузки страницы (%1) для перевода. + Page (%1) load failed. + + + + Нет сценариев для перевода. Измените настройки. + Not found any translators. Change settings. + + diff --git a/translations/translation_ru.ts b/translations/translation_ru.ts index d93797a..74478b6 100644 --- a/translations/translation_ru.ts +++ b/translations/translation_ru.ts @@ -4,53 +4,74 @@ GoogleWebTranslator - Неверные парметры для перевода. - Неверные парметры для перевода. + Неверные парметры для перевода. Manager - + Захват Захват - - - Перевод - Перевод + Перевод - Повторить - Повторить + Повторить - Скопировать - Скопировать + Скопировать - + + Повторить захват + Повторить захват + + + + + + Результат + Результат + + + + Показать + Показать + + + + В буфер + В буфер + + + Настройки Настройки - - + + О программе О программе - + Выход Выход - + + Не найден подходящий язык распознавания. + Не найден подходящий язык распознавания. + + + Программа для распознавания текста на экране. Создана с использованием Qt, tesseract-ocr, Google Translate. Автор: Gres (translator@gres.biz) @@ -60,6 +81,48 @@ Автор: Gres (translator@gres.biz) Версия: %1 от %2 %3 + + + + +Подсказки. +Клик по иконке в трее: +* левой кнопкой - отобразить последний результат +* средней кнопкой - скопировать последний результат в буфер обмена +* двойной клик - повторный захват последнего экрана + +Захвата изображения при зажатых кнопках: +* Ctrl - не выходить из режима захвата +* Alt - выполнить перевод, если в настройках он выключен (и наоборот, не выполнять, если включен) + + + +Подсказки. +Клик по иконке в трее: +* левой кнопкой - отобразить последний результат +* средней кнопкой - скопировать последний результат в буфер обмена +* двойной клик - повторный захват последнего экрана + +Захват изображения при зажатых кнопках: +* Ctrl - не выходить из режима захвата +* Alt - выполнить перевод, если в настройках он выключен (и наоборот, не выполнять, если включен) + + + + + Последний результат был скопирован в буфер обмена. + Последний результат был скопирован в буфер обмена. + + + + Правка + Правка + + + + Исправьте распознанный текст + Исправьте распознанный текст + Программа для распознавания текста на экране. Создана с использованием Qt, tesseract-ocr, Google Translate. @@ -69,12 +132,11 @@ Автор: Gres (translator@gres.biz) - Последний перевод был скопирован в буфер обмена. - Последний перевод был скопирован в буфер обмена. + Последний перевод был скопирован в буфер обмена. - + Ошибка Ошибка @@ -82,415 +144,415 @@ QObject - - + + Afrikaans Африкаанс - - + + Albanian Албанский - - + + Arabic Арабский - + Armenian Армянский - - + + Azerbaijani Азербайджанский - - + + Basque Басков - - + + Belarusian Белорусский - - + + Bulgarian Болгарский - - + + Catalan Каталонский - - + + Chinese (Simplified) Китайский (упрощенный) - - + + Chinese (Traditional) Китайский (традиционный) - - + + Croatian Хорватский - - + + Czech Чешский - - + + Danish Датский - - + + Dutch Голландский - - + + English Английский - - + + Estonian Эстонский - + Filipino Филиппинский - - + + Finnish Финский - - + + French Французский - - + + Galician Галицкий - + Georgian Грузинский - - + + German Немецкий - - + + Greek Греческий - + Haitian Creole Гаитянский креольский - - + + Hebrew Иврит - - + + Hindi Хинди - - + + Hungarian Венгерский - - + + Icelandic Исландский - - + + Indonesian Индонезийский - + Irish Ирландский - - + + Italian Итальянский - - + + Japanese Японский - - + + Korean Корейский - - + + Latvian Латвийский - - + + Lithuanian Литовский - - + + Macedonian Македонский - - + + Malay Малайский - - + + Maltese Мальтийский - - + + Norwegian Норвежский - + Persian Персидский - - + + Polish Польский - - + + Portuguese Португальский - - + + Romanian Румынский - - + + Russian Русский - - + + Serbian Сербский - + Slovak Словацкий - - + + Slovenian Словенский - - + + Spanish Испанский - - + + Swahili Суахили - - + + Swedish Шведский - - + + Thai Тайский - - + + Turkish Турецкий - - + + Ukrainian Украинский - + Urdu Урду - - + + Vietnamese Вьетнамский - + Welsh Валлийский - + Yiddish Идиш - + Ancient Greek Древнегреческий - + Esperanto alternative Эсперанто альтернативный - + Tagalog Тагальский - + Telugu Телугу - + Tamil Тамил - + Slovakian Словацкий - + Malayalam Малаялам - + Kannada Каннада - + Cherokee Чероки - + Middle French (ca. 1400-1600) Средневековый Французский - + Frankish Франкский - + Math / equation Математика/уравнение - + Esperanto Эсперанто - + Middle English (1100-1500) Средневековый Английский - + Bengali Бенгальский @@ -498,17 +560,17 @@ Recognizer - + Неверные параметры для OCR Неверные параметры для OCR - + Ошибка инициализации OCR: %1 Ошибка инициализации OCR: %1 - + Текст не распознан. Текст не распознан. @@ -520,6 +582,31 @@ Результат Результат + + + Распознать другой язык + Распознать другой язык + + + + Перевести на другой язык + Перевести на другой язык + + + + Скопировать в буфер + Скопировать в буфер + + + + Скопировать рисунок в буфер + Скопировать рисунок в буфер + + + + Исправить распознанный текст + Исправить распознанный текст + SelectionDialog @@ -528,6 +615,11 @@ Dialog Выбор + + + Поменять язык текста и перевода + Поменять язык текста и перевода + SettingsEditor @@ -537,102 +629,246 @@ Настройки - + + Общее + Общее + + + Горячие клавиши Горячие клавиши - - - + <html><head/><body><p>Сочетание клавиш для перехода в режим захвата.</p></body></html> <html><head/><body><p>Сочетание клавиш для перехода в режим захвата.</p></body></html> - + Захватить Захватить - + + <html><head/><body><p>Сочетание клавиш для перехода в режим захвата, но с использованием последнего использованного, а не текущего, изображения.</p></body></html> + <html><head/><body><p>Сочетание клавиш для перехода в режим захвата, но с использованием последнего использованного, а не текущего, изображения.</p></body></html> + + + + Захватить повторно + Захватить повторно + + + + <html><head/><body><p>Сочетание клавиш для повторного отображения последнего результата.</p></body></html> + <html><head/><body><p>Сочетание клавиш для повторного отображения последнего результата.</p></body></html> + + + + Показать + Показать + + + + <html><head/><body><p>Сочетание клавиш для копирования последнего результата в буфер обмена.</p></body></html> + <html><head/><body><p>Сочетание клавиш для копирования последнего результата в буфер обмена.</p></body></html> + + + Скопировать Скопировать - Повторить - Повторить + Повторить - + Распознавание Распознавание - <html><head/><body><p>Необходимо для распознавания.</p><p>Скачивается отсюда: <a href="https://code.google.com/p/tesseract-ocr/downloads/list"><span style=" text-decoration: underline; color:#0000ff;">https://code.google.com/p/tesseract-ocr/downloads/list</span></a></p></body></html> - <html><head/><body><p>Необходимо для распознавания.</p><p>Скачивается отсюда: <a href="https://code.google.com/p/tesseract-ocr/downloads/list"><span style=" text-decoration: underline; color:#0000ff;">https://code.google.com/p/tesseract-ocr/downloads/list</span></a></p></body></html> + <html><head/><body><p>Необходимо для распознавания.</p><p>Скачивается отсюда: <a href="https://code.google.com/p/tesseract-ocr/downloads/list"><span style=" text-decoration: underline; color:#0000ff;">https://code.google.com/p/tesseract-ocr/downloads/list</span></a></p></body></html> - - + + Путь к tessdata Путь к tessdata - + ... ... - + <html><head/><body><p>Заполняется на основании содержания tessdata</p></body></html> <html><head/><body><p>Заполняется на основании содержания tessdata</p></body></html> - + Язык распознавания Язык распознавания - <html><head/><body><p>Масштабирование изображения для улучшения распознания. Больше - лучше (до определенных пределов), но медленнее.</p></body></html> - <html><head/><body><p>Масштабирование изображения для улучшения распознания. Больше - лучше (до определенных пределов), но медленнее.</p></body></html> + <html><head/><body><p>Масштабирование изображения для улучшения распознания. Больше - лучше (до определенных пределов), но медленнее.</p></body></html> - + Увеличение масштаба Увеличение масштаба - + Вывод результата Вывод результата - + Трей Трей - + Окно Окно - + + Прокси + Прокси + + + + Тип: + Тип: + + + + Пользователь: + Пользователь: + + + + Адрес: + Адрес: + + + + Пароль: + Пароль: + + + + Порт: + Порт: + + + + Сохранять пароль (небезопасно) + Сохранять пароль (небезопасно) + + + + <html><head/><body><p>Необходимо для распознавания.</p><p>Скачивается отсюда: <a href="https://github.com/tesseract-ocr/tessdata"><span style=" text-decoration: underline; color:#7593bc;">https://github.com/tesseract-ocr/tessdata</span></a></p><p>&quot;./&quot; означает, что папка &quot;tessdata&quot; находится в одной директории с исполняемым файлом программы.</p></body></html> + <html><head/><body><p>Необходимо для распознавания.</p><p>Скачивается отсюда: <a href="https://github.com/tesseract-ocr/tessdata"><span style=" text-decoration: underline; color:#7593bc;">https://github.com/tesseract-ocr/tessdata</span></a></p><p>&quot;./&quot; означает, что папка &quot;tessdata&quot; находится в одной директории с исполняемым файлом программы.</p></body></html> + + + + <html><head/><body><p>Масштабирование изображения для улучшения распознания. Больше - лучше (до определенных пределов), но медленнее и потребляет больше памяти.</p><p>Рекомендуемые значения от 5 до 10.</p></body></html> + <html><head/><body><p>Масштабирование изображения для улучшения распознания. Больше - лучше (до определенных пределов), но медленнее и потребляет больше памяти.</p><p>Рекомендуемые значения от 5 до 10.</p></body></html> + + + + <html><head/><body><p>Символы, регулярно распознаваемые с ошибками. При обнаружении будут заменены на указанные.</p></body></html> + <html><head/><body><p>Символы, регулярно распознаваемые с ошибками. При обнаружении будут заменены на указанные.</p></body></html> + + + + Исправления: + Исправления: + + + + Язык + Язык + + + + Исходный текст + Исходный текст + + + + Исправление + Исправление + + + Перевод Перевод - + + <html><head/><body><p>Необходимо ли переводить (вкл) распознанный текст.</p></body></html> + <html><head/><body><p>Необходимо ли переводить (вкл) распознанный текст.</p></body></html> + + + + Переводить текст + Переводить текст + + + + <html><head/><body><p>Отображает окно переводчика. Следует использовать только для разработки переводчиков.</p></body></html> + <html><head/><body><p>Отображает окно переводчика. Следует использовать только для разработки переводчиков.</p></body></html> + + + + Режим отладки + Режим отладки + + + + <html><head/><body><p>Максимальное время, которое может быть затрачено на перевод, чтобы он не считался &quot;зависшим&quot;.</p></body></html> + <html><head/><body><p>Максимальное время, которое может быть затрачено на перевод, чтобы он не считался &quot;зависшим&quot;.</p></body></html> + + + + Максимальное время перевода: + Максимальное время перевода: + + + <html><head/><body><p>Язык, на который осуществляется перевод.</p></body></html> <html><head/><body><p>Язык, на который осуществляется перевод.</p></body></html> - + + Язык результата: + Язык результата: + + + + Переводчики: + Переводчики: + + + + сек. + сек. + + + + <html><head/><body><p>Отображены в порядке убывания приоритета.</p></body></html> + <html><head/><body><p>Отображены в порядке убывания приоритета.</p></body></html> + + Язык результата - Язык результата + Язык результата Afrikaans @@ -926,18 +1162,31 @@ Bengali Бенгальский + + + Нет + Нет + + + + SOCKS 5 + SOCKS 5 + + + + HTTP + HTTP + Translator - Неверные парметры для перевода. - Неверные парметры для перевода. + Неверные парметры для перевода. - Ошибка альтернативного перевода текста: %1 - Ошибка альтернативного перевода текста: %1 + Ошибка альтернативного перевода текста: %1 Ошибка перевода: %1 @@ -948,4 +1197,22 @@ Ошибка разбора перевода: %1 (%2) + + WebTranslator + + + Перевод отменен по таймауту. + Перевод отменен по таймауту. + + + + Ошибка загрузки страницы (%1) для перевода. + Ошибка загрузки страницы (%1) для перевода. + + + + Нет сценариев для перевода. Измените настройки. + Нет сценариев для перевода. Измените настройки. + + From d90c104fd2ecff9ce1ca6829b9a8818bf5cc5c94 Mon Sep 17 00:00:00 2001 From: Gres Date: Sun, 11 Oct 2015 18:34:55 +0300 Subject: [PATCH 60/89] Version updated. --- Manager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Manager.cpp b/Manager.cpp index 38c44ad..7cfda27 100644 --- a/Manager.cpp +++ b/Manager.cpp @@ -285,7 +285,7 @@ void Manager::close () { } void Manager::about () { - QString version = "1.2.3"; + QString version = "2.0.0"; QString text = tr ("Программа для распознавания текста на экране.\n" \ "Создана с использованием Qt, tesseract-ocr, Google Translate.\n" "Автор: Gres (translator@gres.biz)\n" From e18f9b243104189abce34cae3b4552930832beb5 Mon Sep 17 00:00:00 2001 From: Gres Date: Sun, 11 Oct 2015 19:51:07 +0300 Subject: [PATCH 61/89] Fixed icon change to processing after last item show. --- Manager.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/Manager.cpp b/Manager.cpp index 7cfda27..37d009b 100644 --- a/Manager.cpp +++ b/Manager.cpp @@ -338,6 +338,7 @@ void Manager::editRecognized (ProcessingItem item) { void Manager::showLast () { const ProcessingItem &item = resultDialog_->item (); if (item.isValid ()) { + ++itemProcessingCount_; showResult (item); } } From 37f2293156d9a5b9335fa7f8a67a56cd2b72aa82 Mon Sep 17 00:00:00 2001 From: Gres Date: Sun, 11 Oct 2015 19:51:37 +0300 Subject: [PATCH 62/89] Image conversion optimization. --- ImageProcessing.cpp | 30 ++++++++++-------------------- 1 file changed, 10 insertions(+), 20 deletions(-) diff --git a/ImageProcessing.cpp b/ImageProcessing.cpp index 8caf0c9..2e25dff 100644 --- a/ImageProcessing.cpp +++ b/ImageProcessing.cpp @@ -37,28 +37,20 @@ qint64 getFreeMemory () { Pix * convertImage (const QImage &image) { PIX *pix; - QImage swapped = image.rgbSwapped (); - int width = swapped.width (); - int height = swapped.height (); - int depth = swapped.depth (); - int wpl = swapped.bytesPerLine () / 4; + int width = image.width (); + int height = image.height (); + int depth = image.depth (); + int bytesPerLine = image.bytesPerLine (); + int wpl = bytesPerLine / 4; pix = pixCreate (width, height, depth); pixSetWpl (pix, wpl); pixSetColormap (pix, NULL); - l_uint32 *outData = pix->data; - - for (int y = 0; y < height; y++) { - l_uint32 *lines = outData + y * wpl; - QByteArray a ((const char *)swapped.scanLine (y), swapped.bytesPerLine ()); - for (int j = 0; j < a.size (); j++) { - *((l_uint8 *)lines + j) = a[j]; - } - } + memmove (pix->data, image.bits (), bytesPerLine * height); const qreal toDPM = 1.0 / 0.0254; - int resolutionX = swapped.dotsPerMeterX () / toDPM; - int resolutionY = swapped.dotsPerMeterY () / toDPM; + int resolutionX = image.dotsPerMeterX () / toDPM; + int resolutionY = image.dotsPerMeterY () / toDPM; if (resolutionX < 300) { resolutionX = 300; @@ -67,8 +59,6 @@ Pix * convertImage (const QImage &image) { resolutionY = 300; } pixSetResolution (pix, resolutionX, resolutionY); - - pixEndianByteSwap (pix); return pix; } @@ -77,7 +67,7 @@ QImage convertImage (Pix &image) { int height = pixGetHeight (&image); int depth = pixGetDepth (&image); int bytesPerLine = pixGetWpl (&image) * 4; - l_uint32 *datas = pixGetData (pixEndianByteSwapNew (&image)); + l_uint32 *datas = pixGetData (&image); QImage::Format format; if (depth == 1) { @@ -125,7 +115,7 @@ QImage convertImage (Pix &image) { return none; } - return result.rgbSwapped (); + return result; } Pix * prepareImage (const QImage &image, int preferredScale) { From 9892a9f29bd5e2aa11cc10607e8c7b614b4dc596 Mon Sep 17 00:00:00 2001 From: Gres Date: Sun, 18 Oct 2015 12:19:20 +0300 Subject: [PATCH 63/89] Added Updater class. --- Recources.qrc | 1 + ScreenTranslator.pro | 7 +- Updater.cpp | 263 +++++++++++++++++++++++++++++++++++++++++++ Updater.h | 65 +++++++++++ version.json | 30 +++++ 5 files changed, 364 insertions(+), 2 deletions(-) create mode 100644 Updater.cpp create mode 100644 Updater.h create mode 100644 version.json diff --git a/Recources.qrc b/Recources.qrc index 67a7a5f..e636270 100644 --- a/Recources.qrc +++ b/Recources.qrc @@ -6,5 +6,6 @@ images/STIconGreen.png images/STIconOrange.png images/STIconRed.png + version.json diff --git a/ScreenTranslator.pro b/ScreenTranslator.pro index 1376116..09445db 100644 --- a/ScreenTranslator.pro +++ b/ScreenTranslator.pro @@ -41,7 +41,8 @@ SOURCES += main.cpp\ WebTranslatorProxy.cpp \ TranslatorHelper.cpp \ RecognizerHelper.cpp \ - Utils.cpp + Utils.cpp \ + Updater.cpp HEADERS += \ Manager.h \ @@ -59,7 +60,8 @@ HEADERS += \ StAssert.h \ TranslatorHelper.h \ RecognizerHelper.h \ - Utils.h + Utils.h \ + Updater.h FORMS += \ SettingsEditor.ui \ @@ -76,6 +78,7 @@ TRANSLATIONS += \ OTHER_FILES += \ app.rc \ images/icon.ico \ + version.json \ README.md \ uncrustify.cfg\ translators/google.js \ diff --git a/Updater.cpp b/Updater.cpp new file mode 100644 index 0000000..ff74312 --- /dev/null +++ b/Updater.cpp @@ -0,0 +1,263 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "Updater.h" +#include "StAssert.h" + +namespace { +#define FIELD(NAME) const QString _ ## NAME = #NAME + FIELD (Application); + + FIELD (name); + FIELD (version); + FIELD (compatibleVersion); + FIELD (built_in); + FIELD (versionString); + FIELD (permissions); + FIELD (url); + FIELD (path); +#undef FIELD + +#if defined(Q_OS_WIN) + const QString _platform = "_win"; +#elif defined(Q_OS_LINUX) + const QString _platform = "_linux"; +#endif + + QString versionField (const QJsonObject &component, const QString &field) { + return component.contains (field + _platform) + ? component[field + _platform].toString () + : component[field].toString (); + } + + QFileInfo fileDir (const QString &fileName) { + return QFileInfo (fileName).absolutePath (); + } +} + +Updater::Updater (QObject *parent) + : QObject (parent), + network_ (new QNetworkAccessManager (this)), + componentsUpdating_ (0) { + updatesFileName_ = "updates.json"; + backupSuffix_ = "_backup"; + connect (network_, SIGNAL (finished (QNetworkReply *)), + SLOT (replyFinished (QNetworkReply *))); + + getCurrentVersion (); + updateCurrentVersion (); +} + +QDateTime Updater::nextCheckTime (const QDateTime &lastCheckTime, int updateType) const { + QDateTime nextTime; + switch (updateType) { + case UpdateTypeDaily: + nextTime = lastCheckTime.addDays (1); + break; + case UpdateTypeWeekly: + nextTime = lastCheckTime.addDays (7); + break; + case UpdateTypeMonthly: + nextTime = lastCheckTime.addDays (30); + break; + case UpdateTypeNever: + default: + return QDateTime (); + } + if (nextTime < QDateTime::currentDateTime ()) { + return QDateTime::currentDateTime ().addSecs (5); + } + return nextTime; +} + +void Updater::getCurrentVersion () { + QFile f (":/version.json"); + if (f.open (QFile::ReadOnly)) { + currentVersion_ = QJsonDocument::fromJson (f.readAll ()).object (); + f.close (); + } + else { + emit error (tr ("Ошибка определения текущей версии. Обновление недоступно.")); + } +} + +void Updater::updateCurrentVersion () { + QFile f (updatesFileName_); + if (!f.open (QFile::ReadOnly)) { + return; + } + QJsonObject updated = QJsonDocument::fromJson (f.readAll ()).object (); + f.close (); + foreach (const QString &component, updated.keys ()) { + QJsonObject current = currentVersion_[component].toObject (); + int updatedVersion = updated[component].toInt (); + if (current[_built_in].toBool () || current[_version].toInt () >= updatedVersion) { + continue; + } + current[_version] = updatedVersion; + currentVersion_[component] = current; + } +} + +QString Updater::currentAppVersion () const { + return currentVersion_[_Application].toObject ()[_versionString].toString (); +} + +void Updater::checkForUpdates () { + getAvailableVersion (); +} + +void Updater::getAvailableVersion () { + QNetworkRequest request (versionField (currentVersion_, _url)); + request.setAttribute (QNetworkRequest::User, _version); + network_->get (request); +} + +void Updater::replyFinished (QNetworkReply *reply) { + if (reply->error () != QNetworkReply::NoError) { + emit tr ("Ошибка загрузки информации для обновления."); + return; + } + QByteArray content = reply->readAll (); + QString component = reply->request ().attribute (QNetworkRequest::User).toString (); + if (component == _version) { + availableVersion_ = QJsonDocument::fromJson (content).object (); + parseAvailableVersion (); + } + else if (availableVersion_.contains (component) && !content.isEmpty ()) { + installComponent (component, content); + } + reply->deleteLater (); +} + +void Updater::parseAvailableVersion () { + QStringList inaccessible, incompatible; + QStringList updateList; + QDir currentDir; + foreach (const QString &component, availableVersion_.keys ()) { + QJsonObject available = availableVersion_[component].toObject (); + QJsonObject current = currentVersion_[component].toObject (); + QString path = versionField (available, _path); + if (path.isEmpty ()) { + continue; + } + + QFileInfo installDir = fileDir (path); + if (!installDir.exists ()) { + currentDir.mkpath (installDir.absoluteFilePath ()); + } + if (!installDir.isWritable ()) { // check dir because install = remove + make new + inaccessible << installDir.absoluteFilePath (); + } + if (current[_version].toInt () < available[_compatibleVersion].toInt ()) { + incompatible << component; + } + if (!QFile::exists (path) || current[_version].toInt () < available[_version].toInt ()) { + updateList << component; + } + } + if (updateList.isEmpty ()) { + return; + } + + QFileInfo updateFileDir = fileDir (updatesFileName_); + if (!updateFileDir.isWritable ()) { + inaccessible << updateFileDir.absoluteFilePath (); + } + inaccessible.removeDuplicates (); + + QString message = tr ("Доступно обновлений: %1.\n").arg (updateList.size ()); + QMessageBox::StandardButtons buttons = QMessageBox::Ok; + if (!incompatible.isEmpty ()) { + message += tr ("Несовместимых обновлений: %1.\nВыполните обновление вручную.") + .arg (incompatible.size ()); + } + else if (!inaccessible.isEmpty ()) { + message += tr ("Недоступных для записи директорий: %1.\n%2\nИзмените права доступа и " + "повторите попытку или выполните обновление вручную.") + .arg (inaccessible.size ()).arg (inaccessible.join ("\n")); + } + else { + message += tr ("Обновить?"); + buttons = QMessageBox::Yes | QMessageBox::No; + } + int result = QMessageBox::question (NULL, tr ("Обновление"), message, buttons); + if (result == QMessageBox::Yes) { + componentsUpdating_ = updateList.size (); + foreach (const QString &component, updateList) { + getComponent (component); + } + } +} + +void Updater::getComponent (const QString &component) { + QJsonObject available = availableVersion_[component].toObject (); + QString path = versionField (available, _path); + if (path.isEmpty ()) { + --componentsUpdating_; + return; + } + + QString url = versionField (available, _url); + if (url.isEmpty ()) { // just remove component + installComponent (component, QByteArray ()); + } + else { + QNetworkRequest request (url); + request.setAttribute (QNetworkRequest::User, component); + network_->get (request); + } +} + +void Updater::installComponent (const QString &component, const QByteArray &newContent) { + --componentsUpdating_; + ST_ASSERT (availableVersion_.contains (component)); + QJsonObject available = availableVersion_[component].toObject (); + QString path = versionField (available, _path); + ST_ASSERT (!path.isEmpty ()); + + QString backup = path + backupSuffix_; + QFile::remove (backup); + QFile::rename (path, backup); + + if (!newContent.isEmpty ()) { + QFile f (path); + if (!f.open (QFile::WriteOnly)) { + emit error (tr ("Ошибка обновления файла (%1).").arg (path)); + return; + } + f.write (newContent); + f.close (); + bool ok; + QFileDevice::Permissions perm (available[_permissions].toString ().toUInt (&ok, 16)); + if (ok) { + f.setPermissions (perm); + } + } + updateVersionInfo (component, available[_version].toInt ()); + + if (componentsUpdating_ == 0) { + emit updated (); + QString message = tr ("Обновление завершено. Для активации некоторых компонентов " + "может потребоваться перезапуск."); + QMessageBox::information (NULL, tr ("Обновление"), message, QMessageBox::Ok); + } +} + +void Updater::updateVersionInfo (const QString &component, int version) { + QFile f (updatesFileName_); + if (!f.open (QFile::ReadWrite)) { + emit error (tr ("Ошибка обновления файла с текущей версией.")); + return; + } + QJsonObject updated = QJsonDocument::fromJson (f.readAll ()).object (); + updated[component] = version; + f.seek (0); + f.write (QJsonDocument (updated).toJson ()); + f.close (); +} diff --git a/Updater.h b/Updater.h new file mode 100644 index 0000000..8b5d17a --- /dev/null +++ b/Updater.h @@ -0,0 +1,65 @@ +#ifndef UPDATER_H +#define UPDATER_H + +#include +#include +#include + +/*! + * \brief The Updater class. + * + * Allows to download and copy files from remote source to local machine. + */ +class Updater : public QObject { + Q_OBJECT + + public: + enum UpdateType { + UpdateTypeNever, UpdateTypeDaily, UpdateTypeWeekly, UpdateTypeMonthly + }; + + explicit Updater (QObject *parent = 0); + + QString currentAppVersion () const; + + //! Initiate updates check. + void checkForUpdates (); + + //! Get nearest update check time based on given settings. + QDateTime nextCheckTime (const QDateTime &lastCheckTime, int updateType) const; + + signals: + void error (const QString &message); + //! Emited after all components updated. + void updated (); + + private slots: + //! Handle remote downloads finish. + void replyFinished (QNetworkReply *reply); + + private: + //! Load current version info (built-in). + void getCurrentVersion (); + //! Update current version info with information about preformed updates. + void updateCurrentVersion (); + //! Load latest available version info from remote source. + void getAvailableVersion (); + //! Check is updates available, prompt user and start update. + void parseAvailableVersion (); + //! Start update of given component. + void getComponent (const QString &component); + //! Finalize update of given component with given new content. + void installComponent (const QString &component, const QByteArray &newContent); + //! Save information about component update on disk (for updateCurrentVersion()). + void updateVersionInfo (const QString &component, int version); + + private: + QNetworkAccessManager *network_; + QJsonObject availableVersion_; + QJsonObject currentVersion_; + QString updatesFileName_; + int componentsUpdating_; + QString backupSuffix_; +}; + +#endif // UPDATER_H diff --git a/version.json b/version.json new file mode 100644 index 0000000..8d78aa1 --- /dev/null +++ b/version.json @@ -0,0 +1,30 @@ +{ + "version": 1, + "url": "https://cdn.rawgit.com/OneMoreGres/ScreenTranslator/master/version.json", + "Application": { + "version": 1, + "compatibleVersion": 1, + "built_in": true, + "versionString": "2.0.0", + "permissions": "0x7755", + "url_win": "https://raw.githubusercontent.com/OneMoreGres/ScreenTranslator/releases/2.0.0/ScreenTranslator.exe", + "path_win": "ScreenTranslator.exe", + "url_linux": "https://raw.githubusercontent.com/OneMoreGres/ScreenTranslator/releases/2.0.0/ScreenTranslator", + "path_linux": "ScreenTranslator" + }, + "Bing translator": { + "version": 1, + "url": "https://raw.githubusercontent.com/OneMoreGres/ScreenTranslator/master/translators/bing.js", + "path": "translators/bing.js" + }, + "Google translator": { + "version": 1, + "url": "https://raw.githubusercontent.com/OneMoreGres/ScreenTranslator/master/translators/google.js", + "path": "translators/google.js" + }, + "Yandex translator": { + "version": 1, + "url": "https://raw.githubusercontent.com/OneMoreGres/ScreenTranslator/master/translators/yandex.js", + "path": "translators/yandex.js" + } +} From 01b5d1c91995a9f7f6d73f4f6f9b63acebb2781a Mon Sep 17 00:00:00 2001 From: Gres Date: Sun, 18 Oct 2015 12:19:32 +0300 Subject: [PATCH 64/89] Edit update settings. --- Settings.h | 4 ++ SettingsEditor.cpp | 6 +++ SettingsEditor.h | 1 + SettingsEditor.ui | 108 +++++++++++++++++++++++++++++++++------------ 4 files changed, 92 insertions(+), 27 deletions(-) diff --git a/Settings.h b/Settings.h index 0c705a3..223503a 100644 --- a/Settings.h +++ b/Settings.h @@ -18,6 +18,8 @@ namespace settings_names { const QString proxyUser = "proxyUser"; const QString proxyPassword = "proxyPassword"; const QString proxySavePassword = "proxySavePassword"; + const QString autoUpdateType = "autoUpdateType"; + const QString lastUpdateCheck = "lastUpdateCheck"; //! Recognition const QString recogntionGroup = "Recognition"; @@ -51,6 +53,8 @@ namespace settings_values { const QString proxyUser = ""; const QString proxyPassword = ""; const bool proxySavePassword = false; + const int autoUpdateType = 0; //Never + const QString lastUpdateCheck = ""; //! Recognition const QString tessDataPlace = "./"; diff --git a/SettingsEditor.cpp b/SettingsEditor.cpp index 5537196..72b75c7 100644 --- a/SettingsEditor.cpp +++ b/SettingsEditor.cpp @@ -23,6 +23,10 @@ SettingsEditor::SettingsEditor (const LanguageHelper &dictionary, QWidget *paren buttonGroup_->addButton (ui->trayRadio, 0); buttonGroup_->addButton (ui->dialogRadio, 1); + connect (ui->updateButton, SIGNAL (clicked (bool)), SIGNAL (updateCheckRequested ())); + QStringList updateTypes = QStringList () << tr ("Никогда") << tr ("Ежедневно") + << tr ("Еженедельно") << tr ("Ежемесячно"); + ui->updateCombo->addItems (updateTypes); connect (ui->tessdataButton, SIGNAL (clicked ()), SLOT (openTessdataDialog ())); connect (ui->tessdataEdit, SIGNAL (textChanged (const QString &)), @@ -89,6 +93,7 @@ void SettingsEditor::saveSettings () const { QNetworkProxy::setApplicationProxy (proxy); } settings.setValue (proxySavePassword, ui->proxySaveCheck->isChecked ()); + settings.setValue (autoUpdateType, ui->updateCombo->currentIndex ()); settings.endGroup (); @@ -179,6 +184,7 @@ void SettingsEditor::loadSettings () { else { ui->proxyPassEdit->setText (QNetworkProxy::applicationProxy ().password ()); } + ui->updateCombo->setCurrentIndex (GET (autoUpdateType).toInt ()); settings.endGroup (); settings.beginGroup (settings_names::recogntionGroup); diff --git a/SettingsEditor.h b/SettingsEditor.h index 6cb5796..8b6f669 100644 --- a/SettingsEditor.h +++ b/SettingsEditor.h @@ -26,6 +26,7 @@ class SettingsEditor : public QDialog { signals: void settingsEdited (); + void updateCheckRequested (); public slots: void done (int result); diff --git a/SettingsEditor.ui b/SettingsEditor.ui index cc031a3..d7a1fab 100644 --- a/SettingsEditor.ui +++ b/SettingsEditor.ui @@ -33,7 +33,7 @@ Общее - + @@ -96,32 +96,6 @@ - - - Вывод результата - - - - - - Трей - - - - - - - Окно - - - true - - - - - - - Прокси @@ -194,6 +168,86 @@ + + + + + + + 0 + 0 + + + + Вывод результата + + + + + + + 0 + 0 + + + + Трей + + + + + + + + 0 + 0 + + + + Окно + + + true + + + + + + + + + + Обновление + + + + + + Проверять обновления: + + + + + + + + + + + 0 + 0 + + + + Проверить + + + + + + + + From 25d6ccd81aea8723d19b91f9f414bdc87e3e0c74 Mon Sep 17 00:00:00 2001 From: Gres Date: Sun, 18 Oct 2015 12:19:59 +0300 Subject: [PATCH 65/89] Added ability to auto-update some components. --- Manager.cpp | 35 ++++++++++++++++++++++++++++++++--- Manager.h | 5 +++++ 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/Manager.cpp b/Manager.cpp index 37d009b..74f7d73 100644 --- a/Manager.cpp +++ b/Manager.cpp @@ -23,12 +23,14 @@ #include "LanguageHelper.h" #include "StAssert.h" #include "Utils.h" +#include "Updater.h" Manager::Manager (QObject *parent) : QObject (parent), trayIcon_ (new QSystemTrayIcon (this)), dictionary_ (new LanguageHelper), resultDialog_ (new ResultDialog (*dictionary_)), + updater_ (new Updater (this)), updateTimer_ (new QTimer (this)), captureAction_ (NULL), repeatCaptureAction_ (NULL), repeatAction_ (NULL), clipboardAction_ (NULL), useResultDialog_ (true), doTranslation_ (true), itemProcessingCount_ (0) { @@ -66,6 +68,11 @@ Manager::Manager (QObject *parent) : connect (this, SIGNAL (settingsEdited ()), this, SLOT (applySettings ())); + connect (updater_, SIGNAL (updated ()), SIGNAL (settingsEdited ())); + connect (updater_, SIGNAL (error (QString)), SLOT (showError (QString))); + updateTimer_->setSingleShot (true); + connect (updateTimer_, SIGNAL (timeout ()), SLOT (checkForUpdates ())); + resultDialog_->setWindowIcon (trayIcon_->icon ()); connect (this, SIGNAL (settingsEdited ()), resultDialog_, SLOT (applySettings ())); connect (resultDialog_, SIGNAL (requestRecognize (ProcessingItem)), @@ -78,7 +85,6 @@ Manager::Manager (QObject *parent) : connect (resultDialog_, SIGNAL (requestEdition (ProcessingItem)), this, SLOT (editRecognized (ProcessingItem))); - connect (trayIcon_, SIGNAL (activated (QSystemTrayIcon::ActivationReason)), SLOT (processTrayAction (QSystemTrayIcon::ActivationReason))); @@ -170,6 +176,8 @@ void Manager::applySettings () { proxy.setPassword (encode (GET (proxyPassword).toString ())); } QNetworkProxy::setApplicationProxy (proxy); + + scheduleUpdate (); settings.endGroup (); settings.beginGroup (settings_names::recogntionGroup); @@ -186,6 +194,27 @@ void Manager::applySettings () { #undef GET } +void Manager::scheduleUpdate (bool justChecked) { +#define GET(NAME) settings.value (settings_names::NAME, settings_values::NAME) + QSettings settings; + settings.beginGroup (settings_names::guiGroup); + updateTimer_->stop (); + if (justChecked) { + settings.setValue (settings_names::lastUpdateCheck, QDateTime::currentDateTime ()); + } + QDateTime nextUpdateCheck = updater_->nextCheckTime (GET (lastUpdateCheck).toDateTime (), + GET (autoUpdateType).toInt ()); + if (nextUpdateCheck.isValid ()) { + updateTimer_->start (QDateTime::currentDateTime ().msecsTo (nextUpdateCheck)); + } +#undef GET +} + +void Manager::checkForUpdates () { + updater_->checkForUpdates (); + scheduleUpdate (true); +} + Manager::~Manager () { foreach (SelectionDialog * selection, selections_.values ()) { selection->hide (); @@ -275,6 +304,7 @@ void Manager::settings () { SettingsEditor editor (*dictionary_); editor.setWindowIcon (trayIcon_->icon ()); connect (&editor, SIGNAL (settingsEdited ()), SIGNAL (settingsEdited ())); + connect (&editor, SIGNAL (updateCheckRequested ()), SLOT (checkForUpdates ())); updateActionsState (false); editor.exec (); updateActionsState (true); @@ -285,11 +315,10 @@ void Manager::close () { } void Manager::about () { - QString version = "2.0.0"; QString text = tr ("Программа для распознавания текста на экране.\n" \ "Создана с использованием Qt, tesseract-ocr, Google Translate.\n" "Автор: Gres (translator@gres.biz)\n" - "Версия: %1 от %2 %3").arg (version) + "Версия: %1 от %2 %3").arg (updater_->currentAppVersion ()) .arg (__DATE__).arg (__TIME__); QString tips = tr ("\n\nПодсказки.\n" "Клик по иконке в трее:\n" diff --git a/Manager.h b/Manager.h index c1e0f6b..74bb66a 100644 --- a/Manager.h +++ b/Manager.h @@ -13,6 +13,7 @@ class QMenu; class SelectionDialog; class ResultDialog; class LanguageHelper; +class Updater; class Manager : public QObject { Q_OBJECT @@ -42,6 +43,7 @@ class Manager : public QObject { void copyLastImageToClipboard (); void applySettings (); + void checkForUpdates (); void processTrayAction (QSystemTrayIcon::ActivationReason reason); @@ -56,6 +58,7 @@ class Manager : public QObject { QMenu * trayContextMenu (); void updateActionsState (bool isEnabled = true); void changeIcon (int iconType, int timeoutMsec = 3000); + void scheduleUpdate (bool justChecked = false); private: QSystemTrayIcon *trayIcon_; @@ -63,6 +66,8 @@ class Manager : public QObject { //! Selection dialogs for each screen. Key - screen name. QMap selections_; ResultDialog *resultDialog_; + Updater *updater_; + QTimer *updateTimer_; QAction *captureAction_; QAction *repeatCaptureAction_; QAction *repeatAction_; From c53dcdae6d9aaf456b9fff2706f2a1fe4f2f6f42 Mon Sep 17 00:00:00 2001 From: Gres Date: Sun, 18 Oct 2015 12:20:09 +0300 Subject: [PATCH 66/89] License year changed. --- LICENSE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE.md b/LICENSE.md index e06e546..22dbc5c 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2014 Gres (gres@gres.biz) +Copyright (c) 2015 Gres (gres@gres.biz) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in From ff7ed3de66ed94b2ba8db1774fccb9a4b1571b8c Mon Sep 17 00:00:00 2001 From: Gres Date: Tue, 20 Oct 2015 22:33:12 +0300 Subject: [PATCH 67/89] Recognizer substitutions now placed in user's home dir. --- RecognizerHelper.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/RecognizerHelper.cpp b/RecognizerHelper.cpp index 844c9c9..6547efb 100644 --- a/RecognizerHelper.cpp +++ b/RecognizerHelper.cpp @@ -1,9 +1,16 @@ +#include #include +#include +#include #include "RecognizerHelper.h" RecognizerHelper::RecognizerHelper () - : fileName_ ("subs.csv") { + : fileName_ ("st_subs.csv") { +#ifdef Q_OS_LINUX + QDir settingDir = QFileInfo (QSettings ().fileName ()).dir (); + fileName_ = settingDir.absoluteFilePath (fileName_); +#endif } void RecognizerHelper::load () { From af91756ca36c4fb239ef4d2a90eea85b6f9fa4af Mon Sep 17 00:00:00 2001 From: Gres Date: Tue, 20 Oct 2015 23:28:46 +0300 Subject: [PATCH 68/89] Added icon source. --- images/STIcon.xcf | Bin 0 -> 254245 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/STIcon.xcf diff --git a/images/STIcon.xcf b/images/STIcon.xcf new file mode 100644 index 0000000000000000000000000000000000000000..a141be398608231963718db4992660fc04a8d5b5 GIT binary patch literal 254245 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�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 Date: Tue, 20 Oct 2015 23:34:37 +0300 Subject: [PATCH 69/89] Build and distribution process has been automated. --- 3rd-party/deps/get_deps.sh | 6 - 3rd-party/deps/make_deps.sh | 38 - ScreenTranslator.pro | 10 +- distr/{eng/Changelog.txt => Changelog_en.txt} | 19 +- distr/{ru/Changelog.txt => Changelog_ru.txt} | 19 +- distr/Files.xlsx | Bin 5620963 -> 0 bytes distr/InnoSetup.iss | 269 ---- distr/deb/DEBIAN/control | 16 + .../applications/ScreenTranslator.desktop | 9 + distr/iss/InnoSetup.iss | 145 ++ distr/iss/LICENSE_ru.md | 9 + distr/iss/code2langTr.txt | 109 ++ distr/iss/dwinshs.iss | 1266 +++++++++++++++++ distr/iss/make_tess_iss.sh | 230 +++ distr/iss/tessdata.iss | 551 +++++++ distr/ru/Russian.isl | 78 - distr/sf/readme.md | 26 - scripts/get_deps.sh | 8 + scripts/get_tessdata.sh | 14 + scripts/install_deps.sh | 4 + scripts/make_all.sh | 19 + scripts/make_app.sh | 11 + scripts/make_deb.sh | 45 + scripts/make_deps.sh | 54 + scripts/make_iss.sh | 49 + scripts/make_sf.sh | 21 + scripts/options.sh | 54 + 27 files changed, 2656 insertions(+), 423 deletions(-) delete mode 100755 3rd-party/deps/get_deps.sh delete mode 100755 3rd-party/deps/make_deps.sh rename distr/{eng/Changelog.txt => Changelog_en.txt} (56%) rename distr/{ru/Changelog.txt => Changelog_ru.txt} (52%) delete mode 100644 distr/Files.xlsx delete mode 100644 distr/InnoSetup.iss create mode 100644 distr/deb/DEBIAN/control create mode 100644 distr/deb/usr/share/applications/ScreenTranslator.desktop create mode 100644 distr/iss/InnoSetup.iss create mode 100644 distr/iss/LICENSE_ru.md create mode 100644 distr/iss/code2langTr.txt create mode 100644 distr/iss/dwinshs.iss create mode 100755 distr/iss/make_tess_iss.sh create mode 100644 distr/iss/tessdata.iss delete mode 100644 distr/ru/Russian.isl delete mode 100644 distr/sf/readme.md create mode 100755 scripts/get_deps.sh create mode 100755 scripts/get_tessdata.sh create mode 100755 scripts/install_deps.sh create mode 100755 scripts/make_all.sh create mode 100755 scripts/make_app.sh create mode 100755 scripts/make_deb.sh create mode 100755 scripts/make_deps.sh create mode 100755 scripts/make_iss.sh create mode 100755 scripts/make_sf.sh create mode 100755 scripts/options.sh diff --git a/3rd-party/deps/get_deps.sh b/3rd-party/deps/get_deps.sh deleted file mode 100755 index 09a64e0..0000000 --- a/3rd-party/deps/get_deps.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash - -wget -O leptonica.tar.gz http://www.leptonica.com/source/leptonica-1.72.tar.gz -wget -O tesseract.tar.gz https://github.com/tesseract-ocr/tesseract/archive/3.04.00.tar.gz -wget -O tessdata.tar.gz https://github.com/tesseract-ocr/tessdata/archive/3.04.00.tar.gz - diff --git a/3rd-party/deps/make_deps.sh b/3rd-party/deps/make_deps.sh deleted file mode 100755 index 9c72a5e..0000000 --- a/3rd-party/deps/make_deps.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/bash - -WORK_DIR=linux - -#WORK_DIR=mingw -#HOST=i686-w64-mingw32 -#export PATH="/opt/mingw-4.9.3/mingw-w64-i686/bin:$PATH" - -#rm -rf $WORK_DIR -mkdir $WORK_DIR 2> /dev/null -set -e - -WORK_DIR=`realpath $WORK_DIR` -if [ ! -z "$HOST" ]; then HOST_ATTR="--host=$HOST"; fi - -echo "Building Leptonica" -tar zxf leptonica.tar.gz -C $WORK_DIR -LEPT_DIR=`ls $WORK_DIR | grep lept` -cd $WORK_DIR/$LEPT_DIR -./configure --prefix=$WORK_DIR --disable-programs $HOST_ATTR -make -j4 -make install -cd ../.. - -echo "Building Tesseract" -tar zxf tesseract.tar.gz -C $WORK_DIR -TESS_DIR=`ls $WORK_DIR | grep tess` -cd $WORK_DIR/$TESS_DIR -sed 's/vs2008/vs2010/g' -i ccutil/Makefile.in -sed 's/Windows\.h/windows\.h/g' -i opencl/openclwrapper.cpp -LIBLEPT_HEADERSDIR=$WORK_DIR/include LIBS=-L$WORK_DIR/lib ./configure --prefix=$WORK_DIR --disable-tessdata-prefix $HOST_ATTR -make -j4 -make install -cd ../.. - -find -name '*.dll' -exec cp {} $WORK_DIR/lib \; - -echo "Done" diff --git a/ScreenTranslator.pro b/ScreenTranslator.pro index 09445db..e0de903 100644 --- a/ScreenTranslator.pro +++ b/ScreenTranslator.pro @@ -14,13 +14,13 @@ CONFIG += c++11 win32{ RC_FILE = app.rc - INCLUDEPATH += ../mingw/include - LIBS += -L../mingw/lib -lws2_32 + INCLUDEPATH += $$PWD/../build/mingw/deps/include + LIBS += -L$$PWD/../build/mingw/deps/lib -lws2_32 } linux{ QT += x11extras - INCLUDEPATH += ../linux/include - LIBS += -L../linux/lib -lX11 -Wl,-rpath,. + INCLUDEPATH += $$PWD/../build/linux/deps/include + LIBS += -L$$PWD/../build/linux/deps/lib -lX11 -Wl,-rpath,. } LIBS += -ltesseract -llept @@ -84,4 +84,6 @@ OTHER_FILES += \ translators/google.js \ translators/yandex.js \ translators/bing.js \ + distr/eng/Changelog.txt \ + distr/ru/Changelog.txt \ TODO.md diff --git a/distr/eng/Changelog.txt b/distr/Changelog_en.txt similarity index 56% rename from distr/eng/Changelog.txt rename to distr/Changelog_en.txt index 746894b..c77f70b 100644 --- a/distr/eng/Changelog.txt +++ b/distr/Changelog_en.txt @@ -1,4 +1,21 @@ Changes. +2.0.0: +* Added a version for linux. +* Added support for multiple monitors. +* Added ability of recognition without translation. +* Added ability to recapture from old image. +* Added ability to recapture without closing capture window. +* Added ability to re-recognize other language. +* Added ability to display intermediate result when error occured. +* Added support for different translation services. +* Added ability to copy image to clipboard. +* Added ability to edit recognized text. +* Added ability to automatically correct common recognition mistakes. +* Added ability to use a proxy. +* Added ability to swap translation and recognition languages. +* Updated icons. +* Show progress on icon. +* Added ability to automatically update. 1.2.3: * Fixed possible crash. * Added version information and some error messages. @@ -23,4 +40,4 @@ Changes. * Fixed an issue with incorrect window size when display results. 1.1.0: + Displays the result in the window, along with the picture. -+ Context menu expanded. Added buttons display the last result and copy it to the clipboard. \ No newline at end of file ++ Context menu expanded. Added buttons display the last result and copy it to the clipboard. diff --git a/distr/ru/Changelog.txt b/distr/Changelog_ru.txt similarity index 52% rename from distr/ru/Changelog.txt rename to distr/Changelog_ru.txt index c17b51b..02b4321 100644 --- a/distr/ru/Changelog.txt +++ b/distr/Changelog_ru.txt @@ -1,4 +1,21 @@ . +2.0.0: +* linux. +* . +* . +* . +* . +* . +* . +* . +* . +* . +* . +* . +* . +* . +* . +* . 1.2.3: * . * . @@ -23,4 +40,4 @@ - . 1.1.0: - , . -- . . \ No newline at end of file +- . . diff --git a/distr/Files.xlsx b/distr/Files.xlsx deleted file mode 100644 index afbd7a40b36810e233f0e4c4b0ef38ea15f7f4f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5620963 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�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

rFvspRDD$1!V`-@~x?+hAfe{mFs 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

9q~*It>Qg~EggSiFKOENpuU)~C>0~z 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%0Dwi;cKci$7M_{tox>sD+&@Dvp8 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

Sa6s70af;Ety8k~?A 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