Compare commits

...

2 Commits

Author SHA1 Message Date
luoliangyi cd6b2c8dbf 将deviceType改为通过sane接口获取 2024-04-25 11:06:28 +08:00
luoliangyi 0f18fb46d2 去掉deviceconfig的ui文件 2024-04-25 09:54:44 +08:00
9 changed files with 232 additions and 50 deletions

View File

@ -20,10 +20,10 @@ Dialog_Add::Dialog_Add(SANE_Handle devHandle, class MainWindow *mainWnd, const s
m_scanParam.deviceType = deviceType;
m_scanParam.buttonType = ButtonType(ui->comboBoxButtonType->currentIndex() + 1);
m_scanParam.deviceConfig.clear();
m_scanParam.deviceConfigs.clear();
m_scanParam.saveParam = Form_SaveParam::GetDefSaveParam();
m_formDeviceConfig = new Form_DeviceConfig(devHandle, m_scanParam.deviceConfig, this);
m_formDeviceConfig = new Form_DeviceConfig(devHandle, m_scanParam.deviceConfigs, this);
m_formSaveParam = new Form_SaveParam(m_scanParam.saveParam, this);
ui->stackedWidget->addWidget(m_formDeviceConfig);
ui->stackedWidget->addWidget(m_formSaveParam);
@ -48,7 +48,7 @@ Dialog_Add::Dialog_Add(SANE_Handle devHandle, class MainWindow *mainWnd, const S
m_scanParam = scanParam;
ui->comboBoxButtonType->setCurrentIndex(m_scanParam.buttonType - 1);
m_formDeviceConfig = new Form_DeviceConfig(devHandle, m_scanParam.deviceConfig, this);
m_formDeviceConfig = new Form_DeviceConfig(devHandle, m_scanParam.deviceConfigs, this);
m_formSaveParam = new Form_SaveParam(m_scanParam.saveParam, this);
ui->stackedWidget->addWidget(m_formDeviceConfig);
ui->stackedWidget->addWidget(m_formSaveParam);
@ -90,7 +90,7 @@ void Dialog_Add::on_pushButtonOK_clicked()
return;
}
m_scanParam.deviceConfig = m_formDeviceConfig->GetDeviceConfig();
m_scanParam.deviceConfigs = m_formDeviceConfig->GetDeviceConfigs();
m_scanParam.saveParam = m_formSaveParam->GetSaveParam();
accept();
}

View File

@ -21,7 +21,7 @@ struct ScanParam
{
std::string deviceType;
ButtonType buttonType;
std::string deviceConfig;
std::vector<DeviceConfig> deviceConfigs;
SaveParam saveParam;
};

View File

@ -30,7 +30,6 @@ Dialog_Scan::~Dialog_Scan()
}
sane_exit();
delete ui;
}

View File

@ -1,29 +1,177 @@
#include "form_deviceconfig.h"
#include "ui_form_deviceconfig.h"
Form_DeviceConfig::Form_DeviceConfig(SANE_Handle devHandle, const std::string &deviceConfig, QWidget *parent)
Form_DeviceConfig::Form_DeviceConfig(SANE_Handle devHandle, const std::vector<DeviceConfig>& deviceConfigs, QWidget *parent)
: QWidget(parent)
, ui(new Ui::Form_DeviceConfig)
{
ui->setupUi(this);
CreateUI(devHandle, deviceConfig);
ResetDevice(devHandle);
CreateUI(deviceConfigs);
}
Form_DeviceConfig::~Form_DeviceConfig()
{
delete ui;
}
std::string Form_DeviceConfig::GetDeviceConfig()
std::vector<DeviceConfig> Form_DeviceConfig::GetDeviceConfigs()
{
std::string deviceConfig;
std::vector<DeviceConfig> deviceConfigs;
// 从界面获取配置
// TODO 从界面获取配置再提取和m_deviceConfigsGroups里比较的差异部分
return deviceConfig;
return deviceConfigs;
}
void Form_DeviceConfig::CreateUI(SANE_Handle devHandle, const std::string &deviceConfig)
void Form_DeviceConfig::ResetDevice(SANE_Handle devHandle)
{
// 创建UI
// 1.重置设备
SANE_Int num_dev_options = 0;
sane_control_option(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(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(devHandle, i, SANE_ACTION_SET_VALUE, NULL, NULL);
break;
}
}
// 2.获取基本配置
m_deviceConfigsGroups.clear();
for (int i = 1; i < num_dev_options; ++i)
{
const SANE_Option_Descriptor* desp = sane_get_option_descriptor(devHandle, i);
if (NULL == desp)
continue;
const char* name = desp->name;
while (' ' == *name)
++name;
const char* title = desp->title;
while (' ' == *title)
++title;
if (SANE_TYPE_GROUP == desp->type)
{
DeviceConfigsGroup group;
group.groupTitle = title;
m_deviceConfigsGroups.push_back(group);
}
else if (SANE_TYPE_STRING == desp->type)
{
char value[256] = { 0 };
sane_control_option(devHandle, i, SANE_ACTION_GET_VALUE, value, NULL);
DeviceConfig devConfig;
devConfig.name = name;
devConfig.title = title;
devConfig.valueType = 1;
devConfig.stringValue = value;
devConfig.rangeType = 1;
if (SANE_CONSTRAINT_STRING_LIST == desp->constraint_type)
{
const SANE_String_Const* p = desp->constraint.string_list;
while (NULL != *p)
{
devConfig.stringValueList.push_back(*p);
++p;
}
assert(!m_deviceConfigsGroups.empty());
m_deviceConfigsGroups[m_deviceConfigsGroups.size() - 1].deviceConfigs.push_back(devConfig);
}
}
else if (SANE_TYPE_INT == desp->type)
{
SANE_Int value = 0;
sane_control_option(devHandle, i, SANE_ACTION_GET_VALUE, &value, NULL);
DeviceConfig devConfig;
devConfig.name = name;
devConfig.title = title;
devConfig.valueType = 2;
devConfig.intValue = (int)value;
if (SANE_CONSTRAINT_WORD_LIST == desp->constraint_type)
{
devConfig.rangeType = 2;
const SANE_Word* p = desp->constraint.word_list;
for (SANE_Int i = 0; i < p[0]; ++i)
{
devConfig.intValueList.push_back(p[i + 1]);
}
}
else if (SANE_CONSTRAINT_RANGE == desp->constraint_type)
{
devConfig.rangeType = 4;
devConfig.intValueMin = desp->constraint.range->min;
devConfig.intValueMax = desp->constraint.range->max;
}
assert(!m_deviceConfigsGroups.empty());
m_deviceConfigsGroups[m_deviceConfigsGroups.size() - 1].deviceConfigs.push_back(devConfig);
}
else if (SANE_TYPE_FIXED == desp->type)
{
SANE_Word value = 0;
sane_control_option(devHandle, i, SANE_ACTION_GET_VALUE, &value, NULL);
DeviceConfig devConfig;
devConfig.name = name;
devConfig.title = title;
devConfig.valueType = 3;
devConfig.doubleValue = SANE_UNFIX(value);
if (SANE_CONSTRAINT_WORD_LIST == desp->constraint_type)
{
devConfig.rangeType = 3;
const SANE_Word* p = desp->constraint.word_list;
for (SANE_Int i = 0; i < p[0]; ++i)
{
devConfig.doubleValueList.push_back(SANE_UNFIX(p[i + 1]));
}
}
else if (SANE_CONSTRAINT_RANGE == desp->constraint_type)
{
devConfig.rangeType = 5;
devConfig.doubleValueMin = SANE_UNFIX(desp->constraint.range->min);
devConfig.doubleValueMax = SANE_UNFIX(desp->constraint.range->max);
}
assert(!m_deviceConfigsGroups.empty());
m_deviceConfigsGroups[m_deviceConfigsGroups.size() - 1].deviceConfigs.push_back(devConfig);
}
else if (SANE_TYPE_BOOL == desp->type)
{
SANE_Bool value = 0;
sane_control_option(devHandle, i, SANE_ACTION_GET_VALUE, &value, NULL);
DeviceConfig devConfig;
devConfig.name = name;
devConfig.title = title;
devConfig.valueType = 4;
devConfig.boolValue = (bool)value;
assert(!m_deviceConfigsGroups.empty());
m_deviceConfigsGroups[m_deviceConfigsGroups.size() - 1].deviceConfigs.push_back(devConfig);
}
}
}
void Form_DeviceConfig::CreateUI(const std::vector<DeviceConfig>& deviceConfigs)
{
assert(!m_deviceConfigsGroups.empty());
// TODO 通过m_deviceConfigsGroups和deviceConfigs创建UI
}

View File

@ -2,27 +2,68 @@
#define FORM_DEVICECONFIG_H
#include <QWidget>
#include <string>
#include <vector>
#include "sane/sane_ex.h"
namespace Ui {
class Form_DeviceConfig;
struct DeviceConfig
{
DeviceConfig()
{
valueType = 0;
intValue = 0;
doubleValue = 0;
boolValue = false;
rangeType = 0;
intValueMin = 0;
intValueMax = 0;
doubleValueMin = 0;
doubleValueMax = 0;
}
// 配置名
std::string name;
std::string title;
int valueType; // 0-无1-字符串2-整型3-浮点4-布尔
std::string stringValue;
int intValue;
double doubleValue;
bool boolValue;
int rangeType; // 0-无1-字符串列表2-整型列表3-浮点数列表4-整型范围5-浮点数范围
std::vector<std::string> stringValueList;
std::vector<int> intValueList;
std::vector<double> doubleValueList;
int intValueMin;
int intValueMax;
double doubleValueMin;
double doubleValueMax;
};
struct DeviceConfigsGroup
{
std::string groupTitle;
std::vector<DeviceConfig> deviceConfigs;
};
class Form_DeviceConfig : public QWidget
{
Q_OBJECT
public:
explicit Form_DeviceConfig(SANE_Handle devHandle, const std::string &deviceConfig, QWidget *parent = nullptr);
explicit Form_DeviceConfig(SANE_Handle devHandle, const std::vector<DeviceConfig>& deviceConfigs, QWidget *parent = nullptr);
~Form_DeviceConfig();
std::string GetDeviceConfig();
std::vector<DeviceConfig> GetDeviceConfigs();
private:
void CreateUI(SANE_Handle devHandle, const std::string &deviceConfig);
void ResetDevice(SANE_Handle devHandle);
void CreateUI(const std::vector<DeviceConfig>& deviceConfigs);
private:
Ui::Form_DeviceConfig *ui;
std::vector<DeviceConfigsGroup> m_deviceConfigsGroups;
};
#endif // FORM_DEVICECONFIG_H

View File

@ -1,19 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Form_DeviceConfig</class>
<widget class="QWidget" name="Form_DeviceConfig">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>691</width>
<height>471</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -66,7 +66,7 @@ MainWindow::MainWindow(QWidget *parent)
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].deviceConfig)));
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);
@ -118,7 +118,7 @@ bool MainWindow::FindScanParam(const std::string &deviceType, ButtonType buttonT
return false;
}
QString MainWindow::GetDesc(const std::string &deviceConfig)
QString MainWindow::GetDesc(const std::vector<DeviceConfig> &deviceConfigs)
{
QString desc;
@ -196,6 +196,13 @@ void MainWindow::on_pushButtonAdd_clicked()
}
std::string deviceType = m_scanDlg->m_devName.toStdString(); // TODO 获取m_scanDlg->m_devHandle设备类型
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;
}
Dialog_Add dlg(m_scanDlg->m_devHandle, this, deviceType);
if (dlg.exec())
{
@ -217,7 +224,7 @@ void MainWindow::on_pushButtonAdd_clicked()
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].deviceConfig)));
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);
@ -245,6 +252,13 @@ void MainWindow::on_pushButtonModify_clicked()
}
std::string deviceType = m_scanDlg->m_devName.toStdString(); // TODO 获取m_scanDlg->m_devHandle设备类型
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;
}
if (deviceType != m_vScanParams[index].deviceType)
{
QMessageBox::information(this, tr("Tips"), tr("Device type mismatch"));
@ -263,7 +277,7 @@ void MainWindow::on_pushButtonModify_clicked()
const char *btnTypeStr[] = {NULL, "Button 1", "Button 2", "Button 3"};
ui->tableWidget->item(index, 1)->setText(QString::fromStdString(btnTypeStr[m_vScanParams[index].buttonType]));
ui->tableWidget->item(index, 2)->setText(GetDesc(m_vScanParams[index].deviceConfig));
ui->tableWidget->item(index, 2)->setText(GetDesc(m_vScanParams[index].deviceConfigs));
ui->tableWidget->item(index, 3)->setText(GetDesc(m_vScanParams[index].saveParam));
}
}

View File

@ -25,7 +25,7 @@ public:
bool FindScanParam(const std::string &deviceType, ButtonType buttonType, int ignoreIndex);
private:
QString GetDesc(const std::string &deviceConfig);
QString GetDesc(const std::vector<DeviceConfig> &deviceConfigs);
QString GetDesc(const SaveParam &saveParam);
protected:

View File

@ -129,7 +129,6 @@ FORMS += \
../../../app/scantool/dialog_add.ui \
../../../app/scantool/dialog_scan.ui \
../../../app/scantool/dialog_writesettings.ui \
../../../app/scantool/form_deviceconfig.ui \
../../../app/scantool/form_saveparam.ui \
../../../app/scantool/mainwindow.ui