diff --git a/app/scanner/config.cpp b/app/scanner/config.cpp index 2a338c8e..bc9093dd 100644 --- a/app/scanner/config.cpp +++ b/app/scanner/config.cpp @@ -347,7 +347,10 @@ void config::load_scanner_configs(QString dev_name, DEVCFG* cfg) if(item.get_value("name", val.name) && // item.get_value("type", val.type) && item.get_value("value", val.val)) - scheme.opts.push_back(val); + { + item.get_value("extra", val.extra); + scheme.opts.push_back(val); + } }while(son->next_child(cont)); } delete son; @@ -397,6 +400,7 @@ int config::save_scanner_configs(const DEVCFG* cfg) val = new gb::json(); val->set_value("name", cfg->schemes[i].opts[j].name); // val->set_value("type", cfg->schemes[i].opts[j].type); + val->set_value("extra", cfg->schemes[i].opts[j].extra); val->set_value("value", cfg->schemes[i].opts[j].val); text = val->to_string(false); opt->set_value(NULL, val); diff --git a/app/scanner/config.h b/app/scanner/config.h index 42cc2b2a..f8860b90 100644 --- a/app/scanner/config.h +++ b/app/scanner/config.h @@ -15,6 +15,7 @@ typedef struct _opt_val std::string name; std::string type; std::string val; + std::string extra; bool operator==(const struct _opt_val& r) { @@ -26,7 +27,7 @@ typedef struct _opt_val return IS_DOUBLE_EQUAL(atof(val.c_str()), atof(r.val.c_str())); } else { - return val == r.val; + return val == r.val && extra == r.extra; } } bool operator==(const std::string& n) diff --git a/app/scanner/hg_settingdialog.cpp b/app/scanner/hg_settingdialog.cpp index d4f5e89c..f32b6e6a 100644 --- a/app/scanner/hg_settingdialog.cpp +++ b/app/scanner/hg_settingdialog.cpp @@ -14,7 +14,7 @@ hg_settingdialog::hg_settingdialog(void *handle, QWidget *parent , DEVCFG* cfg) : QDialog(parent) , schemes_(cfg), cur_ind_(cfg->cur_scheme), changed_count_(0), save_(false) - , btn_cut_area_(nullptr), btn_gamma_(nullptr), cfg_file_(nullptr) + , btn_cut_area_(nullptr), btn_gamma_(nullptr), cfg_file_(nullptr), clicked_gamma_(false) { m_dpiId = -1; m_dpiValue = 200; @@ -1119,6 +1119,7 @@ void hg_settingdialog::slot_gammaButtonClicked() if (dlg.exec()) { memset(&m_gammaData, 0, sizeof(m_gammaData)); + clicked_gamma_ = true; if (1 == colorMode) { @@ -1682,6 +1683,8 @@ void hg_settingdialog::on_select_scheme(int scheme_ind, bool apply_to_dev) memset(&m_gammaData, 0, sizeof(m_gammaData)); for(int i = 0; i < sizeof(m_gammaData.table) / sizeof(m_gammaData.table[0]); ++i) m_gammaData.table[i] = i & 0x0ff; + btn_cut_area_->setEnabled(false); + btn_gamma_->setEnabled(false); changed_opts_.clear(); if(scheme_ind >= 0 && scheme_ind + 1 < (int)schemes_->schemes.size()) @@ -1706,20 +1709,24 @@ void hg_settingdialog::on_select_scheme(int scheme_ind, bool apply_to_dev) else ok = false; if(ok) + { changed_opts_.push_back(co); - } - else if(schm->opts[i].name == OPTION_TITLE_ZDYGM) - { - co.opt = (int)OPTION_ID_ZDYGM; - co.val = QVariant(QString::fromStdString(schm->opts[i].val)); - changed_opts_.push_back(co); - config::load_custom_gamma(schm->opts[i].val.c_str(), &m_gammaData); + if(strcmp(opt->title, OPTION_TITLE_ZDYSMQY) == 0) + btn_cut_area_->setEnabled(co.val.toBool()); + else if(strcmp(opt->title, OPTION_TITLE_QYSDQX) == 0) + { + btn_gamma_->setEnabled(co.val.toBool()); + if(co.val.toBool()) + config::load_custom_gamma(schm->opts[i].extra.c_str(), &m_gammaData); + } + } } } } if(apply_to_dev) { + clicked_gamma_ = false; if(scheme_ind >= 0 && scheme_ind + 1 < (int)schemes_->schemes.size()) schemes_->cur_scheme = scheme_ind; else @@ -1728,6 +1735,30 @@ void hg_settingdialog::on_select_scheme(int scheme_ind, bool apply_to_dev) updateUIStatus(); } } +QString hg_settingdialog::gen_gamma_file_path(void) +{ + time_t now = time(nullptr); + tm *ptm = localtime(&now); + char name[80] = {0}; + QString gamma_file; + + sprintf(name, "/%04d%02d%02d%02d%02d%02d.gma", ptm->tm_year + 1900, ptm->tm_mon + 1, ptm->tm_mday, ptm->tm_hour, ptm->tm_min, ptm->tm_sec); + if(cfg_file_) + { + std::string str(cfg_file_->get_file().toStdString()); + size_t pos = str.rfind('/'); + if(pos == std::string::npos) + pos = str.rfind('\\'); + if(pos != std::string::npos) + str.erase(pos); + gamma_file = QString::fromStdString(str); + } + else + gamma_file = config::self_path(); + gamma_file += QString::fromStdString(name); + + return gamma_file; +} void hg_settingdialog::closeEvent(QCloseEvent* e) { @@ -1760,7 +1791,6 @@ void hg_settingdialog::save_scheme(void) int names = 0; OPTVAL ov; OPTSCHEME os; - bool save_gamma = false; QString gamma_file(""); const SANE_Option_Descriptor *opt = nullptr; @@ -1771,13 +1801,7 @@ void hg_settingdialog::save_scheme(void) { opt = (const SANE_Option_Descriptor*)find_option_description(changed_opts_[i].opt); if(!opt) - { - if(changed_opts_[i].opt == (int)OPTION_ID_ZDYGM) - { - gamma_file = changed_opts_[i].val.toString(); - } continue; - } if(is_equal_default_value(changed_opts_[i], opt->type)) continue; @@ -1812,24 +1836,37 @@ void hg_settingdialog::save_scheme(void) names++; } } - - // custom gamma ... - if(strcmp(opt->title, OPTION_TITLE_QYSDQX) == 0 && ov.val == "true") - { - save_gamma = true; - } } - if(os == src && !save_gamma) + if(os == src) { if(changed_count_ == 0) changed_count_ = schemes_->cur_scheme != cur_ind_; schemes_->cur_scheme = cur_ind_; + + if(cur_ind_ >= 0 && cur_ind_ + 1 < (int)schemes_->schemes.size()) + { + OPTSCHEME& schm = schemes_->schemes[cur_ind_ + 1]; + std::vector::iterator it1 = std::find(schm.opts.begin(), schm.opts.end(), OPTION_TITLE_QYSDQX); + if(it1 != schm.opts.end()) + { + if(it1->extra.empty()) + { + changed_count_++; + gamma_file = gen_gamma_file_path(); + it1->extra = gamma_file.toStdString(); + } + else + gamma_file = QString::fromStdString(it1->extra); + config::save_2_file(gamma_file, &m_gammaData, sizeof(m_gammaData)); + } + } } else if(os.opts.size()) { char buf[20]; int ind = 1; + bool save_gamma = false; if(os.name.empty()) os.name = os.opts[0].name + "(" + os.opts[0].val + ")"; @@ -1841,20 +1878,43 @@ void hg_settingdialog::save_scheme(void) } os.name += buf; + std::vector::iterator it1 = std::find(os.opts.begin(), os.opts.end(), OPTION_TITLE_QYSDQX); + save_gamma = it1 != os.opts.end(); if (cur_ind_ >= 0 && cur_ind_ + 1 < (int)schemes_->schemes.size()) { - QString title(tr("save the configuration")); - QString text(tr("The Settings you just set are in the original configuration \"")); + bool overwrite = true, ask = true; + std::vector::iterator it2 = std::find(src.opts.begin(), src.opts.end(), OPTION_TITLE_QYSDQX); - text += QString::fromStdString(schemes_->schemes[cur_ind_ + 1].name); - text += tr("\" changed on the basis,Please select overwrite this configuration or add a new one?\nYes: cover \"") + QString::fromStdString(schemes_->schemes[cur_ind_ + 1].name); - text += tr("\"\nNo: add new configuration") + QString::fromStdString(os.name); + if(save_gamma && it2 != src.opts.end()) + { + OPTVAL v1(*it1), v2(*it2); + os.opts.erase(it1); + src.opts.erase(it2); + if(os == src) + { + v1 = v2; + gamma_file = QString::fromStdString(v1.extra); + ask = false; + } + os.opts.push_back(v1); + src.opts.push_back(v2); + } + if(ask) + { + QString title(tr("save the configuration")); + QString text(tr("The Settings you just set are in the original configuration \"")); - QMessageBox msg(QMessageBox::Question, title, text, QMessageBox::Yes | QMessageBox::No, this); - msg.setButtonText(QMessageBox::Yes, tr("yes")); - msg.setButtonText(QMessageBox::No, tr("no")); - msg.exec(); - if (msg.clickedButton() == msg.button(QMessageBox::Yes)) + text += QString::fromStdString(schemes_->schemes[cur_ind_ + 1].name); + text += tr("\" changed on the basis,Please select overwrite this configuration or add a new one?\nYes: cover \"") + QString::fromStdString(schemes_->schemes[cur_ind_ + 1].name); + text += tr("\"\nNo: add new configuration") + QString::fromStdString(os.name); + + QMessageBox msg(QMessageBox::Question, title, text, QMessageBox::Yes | QMessageBox::No, this); + msg.setButtonText(QMessageBox::Yes, tr("yes")); + msg.setButtonText(QMessageBox::No, tr("no")); + msg.exec(); + overwrite = msg.clickedButton() == msg.button(QMessageBox::Yes); + } + if (overwrite) { os.name = schemes_->schemes[cur_ind_ + 1].name; schemes_->schemes.erase(schemes_->schemes.begin() + cur_ind_ + 1); @@ -1871,31 +1931,12 @@ void hg_settingdialog::save_scheme(void) if(save_gamma) { if(gamma_file.length() == 0) - { - time_t now = time(nullptr); - tm *ptm = localtime(&now); - char name[40] = {0}; - - sprintf(name, "/%04d%02d%02d%02d%02d%02d.gma", ptm->tm_year + 1900, ptm->tm_mon + 1, ptm->tm_mday, ptm->tm_hour, ptm->tm_min, ptm->tm_sec); - if(cfg_file_) - { - std::string str(cfg_file_->get_file().toStdString()); - size_t pos = str.rfind('/'); - if(pos == std::string::npos) - pos = str.rfind('\\'); - if(pos != std::string::npos) - str.erase(pos); - gamma_file = QString::fromStdString(str); - } - else - gamma_file = config::self_path(); - gamma_file += QString::fromStdString(name); - } + gamma_file = gen_gamma_file_path(); config::save_2_file(gamma_file, &m_gammaData, sizeof(m_gammaData)); - ov.val = gamma_file.toStdString(); - ov.type = "file"; - ov.name = OPTION_TITLE_ZDYGM; - os.opts.push_back(ov); + + std::vector::iterator it1 = std::find(os.opts.begin(), os.opts.end(), OPTION_TITLE_QYSDQX); + if(it1 != os.opts.end()) + it1->extra = gamma_file.toStdString(); } schemes_->schemes.insert(schemes_->schemes.begin() + cur_ind_ + 1, os); @@ -2164,11 +2205,11 @@ void hg_settingdialog::slot_pushButton_scheme_management(void) OPTSCHEME* s = &schemes_->schemes[id + 1]; for(size_t i = 0; i < s->opts.size(); ++i) { - if(s->opts[i].name == OPTION_TITLE_ZDYGM) + if(s->opts[i].name == OPTION_TITLE_QYSDQX) { SANE_Gamma gmma; - if(config::load_custom_gamma(s->opts[i].val.c_str(), &gmma)) - remove(s->opts[i].val.c_str()); + if(config::load_custom_gamma(s->opts[i].extra.c_str(), &gmma)) + remove(s->opts[i].extra.c_str()); } } schemes_->schemes.erase(schemes_->schemes.begin() + id + 1); @@ -2198,11 +2239,11 @@ void hg_settingdialog::slot_pushButton_scheme_management(void) OPTSCHEME* s = &schemes_->schemes[i]; for(size_t i = 0; i < s->opts.size(); ++i) { - if(s->opts[i].name == OPTION_TITLE_ZDYGM) + if(s->opts[i].name == OPTION_TITLE_QYSDQX) { SANE_Gamma gmma; - if(config::load_custom_gamma(s->opts[i].val.c_str(), &gmma)) - remove(s->opts[i].val.c_str()); + if(config::load_custom_gamma(s->opts[i].extra.c_str(), &gmma)) + remove(s->opts[i].extra.c_str()); } } } diff --git a/app/scanner/hg_settingdialog.h b/app/scanner/hg_settingdialog.h index 5db3812f..1dfeccff 100644 --- a/app/scanner/hg_settingdialog.h +++ b/app/scanner/hg_settingdialog.h @@ -29,11 +29,13 @@ class hg_settingdialog : public QDialog std::vector changed_opts_; // values which changed int changed_count_; bool save_; + bool clicked_gamma_; config* cfg_file_; void refresh_control_value(int op_id); bool is_covered(std::vector& org, std::vector& now); // if all options in org are inclued in now, then return true void on_select_scheme(int scheme_ind, bool apply_to_dev = true); + QString gen_gamma_file_path(void); QMenu *top_menu_; QLineEdit *edit_name_; diff --git a/app/scanner/mainwindow.cpp b/app/scanner/mainwindow.cpp index 3f454403..96352efc 100644 --- a/app/scanner/mainwindow.cpp +++ b/app/scanner/mainwindow.cpp @@ -2504,10 +2504,26 @@ void MainWindow::on_scanOptions_changed(const QString &device, const QString &op QString info(tr("apply setting") + " '" + option + "' "); bool ok = cur_dev_.apply_setting(schm); // check result ? if(ok) + { info += tr("success"); + cfg.select(option.toStdString().c_str()); + } else + { + ui->menu_device->setOptionChecked(device, option, false); + { + DEVCFG init; + if(init.schemes.size()) + { + std::string name(init.schemes[0].name); + cfg.select(name.c_str()); + ui->menu_device->setOptionChecked(device, QString::fromStdString(name), true); + } + } info += tr("failed"); + } + m_config.save_scanner_configs(&cfg); m_wndStatusBar->setDeviceStatusInfo(info, !ok); m_dialogLog->addLog(info, !ok); HGBase_WriteInfo(!ok ? HGBASE_INFOTYPE_ERROR : HGBASE_INFOTYPE_DESC, "%s", getStdString(info).c_str()); diff --git a/app/scanner/sane_device.cpp b/app/scanner/sane_device.cpp index d0f7f8ca..71b2ab8a 100644 --- a/app/scanner/sane_device.cpp +++ b/app/scanner/sane_device.cpp @@ -20,7 +20,6 @@ bool sane_dev::apply(OPTSCHEME* schm) for(int i = 1; i < count; ++i) { const SANE_Option_Descriptor* desc = sane_get_option_descriptor(hdev_, i); - int extra = 0; if(!desc) continue; @@ -28,16 +27,16 @@ bool sane_dev::apply(OPTSCHEME* schm) desc->type == SANE_TYPE_BUTTON) continue; - act_result result = apply(desc, i, schm->opts, &extra); + act_result result = apply(desc, i, schm->opts); if(result == ACT_RESULT_NO_NEED) continue; if(result == ACT_RESULT_SUCCESS) - applied += extra + 1; + applied++; else break; } - ret = schm->opts.size() <= applied; + ret = schm->opts.size() == applied; } if(ret) @@ -45,13 +44,11 @@ bool sane_dev::apply(OPTSCHEME* schm) return ret; } -sane_dev::act_result sane_dev::apply(const SANE_Option_Descriptor* desc, int opt, const std::vector& vals, int *apply_extra) +sane_dev::act_result sane_dev::apply(const SANE_Option_Descriptor* desc, int opt, const std::vector& vals) { act_result result = ACT_RESULT_NO_NEED; const OPTVAL *cfg = nullptr; - if(apply_extra) - *apply_extra = 0; for(size_t i = 0; i < vals.size(); ++i) { if(vals[i].name == desc->title) @@ -104,19 +101,10 @@ sane_dev::act_result sane_dev::apply(const SANE_Option_Descriptor* desc, int opt if(cfg->name == OPTION_TITLE_QYSDQX && cfg->val == "true") { - for(size_t i = 0; i < vals.size(); ++i) - { - if(vals[i].name == OPTION_TITLE_ZDYGM) - { - SANE_Gamma gamma = {0}; - unsigned int l = 0; - if(config::load_custom_gamma(vals[i].val.c_str(), &gamma)) - sane_io_control(hdev_, IO_CTRL_CODE_SET_CUSTOM_GAMMA, &gamma, &l); - if(apply_extra) - *apply_extra = 1; - break; - } - } + SANE_Gamma gamma = {0}; + unsigned int l = 0; + if(config::load_custom_gamma(cfg->extra.c_str(), &gamma)) + sane_io_control(hdev_, IO_CTRL_CODE_SET_CUSTOM_GAMMA, &gamma, &l); } } diff --git a/app/scanner/sane_device.h b/app/scanner/sane_device.h index cb15e7d2..0453af8a 100644 --- a/app/scanner/sane_device.h +++ b/app/scanner/sane_device.h @@ -21,7 +21,7 @@ class sane_dev }; bool apply(OPTSCHEME* schm); - act_result apply(const SANE_Option_Descriptor* desc, int opt, const std::vector& vals, int *apply_extra = nullptr); + act_result apply(const SANE_Option_Descriptor* desc, int opt, const std::vector& vals); public: sane_dev();