增加整数下拉框类型控件,保存自定义扫描区域数据

This commit is contained in:
gb 2022-05-07 11:00:11 +08:00
parent 5e9351532a
commit 537750b6dc
2 changed files with 118 additions and 37 deletions

View File

@ -6,6 +6,9 @@
#include "setpicclrtool.h"
#include "base/HGDef.h"
#include "../../utility/HGString.h"
#include "sane/sane_option_definitions.h"
std::string hg_settingdialog::property_combox_data_type_ = "combox_value_type";
hg_settingdialog::hg_settingdialog(void *handle, QWidget *parent
, DEVCFG* cfg)
@ -417,7 +420,30 @@ void hg_settingdialog::createUI()
case SANE_CONSTRAINT_WORD_LIST:
{
QComboBox* comboBoxCreation = new QComboBox(scrollArea);
comboBoxCreation->setToolTip(opt->desc);
int id = i + 1;
comboBoxCreation->setProperty("controls_id", id);
reinterpret_cast<QFormLayout*>(widget->layout())->addRow(opt->title + QString(" : "), comboBoxCreation);
auto p_str = opt->constraint.word_list;
char buf[20];
for(SANE_Int i = 0; i < p_str[0]; ++i)
{
sprintf(buf, "%d", p_str[i + 1]);
comboBoxCreation->addItem(QString::fromStdString(buf));
}
sprintf(buf, "%d", m_list_defaultOptions.at(i).second.toInt());
comboBoxCreation->setProperty(hg_settingdialog::property_combox_data_type_.c_str(), COMBO_VAL_INT);
m_list_widgets.append(comboBoxCreation);
m_list_getOpt.append(QPair<int, const void*>(id, opt));
if(ind == -1)
init.val = m_list_defaultOptions.at(i).second;
else
init.val = QVariant(QString::fromStdString(schemes_->schemes[scheme].opts[ind].val));
comboBoxCreation->setCurrentText(init.val.toString());
connect(comboBoxCreation, SIGNAL(currentTextChanged(const QString)), this, SLOT(slot_string_list_comboBoxClicked()));
break;
}
@ -528,6 +554,7 @@ void hg_settingdialog::createUI()
comboBoxCreation->addItem(stringList.at(i));
}
comboBoxCreation->setCurrentText(m_list_defaultOptions.at(i).second.toString());
comboBoxCreation->setProperty(hg_settingdialog::property_combox_data_type_.c_str(), COMBO_VAL_STRING);
//printf("Option %02d default value is: %s\n", i + 1, m_list_defaultOptions.at(i).second.toString().data());
m_list_widgets.append(comboBoxCreation);
@ -584,44 +611,46 @@ void hg_settingdialog::createUI()
}
} //switch(opt->type)
if (Utf8ToStdString(opt->title) == "分辨率")
// if (Utf8ToStdString(opt->title) == "分辨率")
if (strcmp(opt->title, OPTION_TITLE_FBL) == 0)
{
m_dpiId = i + 1;
m_dpiValue = m_list_defaultOptions.at(i).second.toInt();
}
if (Utf8ToStdString(opt->title) == "纸张尺寸")
// else if (Utf8ToStdString(opt->title) == "纸张尺寸")
else if (strcmp(opt->title, OPTION_TITLE_ZZCC) == 0)
{
m_paperSizeId = i + 1;
m_paperSizeValue = m_list_defaultOptions.at(i).second.toString();
}
if (0 == strcmp(opt->name, "tl-x"))
if (0 == strcmp(opt->name, KNOWN_OPT_NAME_CUSTOM_AREA_LEFT))
{
m_cutLeftId = i + 1;
m_cutLeftValue = SANE_UNFIX(m_list_defaultOptions.at(i).second.toInt());
if (opt->constraint_type == SANE_CONSTRAINT_RANGE)
m_cutWidth = SANE_UNFIX(opt->constraint.range->max);
}
else if (0 == strcmp(opt->name, "tl-y"))
else if (0 == strcmp(opt->name, KNOWN_OPT_NAME_CUSTOM_AREA_TOP))
{
m_cutTopId = i + 1;
m_cutTopValue = SANE_UNFIX(m_list_defaultOptions.at(i).second.toInt());
if (opt->constraint_type == SANE_CONSTRAINT_RANGE)
m_cutHeight = SANE_UNFIX(opt->constraint.range->max);
}
else if (0 == strcmp(opt->name, "br-x"))
else if (0 == strcmp(opt->name, KNOWN_OPT_NAME_CUSTOM_AREA_RIGHT))
{
m_cutRightId = i + 1;
m_cutRightValue = SANE_UNFIX(m_list_defaultOptions.at(i).second.toInt());
}
else if (0 == strcmp(opt->name, "br-y"))
else if (0 == strcmp(opt->name, KNOWN_OPT_NAME_CUSTOM_AREA_BOTTOM))
{
m_cutBottomId = i + 1;
m_cutBottomValue = SANE_UNFIX(m_list_defaultOptions.at(i).second.toInt());
}
if (Utf8ToStdString(opt->title) == "分辨率")
// if (Utf8ToStdString(opt->title) == "分辨率")
if (strcmp(opt->title, OPTION_TITLE_FBL) == 0)
{
QPushButton* pushButton = new QPushButton(this);
pushButton->setText(StdStringToUtf8("区域裁剪").c_str());
@ -630,14 +659,14 @@ void hg_settingdialog::createUI()
connect(pushButton, SIGNAL(clicked(bool)), this, SLOT(slot_cutButtonClicked()));
}
if (Utf8ToStdString(opt->title) == "颜色模式")
// else if (Utf8ToStdString(opt->title) == "颜色模式")
else if (strcmp(opt->title, OPTION_TITLE_YSMS) == 0)
{
m_colorModeId = i + 1;
m_colorModeValue = m_list_defaultOptions.at(i).second.toString();
}
if (Utf8ToStdString(opt->title) == "伽玛" || Utf8ToStdString(opt->title) == "伽玛值")
// else if (Utf8ToStdString(opt->title) == "伽玛" || Utf8ToStdString(opt->title) == "伽玛值")
else if (strcmp(opt->title, OPTION_TITLE_GMZ) == 0)
{
unsigned int len = sizeof(SANE_Gamma);
sane_io_control(m_handle, IO_CTRL_CODE_GET_CUSTOM_GAMMA, &m_gammaData, &len);
@ -685,6 +714,17 @@ void hg_settingdialog::refresh_control_value(int op_id)
else if(opt->type == SANE_TYPE_INT)
{
for(size_t i = 0; i < (size_t)ctrls.size(); ++i)
{
QComboBox* comb = qobject_cast<QComboBox*>(ctrls[i]);
if(comb)
{
char buf[40] = {0};
sprintf(buf, "%d", m_list_defaultOptions.at(op_id - 1).second.toInt());
comb->disconnect(comb, SIGNAL(currentTextChanged(const QString)), this, SLOT(slot_string_list_comboBoxClicked()));
comb->setCurrentText(QString::fromStdString(buf));
connect(comb, SIGNAL(currentTextChanged(const QString)), this, SLOT(slot_string_list_comboBoxClicked()));
}
else
{
QSlider* slider = qobject_cast<QSlider*>(ctrls[i]);
if(slider)
@ -705,6 +745,7 @@ void hg_settingdialog::refresh_control_value(int op_id)
}
}
}
}
else if(opt->type == SANE_TYPE_FIXED)
{
double val = SANE_UNFIX(m_list_defaultOptions.at(op_id - 1).second.toInt());
@ -712,13 +753,22 @@ void hg_settingdialog::refresh_control_value(int op_id)
QDoubleSpinBox* spin = NULL;
for(size_t i = 0; i < (size_t)ctrls.size(); ++i)
{
if(!slider)
QComboBox* comb = qobject_cast<QComboBox*>(ctrls[i]);
if(comb)
{
char buf[40] = {0};
sprintf(buf, "%f", val);
comb->disconnect(comb, SIGNAL(currentTextChanged(const QString)), this, SLOT(slot_string_list_comboBoxClicked()));
comb->setCurrentText(QString::fromStdString(buf));
connect(comb, SIGNAL(currentTextChanged(const QString)), this, SLOT(slot_string_list_comboBoxClicked()));
}
else if(!slider)
{
slider = qobject_cast<QSlider*>(ctrls[i]);
if(slider)
disconnect(slider, SIGNAL(valueChanged(int)), this, SLOT(slot_sliderClicked(int)));
}
if(!spin)
else if(!spin)
{
spin = qobject_cast<QDoubleSpinBox*>(ctrls[i]);
if(spin)
@ -743,6 +793,7 @@ void hg_settingdialog::refresh_control_value(int op_id)
{
disconnect(comb, SIGNAL(currentTextChanged(const QString)), this, SLOT(slot_string_list_comboBoxClicked()));
comb->setCurrentText(m_list_defaultOptions.at(op_id - 1).second.toString());
// comb->setProperty(hg_settingdialog::property_combox_data_type_.c_str(), COMBO_VAL_STRING);
connect(comb, SIGNAL(currentTextChanged(const QString)), this, SLOT(slot_string_list_comboBoxClicked()));
}
else
@ -889,6 +940,7 @@ void hg_settingdialog::slot_string_list_comboBoxClicked()
QComboBox *comboBox = qobject_cast<QComboBox*>(sender());
SANE_Int id = comboBox->property("controls_id").toInt();
std::string comboBoxcurrentItem(comboBox->currentText().toUtf8());
int type = comboBox->property(hg_settingdialog::property_combox_data_type_.c_str()).toInt();
if (id == m_paperSizeId)
{
@ -911,6 +963,11 @@ void hg_settingdialog::slot_string_list_comboBoxClicked()
SANE_Int method = 0;
SANE_String buf = (SANE_String)malloc(opt->size * 2 + 4);
if(type == COMBO_VAL_INT)
*((SANE_Int*)buf) = atoi(comboBoxcurrentItem.c_str());
else if(type == COMBO_VAL_FLOAT)
*((SANE_Fixed*)buf) = SANE_FIX(atof(comboBoxcurrentItem.c_str()));
else
strcpy(buf, comboBoxcurrentItem.c_str());
sane_control_option(m_handle, id, SANE_ACTION_SET_VALUE, buf, &method);
if((method & SANE_INFO_RELOAD_OPTIONS) == SANE_INFO_RELOAD_OPTIONS)
@ -918,18 +975,12 @@ void hg_settingdialog::slot_string_list_comboBoxClicked()
else if(method & SANE_INFO_INEXACT)
comboBox->setCurrentText(QString::fromStdString(buf));
std::vector<CHANGEDOPT>::iterator it =
std::find(changed_opts_.begin(), changed_opts_.end(), (int)id);
if(it == changed_opts_.end())
{
CHANGEDOPT co;
co.opt = id;
co.val = QVariant(buf);
changed_opts_.push_back(co);
}
else {
it->val = QVariant(buf);
}
if(type == COMBO_VAL_INT)
record_changed_option((int)id, *((SANE_Int*)buf));
else if(type == COMBO_VAL_FLOAT)
record_changed_option((int)id, SANE_UNFIX(*(SANE_Fixed*)buf));
else
record_changed_option((int)id, buf);
free(buf);
}
@ -975,6 +1026,12 @@ void hg_settingdialog::slot_cutButtonClicked()
sane_control_option(m_handle, m_cutRightId, SANE_ACTION_SET_VALUE, &value, &info);
value = SANE_FIX(m_cutBottomValue);
sane_control_option(m_handle, m_cutBottomId, SANE_ACTION_SET_VALUE, &value, &info);
// write-down changes ...
record_changed_option(m_cutLeftId, m_cutLeftValue);
record_changed_option(m_cutRightId, m_cutRightValue);
record_changed_option(m_cutTopId, m_cutTopValue);
record_changed_option(m_cutBottomId, m_cutBottomValue);
}
}
@ -1928,6 +1985,21 @@ int hg_settingdialog::apply_settings(OPTSCHEME* scheme)
return none;
}
void hg_settingdialog::record_changed_option(int opt, const QVariant& var)
{
std::vector<CHANGEDOPT>::iterator it =
std::find(changed_opts_.begin(), changed_opts_.end(), opt);
if(it == changed_opts_.end())
{
CHANGEDOPT chg;
chg.opt = opt;
chg.val = var;
changed_opts_.push_back(chg);
}
else
it->val = var;
}
void hg_settingdialog::on_scheme_triggered(QAction* act)
{

View File

@ -44,6 +44,14 @@ class hg_settingdialog : public QDialog
void create_scheme_management_ui(QVBoxLayout* layout);
QAction* find_current_scheme_menu(int *scheme_id = NULL);
static std::string property_combox_data_type_;
enum _cbox_type
{
COMBO_VAL_STRING = 0,
COMBO_VAL_INT,
COMBO_VAL_FLOAT,
};
public:
explicit hg_settingdialog(void *handle, QWidget *parent = nullptr,
DEVCFG* cfg = nullptr);
@ -83,6 +91,7 @@ private:
static int find_opt_setting(const char* name, const std::vector<OPTVAL>& opts);
int apply_setting(const SANE_Option_Descriptor* desc, int opt_ind, OPTVAL* val);
int apply_settings(OPTSCHEME* scheme);
void record_changed_option(int opt, const QVariant& var);
private:
QVector<QPair<QPair<int, QVariant>, QString>> m_list_IdValueTitle;