Compare commits

...

2 Commits

4 changed files with 137 additions and 112 deletions

View File

@ -3,7 +3,7 @@
#include "mainwindow.h"
#include <QMessageBox>
Dialog_Add::Dialog_Add(SANE_Handle devHandle, class MainWindow *mainWnd, const std::string &deviceType, int curButtonId)
Dialog_Add::Dialog_Add(SANE_Handle devHandle, class MainWindow *mainWnd, const std::string &deviceType, int buttonId)
: QDialog(mainWnd)
, ui(new Ui::Dialog_Add)
, m_mainWnd(mainWnd)
@ -19,8 +19,8 @@ Dialog_Add::Dialog_Add(SANE_Handle devHandle, class MainWindow *mainWnd, const s
for (SANE_Int i = 0; i < buttonCount; ++i)
ui->comboBoxButtonId->addItem(tr("Button ") + QString::number(i + 1));
if (buttonCount >= curButtonId)
ui->comboBoxButtonId->setCurrentIndex(curButtonId);
if (buttonId < ui->comboBoxButtonId->count())
ui->comboBoxButtonId->setCurrentIndex(buttonId);
m_scanParam.deviceType = deviceType;
m_scanParam.buttonId = ui->comboBoxButtonId->currentIndex();

View File

@ -23,7 +23,7 @@ class Dialog_Add : public QDialog
Q_OBJECT
public:
explicit Dialog_Add(SANE_Handle devHandle, class MainWindow *mainWnd, const std::string &deviceType, int curButtonId);
explicit Dialog_Add(SANE_Handle devHandle, class MainWindow *mainWnd, const std::string &deviceType, int buttonId);
Dialog_Add(SANE_Handle devHandle, class MainWindow *mainWnd, const ScanParam &scanParam, int index);
~Dialog_Add();

View File

@ -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);

View File

@ -39,15 +39,16 @@ private:
QString GetDesc(const std::vector<DeviceConfig> &deviceConfigs);
QString GetDesc(const SaveParam &saveParam);
void StartScan(unsigned int buttonId);
void AddManualScanParam();
void SaveImage(HGImage image);
void Show();
void ShowAddDialog(unsigned int buttonId);
static int sane_ex_callback(SANE_Handle hdev, int code, void* data, unsigned int* len, void* param);
static void HGAPI ocrThreadFunc(HGThread thread, HGPointer param);
static void HGAPI ocrMsgPumpFunc(HGMsgPump msgPump, const HGMsg* msg, HGPointer param);
protected:
virtual void closeEvent(QCloseEvent *e) override;
virtual void timerEvent(QTimerEvent* e) override;
signals:
void deviceArrive(QString devName);
@ -58,6 +59,7 @@ signals:
void scanImage(unsigned int count);
void scanFinish();
void closeDevice();
void saneEventCloseDevice(void* devHandle);
private slots:
void on_deviceArrive(QString devName);
@ -71,6 +73,7 @@ private slots:
void on_pushButtonScan_clicked();
void on_trayActivated(QSystemTrayIcon::ActivationReason reason);
void on_showMainWindowDlg();
void on_saneEventCloseDevice(void* devHandle);
void on_pushButtonAdd_clicked();
void on_pushButtonModify_clicked();
void on_pushButtonRemove_clicked();
@ -98,8 +101,9 @@ private:
int m_aquireIntoBatchStartIndex;
int m_aquireIntoPageIndex;
int m_aquireIntoMultiPageCount;
int m_currentButtonClicked;
HGMsgPump m_ocrMsgPump;
HGThread m_ocrThread;
int m_timerId;
};
#endif // MAINWINDOW_H