|
|
|
@ -23,15 +23,19 @@ MainWindow::MainWindow(QWidget *parent)
|
|
|
|
|
, m_devHandle(nullptr)
|
|
|
|
|
, m_scanning(false)
|
|
|
|
|
, m_dpi(200)
|
|
|
|
|
, m_currentButtonClicked(0)
|
|
|
|
|
, m_scanFileName("")
|
|
|
|
|
, m_scanImgFmtWriter(nullptr)
|
|
|
|
|
, m_ocrMsgPump(nullptr)
|
|
|
|
|
, m_ocrThread(nullptr)
|
|
|
|
|
, m_timerId(-1)
|
|
|
|
|
{
|
|
|
|
|
ui->setupUi(this);
|
|
|
|
|
this->setWindowIcon(QIcon(":images/image_rsc/png/logo.png"));
|
|
|
|
|
|
|
|
|
|
ui->pushButtonScan->setEnabled(false);
|
|
|
|
|
ui->pushButtonAdd->setEnabled(false);
|
|
|
|
|
ui->pushButtonModify->setEnabled(false);
|
|
|
|
|
|
|
|
|
|
m_trayIcon = new QSystemTrayIcon(this);
|
|
|
|
|
m_trayIcon->setIcon(QIcon(":images/image_rsc/png/logo.png"));
|
|
|
|
|
m_trayIcon->show();
|
|
|
|
@ -104,6 +108,7 @@ MainWindow::MainWindow(QWidget *parent)
|
|
|
|
|
connect(this, SIGNAL(scanInfo(QString, bool)), this, SLOT(on_scanInfo(QString, bool)));
|
|
|
|
|
connect(this, SIGNAL(scanImage(unsigned int)), this, SLOT(on_scanImage(unsigned int)));
|
|
|
|
|
connect(this, SIGNAL(scanFinish()), this, SLOT(on_scanFinish()));
|
|
|
|
|
connect(this, SIGNAL(saneEventCloseDevice(void*)), this, SLOT(on_saneEventCloseDevice(void*)));
|
|
|
|
|
|
|
|
|
|
SANE_Int version_code = 0;
|
|
|
|
|
sane_init_ex(&version_code, sane_ex_callback, this);
|
|
|
|
@ -630,9 +635,8 @@ void MainWindow::StartScan(unsigned int buttonId)
|
|
|
|
|
|
|
|
|
|
if (!find)
|
|
|
|
|
{
|
|
|
|
|
// 手动扫描一定能找到配置,按键扫描需要弹出设置对话框
|
|
|
|
|
Show();
|
|
|
|
|
on_pushButtonAdd_clicked();
|
|
|
|
|
ShowAddDialog(buttonId);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -775,56 +779,6 @@ void MainWindow::StartScan(unsigned int buttonId)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MainWindow::AddManualScanParam()
|
|
|
|
|
{
|
|
|
|
|
assert(NULL != m_devHandle);
|
|
|
|
|
|
|
|
|
|
std::string deviceType = m_devName.toStdString();
|
|
|
|
|
char v[256] = {0};
|
|
|
|
|
SANE_Status status = sane_control_option(m_devHandle, (SANE_Int)0x886D, SANE_ACTION_GET_VALUE, v, NULL);
|
|
|
|
|
if (SANE_STATUS_GOOD == status)
|
|
|
|
|
{
|
|
|
|
|
deviceType = v;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (FindScanParam(deviceType, 0, -1))
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ScanParam scanParam;
|
|
|
|
|
scanParam.deviceType = deviceType;
|
|
|
|
|
scanParam.buttonId = 0;
|
|
|
|
|
scanParam.deviceConfigs.clear();
|
|
|
|
|
scanParam.saveParam = Form_SaveParam::GetDefSaveParam();
|
|
|
|
|
m_vScanParams.push_back(scanParam);
|
|
|
|
|
SaveCfg();
|
|
|
|
|
|
|
|
|
|
ui->tableWidget->setRowCount((int)m_vScanParams.size());
|
|
|
|
|
int index = (int)m_vScanParams.size() - 1;
|
|
|
|
|
|
|
|
|
|
ui->tableWidget->setRowHeight(index, 30);
|
|
|
|
|
|
|
|
|
|
ui->tableWidget->setItem(index, 0, new QTableWidgetItem(QString(m_vScanParams[index].deviceType.c_str())));
|
|
|
|
|
ui->tableWidget->item(index, 0)->setTextAlignment(Qt::AlignCenter);
|
|
|
|
|
ui->tableWidget->item(index, 0)->setFlags(ui->tableWidget->item(index, 0)->flags() & ~Qt::ItemIsEditable);
|
|
|
|
|
|
|
|
|
|
QStringList btnTypeStr = {tr("Manual"), tr("Button 1"), tr("Button 2"), tr("Button 3"), tr("Button 4")};
|
|
|
|
|
ui->tableWidget->setItem(index, 1, new QTableWidgetItem(btnTypeStr[m_vScanParams[index].buttonId]));
|
|
|
|
|
ui->tableWidget->item(index, 1)->setTextAlignment(Qt::AlignCenter);
|
|
|
|
|
ui->tableWidget->item(index, 1)->setFlags(ui->tableWidget->item(index, 1)->flags() & ~Qt::ItemIsEditable);
|
|
|
|
|
|
|
|
|
|
ui->tableWidget->setItem(index, 2, new QTableWidgetItem(GetDesc(m_vScanParams[index].deviceConfigs)));
|
|
|
|
|
ui->tableWidget->item(index, 2)->setTextAlignment(Qt::AlignCenter);
|
|
|
|
|
ui->tableWidget->item(index, 2)->setFlags(ui->tableWidget->item(index, 2)->flags() & ~Qt::ItemIsEditable);
|
|
|
|
|
|
|
|
|
|
ui->tableWidget->setItem(index, 3, new QTableWidgetItem(GetDesc(m_vScanParams[index].saveParam)));
|
|
|
|
|
ui->tableWidget->item(index, 3)->setTextAlignment(Qt::AlignCenter);
|
|
|
|
|
ui->tableWidget->item(index, 3)->setFlags(ui->tableWidget->item(index, 3)->flags() & ~Qt::ItemIsEditable);
|
|
|
|
|
|
|
|
|
|
ui->tableWidget->selectRow(index);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MainWindow::SaveImage(HGImage image)
|
|
|
|
|
{
|
|
|
|
|
if (m_aquireIntoSaveParam.isSaveAsMultiPage)
|
|
|
|
@ -1052,6 +1006,61 @@ void MainWindow::Show()
|
|
|
|
|
raise();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MainWindow::ShowAddDialog(unsigned int buttonId)
|
|
|
|
|
{
|
|
|
|
|
if (nullptr == m_devHandle)
|
|
|
|
|
{
|
|
|
|
|
QMessageBox::information(this, tr("Tips"), tr("Device is offline"));
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::string deviceType = m_devName.toStdString();
|
|
|
|
|
char v[256] = {0};
|
|
|
|
|
SANE_Status status = sane_control_option(m_devHandle, (SANE_Int)0x886D, SANE_ACTION_GET_VALUE, v, NULL);
|
|
|
|
|
if (SANE_STATUS_GOOD == status)
|
|
|
|
|
{
|
|
|
|
|
deviceType = v;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
assert(nullptr == m_dlgAdd);
|
|
|
|
|
m_dlgAdd = new Dialog_Add(m_devHandle, this, deviceType, buttonId);
|
|
|
|
|
connect(this, SIGNAL(closeDevice()), m_dlgAdd, SLOT(on_closeDevice()));
|
|
|
|
|
if (m_dlgAdd->exec())
|
|
|
|
|
{
|
|
|
|
|
ScanParam scanParam = m_dlgAdd->GetScanParam();
|
|
|
|
|
m_vScanParams.push_back(scanParam);
|
|
|
|
|
SaveCfg();
|
|
|
|
|
|
|
|
|
|
ui->tableWidget->setRowCount((int)m_vScanParams.size());
|
|
|
|
|
int index = (int)m_vScanParams.size() - 1;
|
|
|
|
|
|
|
|
|
|
ui->tableWidget->setRowHeight(index, 30);
|
|
|
|
|
|
|
|
|
|
ui->tableWidget->setItem(index, 0, new QTableWidgetItem(QString(m_vScanParams[index].deviceType.c_str())));
|
|
|
|
|
ui->tableWidget->item(index, 0)->setTextAlignment(Qt::AlignCenter);
|
|
|
|
|
ui->tableWidget->item(index, 0)->setFlags(ui->tableWidget->item(index, 0)->flags() & ~Qt::ItemIsEditable);
|
|
|
|
|
|
|
|
|
|
QStringList btnTypeStr = {tr("Manual"), tr("Button 1"), tr("Button 2"), tr("Button 3"), tr("Button 4")};
|
|
|
|
|
ui->tableWidget->setItem(index, 1, new QTableWidgetItem(btnTypeStr[m_vScanParams[index].buttonId]));
|
|
|
|
|
ui->tableWidget->item(index, 1)->setTextAlignment(Qt::AlignCenter);
|
|
|
|
|
ui->tableWidget->item(index, 1)->setFlags(ui->tableWidget->item(index, 1)->flags() & ~Qt::ItemIsEditable);
|
|
|
|
|
|
|
|
|
|
ui->tableWidget->setItem(index, 2, new QTableWidgetItem(GetDesc(m_vScanParams[index].deviceConfigs)));
|
|
|
|
|
ui->tableWidget->item(index, 2)->setTextAlignment(Qt::AlignCenter);
|
|
|
|
|
ui->tableWidget->item(index, 2)->setFlags(ui->tableWidget->item(index, 2)->flags() & ~Qt::ItemIsEditable);
|
|
|
|
|
|
|
|
|
|
ui->tableWidget->setItem(index, 3, new QTableWidgetItem(GetDesc(m_vScanParams[index].saveParam)));
|
|
|
|
|
ui->tableWidget->item(index, 3)->setTextAlignment(Qt::AlignCenter);
|
|
|
|
|
ui->tableWidget->item(index, 3)->setFlags(ui->tableWidget->item(index, 3)->flags() & ~Qt::ItemIsEditable);
|
|
|
|
|
|
|
|
|
|
ui->tableWidget->selectRow(index);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
disconnect(this, SIGNAL(closeDevice()), m_dlgAdd, SLOT(on_closeDevice()));
|
|
|
|
|
delete m_dlgAdd;
|
|
|
|
|
m_dlgAdd = nullptr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int MainWindow::sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigned int* len, void* param)
|
|
|
|
|
{
|
|
|
|
|
(void)hdev;
|
|
|
|
@ -1104,6 +1113,11 @@ int MainWindow::sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigne
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case SANE_EVENT_SCANNER_CLOSED:
|
|
|
|
|
{
|
|
|
|
|
emit p->saneEventCloseDevice((void*)hdev);
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case SANE_EVENT_IMAGE_OK:
|
|
|
|
|
{
|
|
|
|
|
++p->m_aquireIntoPageIndex;
|
|
|
|
@ -1205,6 +1219,24 @@ void MainWindow::closeEvent(QCloseEvent *e)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MainWindow::timerEvent(QTimerEvent *e)
|
|
|
|
|
{
|
|
|
|
|
if (e->timerId() == m_timerId)
|
|
|
|
|
{
|
|
|
|
|
SANE_Status status = sane_open(ui->comboBox->currentText().toStdString().c_str(), &m_devHandle);
|
|
|
|
|
if (SANE_STATUS_GOOD == status)
|
|
|
|
|
{
|
|
|
|
|
m_devName = ui->comboBox->currentText();
|
|
|
|
|
ui->pushButtonScan->setEnabled(true);
|
|
|
|
|
ui->pushButtonAdd->setEnabled(true);
|
|
|
|
|
ui->pushButtonModify->setEnabled(true);
|
|
|
|
|
|
|
|
|
|
this->killTimer(m_timerId);
|
|
|
|
|
m_timerId = -1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MainWindow::on_deviceArrive(QString devName)
|
|
|
|
|
{
|
|
|
|
|
ui->comboBox->addItem(devName);
|
|
|
|
@ -1220,6 +1252,10 @@ void MainWindow::on_deviceRemove(QString devName)
|
|
|
|
|
sane_close(m_devHandle);
|
|
|
|
|
m_devHandle = NULL;
|
|
|
|
|
m_devName.clear();
|
|
|
|
|
|
|
|
|
|
ui->pushButtonScan->setEnabled(false);
|
|
|
|
|
ui->pushButtonAdd->setEnabled(false);
|
|
|
|
|
ui->pushButtonModify->setEnabled(false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < ui->comboBox->count(); ++i)
|
|
|
|
@ -1235,7 +1271,6 @@ void MainWindow::on_deviceRemove(QString devName)
|
|
|
|
|
void MainWindow::on_keyPress(unsigned int buttonId)
|
|
|
|
|
{
|
|
|
|
|
assert(nullptr != m_devHandle);
|
|
|
|
|
m_currentButtonClicked = buttonId;
|
|
|
|
|
StartScan(buttonId);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -1293,6 +1328,12 @@ void MainWindow::on_scanFinish()
|
|
|
|
|
|
|
|
|
|
void MainWindow::on_comboBox_currentIndexChanged(const QString &arg1)
|
|
|
|
|
{
|
|
|
|
|
if (-1 != m_timerId)
|
|
|
|
|
{
|
|
|
|
|
this->killTimer(m_timerId);
|
|
|
|
|
m_timerId = -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (NULL != m_devHandle)
|
|
|
|
|
{
|
|
|
|
|
StopScan();
|
|
|
|
@ -1300,13 +1341,24 @@ void MainWindow::on_comboBox_currentIndexChanged(const QString &arg1)
|
|
|
|
|
sane_close(m_devHandle);
|
|
|
|
|
m_devHandle = NULL;
|
|
|
|
|
m_devName.clear();
|
|
|
|
|
|
|
|
|
|
ui->pushButtonScan->setEnabled(false);
|
|
|
|
|
ui->pushButtonAdd->setEnabled(false);
|
|
|
|
|
ui->pushButtonModify->setEnabled(false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SANE_Status status = sane_open(arg1.toStdString().c_str(), &m_devHandle);
|
|
|
|
|
if (SANE_STATUS_GOOD == status)
|
|
|
|
|
{
|
|
|
|
|
m_devName = arg1;
|
|
|
|
|
AddManualScanParam();
|
|
|
|
|
|
|
|
|
|
ui->pushButtonScan->setEnabled(true);
|
|
|
|
|
ui->pushButtonAdd->setEnabled(true);
|
|
|
|
|
ui->pushButtonModify->setEnabled(true);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
m_timerId = this->startTimer(2000);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -1337,59 +1389,34 @@ void MainWindow::on_showMainWindowDlg()
|
|
|
|
|
Show();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MainWindow::on_pushButtonAdd_clicked()
|
|
|
|
|
void MainWindow::on_saneEventCloseDevice(void* devHandle)
|
|
|
|
|
{
|
|
|
|
|
if (nullptr == m_devHandle)
|
|
|
|
|
if (devHandle == m_devHandle)
|
|
|
|
|
{
|
|
|
|
|
QMessageBox::information(this, tr("Tips"), tr("Device is offline"));
|
|
|
|
|
return;
|
|
|
|
|
assert(nullptr != m_devHandle || nullptr != devHandle);
|
|
|
|
|
StopScan();
|
|
|
|
|
emit closeDevice();
|
|
|
|
|
sane_close(m_devHandle);
|
|
|
|
|
m_devHandle = NULL;
|
|
|
|
|
m_devName.clear();
|
|
|
|
|
|
|
|
|
|
ui->pushButtonScan->setEnabled(false);
|
|
|
|
|
ui->pushButtonAdd->setEnabled(false);
|
|
|
|
|
ui->pushButtonModify->setEnabled(false);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::string deviceType = m_devName.toStdString();
|
|
|
|
|
char v[256] = {0};
|
|
|
|
|
SANE_Status status = sane_control_option(m_devHandle, (SANE_Int)0x886D, SANE_ACTION_GET_VALUE, v, NULL);
|
|
|
|
|
if (SANE_STATUS_GOOD == status)
|
|
|
|
|
if (-1 != m_timerId)
|
|
|
|
|
{
|
|
|
|
|
deviceType = v;
|
|
|
|
|
this->killTimer(m_timerId);
|
|
|
|
|
m_timerId = -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
assert(nullptr == m_dlgAdd);
|
|
|
|
|
m_dlgAdd = new Dialog_Add(m_devHandle, this, deviceType, m_currentButtonClicked);
|
|
|
|
|
connect(this, SIGNAL(closeDevice()), m_dlgAdd, SLOT(on_closeDevice()));
|
|
|
|
|
if (m_dlgAdd->exec())
|
|
|
|
|
{
|
|
|
|
|
ScanParam scanParam = m_dlgAdd->GetScanParam();
|
|
|
|
|
m_vScanParams.push_back(scanParam);
|
|
|
|
|
SaveCfg();
|
|
|
|
|
m_timerId = this->startTimer(2000);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ui->tableWidget->setRowCount((int)m_vScanParams.size());
|
|
|
|
|
int index = (int)m_vScanParams.size() - 1;
|
|
|
|
|
|
|
|
|
|
ui->tableWidget->setRowHeight(index, 30);
|
|
|
|
|
|
|
|
|
|
ui->tableWidget->setItem(index, 0, new QTableWidgetItem(QString(m_vScanParams[index].deviceType.c_str())));
|
|
|
|
|
ui->tableWidget->item(index, 0)->setTextAlignment(Qt::AlignCenter);
|
|
|
|
|
ui->tableWidget->item(index, 0)->setFlags(ui->tableWidget->item(index, 0)->flags() & ~Qt::ItemIsEditable);
|
|
|
|
|
|
|
|
|
|
QStringList btnTypeStr = {tr("Manual"), tr("Button 1"), tr("Button 2"), tr("Button 3"), tr("Button 4")};
|
|
|
|
|
ui->tableWidget->setItem(index, 1, new QTableWidgetItem(btnTypeStr[m_vScanParams[index].buttonId]));
|
|
|
|
|
ui->tableWidget->item(index, 1)->setTextAlignment(Qt::AlignCenter);
|
|
|
|
|
ui->tableWidget->item(index, 1)->setFlags(ui->tableWidget->item(index, 1)->flags() & ~Qt::ItemIsEditable);
|
|
|
|
|
|
|
|
|
|
ui->tableWidget->setItem(index, 2, new QTableWidgetItem(GetDesc(m_vScanParams[index].deviceConfigs)));
|
|
|
|
|
ui->tableWidget->item(index, 2)->setTextAlignment(Qt::AlignCenter);
|
|
|
|
|
ui->tableWidget->item(index, 2)->setFlags(ui->tableWidget->item(index, 2)->flags() & ~Qt::ItemIsEditable);
|
|
|
|
|
|
|
|
|
|
ui->tableWidget->setItem(index, 3, new QTableWidgetItem(GetDesc(m_vScanParams[index].saveParam)));
|
|
|
|
|
ui->tableWidget->item(index, 3)->setTextAlignment(Qt::AlignCenter);
|
|
|
|
|
ui->tableWidget->item(index, 3)->setFlags(ui->tableWidget->item(index, 3)->flags() & ~Qt::ItemIsEditable);
|
|
|
|
|
|
|
|
|
|
ui->tableWidget->selectRow(index);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
disconnect(this, SIGNAL(closeDevice()), m_dlgAdd, SLOT(on_closeDevice()));
|
|
|
|
|
delete m_dlgAdd;
|
|
|
|
|
m_dlgAdd = nullptr;
|
|
|
|
|
void MainWindow:: on_pushButtonAdd_clicked()
|
|
|
|
|
{
|
|
|
|
|
ShowAddDialog(0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MainWindow::on_pushButtonModify_clicked()
|
|
|
|
@ -1453,12 +1480,6 @@ void MainWindow::on_pushButtonRemove_clicked()
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (0 == m_vScanParams[index].buttonId)
|
|
|
|
|
{
|
|
|
|
|
QMessageBox::information(this, tr("Tips"), tr("Manual configuration items cannot be deleted"));
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QMessageBox msg(QMessageBox::Question, tr("Question"),
|
|
|
|
|
tr("Are you sure you want to remove the item?"),
|
|
|
|
|
QMessageBox::Yes | QMessageBox::No, this);
|
|
|
|
|