2024-04-23 09:44:22 +00:00
|
|
|
|
#include "mainwindow.h"
|
|
|
|
|
#include "ui_mainwindow.h"
|
2024-04-26 04:11:10 +00:00
|
|
|
|
#include "dialog_scan.h"
|
2024-04-23 09:44:22 +00:00
|
|
|
|
#include <QMessageBox>
|
|
|
|
|
#include <QCloseEvent>
|
|
|
|
|
|
|
|
|
|
MainWindow::MainWindow(QWidget *parent)
|
|
|
|
|
: QMainWindow(parent)
|
|
|
|
|
, ui(new Ui::MainWindow)
|
|
|
|
|
{
|
|
|
|
|
ui->setupUi(this);
|
|
|
|
|
|
2024-04-24 06:57:44 +00:00
|
|
|
|
m_scanDlg = new Dialog_Scan(this);
|
2024-04-23 09:44:22 +00:00
|
|
|
|
m_trayIcon = new QSystemTrayIcon(this);
|
|
|
|
|
m_trayIcon->setIcon(QIcon(":images/image_rsc/png/logo.png"));
|
|
|
|
|
m_trayIcon->show();
|
|
|
|
|
m_trayIcon->setToolTip(tr("HuaGao Scan Tool"));
|
|
|
|
|
|
|
|
|
|
qRegisterMetaType<QSystemTrayIcon::ActivationReason>("QSystemTrayIcon::ActivationReason");
|
|
|
|
|
connect(m_trayIcon, &QSystemTrayIcon::activated, this, &MainWindow::on_trayActivated);
|
|
|
|
|
|
|
|
|
|
m_scanAction = new QAction(tr("Scan Setting"), this);
|
|
|
|
|
connect(m_scanAction, &QAction::triggered, this, &MainWindow::on_showScanSettingDlg);
|
|
|
|
|
m_btnAction = new QAction(tr("Button Setting"), this);
|
2024-04-24 07:08:43 +00:00
|
|
|
|
connect(m_btnAction, &QAction::triggered, this, &MainWindow::on_showMainWindowDlg);
|
2024-04-23 09:44:22 +00:00
|
|
|
|
m_quitAction = new QAction(tr("Exit"), this);
|
|
|
|
|
connect(m_quitAction, &QAction::triggered, this, &QCoreApplication::quit); //应用程序的退出
|
|
|
|
|
|
|
|
|
|
//创建菜单,添加菜单项
|
|
|
|
|
m_trayIconMenu = new QMenu(this);
|
|
|
|
|
m_trayIconMenu->addAction(m_scanAction);
|
|
|
|
|
m_trayIconMenu->addAction(m_btnAction);
|
|
|
|
|
m_trayIconMenu->addSeparator(); //分割线
|
|
|
|
|
m_trayIconMenu->addAction(m_quitAction);
|
|
|
|
|
//给系统托盘添加右键菜单
|
|
|
|
|
m_trayIcon->setContextMenu(m_trayIconMenu);
|
2024-04-24 06:57:44 +00:00
|
|
|
|
|
|
|
|
|
ui->tableWidget->setColumnCount(4);
|
|
|
|
|
ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
|
|
|
|
|
ui->tableWidget->setStyleSheet("selection-background-color:rgb(0, 120, 215)");
|
|
|
|
|
ui->tableWidget->setSelectionMode(QAbstractItemView::SingleSelection);
|
|
|
|
|
ui->tableWidget->horizontalHeader()->setFixedHeight(40);
|
|
|
|
|
ui->tableWidget->horizontalHeader()->setStretchLastSection(true);
|
|
|
|
|
ui->tableWidget->setHorizontalHeaderItem(0, new QTableWidgetItem("Device Type"));
|
|
|
|
|
ui->tableWidget->setHorizontalHeaderItem(1, new QTableWidgetItem("Button Type"));
|
|
|
|
|
ui->tableWidget->setHorizontalHeaderItem(2, new QTableWidgetItem("Device Config"));
|
|
|
|
|
ui->tableWidget->setHorizontalHeaderItem(3, new QTableWidgetItem("Save Param"));
|
2024-04-24 10:08:14 +00:00
|
|
|
|
ui->tableWidget->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
|
|
|
|
|
ui->tableWidget->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Stretch);
|
2024-04-24 06:57:44 +00:00
|
|
|
|
ui->tableWidget->horizontalHeader()->setSectionResizeMode(2, QHeaderView::Stretch);
|
|
|
|
|
ui->tableWidget->horizontalHeader()->setSectionResizeMode(3, QHeaderView::Stretch);
|
|
|
|
|
|
|
|
|
|
// TODO 读取配置文件,设置m_vScanParams
|
|
|
|
|
|
|
|
|
|
ui->tableWidget->setRowCount((int)m_vScanParams.size());
|
|
|
|
|
|
|
|
|
|
for (int index = 0; index < (int)m_vScanParams.size(); ++index)
|
|
|
|
|
{
|
|
|
|
|
ui->tableWidget->setRowHeight(index, 30);
|
|
|
|
|
|
2024-04-24 10:08:14 +00:00
|
|
|
|
ui->tableWidget->setItem(index, 0, new QTableWidgetItem(QString(m_vScanParams[index].deviceType.c_str())));
|
2024-04-24 06:57:44 +00:00
|
|
|
|
ui->tableWidget->item(index, 0)->setTextAlignment(Qt::AlignCenter);
|
|
|
|
|
ui->tableWidget->item(index, 0)->setFlags(ui->tableWidget->item(index, 0)->flags() & ~Qt::ItemIsEditable);
|
|
|
|
|
|
2024-04-26 05:15:43 +00:00
|
|
|
|
const char *btnTypeStr[] = {"Manual", "Button 1", "Button 2", "Button 3"};
|
|
|
|
|
ui->tableWidget->setItem(index, 1, new QTableWidgetItem(btnTypeStr[m_vScanParams[index].buttonId]));
|
2024-04-24 06:57:44 +00:00
|
|
|
|
ui->tableWidget->item(index, 1)->setTextAlignment(Qt::AlignCenter);
|
|
|
|
|
ui->tableWidget->item(index, 1)->setFlags(ui->tableWidget->item(index, 1)->flags() & ~Qt::ItemIsEditable);
|
|
|
|
|
|
2024-04-25 03:06:28 +00:00
|
|
|
|
ui->tableWidget->setItem(index, 2, new QTableWidgetItem(GetDesc(m_vScanParams[index].deviceConfigs)));
|
2024-04-24 06:57:44 +00:00
|
|
|
|
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(0);
|
2024-04-23 09:44:22 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
MainWindow::~MainWindow()
|
|
|
|
|
{
|
|
|
|
|
delete m_scanDlg;
|
|
|
|
|
delete ui;
|
|
|
|
|
}
|
|
|
|
|
|
2024-04-26 05:15:43 +00:00
|
|
|
|
bool MainWindow::GetScanParam(const std::string &deviceType, unsigned int buttonId, ScanParam &scanParam)
|
2024-04-24 06:57:44 +00:00
|
|
|
|
{
|
|
|
|
|
for (int i = 0; i < (int)m_vScanParams.size(); ++i)
|
|
|
|
|
{
|
2024-04-26 05:15:43 +00:00
|
|
|
|
if (deviceType == m_vScanParams[i].deviceType && buttonId == m_vScanParams[i].buttonId)
|
2024-04-24 06:57:44 +00:00
|
|
|
|
{
|
|
|
|
|
scanParam = m_vScanParams[i];
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2024-04-26 05:15:43 +00:00
|
|
|
|
bool MainWindow::FindScanParam(const std::string &deviceType, unsigned int buttonId, int ignoreIndex)
|
2024-04-24 06:57:44 +00:00
|
|
|
|
{
|
|
|
|
|
for (int i = 0; i < (int)m_vScanParams.size(); ++i)
|
|
|
|
|
{
|
2024-04-26 05:15:43 +00:00
|
|
|
|
if (deviceType == m_vScanParams[i].deviceType && buttonId == m_vScanParams[i].buttonId)
|
2024-04-24 06:57:44 +00:00
|
|
|
|
{
|
|
|
|
|
if (-1 == ignoreIndex) // 表示均不忽略
|
|
|
|
|
{
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
else if (i != ignoreIndex)
|
|
|
|
|
{
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2024-04-25 03:06:28 +00:00
|
|
|
|
QString MainWindow::GetDesc(const std::vector<DeviceConfig> &deviceConfigs)
|
2024-04-24 06:57:44 +00:00
|
|
|
|
{
|
|
|
|
|
QString desc;
|
|
|
|
|
|
|
|
|
|
return desc;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QString MainWindow::GetDesc(const SaveParam &saveParam)
|
|
|
|
|
{
|
|
|
|
|
QString desc;
|
|
|
|
|
|
|
|
|
|
desc += "[";
|
|
|
|
|
desc += tr("Save path:");
|
|
|
|
|
desc += saveParam.m_savePath;
|
|
|
|
|
desc += "]";
|
|
|
|
|
desc += " ";
|
|
|
|
|
desc += "[";
|
|
|
|
|
desc += tr("Image format:");
|
|
|
|
|
desc += saveParam.m_fileNameExt;
|
|
|
|
|
desc += "]";
|
|
|
|
|
|
|
|
|
|
return desc;
|
|
|
|
|
}
|
|
|
|
|
|
2024-04-23 09:44:22 +00:00
|
|
|
|
void MainWindow::closeEvent(QCloseEvent *e)
|
|
|
|
|
{
|
|
|
|
|
if (m_trayIcon->isVisible()) //托盘是显示的
|
|
|
|
|
{
|
|
|
|
|
hide(); // 隐藏主窗口
|
|
|
|
|
e->ignore(); //忽略关闭事件,这样才不会关闭程序
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MainWindow::on_trayActivated(QSystemTrayIcon::ActivationReason reason)
|
|
|
|
|
{
|
|
|
|
|
if (QSystemTrayIcon::Trigger == reason)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
else if (QSystemTrayIcon::DoubleClick == reason)
|
|
|
|
|
{
|
2024-04-24 06:57:44 +00:00
|
|
|
|
show();
|
2024-04-24 07:08:43 +00:00
|
|
|
|
raise();
|
2024-04-23 09:44:22 +00:00
|
|
|
|
}
|
|
|
|
|
else if (QSystemTrayIcon::MiddleClick == reason)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MainWindow::on_showScanSettingDlg()
|
|
|
|
|
{
|
|
|
|
|
m_scanDlg->show();
|
2024-04-24 07:08:43 +00:00
|
|
|
|
m_scanDlg->raise();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MainWindow::on_showMainWindowDlg()
|
|
|
|
|
{
|
|
|
|
|
show();
|
|
|
|
|
raise();
|
2024-04-23 09:44:22 +00:00
|
|
|
|
}
|
|
|
|
|
|
2024-04-24 06:57:44 +00:00
|
|
|
|
void MainWindow::on_pushButtonAdd_clicked()
|
|
|
|
|
{
|
2024-04-24 10:08:14 +00:00
|
|
|
|
if (NULL == m_scanDlg->m_devHandle)
|
|
|
|
|
{
|
|
|
|
|
QMessageBox::information(this, tr("Tips"), tr("Device is offline"));
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2024-04-26 05:15:43 +00:00
|
|
|
|
std::string deviceType = m_scanDlg->m_devName.toStdString();
|
2024-04-25 03:06:28 +00:00
|
|
|
|
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)
|
|
|
|
|
{
|
|
|
|
|
deviceType = v;
|
|
|
|
|
}
|
|
|
|
|
|
2024-04-24 10:08:14 +00:00
|
|
|
|
Dialog_Add dlg(m_scanDlg->m_devHandle, this, deviceType);
|
2024-04-24 06:57:44 +00:00
|
|
|
|
if (dlg.exec())
|
|
|
|
|
{
|
|
|
|
|
ScanParam scanParam = dlg.GetScanParam();
|
|
|
|
|
m_vScanParams.push_back(scanParam);
|
|
|
|
|
// TODO 保存m_vScanParams
|
|
|
|
|
|
|
|
|
|
ui->tableWidget->setRowCount((int)m_vScanParams.size());
|
|
|
|
|
int index = (int)m_vScanParams.size() - 1;
|
|
|
|
|
|
|
|
|
|
ui->tableWidget->setRowHeight(index, 30);
|
|
|
|
|
|
2024-04-24 10:08:14 +00:00
|
|
|
|
ui->tableWidget->setItem(index, 0, new QTableWidgetItem(QString(m_vScanParams[index].deviceType.c_str())));
|
2024-04-24 06:57:44 +00:00
|
|
|
|
ui->tableWidget->item(index, 0)->setTextAlignment(Qt::AlignCenter);
|
|
|
|
|
ui->tableWidget->item(index, 0)->setFlags(ui->tableWidget->item(index, 0)->flags() & ~Qt::ItemIsEditable);
|
|
|
|
|
|
2024-04-26 05:15:43 +00:00
|
|
|
|
const char *btnTypeStr[] = {"Manual", "Button 1", "Button 2", "Button 3"};
|
|
|
|
|
ui->tableWidget->setItem(index, 1, new QTableWidgetItem(btnTypeStr[m_vScanParams[index].buttonId]));
|
2024-04-24 06:57:44 +00:00
|
|
|
|
ui->tableWidget->item(index, 1)->setTextAlignment(Qt::AlignCenter);
|
|
|
|
|
ui->tableWidget->item(index, 1)->setFlags(ui->tableWidget->item(index, 1)->flags() & ~Qt::ItemIsEditable);
|
|
|
|
|
|
2024-04-25 03:06:28 +00:00
|
|
|
|
ui->tableWidget->setItem(index, 2, new QTableWidgetItem(GetDesc(m_vScanParams[index].deviceConfigs)));
|
2024-04-24 06:57:44 +00:00
|
|
|
|
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::on_pushButtonModify_clicked()
|
2024-04-23 09:44:22 +00:00
|
|
|
|
{
|
2024-04-24 06:57:44 +00:00
|
|
|
|
int index = ui->tableWidget->currentRow();
|
|
|
|
|
if (-1 == index)
|
|
|
|
|
{
|
|
|
|
|
QMessageBox::information(this, tr("Tips"), tr("No item selected"));
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2024-04-24 10:08:14 +00:00
|
|
|
|
if (NULL == m_scanDlg->m_devHandle)
|
|
|
|
|
{
|
|
|
|
|
QMessageBox::information(this, tr("Tips"), tr("Device is offline"));
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2024-04-26 05:15:43 +00:00
|
|
|
|
std::string deviceType = m_scanDlg->m_devName.toStdString();
|
2024-04-25 03:06:28 +00:00
|
|
|
|
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)
|
|
|
|
|
{
|
|
|
|
|
deviceType = v;
|
|
|
|
|
}
|
|
|
|
|
|
2024-04-24 10:08:14 +00:00
|
|
|
|
if (deviceType != m_vScanParams[index].deviceType)
|
|
|
|
|
{
|
|
|
|
|
QMessageBox::information(this, tr("Tips"), tr("Device type mismatch"));
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Dialog_Add dlg(m_scanDlg->m_devHandle, this, m_vScanParams[index], index);
|
2024-04-24 06:57:44 +00:00
|
|
|
|
if (dlg.exec())
|
|
|
|
|
{
|
|
|
|
|
ScanParam scanParam = dlg.GetScanParam();
|
|
|
|
|
m_vScanParams[index] = scanParam;
|
|
|
|
|
// TODO 保存m_vScanParams
|
|
|
|
|
|
2024-04-24 10:08:14 +00:00
|
|
|
|
ui->tableWidget->item(index, 0)->setText(QString::fromStdString(m_vScanParams[index].deviceType));
|
2024-04-24 06:57:44 +00:00
|
|
|
|
|
2024-04-26 05:15:43 +00:00
|
|
|
|
const char *btnTypeStr[] = {"Manual", "Button 1", "Button 2", "Button 3"};
|
|
|
|
|
ui->tableWidget->item(index, 1)->setText(QString::fromStdString(btnTypeStr[m_vScanParams[index].buttonId]));
|
2024-04-24 06:57:44 +00:00
|
|
|
|
|
2024-04-25 03:06:28 +00:00
|
|
|
|
ui->tableWidget->item(index, 2)->setText(GetDesc(m_vScanParams[index].deviceConfigs));
|
2024-04-24 06:57:44 +00:00
|
|
|
|
ui->tableWidget->item(index, 3)->setText(GetDesc(m_vScanParams[index].saveParam));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MainWindow::on_pushButtonRemove_clicked()
|
|
|
|
|
{
|
|
|
|
|
int index = ui->tableWidget->currentRow();
|
|
|
|
|
if (-1 == index)
|
|
|
|
|
{
|
|
|
|
|
QMessageBox::information(this, tr("Tips"), tr("No item selected"));
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QMessageBox msg(QMessageBox::Question, tr("Question"),
|
|
|
|
|
tr("Are you sure you want to remove the item?"),
|
|
|
|
|
QMessageBox::Yes | QMessageBox::No, this);
|
|
|
|
|
msg.exec();
|
|
|
|
|
if (msg.clickedButton() != msg.button(QMessageBox::Yes))
|
|
|
|
|
{
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
m_vScanParams.erase(m_vScanParams.begin() + index);
|
|
|
|
|
// TODO 保存m_vScanParams
|
|
|
|
|
ui->tableWidget->removeRow(index);
|
2024-04-23 09:44:22 +00:00
|
|
|
|
}
|