修复自定义gamma配置保存BUG,修复程序退出不能记住上次配置方案BUG

This commit is contained in:
gb 2022-05-07 18:43:43 +08:00
parent 60c954898d
commit eddab192aa
7 changed files with 137 additions and 85 deletions

View File

@ -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))
{
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);

View File

@ -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)

View File

@ -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<OPTVAL>::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,7 +1878,28 @@ void hg_settingdialog::save_scheme(void)
}
os.name += buf;
std::vector<OPTVAL>::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())
{
bool overwrite = true, ask = true;
std::vector<OPTVAL>::iterator it2 = std::find(src.opts.begin(), src.opts.end(), OPTION_TITLE_QYSDQX);
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 \""));
@ -1854,7 +1912,9 @@ void hg_settingdialog::save_scheme(void)
msg.setButtonText(QMessageBox::Yes, tr("yes"));
msg.setButtonText(QMessageBox::No, tr("no"));
msg.exec();
if (msg.clickedButton() == msg.button(QMessageBox::Yes))
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<OPTVAL>::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());
}
}
}

View File

@ -29,11 +29,13 @@ class hg_settingdialog : public QDialog
std::vector<CHANGEDOPT> 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<OPTVAL>& org, std::vector<OPTVAL>& 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_;

View File

@ -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());

View File

@ -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<OPTVAL>& vals, int *apply_extra)
sane_dev::act_result sane_dev::apply(const SANE_Option_Descriptor* desc, int opt, const std::vector<OPTVAL>& 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)
@ -103,20 +100,11 @@ sane_dev::act_result sane_dev::apply(const SANE_Option_Descriptor* desc, int opt
delete[] str;
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))
if(config::load_custom_gamma(cfg->extra.c_str(), &gamma))
sane_io_control(hdev_, IO_CTRL_CODE_SET_CUSTOM_GAMMA, &gamma, &l);
if(apply_extra)
*apply_extra = 1;
break;
}
}
}
}

View File

@ -21,7 +21,7 @@ class sane_dev
};
bool apply(OPTSCHEME* schm);
act_result apply(const SANE_Option_Descriptor* desc, int opt, const std::vector<OPTVAL>& vals, int *apply_extra = nullptr);
act_result apply(const SANE_Option_Descriptor* desc, int opt, const std::vector<OPTVAL>& vals);
public:
sane_dev();