Compare commits
2 Commits
ad1cc486eb
...
cd6b2c8dbf
Author | SHA1 | Date |
---|---|---|
luoliangyi | cd6b2c8dbf | |
luoliangyi | 0f18fb46d2 |
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -21,7 +21,7 @@ struct ScanParam
|
|||
{
|
||||
std::string deviceType;
|
||||
ButtonType buttonType;
|
||||
std::string deviceConfig;
|
||||
std::vector<DeviceConfig> deviceConfigs;
|
||||
SaveParam saveParam;
|
||||
};
|
||||
|
||||
|
|
|
@ -30,7 +30,6 @@ Dialog_Scan::~Dialog_Scan()
|
|||
}
|
||||
|
||||
sane_exit();
|
||||
|
||||
delete ui;
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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>
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in New Issue