#include "mainwindow.h" #include "ui_mainwindow.h" #include #include #include #include #include #include #include #include #include "widget_statusbar.h" #include "dialog_log.h" #include "dialog_openimageindex.h" #include "dialog_saveas.h" #include "dialog_export.h" #include "dialog_exportimagefile.h" #include "dialog_imageinfo.h" #include "dialog_fullscreen.h" #include "dialog_imgproc_adjust.h" #include "dialog_multirotate.h" #include "dialog_multirotateimagefile.h" #include "dialog_imgproc_autocrop.h" #include "dialog_admin.h" #include "dialog_passwordchange.h" #include "dialog_insertindex.h" #include "dialog_aquireinto.h" #include "dialog_logmanager.h" #include "dialog_clrcache.h" #include "dialog_moveto.h" #include "dialog_imageeditor.h" #include "hg_settingdialog.h" #include "base/HGInfo.h" #include "imgfmt/HGPdf.h" #include "imgfmt/HGTiff.h" #include "imgfmt/HGImgFmt.h" #include "imgproc/HGImgProc.h" #include "base/HGUtility.h" #include "HGUIGlobal.h" #include "../../utility/HGString.h" #include "app_cfg.h" #define PASSWORD_KEY 4 #define MY_URL_SCHEME "inscanner" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) , m_admin_loggedIn(false) , m_currFilePath("") , m_currIndex(-1) , m_multiPageCount(0) , m_multiIndex(-1) , m_modify(false) , m_singleScan(false) , m_scanType(0) , m_scanInsertPos(-1) , m_scanFileName("") , m_scanImgFmtWriter(nullptr) , m_isScanning(false) { ui->setupUi(this); this->setWindowIcon(QIcon(":images/image_rsc/logo/logo.ico")); this->setWindowTitle(tr("HuaGoScan")); this->setAutoFillBackground(true); this->setPalette(QPalette(QColor(240, 240, 240))); m_config.load(); ui->toolBar->addAction(ui->act_scannerSettings); ui->toolBar->addAction(ui->act_acquire); ui->toolBar->addSeparator(); ui->toolBar->addAction(ui->act_fitWindowWidth); ui->toolBar->addAction(ui->act_fitWindowSize); ui->toolBar->addAction(ui->act_zoomIn); ui->toolBar->addAction(ui->act_zoomOut); ui->toolBar->addAction(ui->act_realSize); ui->toolBar->addSeparator(); ui->toolBar->addAction(ui->act_90Left); ui->toolBar->addAction(ui->act_90Right); ui->toolBar->addAction(ui->act_imageEdit); ui->toolBar->addSeparator(); ui->toolBar->addAction(ui->act_previous); ui->toolBar->addAction(ui->act_next); ui->toolBar->addAction(ui->act_previousPage); ui->toolBar->addAction(ui->act_nextPage); ui->toolBar->addSeparator(); ui->toolBar->addAction(ui->act_help); m_view = new HGImgView(ui->centralwidget); ui->verticalLayout->addWidget(m_view); ui->centralwidget->setMinimumWidth(160); m_thumb = new HGImgThumb(ui->dockWidget); ui->dockWidget->setMinimumWidth(200); resizeDocks({ui->dockWidget}, {200}, Qt::Horizontal); ui->dockWidget->setWidget(m_thumb); ui->dockWidget->setTitleBarWidget(new QWidget()); ui->dockWidget->titleBarWidget()->setVisible(false); QRegExp rx("[0-9,-]+$"); m_multiPageLineEdit = new HGLineEdit(this); m_multiPageLineEdit->setValidator(new QRegExpValidator(rx, this)); m_multiPageLineEdit->setFixedWidth(70); m_multiPageLineEdit->setAlignment(Qt::AlignHCenter); ui->toolBar->insertWidget(ui->act_nextPage, m_multiPageLineEdit); m_wndStatusBar = new Widget_StatusBar(ui->act_zoomIn, ui->act_zoomOut, ui->statusBar); ui->statusBar->addWidget(m_wndStatusBar, 1); m_dialogLog = new dialog_log(this); connect(m_view, SIGNAL(scaleChanged(double)), this, SLOT(on_viewerScale(double))); connect(m_view, SIGNAL(mousePos(int, int)), this, SLOT(on_viewerMousePos(int, int))); connect(m_view, SIGNAL(drop(const QObject*, const QStringList &)), this, SLOT(on_viewerDrop(const QObject*, const QStringList &))); connect(m_view, SIGNAL(doubleClicked()), this, SLOT(on_viewerDblClick())); connect(m_thumb, SIGNAL(itemCountChanged(int)), this, SLOT(on_itemCountChanged(int))); connect(m_thumb, SIGNAL(itemSelectingChanged()), this, SLOT(on_itemSelectingChanged())); connect(m_thumb, SIGNAL(currItemChanged(int)), this, SLOT(on_currItemChanged(int))); connect(m_thumb, SIGNAL(itemDoubleClicked(int)), this, SLOT(on_itemDoubleClicked(int))); connect(m_thumb, SIGNAL(contextMenuEvent(int)), this, SLOT(on_thumbContextMenu(int))); connect(m_thumb, SIGNAL(drop(const QObject*, const QStringList &, int)), this, SLOT(on_thumbDrop(const QObject*, const QStringList &, int))); connect(m_multiPageLineEdit, SIGNAL(editingFinished()), this, SLOT(on_multiPageLineEditFinished())); m_view->enableScroll(true); m_view->setScrollSize(16); m_view->setMinScrollSliderSize(20); QImage defItemImage(":images/image_rsc/scroll/defItemImage.png"); m_thumb->setDefItemImage(&defItemImage); m_thumb->setType(HGImgThumb::ThumbType_Vert); m_thumb->setItemSize(120); m_thumb->setScrollSize(16); m_thumb->setMinScrollSliderSize(20); m_thumb->setItemTextHeight(0); QImage nullScrollImage(":images/image_rsc/scroll/nullScrollImage.png"); m_view->setNullScrollImage(&nullScrollImage); m_thumb->setNullScrollImage(&nullScrollImage); QImage hScrollImage(":images/image_rsc/scroll/hScrollImage.png"); m_thumb->setHScrollImage(&hScrollImage, nullptr); m_view->setHScrollImage(&hScrollImage, nullptr); QImage vScrollImage(":images/image_rsc/scroll/vScrollImage.png"); m_thumb->setVScrollImage(&vScrollImage, nullptr); m_view->setVScrollImage(&vScrollImage, nullptr); QImage leftNormalImg(":images/image_rsc/scroll/left_Normal.png"); QImage leftHotImg(":images/image_rsc/scroll/left_Hot.png"); QImage leftPushImg(":images/image_rsc/scroll/left_Push.png"); m_thumb->setHScrollLeftImage(&leftNormalImg, &leftHotImg, &leftPushImg); m_view->setHScrollLeftImage(&leftNormalImg, &leftHotImg, &leftPushImg); QImage rightNormalImg(":images/image_rsc/scroll/right_Normal.png"); QImage rightHotImg(":images/image_rsc/scroll/right_Hot.png"); QImage rightPushImg(":images/image_rsc/scroll/right_Push.png"); m_thumb->setHScrollRightImage(&rightNormalImg, &rightHotImg, &rightPushImg); m_view->setHScrollRightImage(&rightNormalImg, &rightHotImg, &rightPushImg); QImage topNormalImg(":images/image_rsc/scroll/top_Normal.png"); QImage topHotImg(":images/image_rsc/scroll/top_Hot.png"); QImage topPushImg(":images/image_rsc/scroll/top_Push.png"); m_thumb->setVScrollTopImage(&topNormalImg, &topHotImg, &topPushImg); m_view->setVScrollTopImage(&topNormalImg, &topHotImg, &topPushImg); QImage bottomNormalImg(":images/image_rsc/scroll/bottom_Normal.png"); QImage bottomHotImg(":images/image_rsc/scroll/bottom_Hot.png"); QImage bottomPushImg(":images/image_rsc/scroll/bottom_Push.png"); m_thumb->setVScrollBottomImage(&bottomNormalImg, &bottomHotImg, &bottomPushImg); m_view->setVScrollBottomImage(&bottomNormalImg, &bottomHotImg, &bottomPushImg); HGRect hSliderStretchRect = {4, 0, 196, 16}; QImage hScrollSliderNormalImage(":images/image_rsc/scroll/hScrollSlider_Normal.png"); QImage hScrollSliderHotImage(":images/image_rsc/scroll/hScrollSlider_Hot.png"); QImage hScrollSliderPushImage(":images/image_rsc/scroll/hScrollSlider_Push.png"); m_thumb->setHScrollSliderImage(&hScrollSliderNormalImage, &hSliderStretchRect, &hScrollSliderHotImage, &hSliderStretchRect, &hScrollSliderPushImage, &hSliderStretchRect); m_view->setHScrollSliderImage(&hScrollSliderNormalImage, &hSliderStretchRect, &hScrollSliderHotImage, &hSliderStretchRect, &hScrollSliderPushImage, &hSliderStretchRect); HGRect vSliderStretchRect = {0, 4, 16, 196}; QImage vScrollSliderNormalImage(":images/image_rsc/scroll/vScrollSlider_Normal.png"); QImage vScrollSliderHotImage(":images/image_rsc/scroll/vScrollSlider_Hot.png"); QImage vScrollSliderPushImage(":images/image_rsc/scroll/vScrollSlider_Push.png"); m_thumb->setVScrollSliderImage(&vScrollSliderNormalImage, &vSliderStretchRect, &vScrollSliderHotImage, &vSliderStretchRect, &vScrollSliderPushImage, &vSliderStretchRect); m_view->setVScrollSliderImage(&vScrollSliderNormalImage, &vSliderStretchRect, &vScrollSliderHotImage, &vSliderStretchRect, &vScrollSliderPushImage, &vSliderStretchRect); QAction *act_thumbGrid = new QAction(tr("Grid"), this); act_thumbGrid->setCheckable(true); act_thumbGrid->setChecked(false); connect(act_thumbGrid, SIGNAL(triggered(bool)), this, SLOT(on_act_thumbGrid_triggered(bool))); m_moveToAction = new QAction(tr("Move To..."), this); connect(m_moveToAction, SIGNAL(triggered()), this, SLOT(on_act_moveTo_triggered())); m_thumbMenu = new QMenu(this); QMenu* menu_imageInsert = new QMenu(tr("Insert files"), m_thumbMenu); m_thumbMenu->addAction(ui->act_closeFile); m_thumbMenu->addAction(ui->act_closeAll); m_thumbMenu->addAction(ui->act_Export); m_thumbMenu->addSeparator(); m_thumbMenu->addAction(m_moveToAction); m_thumbMenu->addAction(menu_imageInsert->menuAction()); m_thumbMenu->addSeparator(); m_thumbMenu->addAction(act_thumbGrid); menu_imageInsert->addAction(ui->act_insert); menu_imageInsert->addAction(ui->act_insertFromScanner); ui->act_consume->setVisible(false); connect(this, SIGNAL(sane_dev_arrive(QString, bool)), this, SLOT(on_sane_dev_arrive(QString, bool)), Qt::QueuedConnection); connect(this, SIGNAL(sane_dev_remove(QString)), this, SLOT(on_sane_dev_remove(QString)), Qt::QueuedConnection); connect(this, SIGNAL(new_image(void *)), this, SLOT(on_new_image(void *)), Qt::QueuedConnection); connect(this, SIGNAL(scan_working(QString)), this, SLOT(on_scan_working(QString)), Qt::QueuedConnection); connect(this, SIGNAL(scan_finish(QString, int)), this, SLOT(on_scan_finish(QString, int)), Qt::QueuedConnection); connect(this, SIGNAL(sane_dev_error(QString)), this, SLOT(on_sane_dev_error(QString)), Qt::QueuedConnection); connect(m_dialogLog, SIGNAL(continueScan()), this, SLOT(on_continueScan())); connect(m_dialogLog, SIGNAL(stopScan()), this, SLOT(on_stopScan())); connect(m_wndStatusBar, SIGNAL(statusInfoDblClick()), this, SLOT(on_statusInfoDblClick())); m_wndStatusBar->setDeviceStatusInfo(tr("nodevice"), false); m_dialogLog->addLog(tr("nodevice"), false); HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "%s", getStdString(tr("nodevice")).c_str()); connect(ui->menu_device, SIGNAL(scanOptionsChanged(const QString&, const QString&, bool)), this, SLOT(on_scanOptions_changed(const QString&, const QString&, bool))); QString password = getCfgValue("login", "password", QString("")); if (password.isEmpty()) m_password = "huagoscan"; else m_password = passwordDecrypt(password); m_dlgFullScreen = nullptr; m_dialogLog->updateStatus(cur_dev_.is_online() && 0 != m_scanType, m_isScanning); updateActionStatus(); SANE_Int v = 0; sane_init_ex(&v, sane_ex_callback, this); } MainWindow::~MainWindow() { if (nullptr != m_dlgFullScreen) { delete m_dlgFullScreen; m_dlgFullScreen = nullptr; } cur_dev_.close(); sane_exit(); delete ui; } void MainWindow::exitFullScreen() { assert(nullptr != m_dlgFullScreen); this->show(); delete m_dlgFullScreen; m_dlgFullScreen = nullptr; } void MainWindow::on_act_90Left_triggered() { if (HGBASE_ERR_OK == m_view->rotateLeft()) { m_modify = true; updateStatusBarPixelInfo(); updateActionStatus(); } } void MainWindow::on_act_90Right_triggered() { if (HGBASE_ERR_OK == m_view->rotateRight()) { m_modify = true; updateStatusBarPixelInfo(); updateActionStatus(); } } void MainWindow::on_act_180_triggered() { if (HGBASE_ERR_OK == m_view->rotate180()) { m_modify = true; updateStatusBarPixelInfo(); updateActionStatus(); } } void MainWindow::on_act_fitWindowSize_triggered() { m_view->fitWndSize(); } void MainWindow::on_act_fitWindowWidth_triggered() { m_view->fitWndWidth(); } void MainWindow::on_act_realSize_triggered() { m_view->realSize(); } void MainWindow::on_act_zoomIn_triggered() { m_view->zoomIn(nullptr); } void MainWindow::on_act_zoomOut_triggered() { m_view->zoomOut(nullptr); } void MainWindow::on_act_statusBar_triggered(bool checked) { ui->statusBar->setVisible(checked); } void MainWindow::on_act_toolBar_triggered(bool checked) { ui->toolBar->setVisible(checked); } void MainWindow::on_act_colorInfo_triggered(bool checked) { m_view->showColorInfo(checked); } void MainWindow::on_act_fullscreen_triggered() { assert(nullptr == m_dlgFullScreen); int count = 0; m_thumb->getItemCount(&count); if (0 == count || -1 == m_currIndex || -1 == m_multiIndex) { return; } QStringList fileNames; for (int i = 0; i < count; ++i) { QString fileName; m_thumb->getItemFileName(i, fileName); fileNames.append(fileName); } m_dlgFullScreen = new Dialog_FullScreen(this, fileNames, m_currIndex, m_multiIndex); m_dlgFullScreen->show(); this->hide(); } void MainWindow::on_itemCountChanged(int count) { m_wndStatusBar->setPageInfo(count, m_currIndex); updateActionStatus(); } void MainWindow::on_itemSelectingChanged() { updateActionStatus(); } void MainWindow::on_currItemChanged(int index) { HGImage img = nullptr; m_view->getImage(&img); if (nullptr != img && m_modify && -1 != m_currIndex && m_multiPageCount == 1) { assert(!m_currFilePath.isEmpty()); QString newCurrFilePath; if (-1 != index) m_thumb->getItemFileName(index, newCurrFilePath); if (m_currFilePath != newCurrFilePath) { QMessageBox msg(QMessageBox::Question, tr("Question"), tr("modified, save it?"), QMessageBox::Yes | QMessageBox::No, this); msg.setButtonText(QMessageBox::Yes, tr("yes")); msg.setButtonText(QMessageBox::No, tr("no")); msg.exec(); if (msg.clickedButton() != msg.button(QMessageBox::Yes)) { m_modify = false; } else { on_act_save_triggered(); } } } if (-1 != index) { QString oldCurrFilePath = m_currFilePath; m_currIndex = index; m_thumb->getItemFileName(m_currIndex, m_currFilePath); assert(!m_currFilePath.isEmpty()); if (oldCurrFilePath != m_currFilePath) { m_multiPageCount = getMultiPageCount(); m_multiIndex = 0; HGImage img2 = createImage(); if (nullptr != img2) { m_view->addImage(img2); HGBase_DestroyImage(img2); m_modify = false; } else { m_view->clearImage(); m_wndStatusBar->setMousePosInfo(0, 0); m_modify = false; QFileInfo info(m_currFilePath); if (!info.isFile()) { QMessageBox msg(QMessageBox::Question, tr("Question"), tr("file lost, remove it?"), QMessageBox::Yes | QMessageBox::No, this); msg.setButtonText(QMessageBox::Yes, tr("yes")); msg.setButtonText(QMessageBox::No, tr("no")); msg.exec(); if (msg.clickedButton() == msg.button(QMessageBox::Yes)) { m_thumb->removeItem(index, HGImgThumb::ThumbRemoveFlag_NULL); } } } } } else { m_currFilePath.clear(); m_currIndex = -1; m_multiPageCount = 0; m_multiIndex = -1; m_view->clearImage(); m_wndStatusBar->setMousePosInfo(0, 0); m_modify = false; } int count = 0; m_thumb->getItemCount(&count); m_wndStatusBar->setPageInfo(count, m_currIndex); updateStatusBarPixelInfo(); updateActionStatus(); } void MainWindow::on_itemDoubleClicked(int index) { (void)index; } void MainWindow::on_thumbContextMenu(int index) { qDebug("thumbnail menu index=%d", index); m_thumbMenu->show(); m_thumbMenu->popup(QCursor::pos()); qDebug("show menu"); } void MainWindow::on_viewerScale(double scale) { m_wndStatusBar->setScale(scale); } void MainWindow::on_viewerMousePos(int x, int y) { m_wndStatusBar->setMousePosInfo(x, y); } void MainWindow::on_thumbDrop(const QObject *source, const QStringList &fileNames, int pos) { if (source != m_thumb) m_thumb->insertItems(fileNames, pos); else m_thumb->moveItems(fileNames, pos); } void MainWindow::on_viewerDrop(const QObject *source, const QStringList &fileNames) { if (source != m_thumb) m_thumb->addItems(fileNames); } void MainWindow::on_viewerDblClick() { on_act_open_triggered(); } void MainWindow::on_act_moveTo_triggered() { int count = 0; m_thumb->getItemCount(&count); Dialog_MoveTo dlg(count, (-1 != m_currIndex) ? m_currIndex : 0, this); if (dlg.exec()) { QStringList fileNames; for (int i = 0; i < count; ++i) { bool selected = false; m_thumb->itemIsSelect(i, &selected); if (selected) { QString fileName; m_thumb->getItemFileName(i, fileName); fileNames.append(fileName); } } int pos = dlg.getMovePos(); m_thumb->moveItems(fileNames, pos); } } void MainWindow::on_act_thumbGrid_triggered(bool checked) { if (checked) m_thumb->setType(HGImgThumb::ThumbType_Grid); else m_thumb->setType(HGImgThumb::ThumbType_Vert); } void MainWindow::on_dialog_adjust_applyToImage(HGImage img) { m_view->addImage(img); updateStatusBarPixelInfo(); } void MainWindow::on_dialog_multirotate_refreshImgFile(const QString &fileName) { m_thumb->refreshItem(fileName); } void MainWindow::on_multiPageLineEditFinished() { if (-1 != m_currIndex && m_multiPageCount > 0) { int multiIndex = m_multiPageLineEdit->text().toInt() - 1; if (multiIndex >= 0 && multiIndex < m_multiPageCount) { m_multiIndex = multiIndex; HGImage img = createImage(); if (nullptr != img) { m_view->addImage(img); HGBase_DestroyImage(img); m_modify = false; } else { m_view->clearImage(); m_wndStatusBar->setMousePosInfo(0, 0); m_modify = false; } updateStatusBarPixelInfo(); } updateActionStatus(); } } void MainWindow::on_clearCache() { std::vector removeItems; int count = 0; m_thumb->getItemCount(&count); for (int i = 0; i < count; ++i) { QString fileName; m_thumb->getItemFileName(i, fileName); if (0 == fileName.indexOf(Dialog_ClrCache::getCachePath())) { removeItems.push_back(i); } } m_thumb->removeItems(removeItems, HGImgThumb::ThumbRemoveFlag_NULL); } void MainWindow::on_sane_dev_arrive(QString devName, bool opened) { bool reconnected = false; if(std::find(dev_schemes_.begin(), dev_schemes_.end(), devName.toStdString()) == dev_schemes_.end()) { // initializing the device configuration ... DEVCFG cfg; cfg.name = devName.toStdString(); m_config.load_scanner_configs(devName, &cfg); dev_schemes_.push_back(cfg); ui->menu_device->update(&dev_schemes_); // statu info ... QString info(tr("found device ") +": " + devName); m_wndStatusBar->setDeviceStatusInfo(info, false); m_dialogLog->addLog(info, false); HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "%s", getStdString(info).c_str()); } else { // re-connected statu ... QString info(devName); if(opened) info += tr(" reconnected"); else info += "\345\267\262\347\273\217\350\277\236\346\216\245\357\274\214\344\275\206\346\211\223\345\274\200\345\244\261\350\264\245"; m_wndStatusBar->setDeviceStatusInfo(info, !opened); m_dialogLog->addLog(info, !opened); HGBase_WriteInfo(!opened ? HGBASE_INFOTYPE_ERROR : HGBASE_INFOTYPE_DESC, "%s", getStdString(info).c_str()); reconnected = true; } // enable the device menu item ... ui->menu_device->connectedDevice(devName); // open it if no device has been opened ... if (!cur_dev_.is_online()) { if (cur_dev_.handle() && devName.toStdString() == cur_dev_.name()) { cur_dev_.set_online(true); } else { std::vector::iterator it = std::find(dev_schemes_.begin(), dev_schemes_.end(), devName.toStdString()); OPTSCHEME *schm = nullptr; if(it!= dev_schemes_.end()) schm = it->get_current(); open_scanner(devName, schm); } } m_dialogLog->updateStatus(cur_dev_.is_online() && 0 != m_scanType, m_isScanning); updateActionStatus(); } void MainWindow::on_sane_dev_remove(QString devName) { // statu info ... QString info(devName + tr(" disconnected")); m_wndStatusBar->setDeviceStatusInfo(info, true); m_dialogLog->addLog(info, true); HGBase_WriteInfo(HGBASE_INFOTYPE_ERROR, "%s", getStdString(info).c_str()); // enable the device menu item ... ui->menu_device->disconnectedDevice(devName); // set openning device offline ... if(devName.toStdString() == cur_dev_.name()) { cur_dev_.set_online(false); } m_dialogLog->updateStatus(cur_dev_.is_online() && 0 != m_scanType, m_isScanning); updateActionStatus(); } void MainWindow::on_sane_dev_error(QString errorInfo) { //Error codes operate in slot function: on_scan_finish(QString finishInfo, int err). m_wndStatusBar->setDeviceStatusInfo(errorInfo, true); m_dialogLog->addLog(errorInfo, true); HGBase_WriteInfo(HGBASE_INFOTYPE_ERROR, "%s", getStdString(errorInfo).c_str()); } void MainWindow::on_new_image(void *img) { HGImage image = (HGImage)img; HGUInt dpi = 96; SANE_Int num_dev_options = 0; sane_control_option(cur_dev_.handle(), 0, SANE_ACTION_GET_VALUE, &num_dev_options, nullptr); for (int i = 1; i < num_dev_options; ++i) { const SANE_Option_Descriptor* desp = sane_get_option_descriptor(cur_dev_.handle(), i); if (nullptr == desp) continue; std::string title = Utf8ToStdString(desp->title); TrimString(title); HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "title=%s", title.c_str()); if (SANE_TYPE_INT == desp->type) { SANE_Int value = 0; sane_control_option(cur_dev_.handle(), i, SANE_ACTION_GET_VALUE, &value, nullptr); HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, " valueType=INT, value=%d", value); if (0 == strcmp(title.c_str(), "分辨率")) { dpi = (HGUInt)value; } } } HGBase_SetImageDpi(image, dpi, dpi); if (1 == m_scanType) { QString fileName = getCacheFileName(); HGImgFmtSaveInfo saveInfo; saveInfo.jpegQuality = (HGUInt)m_aquireIntoSaveParam.m_jpegQuality; saveInfo.tiffCompression = HGIMGFMT_TIFFCOMP_NONE; if (1 == m_aquireIntoSaveParam.m_tiffCompression) saveInfo.tiffCompression = HGIMGFMT_TIFFCOMP_LZW; else if (2 == m_aquireIntoSaveParam.m_tiffCompression) saveInfo.tiffCompression = HGIMGFMT_TIFFCOMP_JPEG; saveInfo.tiffJpegQuality = (HGUInt)m_aquireIntoSaveParam.m_tiffQuality; HGImgFmt_SaveImage(image, 0, &saveInfo, getStdString(fileName).c_str()); if (-1 == m_scanInsertPos) { m_thumb->addItem(fileName); } else { m_thumb->insertItem(fileName, m_scanInsertPos); ++m_scanInsertPos; } } else if (2 == m_scanType) { if (m_aquireIntoSaveParam.m_isSaveAsMultiPage) { if (nullptr == m_scanImgFmtWriter) { assert(m_scanFileName.isEmpty()); HGBase_CreateDir(getStdString(m_aquireIntoSaveParam.m_savePath).c_str()); QString scanFileName; while (1) { scanFileName = QString(tr("%1%2%3.%4")).arg(m_aquireIntoSaveParam.m_savePath) .arg(m_aquireIntoSaveParam.m_fileNamePrefix) .arg(m_aquireIntoSaveParam.m_fileNameStartIndex, m_aquireIntoSaveParam.m_fileNameDigits, 10, QLatin1Char('0')) .arg(m_aquireIntoSaveParam.m_fileNameExt); QFileInfo fileInfo(scanFileName); if (fileInfo.isFile()) { ++m_aquireIntoSaveParam.m_fileNameStartIndex; } else { break; } } HGImgFmt_OpenImageWriter(getStdString(getStdFileName(scanFileName)).c_str(), 0, &m_scanImgFmtWriter); if (nullptr != m_scanImgFmtWriter) m_scanFileName = scanFileName; } if (nullptr != m_scanImgFmtWriter) { HGImgFmtSaveInfo saveInfo; saveInfo.jpegQuality = (HGUInt)m_aquireIntoSaveParam.m_jpegQuality; saveInfo.tiffCompression = HGIMGFMT_TIFFCOMP_NONE; if (1 == m_aquireIntoSaveParam.m_tiffCompression) saveInfo.tiffCompression = HGIMGFMT_TIFFCOMP_LZW; else if (2 == m_aquireIntoSaveParam.m_tiffCompression) saveInfo.tiffCompression = HGIMGFMT_TIFFCOMP_JPEG; saveInfo.tiffJpegQuality = (HGUInt)m_aquireIntoSaveParam.m_tiffQuality; HGImgFmt_SaveImageToWriter(m_scanImgFmtWriter, image, &saveInfo); } } else { assert(m_scanFileName.isEmpty()); assert(nullptr == m_scanImgFmtWriter); HGBase_CreateDir(getStdString(m_aquireIntoSaveParam.m_savePath).c_str()); QString scanFileName; while (1) { scanFileName = QString(tr("%1%2%3.%4")).arg(m_aquireIntoSaveParam.m_savePath) .arg(m_aquireIntoSaveParam.m_fileNamePrefix) .arg(m_aquireIntoSaveParam.m_fileNameStartIndex, m_aquireIntoSaveParam.m_fileNameDigits, 10, QLatin1Char('0')) .arg(m_aquireIntoSaveParam.m_fileNameExt); QFileInfo fileInfo(scanFileName); if (fileInfo.isFile()) { ++m_aquireIntoSaveParam.m_fileNameStartIndex; } else { break; } } HGImgFmtSaveInfo saveInfo; saveInfo.jpegQuality = (HGUInt)m_aquireIntoSaveParam.m_jpegQuality; saveInfo.tiffCompression = HGIMGFMT_TIFFCOMP_NONE; if (1 == m_aquireIntoSaveParam.m_tiffCompression) saveInfo.tiffCompression = HGIMGFMT_TIFFCOMP_LZW; else if (2 == m_aquireIntoSaveParam.m_tiffCompression) saveInfo.tiffCompression = HGIMGFMT_TIFFCOMP_JPEG; saveInfo.tiffJpegQuality = (HGUInt)m_aquireIntoSaveParam.m_tiffQuality; HGImgFmt_SaveImage(image, 0, &saveInfo, getStdString(scanFileName).c_str()); m_thumb->addItem(scanFileName); ++m_aquireIntoSaveParam.m_fileNameStartIndex; } } HGBase_DestroyImage(image); } void MainWindow::on_scan_working(QString workingInfo) { m_wndStatusBar->setDeviceStatusInfo(workingInfo, false); m_dialogLog->addLog(workingInfo, false); HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "%s", getStdString(workingInfo).c_str()); } void MainWindow::on_scan_finish(QString finishInfo, int err) { if (0 == m_scanType) { if (nullptr != m_scanImgFmtWriter) { HGImgFmt_CloseImageWriter(m_scanImgFmtWriter); m_scanImgFmtWriter = nullptr; m_thumb->addItem(m_scanFileName); m_scanFileName.clear(); ++m_aquireIntoSaveParam.m_fileNameStartIndex; } } m_isScanning = false; m_thumb->setAcceptDrops(true); m_dialogLog->updateStatus(cur_dev_.is_online() && 0 != m_scanType, m_isScanning); updateActionStatus(); m_wndStatusBar->setDeviceStatusInfo(finishInfo, (err != SANE_STATUS_GOOD)); m_dialogLog->addLog(finishInfo, (err != SANE_STATUS_GOOD)); HGBase_WriteInfo((err != SANE_STATUS_GOOD) ? HGBASE_INFOTYPE_ERROR : HGBASE_INFOTYPE_DESC, "%s", getStdString(finishInfo).c_str()); } void MainWindow::on_continueScan() { if (!cur_dev_.is_online() || m_isScanning || 0 == m_scanType) { return; } if (!startSpaceCheck(m_dialogLog)) { return; } startSaveMessageBox(m_dialogLog); SANE_Status ret; if (m_singleScan) ret = sane_io_control(cur_dev_.handle(), IO_CTRL_CODE_TEST_SINGLE, nullptr, nullptr); else ret = sane_start(cur_dev_.handle()); if (ret != SANE_STATUS_GOOD) { m_wndStatusBar->setDeviceStatusInfo(tr("start failed"), true); m_dialogLog->addLog(tr("start failed"), true); HGBase_WriteInfo(HGBASE_INFOTYPE_ERROR, "%s", getStdString(tr("start failed")).c_str()); } else { m_isScanning = true; m_thumb->setAcceptDrops(false); m_dialogLog->updateStatus(cur_dev_.is_online() && 0 != m_scanType, m_isScanning); updateActionStatus(); } m_dialogLog->show(); } void MainWindow::on_stopScan() { m_scanType = 0; m_dialogLog->updateStatus(cur_dev_.is_online() && 0 != m_scanType, m_isScanning); if (!m_isScanning) { if (nullptr != m_scanImgFmtWriter) { HGImgFmt_CloseImageWriter(m_scanImgFmtWriter); m_scanImgFmtWriter = nullptr; m_thumb->addItem(m_scanFileName); m_scanFileName.clear(); ++m_aquireIntoSaveParam.m_fileNameStartIndex; } } else { if (cur_dev_.is_online()) { sane_cancel(cur_dev_.handle()); } } } void MainWindow::on_statusInfoDblClick() { m_dialogLog->show(); } void MainWindow::on_act_thumbnailBar_triggered(bool checked) { ui->dockWidget->setVisible(checked); } void MainWindow::on_act_previous_triggered() { int count = 0; m_thumb->getItemCount(&count); if (count > 0 && (-1 == m_currIndex || m_currIndex > 0)) { if (-1 == m_currIndex) m_thumb->setCurrItem(0); else m_thumb->setCurrItem(m_currIndex - 1); } } void MainWindow::on_act_next_triggered() { int count = 0; m_thumb->getItemCount(&count); if (count > 0 && (-1 == m_currIndex || m_currIndex < count - 1)) { if (-1 == m_currIndex) m_thumb->setCurrItem(0); else m_thumb->setCurrItem(m_currIndex + 1); } } void MainWindow::on_act_first_triggered() { int count = 0; m_thumb->getItemCount(&count); if (count > 0 && 0 != m_currIndex) { m_thumb->setCurrItem(0); } } void MainWindow::on_act_last_triggered() { int count = 0; m_thumb->getItemCount(&count); if (count > 0 && count - 1 != m_currIndex) { m_thumb->setCurrItem(count - 1); } } QString MainWindow::getCacheFileName() { QString cachePath = Dialog_ClrCache::getCachePath(); HGBase_CreateDir(getStdString(cachePath).c_str()); char uuid[256] = {0}; HGBase_GetUuid(uuid, 256); QString fileName = getStdFileName(cachePath + uuid + ".jpg"); return fileName; } HGImage MainWindow::createImage() { qDebug("createImage"); assert(-1 != m_currIndex && -1 != m_multiIndex); assert(!m_currFilePath.isEmpty()); HGImage img = nullptr; HGPdfReader pdfReader = nullptr; HGImgFmt_OpenPdfReader(getStdString(m_currFilePath).c_str(), &pdfReader); if (nullptr != pdfReader) { HGPdfPageInfo pageInfo = {0, 0}; if (HGBASE_ERR_OK == HGImgFmt_GetPdfPageInfo(pdfReader, (HGUInt)m_multiIndex, &pageInfo)) { float scale = 1.0f; if (pageInfo.width < 1600) scale = 1600.0f / pageInfo.width; HGImgFmt_LoadImageFromPdfReader(pdfReader, (HGUInt)m_multiIndex, scale, scale, HGBASE_IMGTYPE_RGB, HGBASE_IMGORIGIN_TOP, &img); } HGImgFmt_ClosePdfReader(pdfReader); } else { HGImgFmtReader imgFmtReader = nullptr; HGImgFmt_OpenImageReader(getStdString(m_currFilePath).c_str(), 0, &imgFmtReader); if (nullptr != imgFmtReader) { HGImgFmt_LoadImageFromReader(imgFmtReader, (HGUInt)m_multiIndex, nullptr, HGBASE_IMGTYPE_RGB, HGBASE_IMGORIGIN_TOP, &img); HGImgFmt_CloseImageReader(imgFmtReader); } } return img; } int MainWindow::getMultiPageCount() { assert(-1 != m_currIndex); assert(!m_currFilePath.isEmpty()); int count = 0; HGImgFmtReader imgFmtReader = nullptr; HGImgFmt_OpenImageReader(getStdString(m_currFilePath).c_str(), 0, &imgFmtReader); if (nullptr != imgFmtReader) { HGImgFmt_GetImagePageCount(imgFmtReader, (HGUInt *)&count); HGImgFmt_CloseImageReader(imgFmtReader); } qDebug("pageCount=%d", count); return count; } void MainWindow::updateStatusBarPixelInfo() { HGImage img = nullptr; m_view->getImage(&img); if (nullptr == img) { m_wndStatusBar->setPixelInfo(0, 0, 0); } else { HGImageInfo imgInfo; HGBase_GetImageInfo(img, &imgInfo); int bpp = 0; if (HGBASE_IMGTYPE_GRAY == imgInfo.type) bpp = 8; else if (HGBASE_IMGTYPE_BGR == imgInfo.type || HGBASE_IMGTYPE_RGB == imgInfo.type) bpp = 24; else bpp = 32; m_wndStatusBar->setPixelInfo((int)imgInfo.width, (int)imgInfo.height, bpp); } } void MainWindow::updateActionStatus() { HGImage img = nullptr; m_view->getImage(&img); int count = 0; m_thumb->getItemCount(&count); std::vector selectIndexs; for (int i = 0; i < count; ++i) { bool select = false; m_thumb->itemIsSelect(i, &select); if (select) selectIndexs.push_back(i); } ui->act_open->setEnabled(!cur_dev_.is_online() || !m_isScanning); ui->act_insert->setEnabled(!cur_dev_.is_online() || !m_isScanning); ui->act_save->setEnabled(nullptr != img && -1 != m_currIndex && m_multiPageCount == 1 && (!cur_dev_.is_online() || !m_isScanning)); ui->act_saveAs->setEnabled(nullptr != img); ui->act_Export->setEnabled(0 != count && (!cur_dev_.is_online() || !m_isScanning)); ui->act_closeFile->setEnabled(!selectIndexs.empty() && (!cur_dev_.is_online() || !m_isScanning)); ui->act_closeAll->setEnabled(0 != count && (!cur_dev_.is_online() || !m_isScanning)); ui->act_imageInfo->setEnabled(-1 != m_currIndex && (!cur_dev_.is_online() || !m_isScanning)); ui->menu_multiPages->setEnabled(m_multiPageCount > 1 && (!cur_dev_.is_online() || !m_isScanning)); ui->act_previous->setEnabled(count > 0 && (-1 == m_currIndex || m_currIndex > 0) && (!cur_dev_.is_online() || !m_isScanning)); ui->act_next->setEnabled(count > 0 && (-1 == m_currIndex || m_currIndex < count - 1) && (!cur_dev_.is_online() || !m_isScanning)); ui->act_first->setEnabled(count > 0 && 0 != m_currIndex && (!cur_dev_.is_online() || !m_isScanning)); ui->act_last->setEnabled(count > 0 && count - 1 != m_currIndex && (!cur_dev_.is_online() || !m_isScanning)); ui->act_openPageNum->setEnabled(count > 0 && (!cur_dev_.is_online() || !m_isScanning)); ui->act_previousPage->setEnabled(-1 != m_currIndex && m_multiPageCount > 0 && m_multiIndex > 0 && (!cur_dev_.is_online() || !m_isScanning)); ui->act_nextPage->setEnabled(-1 != m_currIndex && m_multiPageCount > 0 && -1 != m_multiIndex && m_multiIndex < m_multiPageCount - 1 && (!cur_dev_.is_online() || !m_isScanning)); ui->act_firstPage->setEnabled(-1 != m_currIndex && m_multiPageCount > 0 && 0 != m_multiIndex && (!cur_dev_.is_online() || !m_isScanning)); ui->act_lastPage->setEnabled(-1 != m_currIndex && m_multiPageCount > 0 && m_multiIndex != m_multiPageCount - 1 && (!cur_dev_.is_online() || !m_isScanning)); m_multiPageLineEdit->setText(QString("%1/%2").arg(m_multiIndex + 1).arg(m_multiPageCount)); ui->toolBar->actions().at(16)->setVisible(-1 != m_currIndex && m_multiPageCount > 1 && -1 != m_multiIndex && (!cur_dev_.is_online() || !m_isScanning)); ui->act_imageEdit->setEnabled(nullptr != img); ui->act_zoomIn->setEnabled(nullptr != img); ui->act_zoomOut->setEnabled(nullptr != img); ui->act_fullscreen->setEnabled(count > 0 && -1 != m_currIndex && -1 != m_multiIndex && (!cur_dev_.is_online() || !m_isScanning)); ui->act_fitWindowSize->setEnabled(nullptr != img); ui->act_fitWindowWidth->setEnabled(nullptr != img); ui->act_realSize->setEnabled(nullptr != img); ui->act_90Left->setEnabled(nullptr != img); ui->act_90Right->setEnabled(nullptr != img); ui->act_180->setEnabled(nullptr != img); ui->menu_Auto_Image_Size->setEnabled(nullptr != img); ui->act_adjust->setEnabled(nullptr != img); ui->act_multiRotate->setEnabled(0 != count && (!cur_dev_.is_online() || !m_isScanning)); ui->menu_Rotate->setEnabled((0 != count || nullptr != img) && (!cur_dev_.is_online() || !m_isScanning)); ui->act_autoCrop->setEnabled(nullptr != img); ui->act_signIn->setEnabled(!m_admin_loggedIn); ui->act_passwordChange->setEnabled(m_admin_loggedIn); ui->act_signOut->setEnabled(m_admin_loggedIn); ui->act_log->setEnabled(m_admin_loggedIn); ui->act_clrCache->setEnabled(m_admin_loggedIn); ui->act_consume->setEnabled(m_admin_loggedIn); ui->act_clearRoller->setEnabled(m_admin_loggedIn); ui->act_acquireInto->setEnabled(cur_dev_.is_online() && !m_isScanning); ui->act_acquireSingle->setEnabled(cur_dev_.is_online() && !m_isScanning); ui->act_acquire->setEnabled(cur_dev_.is_online() && !m_isScanning); ui->act_scannerSettings->setEnabled(cur_dev_.is_online() && !m_isScanning); ui->act_insertFromScanner->setEnabled(cur_dev_.is_online() && !m_isScanning); ui->menu_scan->setEnabled(cur_dev_.is_online() && !m_isScanning); ui->menu_device->setEnabled(!cur_dev_.is_online() || !m_isScanning); m_moveToAction->setEnabled(!selectIndexs.empty() && (!cur_dev_.is_online() || !m_isScanning)); } void MainWindow::startSaveMessageBox(QWidget* parent) { HGImage img = nullptr; m_view->getImage(&img); if (nullptr != img && m_modify && -1 != m_currIndex && m_multiPageCount == 1) { QMessageBox msg(QMessageBox::Question, tr("Question"), tr("modified, save it?"), QMessageBox::Yes | QMessageBox::No, parent); msg.setButtonText(QMessageBox::Yes, tr("yes")); msg.setButtonText(QMessageBox::No, tr("no")); msg.exec(); if (msg.clickedButton() != msg.button(QMessageBox::Yes)) { m_modify = false; updateActionStatus(); } else { on_act_save_triggered(); } } } askIfClear MainWindow::startScanMessageBox(QWidget *parent) { QMessageBox box(parent); QPushButton* clearBtn = box.addButton(tr("Clear, then start scan"), QMessageBox::ActionRole); box.addButton(tr("Do NOT clear, then start scan"), QMessageBox::ActionRole); QPushButton* cancelBtn = box.addButton(QMessageBox::Cancel); box.setWindowTitle(tr("Question")); box.setText(tr("Already exist images in image list.\nDo you want to clear?")); box.exec(); if (box.clickedButton() == cancelBtn) return cancelScan; else if (box.clickedButton() == clearBtn) { on_act_closeAll_triggered(); return clearAndScan; } return notClearAndScan; } bool MainWindow::startSpaceCheck(QWidget* parent) { qint64 space = 0; QList storageInfoList = QStorageInfo::mountedVolumes(); foreach(QStorageInfo storage, storageInfoList) { QString savePath; if (1 == m_scanType) savePath = Dialog_ClrCache::getCachePath(); else if (2 == m_scanType) savePath = m_aquireIntoSaveParam.m_savePath; if (0 == savePath.indexOf(getStdFileName(storage.rootPath()))) { space = storage.bytesAvailable() / 1024 / 1024; break; } } assert(0 != space); if (space < 64) { QMessageBox msg(QMessageBox::Information, tr("Information"), tr("Insufficient disk space"), QMessageBox::Yes, parent); msg.setButtonText(QMessageBox::Yes, tr("yes")); msg.exec(); return false; } return true; } QString MainWindow::passwordEncrypt(const QString& password) { QString p = password; int num = PASSWORD_KEY - p.length() % PASSWORD_KEY; for (int i = 0; i < num; i++) p.append("+"); int rows = p.length() / 4; QString transcode; for (int i = 0; i < PASSWORD_KEY; i++) for (int j = 0; j < rows; j++) transcode.append(p[i + j * PASSWORD_KEY]); return transcode; } QString MainWindow::passwordDecrypt(const QString& transcode) { QString t = transcode; int cols = t.length() / 4; QString password; for (int i = 0; i < cols; i++) for (int j = 0; j < PASSWORD_KEY; j++) password.append(t[i + j * cols]); password.remove("+"); return password; } void MainWindow::on_act_openPageNum_triggered() { int count = 0; m_thumb->getItemCount(&count); if (0 == count) { return; } Dialog_OpenImageIndex dlg(count, (-1 == m_currIndex) ? 0 : m_currIndex, this); if (dlg.exec()) { int index = dlg.getIndex(); m_thumb->setCurrItem(index); } } void MainWindow::on_act_previousPage_triggered() { if (-1 != m_currIndex && m_multiPageCount > 0 && m_multiIndex > 0) { --m_multiIndex; HGImage img = createImage(); if (nullptr != img) { m_view->addImage(img); HGBase_DestroyImage(img); m_modify = false; } else { m_view->clearImage(); m_wndStatusBar->setMousePosInfo(0, 0); m_modify = false; } updateStatusBarPixelInfo(); updateActionStatus(); } } void MainWindow::on_act_nextPage_triggered() { if (-1 != m_currIndex && m_multiPageCount > 0 && -1 != m_multiIndex && m_multiIndex < m_multiPageCount - 1) { ++m_multiIndex; HGImage img = createImage(); if (nullptr != img) { m_view->addImage(img); HGBase_DestroyImage(img); m_modify = false; } else { m_view->clearImage(); m_wndStatusBar->setMousePosInfo(0, 0); m_modify = false; } updateStatusBarPixelInfo(); updateActionStatus(); } } void MainWindow::on_act_firstPage_triggered() { if (-1 != m_currIndex && m_multiPageCount > 0 && 0 != m_multiIndex) { m_multiIndex = 0; HGImage img = createImage(); if (nullptr != img) { m_view->addImage(img); HGBase_DestroyImage(img); m_modify = false; } else { m_view->clearImage(); m_wndStatusBar->setMousePosInfo(0, 0); m_modify = false; } updateStatusBarPixelInfo(); updateActionStatus(); } } void MainWindow::on_act_lastPage_triggered() { if (-1 != m_currIndex && m_multiPageCount > 0 && m_multiIndex != m_multiPageCount - 1) { m_multiIndex = m_multiPageCount - 1; HGImage img = createImage(); if (nullptr != img) { m_view->addImage(img); HGBase_DestroyImage(img); m_modify = false; } else { m_view->clearImage(); m_wndStatusBar->setMousePosInfo(0, 0); m_modify = false; } updateStatusBarPixelInfo(); updateActionStatus(); } } void MainWindow::on_act_adjust_triggered() { HGImage img = nullptr; m_view->getImage(&img); if (nullptr == img) { return; } Dialog_ImgProc_Adjust dlg(img, this); connect(&dlg, SIGNAL(applyToImage(HGImage)), this, SLOT(on_dialog_adjust_applyToImage(HGImage))); if (dlg.exec()) { m_view->addImage(dlg.getAfterImage()); m_modify = true; } else { m_view->addImage(dlg.getBeforeImage()); } updateStatusBarPixelInfo(); updateActionStatus(); disconnect(&dlg, SIGNAL(applyToImage(HGImage)), this, SLOT(on_dialog_adjust_applyToImage(HGImage))); } void MainWindow::on_act_open_triggered() { if (m_isScanning) { return; } QStringList fileNames = QFileDialog::getOpenFileNames(nullptr, tr("Open images"), "", "(*.jpg *.jpeg *.png *.bmp *.pdf *.tif *.tiff *.ofd)"); m_thumb->addItems(fileNames); } void MainWindow::on_act_insert_triggered() { if (m_isScanning) { return; } QStringList fileNames = QFileDialog::getOpenFileNames(nullptr, tr("Insert images"), "", "(*.jpg *.jpeg *.png *.bmp *.pdf *.tif *.tiff *.ofd)"); if (-1 != m_currIndex) m_thumb->insertItems(fileNames, m_currIndex); else m_thumb->addItems(fileNames); } void MainWindow::on_act_closeFile_triggered() { if (m_isScanning) { return; } std::vector selectIndexs; int count = 0; m_thumb->getItemCount(&count); for (int i = 0; i < count; ++i) { bool select = false; m_thumb->itemIsSelect(i, &select); if (select) selectIndexs.push_back(i); } if (selectIndexs.empty()) { return; } if (-1 != m_currIndex) { bool select = false; m_thumb->itemIsSelect(m_currIndex, &select); if (select) { startSaveMessageBox(this); } } m_thumb->removeItems(selectIndexs, HGImgThumb::ThumbRemoveFlag_NULL); } void MainWindow::on_act_closeAll_triggered() { if (m_isScanning) { return; } int count = 0; m_thumb->getItemCount(&count); if (0 == count) { return; } startSaveMessageBox(this); m_thumb->removeAllItems(HGImgThumb::ThumbRemoveFlag_NULL); } void MainWindow::on_act_exit_triggered() { close(); } void MainWindow::on_act_save_triggered() { HGImage img = nullptr; m_view->getImage(&img); if (nullptr == img || -1 == m_currIndex || 1 != m_multiPageCount) { return; } assert(!m_currFilePath.isEmpty()); if (0 == m_currFilePath.indexOf(Dialog_ClrCache::getCachePath())) { Dialog_SaveAs dlg(this); if (dlg.exec()) { QString savePath = dlg.getSavePath(); bool find = false; int count = 0; m_thumb->getItemCount(&count); for (int i = 0; i < count; ++i) { QString fileName; m_thumb->getItemFileName(i, fileName); assert(!fileName.isEmpty()); if (fileName == savePath) { find = true; break; } } if (!find) { int jpegQuality = dlg.getJpegQuality(); int tiffCompressionBW = dlg.getTiffCompressionBW(); int tiffCompression = dlg.getTiffCompression(); int tiffQuality = dlg.getTiffQuality(); HGImgFmtSaveInfo saveInfo; saveInfo.jpegQuality = (HGUInt)jpegQuality; saveInfo.tiffCompression = HGIMGFMT_TIFFCOMP_NONE; if (1 == tiffCompression) saveInfo.tiffCompression = HGIMGFMT_TIFFCOMP_LZW; else if (2 == tiffCompression) saveInfo.tiffCompression = HGIMGFMT_TIFFCOMP_JPEG; saveInfo.tiffJpegQuality = (HGUInt)tiffQuality; if (HGBASE_ERR_OK == HGImgFmt_SaveImage(img, 0, &saveInfo, getStdString(savePath).c_str())) { m_thumb->updateItem(m_currIndex, savePath); m_currFilePath = savePath; m_modify = false; } else { QMessageBox::information(this, tr("info"), tr("save failed")); } } else { QMessageBox::information(this, tr("info"), tr("find savePath in thumbnail")); } } return; } HGResult saveRet = HGBASE_ERR_FAIL; HGUInt fmtType = 0; HGImgFmt_GetImgFmtTypeFromFileName(getStdString(m_currFilePath).c_str(), &fmtType); if (HGIMGFMT_TYPE_TIFF == fmtType) { HGUInt compression = HGIMGFMT_TIFFCOMP_LZW; HGTiffReader tiffReader = nullptr; HGImgFmt_OpenTiffReader(getStdString(m_currFilePath).c_str(), &tiffReader); if (nullptr != tiffReader) { UPTiffLoadInfo tiffInfo; HGImgFmt_LoadImageFromTiffReader(tiffReader, 0, &tiffInfo, 0, 0, nullptr); compression = tiffInfo.compression; HGImgFmt_CloseTiffReader(tiffReader); } HGUInt xDpi, yDpi; HGBase_GetImageDpi(img, &xDpi, &yDpi); UPTiffSaveInfo tiffInfo; tiffInfo.compression = compression; tiffInfo.jpegQuality = 80; tiffInfo.resolutionUnit = HGIMGFMT_TIFFRESUNIT_INCH; tiffInfo.xResolution = xDpi; tiffInfo.yResolution = yDpi; HGTiffWriter tiffWriter = nullptr; HGImgFmt_OpenTiffWriter(getStdString(m_currFilePath).c_str(), &tiffWriter); if (nullptr != tiffWriter) { saveRet = HGImgFmt_SaveImageToTiffWriter(tiffWriter, img, &tiffInfo); HGImgFmt_CloseTiffWriter(tiffWriter); } } else { saveRet = HGImgFmt_SaveImage(img, 0, nullptr, getStdString(m_currFilePath).c_str()); } if (HGBASE_ERR_OK == saveRet) { m_thumb->refreshItem(m_currFilePath); m_modify = false; updateActionStatus(); } else { QMessageBox::information(this, tr("info"), tr("save failed")); } } void MainWindow::on_act_saveAs_triggered() { HGImage img = nullptr; m_view->getImage(&img); if (nullptr == img) { return; } Dialog_SaveAs dlg(this); if (dlg.exec()) { QString savePath = dlg.getSavePath(); bool find = false; int count = 0; m_thumb->getItemCount(&count); for (int i = 0; i < count; ++i) { QString fileName; m_thumb->getItemFileName(i, fileName); assert(!fileName.isEmpty()); if (fileName == savePath) { find = true; break; } } if (!find) { int jpegQuality = dlg.getJpegQuality(); int tiffCompressionBW = dlg.getTiffCompressionBW(); int tiffCompression = dlg.getTiffCompression(); int tiffQuality = dlg.getTiffQuality(); HGImgFmtSaveInfo saveInfo; saveInfo.jpegQuality = (HGUInt)jpegQuality; saveInfo.tiffCompression = HGIMGFMT_TIFFCOMP_NONE; if (1 == tiffCompression) saveInfo.tiffCompression = HGIMGFMT_TIFFCOMP_LZW; else if (2 == tiffCompression) saveInfo.tiffCompression = HGIMGFMT_TIFFCOMP_JPEG; saveInfo.tiffJpegQuality = (HGUInt)tiffQuality; if (HGBASE_ERR_OK == HGImgFmt_SaveImage(img, 0, &saveInfo, getStdString(savePath).c_str())) { } else { QMessageBox::information(this, tr("info"), tr("save failed")); } } else { QMessageBox::information(this, tr("info"), tr("find savePath in thumbnail")); } } } void MainWindow::on_act_Export_triggered() { int count = 0; m_thumb->getItemCount(&count); if (0 == count) { return; } std::vector selectIndexs; for (int i = 0; i < count; ++i) { bool select = false; m_thumb->itemIsSelect(i, &select); if (select) selectIndexs.push_back(i); } Dialog_Export dlg(count, selectIndexs, this); if (dlg.exec()) { QStringList srcFiles; std::vector saveIndexs; dlg.getSaveIndexs(saveIndexs); for (size_t i = 0; i < saveIndexs.size(); ++i) { QString fileName; m_thumb->getItemFileName(saveIndexs[i], fileName); srcFiles.append(fileName); } if (!srcFiles.isEmpty()) { QString savePath = dlg.getSavePath(); QString saveName = dlg.getSaveName(); QString saveExt = dlg.getSaveExt(); bool isSaveAsMulti = dlg.isSaveAsMultiPage(); int jpegQuality = dlg.getJpegQuality(); int tiffCompressionBW = dlg.getTiffCompressionBW(); int tiffCompression = dlg.getTiffCompression(); int tiffQuality = dlg.getTiffQuality(); Dialog_ExportImageFile dlgExport(savePath, saveName, saveExt, isSaveAsMulti, jpegQuality, tiffCompressionBW, tiffCompression, tiffQuality, srcFiles, this); dlgExport.exec(); } } } void MainWindow::on_act_imageInfo_triggered() { if (-1 == m_currIndex) { return; } assert(!m_currFilePath.isEmpty()); QFileInfo info(m_currFilePath); HGImgFmtLoadInfo imgInfo; memset(&imgInfo, 0, sizeof(HGImgFmtLoadInfo)); HGImgFmtReader imgFmtReader = nullptr; HGImgFmt_OpenImageReader(getStdString(m_currFilePath).c_str(), 0, &imgFmtReader); if (nullptr != imgFmtReader) { HGImgFmt_LoadImageFromReader(imgFmtReader, (HGUInt)m_multiIndex, &imgInfo, 0, 0, nullptr); HGImgFmt_CloseImageReader(imgFmtReader); } QStringList fileKeys; fileKeys << tr("File name") << tr("File path") << tr("File size") << tr("Creation date/time") << tr("Modified date/time") << tr("Accessed date/time"); QStringList fileValues; fileValues.append(info.completeBaseName());//add Filename fileValues.append(info.absoluteFilePath());//add Filepath qint64 size_B = info.size(); QDateTime c_date = info.birthTime(); QString createTime = c_date.toString("yyyy-MM-dd hh:mm:ss"); fileValues.append(createTime);//add File created time QDateTime m_date = info.lastModified(); QString modifiedTime = m_date.toString("yyyy-MM-dd hh:mm:ss"); fileValues.append(modifiedTime);//add File modified time QDateTime r_date = info.lastRead(); QString accessTime = r_date.toString("yyyy-MM-dd hh:mm:ss"); fileValues.append(accessTime);//add File access time double s = size_B; int unit = 0; while (true) { if (s > 1024.0) { s /= 1024.0; unit += 1; } else break; } QString unitstring = unit == 3 ? "GB" : (unit == 2 ? "MB" : (unit == 1 ? "KB" : "B")); QString sstring = QString::number(s, 'f', 2); QString Bstring = QString::number(size_B); int commaNum = Bstring.size() / 3; if (Bstring.size() % 3 == 0) commaNum -= 1; int offset = 0; for (int i = 0; i < commaNum; i++) { Bstring.insert(Bstring.size() - 3 - offset * 4, ","); offset += 1; } fileValues.insert(2, sstring + " " + unitstring + " (" + Bstring + ")");//add Filesize QStringList imageKeys; imageKeys << tr("Format") << tr("Width") << tr("Height") << tr("depth") << tr("Color model") << tr("DPI") << tr("Print size") << tr("Frame"); QStringList imageValues; imageValues.append(info.suffix());//add image format imageValues.append(QString::number(imgInfo.width));//add image width imageValues.append(QString::number(imgInfo.height));//add image height int depth = (int)imgInfo.bpp; imageValues.append(QString::number(depth));//add image depth imageValues.append(depth == 0 ? tr("None") : (depth == 1 ? tr("Mono") : (depth == 8 ? tr("Gray") : tr("Color"))));//add image color QString dpi = QString::number(imgInfo.xDpi) + " x " + QString::number(imgInfo.yDpi); imageValues.append(dpi);//add image dpi double cm_x = (0 == imgInfo.xDpi) ? 0 : 2.54 * imgInfo.width / imgInfo.xDpi; double cm_y = (0 == imgInfo.yDpi) ? 0 : 2.54 * imgInfo.height / imgInfo.yDpi; QString cm_printsize = QString::number(cm_x, 'f', 2) + " x " + QString::number(cm_y, 'f', 2) + " cm"; double inch_x = cm_x / 2.54; double inch_y = cm_y / 2.54; QString inch_printsize = QString::number(inch_x, 'f', 2) + " x " + QString::number(inch_y, 'f', 2) + " inches"; imageValues.append(cm_printsize + ", " + inch_printsize);//add image print size imageValues.append(QString::number(m_multiIndex)); Dialog_ImageInfo d(fileKeys, fileValues, imageKeys, imageValues, this); d.exec(); } void MainWindow::closeEvent(QCloseEvent *e) { if (m_isScanning) { QMessageBox::warning(this, tr("Warning"), tr("Device is Running!\nPlease finish scanning first.")); e->ignore(); return; } bool cache_saved = true; int count = 0; m_thumb->getItemCount(&count); for (int i = 0; i < count; ++i) { QString fileName; m_thumb->getItemFileName(i, fileName); if (0 == fileName.indexOf(Dialog_ClrCache::getCachePath())) { cache_saved = false; break; } } if (!cache_saved || m_modify) { QMessageBox msg(QMessageBox::Question, tr("Question"), tr("There are pictures that have not been saved.\nAre you sure to close?"), QMessageBox::Yes | QMessageBox::No, this); msg.setButtonText(QMessageBox::Yes, tr("yes")); msg.setButtonText(QMessageBox::No, tr("no")); msg.exec(); if (msg.clickedButton() != msg.button(QMessageBox::Yes)) { e->ignore(); return; } } else { QMessageBox msg(QMessageBox::Question, tr("tips"), tr("Are you sure to close?"), QMessageBox::Yes | QMessageBox::No, this); msg.setButtonText(QMessageBox::Yes, tr("yes")); msg.setButtonText(QMessageBox::No, tr("no")); msg.exec(); if (msg.clickedButton() != msg.button(QMessageBox::Yes)) { e->ignore(); return; } } QDir dir = QDir(Dialog_ClrCache::getCachePath()); dir.removeRecursively(); QMainWindow::closeEvent(e); } int MainWindow::sane_ex_callback(SANE_Handle hdev, int code, void *data, unsigned int* len, void *param) { (void)hdev; (void)len; MainWindow *p = (MainWindow *)param; switch (code) { case SANE_EVENT_DEVICE_ARRIVED: { SANE_Device_Ex* sane_dev = (SANE_Device_Ex*)data; emit p->sane_dev_arrive(sane_dev->name, sane_dev->openned == SANE_TRUE); } break; case SANE_EVENT_DEVICE_LEFT: { SANE_Device* sane_dev = (SANE_Device*)data; emit p->sane_dev_remove(sane_dev->name); } break; case SANE_EVENT_STATUS: { } break; case SANE_EVENT_ERROR: { QString errorInfo((char*)data); emit p->sane_dev_error(errorInfo); } break; case SANE_EVENT_WORKING: { QString workingInfo((char*)data); emit p->scan_working(workingInfo); } break; case SANE_EVENT_IMAGE_OK: { SANE_Image *sane_img = (SANE_Image *)data; HGUInt imgType = 0; if (sane_img->header.format == SANE_FRAME_GRAY) imgType = HGBASE_IMGTYPE_GRAY; else if (sane_img->header.format == SANE_FRAME_RGB) imgType = HGBASE_IMGTYPE_RGB; HGByte *imgData = sane_img->data; HGImageInfo imgInfo = {(HGUInt)sane_img->header.pixels_per_line, (HGUInt)sane_img->header.lines, imgType, (HGUInt)sane_img->header.bytes_per_line, HGBASE_IMGORIGIN_TOP}; HGImage img = nullptr; HGBase_CreateImageFromData(imgData, &imgInfo, nullptr, imgType, HGBASE_IMGORIGIN_TOP, &img); if (nullptr != img) { emit p->new_image(img); } } break; case SANE_EVENT_SCAN_FINISHED: { int err = len ? (int)(*len) : 0; QString finishInfo((char*)data); emit p->scan_finish(finishInfo, err); } break; } return 0; } void MainWindow::on_act_multiRotate_triggered() { int count = 0; m_thumb->getItemCount(&count); if (0 == count) { return; } Dialog_MultiRotate dlg(this); if (dlg.exec()) { int rotateType = dlg.getRotateType(); int rotatePageType = dlg.getRotatePageType(); QStringList fileList; switch (rotatePageType) { case 0: { if (-1 != m_currIndex) { assert(!m_currFilePath.isEmpty()); fileList.append(m_currFilePath); } } break; case 1: { for (int i = 0; i < count; ++i) { bool selected = false; m_thumb->itemIsSelect(i, &selected); if (selected) { QString fileName; m_thumb->getItemFileName(i, fileName); fileList.append(fileName); } } } break; case 2: { for (int i = 0; i < count; ++i) { if ((i + 1) % 2 != 0) { QString fileName; m_thumb->getItemFileName(i, fileName); fileList.append(fileName); } } } break; case 3: { for (int i = 0; i < count; ++i) { if ((i + 1) % 2 == 0) { QString fileName; m_thumb->getItemFileName(i, fileName); fileList.append(fileName); } } } break; case 4: { for (int i = 0; i < count; ++i) { QString fileName; m_thumb->getItemFileName(i, fileName); fileList.append(fileName); } } break; } if (!fileList.isEmpty()) { Dialog_MultiRotateImageFile processDlg(fileList, rotateType, this); connect(&processDlg, SIGNAL(refreshImageFile(const QString &)), this, SLOT(on_dialog_multirotate_refreshImgFile(const QString &))); processDlg.exec(); disconnect(&processDlg, SIGNAL(refreshImageFile(const QString &)), this, SLOT(on_dialog_multirotate_refreshImgFile(const QString &))); } } } void MainWindow::on_act_autoCrop_triggered() { HGImage img = nullptr; m_view->getImage(&img); if (nullptr == img) { return; } Dialog_ImgProc_AutoCrop dlg(this); if (dlg.exec()) { bool isCrop = dlg.isCrop(); bool isDeskew = dlg.isDeskew(); bool isFillBlank = dlg.isFillBlank(); bool isConvex = dlg.isConvex(); bool isAutoColor = dlg.isAutoColor(); bool isUseAdvParam = dlg.isUseAdvancedParam(); int threshold = dlg.getThreshold(); int noise = dlg.getNoise(); int indent = dlg.getIndent(); HGImgAutoCropParam autoCropParam; if (isFillBlank) { autoCropParam.convex = (HGBool)isConvex; autoCropParam.fillColor = (HGBool)isAutoColor; } else { autoCropParam.convex = HGTRUE; autoCropParam.fillColor = HGFALSE; } if (isUseAdvParam) { autoCropParam.threshold = threshold; autoCropParam.noise = noise; autoCropParam.indent = indent; } else { autoCropParam.threshold = 40.0; autoCropParam.noise = 8; autoCropParam.indent = 5; } HGImageInfo imgInfo; HGBase_GetImageInfo(img, &imgInfo); HGImage destImage = nullptr; HGImgProc_ImageAutoCrop(img, (HGBool)isCrop, (HGBool)isDeskew, (HGBool)isFillBlank, &autoCropParam, imgInfo.width, imgInfo.height, HGBASE_IMGTYPE_RGB, HGBASE_IMGORIGIN_TOP, &destImage); if (nullptr != destImage) { m_view->addImage(destImage); HGBase_DestroyImage(destImage); m_modify = true; updateStatusBarPixelInfo(); updateActionStatus(); } } } void MainWindow::on_act_signIn_triggered() { if (m_admin_loggedIn) { return; } Dialog_Admin dlg(m_password, this); m_admin_loggedIn = dlg.exec(); updateActionStatus(); } void MainWindow::on_act_passwordChange_triggered() { if (!m_admin_loggedIn) { return; } Dialog_PasswordChange dlg(m_password, this); if (dlg.exec()) { m_password = dlg.getNewPassword(); saveCfgValue("login", "password", passwordEncrypt(m_password)); } } void MainWindow::on_act_signOut_triggered() { if (!m_admin_loggedIn) { return; } QMessageBox msg(QMessageBox::Question, tr("Question"), tr("Sure to sign out administrator account?"), QMessageBox::Yes | QMessageBox::No); msg.setButtonText(QMessageBox::Yes, tr("yes")); msg.setButtonText(QMessageBox::No, tr("no")); msg.exec(); if(msg.clickedButton() == msg.button(QMessageBox::Yes)) { m_admin_loggedIn = false; updateActionStatus(); } } void MainWindow::on_act_log_triggered() { if (!m_admin_loggedIn) { return; } Dialog_LogManager d(this); d.setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint); d.exec(); } void MainWindow::on_act_clrCache_triggered() { if (!m_admin_loggedIn) { return; } Dialog_ClrCache dlg(this); dlg.setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint); connect(&dlg, SIGNAL(clearCache()), this, SLOT(on_clearCache())); dlg.exec(); disconnect(&dlg, SIGNAL(clearCache()), this, SLOT(on_clearCache())); } void MainWindow::on_act_consume_triggered() { if (!m_admin_loggedIn) { return; } } void MainWindow::on_act_clearRoller_triggered() { if (!m_admin_loggedIn) { return; } if(QMessageBox::question(this, QString::fromStdString("\347\241\256\350\256\244\346\223\215\344\275\234") , QString::fromStdString("\346\202\250\347\241\256\345\256\232\350\246\201\346\270\205\351\231\244\346\273\232\350\275\264\350\256\241\346\225\260\345\220\227\357\274\237")) != QMessageBox::Yes) return; unsigned int count = 0; int ret = sane_io_control(cur_dev_.handle(), IO_CTRL_CODE_CLEAR_ROLLER_COUNT, nullptr, &count); if(ret == SANE_STATUS_GOOD) QMessageBox::information(this, tr("hint"), tr("Roller scanned count has been set to 0.")); else QMessageBox::information(this, tr("hint"), tr("Roller scanned count reset failed.")); } void MainWindow::on_act_help_triggered() { #if defined(HG_CMP_MSC) QString filename = QApplication::applicationDirPath() + "/HuaGoScan_App_Help_manual.pdf"; #else QString filename = "/opt/apps/com.huagaochina.huagoscan/entries/help/HuaGoScan_App_Help_manual.pdf"; #endif QFileInfo info(filename); if (!info.exists()) QMessageBox::warning(this, tr("Error"), tr("Document missing! It would be deleted or renamed.")); else QDesktopServices::openUrl(QUrl::fromLocalFile(filename)); } void MainWindow::my_url_handler(const QUrl& url) { std::string to(url.url().toStdString()); if(to.find("://clear-roller") != std::string::npos) { if(QMessageBox::question(this, QString::fromStdString("\347\241\256\350\256\244\346\223\215\344\275\234") , QString::fromStdString("\346\202\250\347\241\256\345\256\232\350\246\201\346\270\205\351\231\244\346\273\232\350\275\264\350\256\241\346\225\260\345\220\227\357\274\237")) == QMessageBox::Yes) { unsigned int count = 0; int ret = sane_io_control(cur_dev_.handle(), IO_CTRL_CODE_CLEAR_ROLLER_COUNT, nullptr, &count); QString info; if(ret == SANE_STATUS_GOOD) { info = tr("Roller scanned count has been set to 0."); // +请重新进入关于界面以获取最新值 info += QString::fromStdString("\350\257\267\351\207\215\346\226\260\350\277\233\345\205\245\345\205\263\344\272\216\347\225\214\351\235\242\344\273\245\350\216\267\345\217\226\346\234\200\346\226\260\345\200\274"); } else info = tr("Roller scanned count reset failed."); QMessageBox::information(this, tr("hint"), info); } } } void MainWindow::on_act_about_triggered() { QString company; QString appName; QString copyRight; QString developer; QString website; QString contact; QString afterSelesContact; QString address; QString navigation; SANE_About *about = nullptr; unsigned int len = 0; QString title(tr("About %1").arg(company)), content(tr("

%1

" "

Version: %2" "
CopyRight: © %3

" "

%4%5%6%7%8%9

") .arg(appName).arg("v2.0.9.061").arg(copyRight).arg(developer).arg(website).arg(contact).arg(afterSelesContact).arg(address).arg(navigation)); QDesktopServices::setUrlHandler(MY_URL_SCHEME, this, "my_url_handler"); if (sane_io_control(cur_dev_.handle(), IO_CTRL_CODE_ABOUT_INFO, about, &len) == SANE_STATUS_NO_MEM) { about = (SANE_About*)malloc(len + 128); if (about) { memset(about, 0, len + 128); if (sane_io_control(cur_dev_.handle(), IO_CTRL_CODE_ABOUT_INFO, about, &len) == SANE_STATUS_GOOD) { title = tr("about %1").arg(QString::fromStdString(about->title)); content = tr("

Version: %1

").arg(QString::fromStdString(about->version)); content += tr("

CopyRight: © %1

").arg(QString::fromStdString(about->copyright)); for (int i = 0; about->appendix[i].key; ++i) { if(about->appendix[i].url) content += tr("

%1: %3").arg(about->appendix[i].key).arg(about->appendix[i].url).arg(about->appendix[i].content); else content += tr("

%1: %2").arg(about->appendix[i].key).arg(about->appendix[i].content); if(m_admin_loggedIn && strcmp(about->appendix[i].key, "\346\273\232\350\275\264\345\274\240\346\225\260") == 0 && atoi(about->appendix[i].content) > 0) { char url[128] = {0}; sprintf(url, "        \346\270\205\351\231\244", MY_URL_SCHEME); content += QString::fromStdString(url); } content += "

"; } } free(about); } } QMessageBox::about(this, title, content); QDesktopServices::unsetUrlHandler(MY_URL_SCHEME); } void MainWindow::on_act_scannerSettings_triggered() { if (!cur_dev_.is_online() || m_isScanning) { return; } DEVCFG cfg; std::vector::iterator it = std::find(dev_schemes_.begin(), dev_schemes_.end(), cur_dev_.name()); cfg.name = cur_dev_.name(); if(it != dev_schemes_.end()) { cfg = *it; dev_schemes_.erase(it); } hg_settingdialog dlg(cur_dev_.handle(), this, &cfg); dlg.set_config_file(&m_config); dlg.exec(); int changes = dlg.get_changed_items(); dev_schemes_.insert(dev_schemes_.begin(), cfg); if(changes) { m_config.save_scanner_configs(&cfg); ui->menu_device->update(&dev_schemes_); QString dev(QString::fromStdString(cfg.name)), scheme(""); if(cfg.get_current()) scheme = QString::fromStdString(cfg.get_current()->name); else if(cfg.schemes.size()) scheme = QString::fromStdString(cfg.schemes[0].name); ui->menu_device->setOptionChecked(dev, scheme, true); setWindowTitle(dev + "(" + scheme + ")"); } } void MainWindow::on_act_acquire_triggered() { if (!cur_dev_.is_online() || m_isScanning) { return; } int count = 0; m_thumb->getItemCount(&count); if (count != 0) { int result = startScanMessageBox(this); if (cancelScan == result) return; } m_singleScan = false; m_scanType = 1; m_scanInsertPos = -1; if (!startSpaceCheck(this)) { m_dialogLog->updateStatus(cur_dev_.is_online() && 0 != m_scanType, m_isScanning); return; } startSaveMessageBox(this); SANE_Status ret = sane_start(cur_dev_.handle()); if (ret != SANE_STATUS_GOOD) { m_dialogLog->updateStatus(cur_dev_.is_online() && 0 != m_scanType, m_isScanning); m_wndStatusBar->setDeviceStatusInfo(tr("start failed"), true); m_dialogLog->addLog(tr("start failed"), true); HGBase_WriteInfo(HGBASE_INFOTYPE_ERROR, "%s", getStdString(tr("start failed")).c_str()); } else { m_isScanning = true; m_thumb->setAcceptDrops(false); m_dialogLog->updateStatus(cur_dev_.is_online() && 0 != m_scanType, m_isScanning); updateActionStatus(); } m_dialogLog->show(); } void MainWindow::on_act_acquireSingle_triggered() { if (!cur_dev_.is_online() || m_isScanning) { return; } int count = 0; m_thumb->getItemCount(&count); if (count != 0) { int result = startScanMessageBox(this); if (cancelScan == result) return; } m_singleScan = true; m_scanType = 1; m_scanInsertPos = -1; if (!startSpaceCheck(this)) { m_dialogLog->updateStatus(cur_dev_.is_online() && 0 != m_scanType, m_isScanning); return; } startSaveMessageBox(this); SANE_Status ret = sane_io_control(cur_dev_.handle(), IO_CTRL_CODE_TEST_SINGLE, nullptr, nullptr); if (ret != SANE_STATUS_GOOD) { m_dialogLog->updateStatus(cur_dev_.is_online() && 0 != m_scanType, m_isScanning); m_wndStatusBar->setDeviceStatusInfo(tr("start failed"), true); m_dialogLog->addLog(tr("start failed"), true); HGBase_WriteInfo(HGBASE_INFOTYPE_ERROR, "%s", getStdString(tr("start failed")).c_str()); } else { m_isScanning = true; m_thumb->setAcceptDrops(false); m_dialogLog->updateStatus(cur_dev_.is_online() && 0 != m_scanType, m_isScanning); updateActionStatus(); } m_dialogLog->show(); } void MainWindow::on_act_acquireInto_triggered() { if (!cur_dev_.is_online() || m_isScanning) { return; } int count = 0; m_thumb->getItemCount(&count); if (count != 0) { int result = startScanMessageBox(this); if (cancelScan == result) return; } Dialog_AquireInto dlg(this); if (dlg.exec()) { m_singleScan = false; m_scanType = 2; m_aquireIntoSaveParam = dlg.getSaveParam(); if (m_aquireIntoSaveParam.m_isUseSubfolderByTime) { QDate date = QDate::currentDate(); QString newSavePath = m_aquireIntoSaveParam.m_savePath + date.toString("yyyy-MM-dd") + "/"; m_aquireIntoSaveParam.m_savePath = getStdFileName(newSavePath); } if (!startSpaceCheck(this)) { m_dialogLog->updateStatus(cur_dev_.is_online() && 0 != m_scanType, m_isScanning); return; } startSaveMessageBox(this); SANE_Status ret = sane_start(cur_dev_.handle()); if (ret != SANE_STATUS_GOOD) { m_dialogLog->updateStatus(cur_dev_.is_online() && 0 != m_scanType, m_isScanning); m_wndStatusBar->setDeviceStatusInfo(tr("start failed"), true); m_dialogLog->addLog(tr("start failed"), true); HGBase_WriteInfo(HGBASE_INFOTYPE_ERROR, "%s", getStdString(tr("start failed")).c_str()); } else { m_isScanning = true; m_thumb->setAcceptDrops(false); m_dialogLog->updateStatus(cur_dev_.is_online() && 0 != m_scanType, m_isScanning); updateActionStatus(); } m_dialogLog->show(); } } void MainWindow::on_act_insertFromScanner_triggered() { if (!cur_dev_.is_online() || m_isScanning) { return; } Dialog_InsertIndex dlg(this); if (dlg.exec()) { m_singleScan = false; m_scanType = 1; m_scanInsertPos = -1; int count = 0; m_thumb->getItemCount(&count); switch (dlg.selectedLocation()) { case 0: m_scanInsertPos = 0; break; case 1: if (-1 != m_currIndex) m_scanInsertPos = m_currIndex; break; case 2: if (-1 != m_currIndex) m_scanInsertPos = m_currIndex + 1; break; case 3: m_scanInsertPos = count; break; } if (!startSpaceCheck(this)) { m_dialogLog->updateStatus(cur_dev_.is_online() && 0 != m_scanType, m_isScanning); return; } startSaveMessageBox(this); SANE_Status ret = sane_start(cur_dev_.handle()); if (ret != SANE_STATUS_GOOD) { m_dialogLog->updateStatus(cur_dev_.is_online() && 0 != m_scanType, m_isScanning); m_wndStatusBar->setDeviceStatusInfo(tr("start failed"), true); m_dialogLog->addLog(tr("start failed"), true); HGBase_WriteInfo(HGBASE_INFOTYPE_ERROR, "%s", getStdString(tr("start failed")).c_str()); } else { m_isScanning = true; m_thumb->setAcceptDrops(false); m_dialogLog->updateStatus(cur_dev_.is_online() && 0 != m_scanType, m_isScanning); updateActionStatus(); } m_dialogLog->show(); } } void MainWindow::on_act_imageEdit_triggered() { HGImage img = nullptr; m_view->getImage(&img); if (nullptr == img) { return; } HGImageInfo info; HGBase_GetImageInfo(img, &info); QImage::Format fmt = QImage::Format_Invalid; if (info.type == HGBASE_IMGTYPE_GRAY) fmt = QImage::Format_Grayscale8; else if (info.type == HGBASE_IMGTYPE_RGB) fmt = QImage::Format_RGB888; if (QImage::Format_Invalid == fmt) { return; } HGByte *data = nullptr; HGBase_GetImageData(img, &data); QImage image(data, (int)info.width, (int)info.height, (int)info.widthStep, fmt); if (image.isNull()) { return; } Dialog_ImageEditor dlg(this); dlg.setImage(image); if (dlg.exec()) { QImage image = dlg.exportImage(); if (!image.isNull()) { info.width = (HGUInt)image.width(); info.height = (HGUInt)image.height(); info.type = 0; if (QImage::Format_Grayscale8 == image.format()) info.type = HGBASE_IMGTYPE_GRAY; else if (QImage::Format_RGB888 == image.format()) info.type = HGBASE_IMGTYPE_RGB; info.widthStep = (HGUInt)image.bytesPerLine(); info.origin = HGBASE_IMGORIGIN_TOP; HGImage img = nullptr; HGBase_CreateImageWithData((HGByte *)image.bits(), &info, nullptr, &img); if (nullptr != img) { m_view->addImage(img); m_modify = true; HGBase_DestroyImage(img); } } } } bool MainWindow::open_scanner(const QString& name, OPTSCHEME* schm) { bool ret = cur_dev_.open(name.toStdString()); QString info(tr("open scanner ") + " " + name + " "); QString title(tr("app name")); if(ret) { title = name; info += tr("success"); m_wndStatusBar->setDeviceStatusInfo(info, false); m_dialogLog->addLog(info, false); HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "%s", getStdString(info).c_str()); bool apply = false; if(schm) { apply = cur_dev_.apply_setting(schm); info = tr("apply setting ") + QString::fromStdString(schm->name) + (apply ? tr(" success") : tr(" failed")); ui->menu_device->setOptionChecked(name, QString::fromStdString(schm->name), apply); if(apply) title += "(" + QString::fromStdString(schm->name) + ")"; } if(!apply) { DEVCFG first; if(first.schemes.size()) { ui->menu_device->setOptionChecked(name, QString::fromStdString(first.schemes[0].name), true); title += "(" + QString::fromStdString(first.schemes[0].name) + ")"; } } } else { info += tr("failed"); m_wndStatusBar->setDeviceStatusInfo(info, true); m_dialogLog->addLog(info, true); HGBase_WriteInfo(HGBASE_INFOTYPE_ERROR, "%s", getStdString(info).c_str()); } m_dialogLog->updateStatus(cur_dev_.is_online() && 0 != m_scanType, m_isScanning); updateActionStatus(); setWindowTitle(title); return ret; } void MainWindow::on_scanOptions_changed(const QString &device, const QString &option, bool checked_now) { QString title(tr("app name")); if(checked_now) { OPTSCHEME *schm = nullptr; int ind = config::find_config(device, dev_schemes_); if(ind == -1) { QString info(tr("lost config") + ": " + device); m_wndStatusBar->setDeviceStatusInfo(info, true); m_dialogLog->addLog(info, true); HGBase_WriteInfo(HGBASE_INFOTYPE_ERROR, "%s", getStdString(info).c_str()); if(cur_dev_.name() != device.toStdString()) open_scanner(device, nullptr); return; } DEVCFG& cfg = dev_schemes_[ind]; std::vector::iterator it = std::find(cfg.schemes.begin(), cfg.schemes.end(), option.toStdString()); if(it != cfg.schemes.end()) schm = &(*it); if(cur_dev_.name() != device.toStdString()) { if(!open_scanner(device, schm)) m_dialogLog->show(); return; } QString info(tr("apply setting") + " '" + option + "' "); bool ok = cur_dev_.apply_setting(schm); // check result ? if(ok) { info += tr("success"); cfg.select(option.toStdString().c_str()); } else { ui->menu_device->setOptionChecked(device, option, false); { DEVCFG init; if(init.schemes.size()) { std::string name(init.schemes[0].name); cfg.select(name.c_str()); ui->menu_device->setOptionChecked(device, QString::fromStdString(name), true); } } info += tr("failed"); } m_config.save_scanner_configs(&cfg); m_wndStatusBar->setDeviceStatusInfo(info, !ok); m_dialogLog->addLog(info, !ok); HGBase_WriteInfo(!ok ? HGBASE_INFOTYPE_ERROR : HGBASE_INFOTYPE_DESC, "%s", getStdString(info).c_str()); title = device + "(" + option + ")"; } else { cur_dev_.close(); } m_dialogLog->updateStatus(cur_dev_.is_online() && 0 != m_scanType, m_isScanning); updateActionStatus(); setWindowTitle(title); }