2022-05-03 10:25:52 +00:00
|
|
|
|
#include "mainwindow.h"
|
|
|
|
|
#include "ui_mainwindow.h"
|
|
|
|
|
#include <QDockWidget>
|
|
|
|
|
#include <QFileDialog>
|
|
|
|
|
#include <QMessageBox>
|
|
|
|
|
#include <QDateTime>
|
|
|
|
|
#include <QLineEdit>
|
|
|
|
|
#include <QRegExpValidator>
|
|
|
|
|
#include <QStandardPaths>
|
|
|
|
|
#include <QDesktopServices>
|
|
|
|
|
#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/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
|
2022-05-10 10:15:37 +00:00
|
|
|
|
#define MY_URL_SCHEME "inscanner"
|
2022-05-03 10:25:52 +00:00
|
|
|
|
|
|
|
|
|
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)));
|
2022-05-12 11:21:43 +00:00
|
|
|
|
connect(m_view, SIGNAL(drop(const QStringList &)), this, SLOT(on_viewerDrop(const QStringList &)));
|
2022-05-03 10:25:52 +00:00
|
|
|
|
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_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())
|
2022-05-13 01:26:49 +00:00
|
|
|
|
m_password = "huagoscan";
|
2022-05-03 10:25:52 +00:00
|
|
|
|
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);
|
2022-05-12 11:21:43 +00:00
|
|
|
|
if (nullptr != img && m_modify && -1 != m_currIndex && m_multiPageCount == 1)
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
|
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
|
2022-05-12 11:21:43 +00:00
|
|
|
|
void MainWindow::on_viewerDrop(const QStringList &fileNames)
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
2022-05-12 11:21:43 +00:00
|
|
|
|
m_thumb->addItems(fileNames);
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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();
|
2022-05-13 01:26:49 +00:00
|
|
|
|
m_thumb->moveItems(fileNames, pos);
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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<int> 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<DEVCFG>::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)
|
|
|
|
|
{
|
|
|
|
|
if (-1 == m_scanInsertPos)
|
|
|
|
|
{
|
|
|
|
|
QString fileName = getCacheFileName();
|
|
|
|
|
HGImgFmt_SaveImage(image, 0, nullptr, 0, getStdString(fileName).c_str());
|
|
|
|
|
m_thumb->addItem(fileName);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
QString fileName = getCacheFileName();
|
|
|
|
|
HGImgFmt_SaveImage(image, 0, nullptr, 0, getStdString(fileName).c_str());
|
|
|
|
|
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)
|
|
|
|
|
HGImgFmt_SaveImageToWriter(m_scanImgFmtWriter, image, nullptr, (HGUInt)m_aquireIntoSaveParam.m_saveQuality);
|
|
|
|
|
}
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
HGImgFmt_SaveImage(image, 0, nullptr, 0, getStdString(getStdFileName(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)
|
|
|
|
|
{
|
2022-05-05 02:03:14 +00:00
|
|
|
|
if (0 == m_scanType)
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
2022-05-05 02:03:14 +00:00
|
|
|
|
if (nullptr != m_scanImgFmtWriter)
|
|
|
|
|
{
|
|
|
|
|
HGImgFmt_CloseImageWriter(m_scanImgFmtWriter);
|
|
|
|
|
m_scanImgFmtWriter = nullptr;
|
|
|
|
|
m_thumb->addItem(m_scanFileName);
|
|
|
|
|
m_scanFileName.clear();
|
|
|
|
|
++m_aquireIntoSaveParam.m_fileNameStartIndex;
|
|
|
|
|
}
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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()
|
|
|
|
|
{
|
2022-05-05 02:03:14 +00:00
|
|
|
|
m_scanType = 0;
|
|
|
|
|
m_dialogLog->updateStatus(cur_dev_.is_online() && 0 != m_scanType, m_isScanning);
|
|
|
|
|
|
|
|
|
|
if (!m_isScanning)
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
2022-05-05 02:03:14 +00:00
|
|
|
|
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());
|
|
|
|
|
}
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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<int> 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);
|
2022-05-13 01:26:49 +00:00
|
|
|
|
ui->act_insert->setEnabled(0 != count && (!cur_dev_.is_online() || !m_isScanning));
|
2022-05-12 11:21:43 +00:00
|
|
|
|
ui->act_save->setEnabled(nullptr != img && m_modify && -1 != m_currIndex && m_multiPageCount == 1
|
2022-05-03 10:25:52 +00:00
|
|
|
|
&& (!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);
|
2022-05-13 01:26:49 +00:00
|
|
|
|
ui->act_insertFromScanner->setEnabled(0 != count && cur_dev_.is_online() && !m_isScanning);
|
2022-05-03 10:25:52 +00:00
|
|
|
|
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);
|
2022-05-12 11:21:43 +00:00
|
|
|
|
if (nullptr != img && m_modify && -1 != m_currIndex && m_multiPageCount == 1)
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
|
|
|
|
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<QStorageInfo> 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<int> 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);
|
2022-05-12 11:21:43 +00:00
|
|
|
|
if (nullptr == img || !m_modify || -1 == m_currIndex || 1 != m_multiPageCount)
|
2022-05-03 10:25:52 +00:00
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
assert(!m_currFilePath.isEmpty());
|
|
|
|
|
if (HGBASE_ERR_OK == HGImgFmt_SaveImage(img, 0, nullptr, 0, getStdString(m_currFilePath).c_str()))
|
|
|
|
|
{
|
|
|
|
|
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 saveQuality = dlg.getSaveQuality();
|
|
|
|
|
if (HGBASE_ERR_OK == HGImgFmt_SaveImage(img, 0, nullptr, (HGUInt)saveQuality, 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<int> 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<int> 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 saveQuality = dlg.getSaveQuality();
|
|
|
|
|
|
|
|
|
|
Dialog_ExportImageFile dlgExport(savePath, saveName, saveExt, isSaveAsMulti, saveQuality, 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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int count = 0;
|
|
|
|
|
m_thumb->getItemCount(&count);
|
|
|
|
|
if(count != 0)
|
|
|
|
|
{
|
|
|
|
|
QMessageBox msg(QMessageBox::Question, tr("Question"),
|
|
|
|
|
tr("Application is about to close.Make sure all needed files are saved.\nContinue 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();
|
2022-05-12 03:26:09 +00:00
|
|
|
|
bool isUseAdvParam = dlg.isUseAdvancedParam();
|
2022-05-03 10:25:52 +00:00
|
|
|
|
int threshold = dlg.getThreshold();
|
|
|
|
|
int noise = dlg.getNoise();
|
|
|
|
|
int indent = dlg.getIndent();
|
|
|
|
|
|
2022-05-12 03:26:09 +00:00
|
|
|
|
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;
|
|
|
|
|
}
|
2022-05-03 10:25:52 +00:00
|
|
|
|
|
|
|
|
|
HGImageInfo imgInfo;
|
|
|
|
|
HGBase_GetImageInfo(img, &imgInfo);
|
|
|
|
|
|
|
|
|
|
HGImage destImage = nullptr;
|
2022-05-12 03:26:09 +00:00
|
|
|
|
HGImgProc_ImageAutoCrop(img, (HGBool)isCrop, (HGBool)isDeskew, (HGBool)isFillBlank, &autoCropParam, imgInfo.width, imgInfo.height,
|
2022-05-03 10:25:52 +00:00
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
2022-05-12 07:34:40 +00:00
|
|
|
|
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;
|
|
|
|
|
|
2022-05-03 10:25:52 +00:00
|
|
|
|
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));
|
|
|
|
|
}
|
|
|
|
|
|
2022-05-10 10:15:37 +00:00
|
|
|
|
void MainWindow::my_url_handler(const QUrl& url)
|
|
|
|
|
{
|
|
|
|
|
std::string to(url.url().toStdString());
|
|
|
|
|
|
|
|
|
|
if(to.find("://clear-roller") != std::string::npos)
|
|
|
|
|
{
|
2022-05-12 07:34:40 +00:00
|
|
|
|
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)
|
2022-05-10 10:15:37 +00:00
|
|
|
|
{
|
2022-05-12 07:34:40 +00:00
|
|
|
|
unsigned int count = 0;
|
|
|
|
|
int ret = sane_io_control(cur_dev_.handle(), IO_CTRL_CODE_CLEAR_ROLLER_COUNT, nullptr, &count);
|
2022-05-10 10:15:37 +00:00
|
|
|
|
|
2022-05-12 07:34:40 +00:00
|
|
|
|
QString info;
|
|
|
|
|
if(ret == SANE_STATUS_GOOD)
|
|
|
|
|
{
|
|
|
|
|
info = tr("Roller scanned count has been set to 0.");
|
2022-05-10 10:15:37 +00:00
|
|
|
|
|
2022-05-12 07:34:40 +00:00
|
|
|
|
// +请重新进入关于界面以获取最新值
|
|
|
|
|
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);
|
|
|
|
|
}
|
2022-05-10 10:15:37 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
2022-05-03 10:25:52 +00:00
|
|
|
|
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("<p>%1</p>"
|
|
|
|
|
"<p>Version: %2"
|
|
|
|
|
"<br>CopyRight: © %3</p>"
|
|
|
|
|
"<p>%4%5%6%7%8%9</p>")
|
|
|
|
|
.arg(appName).arg("v2.0.9.061").arg(copyRight).arg(developer).arg(website).arg(contact).arg(afterSelesContact).arg(address).arg(navigation));
|
|
|
|
|
|
2022-05-10 10:15:37 +00:00
|
|
|
|
QDesktopServices::setUrlHandler(MY_URL_SCHEME, this, "my_url_handler");
|
2022-05-03 10:25:52 +00:00
|
|
|
|
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("<p>Version: %1</p>").arg(QString::fromStdString(about->version));
|
|
|
|
|
content += tr("<p>CopyRight: © %1</p>").arg(QString::fromStdString(about->copyright));
|
|
|
|
|
for (int i = 0; about->appendix[i].key; ++i)
|
|
|
|
|
{
|
|
|
|
|
if(about->appendix[i].url)
|
2022-05-10 10:15:37 +00:00
|
|
|
|
content += tr("<p>%1: <a href='%2'>%3</a>").arg(about->appendix[i].key).arg(about->appendix[i].url).arg(about->appendix[i].content);
|
2022-05-03 10:25:52 +00:00
|
|
|
|
else
|
2022-05-10 10:15:37 +00:00
|
|
|
|
content += tr("<p>%1: %2").arg(about->appendix[i].key).arg(about->appendix[i].content);
|
2022-05-11 01:35:05 +00:00
|
|
|
|
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)
|
2022-05-10 10:15:37 +00:00
|
|
|
|
{
|
|
|
|
|
char url[128] = {0};
|
|
|
|
|
sprintf(url, " <a href=%s://clear-roller>\346\270\205\351\231\244</a>", MY_URL_SCHEME);
|
|
|
|
|
content += QString::fromStdString(url);
|
|
|
|
|
}
|
|
|
|
|
content += "</p>";
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
free(about);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
QMessageBox::about(this, title, content);
|
2022-05-10 10:15:37 +00:00
|
|
|
|
QDesktopServices::unsetUrlHandler(MY_URL_SCHEME);
|
2022-05-03 10:25:52 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MainWindow::on_act_scannerSettings_triggered()
|
|
|
|
|
{
|
|
|
|
|
if (!cur_dev_.is_online() || m_isScanning)
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
DEVCFG cfg;
|
|
|
|
|
std::vector<DEVCFG>::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);
|
2022-05-07 08:12:34 +00:00
|
|
|
|
dlg.set_config_file(&m_config);
|
2022-05-03 10:25:52 +00:00
|
|
|
|
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<OPTSCHEME>::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)
|
2022-05-07 10:43:43 +00:00
|
|
|
|
{
|
2022-05-03 10:25:52 +00:00
|
|
|
|
info += tr("success");
|
2022-05-07 10:43:43 +00:00
|
|
|
|
cfg.select(option.toStdString().c_str());
|
|
|
|
|
}
|
2022-05-03 10:25:52 +00:00
|
|
|
|
else
|
2022-05-07 10:43:43 +00:00
|
|
|
|
{
|
|
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
}
|
2022-05-03 10:25:52 +00:00
|
|
|
|
info += tr("failed");
|
2022-05-07 10:43:43 +00:00
|
|
|
|
}
|
2022-05-03 10:25:52 +00:00
|
|
|
|
|
2022-05-07 10:43:43 +00:00
|
|
|
|
m_config.save_scanner_configs(&cfg);
|
2022-05-03 10:25:52 +00:00
|
|
|
|
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);
|
|
|
|
|
}
|