diff --git a/app/scanner/hg_settingdialog.cpp b/app/scanner/hg_settingdialog.cpp index 26dce742..4a1b0de2 100644 --- a/app/scanner/hg_settingdialog.cpp +++ b/app/scanner/hg_settingdialog.cpp @@ -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(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(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); @@ -686,21 +715,33 @@ void hg_settingdialog::refresh_control_value(int op_id) { for(size_t i = 0; i < (size_t)ctrls.size(); ++i) { - QSlider* slider = qobject_cast(ctrls[i]); - if(slider) + QComboBox* comb = qobject_cast(ctrls[i]); + if(comb) { - disconnect(slider, SIGNAL(valueChanged(int)), this, SLOT(slot_sliderClicked(int))); - slider->setValue(m_list_defaultOptions.at(op_id - 1).second.toInt()); - connect(slider, SIGNAL(valueChanged(int)), this, SLOT(slot_sliderClicked(int))); + 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 { - QSpinBox* spin = qobject_cast(ctrls[i]); - if(spin) + QSlider* slider = qobject_cast(ctrls[i]); + if(slider) { - disconnect(spin, SIGNAL(valueChanged(int)), this, SLOT(slot_spinBoxClicked(int))); - spin->setValue(m_list_defaultOptions.at(op_id - 1).second.toInt()); - connect(spin, SIGNAL(valueChanged(int)), this, SLOT(slot_spinBoxClicked(int))); + disconnect(slider, SIGNAL(valueChanged(int)), this, SLOT(slot_sliderClicked(int))); + slider->setValue(m_list_defaultOptions.at(op_id - 1).second.toInt()); + connect(slider, SIGNAL(valueChanged(int)), this, SLOT(slot_sliderClicked(int))); + } + else + { + QSpinBox* spin = qobject_cast(ctrls[i]); + if(spin) + { + disconnect(spin, SIGNAL(valueChanged(int)), this, SLOT(slot_spinBoxClicked(int))); + spin->setValue(m_list_defaultOptions.at(op_id - 1).second.toInt()); + connect(spin, SIGNAL(valueChanged(int)), this, SLOT(slot_spinBoxClicked(int))); + } } } } @@ -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(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(ctrls[i]); if(slider) disconnect(slider, SIGNAL(valueChanged(int)), this, SLOT(slot_sliderClicked(int))); } - if(!spin) + else if(!spin) { spin = qobject_cast(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(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,25 +963,24 @@ void hg_settingdialog::slot_string_list_comboBoxClicked() SANE_Int method = 0; SANE_String buf = (SANE_String)malloc(opt->size * 2 + 4); - strcpy(buf, comboBoxcurrentItem.c_str()); + 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) updateUIStatus(); else if(method & SANE_INFO_INEXACT) comboBox->setCurrentText(QString::fromStdString(buf)); - std::vector::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::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) { diff --git a/app/scanner/hg_settingdialog.h b/app/scanner/hg_settingdialog.h index c05c7547..dcca2cbc 100644 --- a/app/scanner/hg_settingdialog.h +++ b/app/scanner/hg_settingdialog.h @@ -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& 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, QString>> m_list_IdValueTitle;