122 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			122 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
#include "ResultDialog.h"
 | 
						|
#include "ui_ResultDialog.h"
 | 
						|
#include "StAssert.h"
 | 
						|
#include "LanguageHelper.h"
 | 
						|
 | 
						|
#include <QDesktopWidget>
 | 
						|
#include <QMouseEvent>
 | 
						|
#include <QMenu>
 | 
						|
 | 
						|
ResultDialog::ResultDialog (const LanguageHelper &dictionary, QWidget *parent) :
 | 
						|
  QDialog (parent),
 | 
						|
  ui (new Ui::ResultDialog),
 | 
						|
  dictionary_ (dictionary),
 | 
						|
  contextMenu_ (NULL), recognizeSubMenu_ (NULL),  translateSubMenu_ (NULL),
 | 
						|
  clipboardAction_ (NULL), imageClipboardAction_ (NULL), correctAction_ (NULL) {
 | 
						|
  ui->setupUi (this);
 | 
						|
  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 ();
 | 
						|
}
 | 
						|
 | 
						|
ResultDialog::~ResultDialog () {
 | 
						|
  delete contextMenu_;
 | 
						|
  delete ui;
 | 
						|
}
 | 
						|
 | 
						|
const ProcessingItem &ResultDialog::item () const {
 | 
						|
  return item_;
 | 
						|
}
 | 
						|
 | 
						|
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 ("Скопировать в буфер"));
 | 
						|
  imageClipboardAction_ = contextMenu_->addAction (tr ("Скопировать рисунок в буфер"));
 | 
						|
  correctAction_ = contextMenu_->addAction (tr ("Исправить распознанный текст"));
 | 
						|
}
 | 
						|
 | 
						|
bool ResultDialog::eventFilter (QObject *object, QEvent *event) {
 | 
						|
  Q_UNUSED (object);
 | 
						|
  if (event->type () == QEvent::MouseButtonPress) {
 | 
						|
    Qt::MouseButton button = static_cast<QMouseEvent *>(event)->button ();
 | 
						|
    if (button == Qt::RightButton) {
 | 
						|
      QAction *action = contextMenu_->exec (QCursor::pos ());
 | 
						|
      if (recognizeSubMenu_->findChildren<QAction *> ().contains (action)) {
 | 
						|
        ProcessingItem item = item_;
 | 
						|
        item.translated = item.recognized = QString ();
 | 
						|
        item.ocrLanguage = dictionary_.ocrUiToCode (action->text ());
 | 
						|
        emit requestRecognize (item);
 | 
						|
      }
 | 
						|
      else if (translateSubMenu_->findChildren<QAction *> ().contains (action)) {
 | 
						|
        ProcessingItem item = item_;
 | 
						|
        item.translated.clear ();
 | 
						|
        item.translateLanguage = dictionary_.translateUiToCode (action->text ());
 | 
						|
        emit requestTranslate (item);
 | 
						|
      }
 | 
						|
      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.
 | 
						|
        return QDialog::eventFilter (object, event);
 | 
						|
      }
 | 
						|
    }
 | 
						|
    hide ();
 | 
						|
  }
 | 
						|
  else if (event->type () == QEvent::WindowDeactivate) {
 | 
						|
    hide ();
 | 
						|
  }
 | 
						|
  return QDialog::eventFilter (object, event);
 | 
						|
}
 | 
						|
 | 
						|
void ResultDialog::showResult (ProcessingItem item) {
 | 
						|
  ST_ASSERT (item.isValid ());
 | 
						|
  item_ = 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 ();
 | 
						|
#ifdef Q_OS_LINUX
 | 
						|
  hide (); // buggy otherwise (on some systems)
 | 
						|
  show ();
 | 
						|
#endif
 | 
						|
 | 
						|
  QDesktopWidget *desktop = QApplication::desktop ();
 | 
						|
  Q_CHECK_PTR (desktop);
 | 
						|
  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 ();
 | 
						|
  if (y () > minY) {
 | 
						|
    move (x (), minY);
 | 
						|
  }
 | 
						|
  activateWindow ();
 | 
						|
}
 |