diff --git a/app/scantool/dialog_add.cpp b/app/scantool/dialog_add.cpp index c3946e44..751c2a73 100644 --- a/app/scantool/dialog_add.cpp +++ b/app/scantool/dialog_add.cpp @@ -13,13 +13,14 @@ Dialog_Add::Dialog_Add(SANE_Handle devHandle, class MainWindow *mainWnd, const s setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint); this->setWindowTitle(tr("Add") + " (" + QString(deviceType.c_str()) + ")"); + ui->comboBoxButtonId->addItem("Manual"); // TODO 通过devHandle获取支持的按钮,并添加到下拉列表 - ui->comboBoxButtonType->addItem("Button 1"); - ui->comboBoxButtonType->addItem("Button 2"); - ui->comboBoxButtonType->addItem("Button 3"); + ui->comboBoxButtonId->addItem("Button 1"); + ui->comboBoxButtonId->addItem("Button 2"); + ui->comboBoxButtonId->addItem("Button 3"); m_scanParam.deviceType = deviceType; - m_scanParam.buttonType = ButtonType(ui->comboBoxButtonType->currentIndex() + 1); + m_scanParam.buttonId = ui->comboBoxButtonId->currentIndex(); m_scanParam.deviceConfigs.clear(); m_scanParam.saveParam = Form_SaveParam::GetDefSaveParam(); @@ -40,13 +41,14 @@ Dialog_Add::Dialog_Add(SANE_Handle devHandle, class MainWindow *mainWnd, const S setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint); this->setWindowTitle(tr("Modify") + " (" + QString(scanParam.deviceType.c_str()) + ")"); + ui->comboBoxButtonId->addItem("Manual"); // TODO 通过devHandle获取支持的按钮,并添加到下拉列表 - ui->comboBoxButtonType->addItem("Button 1"); - ui->comboBoxButtonType->addItem("Button 2"); - ui->comboBoxButtonType->addItem("Button 3"); + ui->comboBoxButtonId->addItem("Button 1"); + ui->comboBoxButtonId->addItem("Button 2"); + ui->comboBoxButtonId->addItem("Button 3"); m_scanParam = scanParam; - ui->comboBoxButtonType->setCurrentIndex(m_scanParam.buttonType - 1); + ui->comboBoxButtonId->setCurrentIndex(m_scanParam.buttonId); m_formDeviceConfig = new Form_DeviceConfig(devHandle, m_scanParam.deviceConfigs, this); m_formSaveParam = new Form_SaveParam(m_scanParam.saveParam, this); @@ -77,14 +79,14 @@ void Dialog_Add::on_pushButtonSaveParam_clicked() ui->stackedWidget->setCurrentIndex(1); } -void Dialog_Add::on_comboBoxButtonType_currentIndexChanged(int index) +void Dialog_Add::on_comboBoxButtonId_currentIndexChanged(int index) { - m_scanParam.buttonType = ButtonType(index + 1); + m_scanParam.buttonId = index; } void Dialog_Add::on_pushButtonOK_clicked() { - if (m_mainWnd->FindScanParam(m_scanParam.deviceType, m_scanParam.buttonType, m_index)) + if (m_mainWnd->FindScanParam(m_scanParam.deviceType, m_scanParam.buttonId, m_index)) { QMessageBox::information(this, tr("Tips"), tr("Item find in list")); return; diff --git a/app/scantool/dialog_add.h b/app/scantool/dialog_add.h index c7712316..17e79e72 100644 --- a/app/scantool/dialog_add.h +++ b/app/scantool/dialog_add.h @@ -10,17 +10,10 @@ namespace Ui { class Dialog_Add; } -enum ButtonType -{ - DeviceType_1 = 1, - DeviceType_2, - DeviceType_3 -}; - struct ScanParam { std::string deviceType; - ButtonType buttonType; + unsigned int buttonId; std::vector deviceConfigs; SaveParam saveParam; }; @@ -41,7 +34,7 @@ private slots: void on_pushButtonSaveParam_clicked(); - void on_comboBoxButtonType_currentIndexChanged(int index); + void on_comboBoxButtonId_currentIndexChanged(int index); void on_pushButtonOK_clicked(); diff --git a/app/scantool/dialog_add.ui b/app/scantool/dialog_add.ui index 14e8f786..f5ada4e4 100644 --- a/app/scantool/dialog_add.ui +++ b/app/scantool/dialog_add.ui @@ -31,7 +31,7 @@ - + diff --git a/app/scantool/dialog_scan.cpp b/app/scantool/dialog_scan.cpp index 478125f0..96c6fda2 100644 --- a/app/scantool/dialog_scan.cpp +++ b/app/scantool/dialog_scan.cpp @@ -51,6 +51,159 @@ Dialog_Scan::~Dialog_Scan() delete ui; } +void Dialog_Scan::StartScan(unsigned int buttonId) +{ + if (nullptr == m_devHandle) + { + QMessageBox::information(this, tr("Tips"), tr("Device is offline")); + return; + } + + if (m_scanning) + { + 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; + } + + ScanParam scanParam; + if (!m_mainWnd->GetScanParam(deviceType, buttonId, scanParam)) + { + QMessageBox::information(this, tr("Tips"), tr("No key scanning configuration found")); + return; + } + + // 1.恢复默认 + + SANE_Int num_dev_options = 0; + sane_control_option(m_devHandle, 0, SANE_ACTION_GET_VALUE, &num_dev_options, NULL); + for (int i = 1; i < num_dev_options; ++i) + { + const SANE_Option_Descriptor* desp = sane_get_option_descriptor(m_devHandle, i); + if (NULL == desp) + continue; + + const char* name = desp->name; + while (' ' == *name) + ++name; + + if (0 == strcmp(SANE_STD_OPT_NAME_RESTORE, name) && SANE_TYPE_BUTTON == desp->type) + { + sane_control_option(m_devHandle, i, SANE_ACTION_SET_VALUE, NULL, NULL); + break; + } + } + + // 2.设置新的属性 + + for (int i = 0; i < (int)scanParam.deviceConfigs.size(); ++i) + { + for (int j = 1; j < num_dev_options; ++j) + { + const SANE_Option_Descriptor* desp = sane_get_option_descriptor(m_devHandle, j); + if (NULL == desp) + continue; + + const char* name = desp->name; + while (' ' == *name) + ++name; + + if (0 == strcmp(scanParam.deviceConfigs[i].name.c_str(), name)) + { + if (SANE_TYPE_STRING == desp->type) + { + sane_control_option(m_devHandle, j, SANE_ACTION_SET_VALUE, (void*)scanParam.deviceConfigs[i].stringValue.c_str(), NULL); + } + else if (SANE_TYPE_INT == desp->type) + { + SANE_Int value = scanParam.deviceConfigs[i].intValue; + sane_control_option(m_devHandle, j, SANE_ACTION_SET_VALUE, &value, NULL); + } + else if (SANE_TYPE_FIXED == desp->type) + { + SANE_Fixed value = SANE_FIX(scanParam.deviceConfigs[i].doubleValue); + sane_control_option(m_devHandle, j, SANE_ACTION_SET_VALUE, &value, NULL); + } + else if (SANE_TYPE_BOOL == desp->type) + { + SANE_Bool value = (SANE_Bool)scanParam.deviceConfigs[i].boolValue; + sane_control_option(m_devHandle, j, SANE_ACTION_SET_VALUE, &value, NULL); + } + + break; + } + } + } + + // 3. 获取DPI + + for (int i = 1; i < num_dev_options; ++i) + { + const SANE_Option_Descriptor* desp = sane_get_option_descriptor(m_devHandle, i); + if (nullptr == desp) + continue; + + if (SANE_TYPE_INT == desp->type) + { + SANE_Int value = 0; + sane_control_option(m_devHandle, i, SANE_ACTION_GET_VALUE, &value, nullptr); + if (0 == strcmp(desp->name, SANE_STD_OPT_NAME_RESOLUTION)) + { + m_dpi = (HGUInt)value; + } + } + } + + // 4.保存配置 + assert(m_scanFileName.isEmpty()); + assert(nullptr == m_scanImgFmtWriter); + m_aquireIntoSaveParam = scanParam.saveParam; + m_aquireIntoInBlank = true; + m_aquireIntoBatchStartIndex = 0; + m_aquireIntoPageIndex = 0; + m_aquireIntoMultiPageCount = 0; + + QDateTime dateTime = QDateTime::currentDateTime(); + if (m_aquireIntoSaveParam.m_isUseSubfolderByTime) + { + m_aquireIntoSaveParam.m_savePath = getStdFileName(m_aquireIntoSaveParam.m_savePath + dateTime.toString("yyyy-MM-dd") + "/"); + } + + if (m_aquireIntoSaveParam.m_isOcr) + { + HGBase_CreateMsgPump(&m_ocrMsgPump); + HGBase_OpenThread(ocrThreadFunc, this, &m_ocrThread); + } + + m_scanning = true; + ui->comboBox->setEnabled(false); + ui->pushButtonScan->setEnabled(false); + status = sane_start(m_devHandle); + if (SANE_STATUS_GOOD != status) + { + if (NULL != m_ocrMsgPump) + { + HGBase_ExitMsgPump(m_ocrMsgPump); + HGBase_CloseThread(m_ocrThread); + m_ocrThread = NULL; + HGBase_DestroyMsgPump(m_ocrMsgPump); + m_ocrMsgPump = NULL; + } + + m_scanning = false; + m_dpi = 200; + ui->comboBox->setEnabled(true); + ui->pushButtonScan->setEnabled(true); + return; + } +} + void Dialog_Scan::StopScan() { if (m_scanning) @@ -59,6 +212,8 @@ void Dialog_Scan::StopScan() sane_cancel(m_devHandle); m_scanning = false; m_dpi = 200; + ui->comboBox->setEnabled(true); + ui->pushButtonScan->setEnabled(true); } } @@ -445,149 +600,10 @@ void Dialog_Scan::on_deviceRemove(QString devName) } } -void Dialog_Scan::on_keyPress(unsigned int buttonType) +void Dialog_Scan::on_keyPress(unsigned int buttonId) { assert(NULL != m_devHandle); - if (m_scanning) - { - // 扫描过程中,不响应按键 - return; - } - - std::string deviceType = m_devName.toStdString(); // TODO 获取m_devHandle设备类型 - 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; - } - - ScanParam scanParam; - if (!m_mainWnd->GetScanParam(deviceType, (ButtonType)buttonType, scanParam)) - { - QMessageBox::information(this, tr("Tips"), tr("No key scanning configuration found")); - return; - } - - // 1.恢复默认 - - SANE_Int num_dev_options = 0; - sane_control_option(m_devHandle, 0, SANE_ACTION_GET_VALUE, &num_dev_options, NULL); - for (int i = 1; i < num_dev_options; ++i) - { - const SANE_Option_Descriptor* desp = sane_get_option_descriptor(m_devHandle, i); - if (NULL == desp) - continue; - - const char* name = desp->name; - while (' ' == *name) - ++name; - - if (0 == strcmp(SANE_STD_OPT_NAME_RESTORE, name) && SANE_TYPE_BUTTON == desp->type) - { - sane_control_option(m_devHandle, i, SANE_ACTION_SET_VALUE, NULL, NULL); - break; - } - } - - // 2.设置新的属性 - - for (int i = 0; i < (int)scanParam.deviceConfigs.size(); ++i) - { - for (int j = 1; j < num_dev_options; ++j) - { - const SANE_Option_Descriptor* desp = sane_get_option_descriptor(m_devHandle, j); - if (NULL == desp) - continue; - - const char* name = desp->name; - while (' ' == *name) - ++name; - - if (0 == strcmp(scanParam.deviceConfigs[i].name.c_str(), name)) - { - if (SANE_TYPE_STRING == desp->type) - { - sane_control_option(m_devHandle, j, SANE_ACTION_SET_VALUE, (void*)scanParam.deviceConfigs[i].stringValue.c_str(), NULL); - } - else if (SANE_TYPE_INT == desp->type) - { - SANE_Int value = scanParam.deviceConfigs[i].intValue; - sane_control_option(m_devHandle, j, SANE_ACTION_SET_VALUE, &value, NULL); - } - else if (SANE_TYPE_FIXED == desp->type) - { - SANE_Fixed value = SANE_FIX(scanParam.deviceConfigs[i].doubleValue); - sane_control_option(m_devHandle, j, SANE_ACTION_SET_VALUE, &value, NULL); - } - else if (SANE_TYPE_BOOL == desp->type) - { - SANE_Bool value = (SANE_Bool)scanParam.deviceConfigs[i].boolValue; - sane_control_option(m_devHandle, j, SANE_ACTION_SET_VALUE, &value, NULL); - } - - break; - } - } - } - - // 3. 获取DPI - - for (int i = 1; i < num_dev_options; ++i) - { - const SANE_Option_Descriptor* desp = sane_get_option_descriptor(m_devHandle, i); - if (nullptr == desp) - continue; - - if (SANE_TYPE_INT == desp->type) - { - SANE_Int value = 0; - sane_control_option(m_devHandle, i, SANE_ACTION_GET_VALUE, &value, nullptr); - if (0 == strcmp(desp->name, SANE_STD_OPT_NAME_RESOLUTION)) - { - m_dpi = (HGUInt)value; - } - } - } - - // 4.保存配置 - assert(m_scanFileName.isEmpty()); - assert(nullptr == m_scanImgFmtWriter); - m_aquireIntoSaveParam = scanParam.saveParam; - m_aquireIntoInBlank = true; - m_aquireIntoBatchStartIndex = 0; - m_aquireIntoPageIndex = 0; - m_aquireIntoMultiPageCount = 0; - - QDateTime dateTime = QDateTime::currentDateTime(); - if (m_aquireIntoSaveParam.m_isUseSubfolderByTime) - { - m_aquireIntoSaveParam.m_savePath = getStdFileName(m_aquireIntoSaveParam.m_savePath + dateTime.toString("yyyy-MM-dd") + "/"); - } - - if (m_aquireIntoSaveParam.m_isOcr) - { - HGBase_CreateMsgPump(&m_ocrMsgPump); - HGBase_OpenThread(ocrThreadFunc, this, &m_ocrThread); - } - - m_scanning = true; - status = sane_start(m_devHandle); - if (SANE_STATUS_GOOD != status) - { - if (NULL != m_ocrMsgPump) - { - HGBase_ExitMsgPump(m_ocrMsgPump); - HGBase_CloseThread(m_ocrThread); - m_ocrThread = NULL; - HGBase_DestroyMsgPump(m_ocrMsgPump); - m_ocrMsgPump = NULL; - } - - m_scanning = false; - m_dpi = 200; - return; - } + StartScan(buttonId); } void Dialog_Scan::on_scanWorking() @@ -602,7 +618,7 @@ void Dialog_Scan::on_scanInfo(QString info, bool error) void Dialog_Scan::on_scanImage(unsigned int count) { - // 更新扫描数量到进度窗口 + // TODO 更新扫描数量到进度窗口 } void Dialog_Scan::on_scanFinish() @@ -659,3 +675,9 @@ void Dialog_Scan::on_comboBox_currentIndexChanged(const QString &arg1) m_devName = arg1; } } + +void Dialog_Scan::on_pushButtonScan_clicked() +{ + assert(!m_scanning); + StartScan(0); +} diff --git a/app/scantool/dialog_scan.h b/app/scantool/dialog_scan.h index 8a4a3f6c..9a539cc9 100644 --- a/app/scantool/dialog_scan.h +++ b/app/scantool/dialog_scan.h @@ -25,6 +25,7 @@ public: ~Dialog_Scan(); private: + void StartScan(unsigned int buttonId); void StopScan(); void SaveImage(HGImage image); static int sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigned int* len, void* param); @@ -37,7 +38,7 @@ protected: signals: void deviceArrive(QString devName); void deviceRemove(QString devName); - void keyPress(unsigned int buttonType); + void keyPress(unsigned int buttonId); void scanWorking(); void scanInfo(QString info, bool error); void scanImage(unsigned int count); @@ -46,7 +47,7 @@ signals: private slots: void on_deviceArrive(QString devName); void on_deviceRemove(QString devName); - void on_keyPress(unsigned int buttonType); + void on_keyPress(unsigned int buttonId); void on_scanWorking(); void on_scanInfo(QString info, bool error); void on_scanImage(unsigned int count); @@ -54,6 +55,8 @@ private slots: void on_comboBox_currentIndexChanged(const QString &arg1); + void on_pushButtonScan_clicked(); + private: Ui::Dialog_Scan *ui; class MainWindow *m_mainWnd; diff --git a/app/scantool/dialog_scan.ui b/app/scantool/dialog_scan.ui index f36cff35..e6cc64eb 100644 --- a/app/scantool/dialog_scan.ui +++ b/app/scantool/dialog_scan.ui @@ -74,6 +74,62 @@ + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 81 + 31 + + + + Scan + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + diff --git a/app/scantool/mainwindow.cpp b/app/scantool/mainwindow.cpp index aa026d61..e19dc8ec 100644 --- a/app/scantool/mainwindow.cpp +++ b/app/scantool/mainwindow.cpp @@ -62,8 +62,8 @@ MainWindow::MainWindow(QWidget *parent) ui->tableWidget->item(index, 0)->setTextAlignment(Qt::AlignCenter); ui->tableWidget->item(index, 0)->setFlags(ui->tableWidget->item(index, 0)->flags() & ~Qt::ItemIsEditable); - const char *btnTypeStr[] = {NULL, "Button 1", "Button 2", "Button 3"}; - ui->tableWidget->setItem(index, 1, new QTableWidgetItem(btnTypeStr[m_vScanParams[index].buttonType])); + const char *btnTypeStr[] = {"Manual", "Button 1", "Button 2", "Button 3"}; + 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); @@ -85,11 +85,11 @@ MainWindow::~MainWindow() delete ui; } -bool MainWindow::GetScanParam(const std::string &deviceType, ButtonType buttonType, ScanParam &scanParam) +bool MainWindow::GetScanParam(const std::string &deviceType, unsigned int buttonId, ScanParam &scanParam) { for (int i = 0; i < (int)m_vScanParams.size(); ++i) { - if (deviceType == m_vScanParams[i].deviceType && buttonType == m_vScanParams[i].buttonType) + if (deviceType == m_vScanParams[i].deviceType && buttonId == m_vScanParams[i].buttonId) { scanParam = m_vScanParams[i]; return true; @@ -99,11 +99,11 @@ bool MainWindow::GetScanParam(const std::string &deviceType, ButtonType buttonTy return false; } -bool MainWindow::FindScanParam(const std::string &deviceType, ButtonType buttonType, int ignoreIndex) +bool MainWindow::FindScanParam(const std::string &deviceType, unsigned int buttonId, int ignoreIndex) { for (int i = 0; i < (int)m_vScanParams.size(); ++i) { - if (deviceType == m_vScanParams[i].deviceType && buttonType == m_vScanParams[i].buttonType) + if (deviceType == m_vScanParams[i].deviceType && buttonId == m_vScanParams[i].buttonId) { if (-1 == ignoreIndex) // 表示均不忽略 { @@ -189,14 +189,7 @@ void MainWindow::on_pushButtonAdd_clicked() return; } - // TODO 获取m_scanDlg->m_devHandle是否支持按键扫描 - if (0) - { - QMessageBox::information(this, tr("Tips"), tr("The device does not support key scanning")); - return; - } - - std::string deviceType = m_scanDlg->m_devName.toStdString(); // TODO 获取m_scanDlg->m_devHandle设备类型 + std::string deviceType = m_scanDlg->m_devName.toStdString(); char v[256] = {0}; SANE_Status status = sane_control_option(m_scanDlg->m_devHandle, (SANE_Int)0x886D, SANE_ACTION_GET_VALUE, v, NULL); if (SANE_STATUS_GOOD == status) @@ -220,8 +213,8 @@ void MainWindow::on_pushButtonAdd_clicked() ui->tableWidget->item(index, 0)->setTextAlignment(Qt::AlignCenter); ui->tableWidget->item(index, 0)->setFlags(ui->tableWidget->item(index, 0)->flags() & ~Qt::ItemIsEditable); - const char *btnTypeStr[] = {NULL, "Button 1", "Button 2", "Button 3"}; - ui->tableWidget->setItem(index, 1, new QTableWidgetItem(btnTypeStr[m_vScanParams[index].buttonType])); + const char *btnTypeStr[] = {"Manual", "Button 1", "Button 2", "Button 3"}; + 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); @@ -252,7 +245,7 @@ void MainWindow::on_pushButtonModify_clicked() return; } - std::string deviceType = m_scanDlg->m_devName.toStdString(); // TODO 获取m_scanDlg->m_devHandle设备类型 + std::string deviceType = m_scanDlg->m_devName.toStdString(); char v[256] = {0}; SANE_Status status = sane_control_option(m_scanDlg->m_devHandle, (SANE_Int)0x886D, SANE_ACTION_GET_VALUE, v, NULL); if (SANE_STATUS_GOOD == status) @@ -275,8 +268,8 @@ void MainWindow::on_pushButtonModify_clicked() ui->tableWidget->item(index, 0)->setText(QString::fromStdString(m_vScanParams[index].deviceType)); - const char *btnTypeStr[] = {NULL, "Button 1", "Button 2", "Button 3"}; - ui->tableWidget->item(index, 1)->setText(QString::fromStdString(btnTypeStr[m_vScanParams[index].buttonType])); + const char *btnTypeStr[] = {"Manual", "Button 1", "Button 2", "Button 3"}; + ui->tableWidget->item(index, 1)->setText(QString::fromStdString(btnTypeStr[m_vScanParams[index].buttonId])); ui->tableWidget->item(index, 2)->setText(GetDesc(m_vScanParams[index].deviceConfigs)); ui->tableWidget->item(index, 3)->setText(GetDesc(m_vScanParams[index].saveParam)); diff --git a/app/scantool/mainwindow.h b/app/scantool/mainwindow.h index 2e3c1ea7..1a015c38 100644 --- a/app/scantool/mainwindow.h +++ b/app/scantool/mainwindow.h @@ -20,8 +20,8 @@ public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); - bool GetScanParam(const std::string &deviceType, ButtonType buttonType, ScanParam &scanParam); - bool FindScanParam(const std::string &deviceType, ButtonType buttonType, int ignoreIndex); + bool GetScanParam(const std::string &deviceType, unsigned int buttonId, ScanParam &scanParam); + bool FindScanParam(const std::string &deviceType, unsigned int buttonId, int ignoreIndex); private: QString GetDesc(const std::vector &deviceConfigs);