修复自定义gamma配置保存BUG,修复程序退出不能记住上次配置方案BUG
This commit is contained in:
parent
60c954898d
commit
eddab192aa
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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_;
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in New Issue