修复浮点数1.0在SANE属性中被解析为整数的问题 - 首次添加的时候作修正
This commit is contained in:
parent
dcf2c0215a
commit
94982d331f
|
@ -960,3 +960,36 @@ bool gb_json::operator!=(const gb_json& r)
|
|||
{
|
||||
return !(*this == r);
|
||||
}
|
||||
|
||||
bool gb_json::revise_number_type(bool dbval)
|
||||
{
|
||||
bool chg = false;
|
||||
|
||||
if (dbval)
|
||||
{
|
||||
// int -> double
|
||||
if (type_ == VAL_TYPE_INT)
|
||||
{
|
||||
type_ = VAL_TYPE_FLOAT;
|
||||
simple_val_.dval = simple_val_.nval;
|
||||
chg = true;
|
||||
}
|
||||
else
|
||||
chg = type_ == VAL_TYPE_FLOAT;
|
||||
}
|
||||
else
|
||||
{
|
||||
// double -> int
|
||||
if (type_ == VAL_TYPE_FLOAT)
|
||||
{
|
||||
type_ = VAL_TYPE_INT;
|
||||
simple_val_.nval = simple_val_.dval + .5f;
|
||||
chg = true;
|
||||
}
|
||||
else
|
||||
chg = type_ == VAL_TYPE_INT;
|
||||
}
|
||||
|
||||
return chg;
|
||||
}
|
||||
|
||||
|
|
|
@ -115,6 +115,11 @@ public:
|
|||
|
||||
bool operator==(const gb_json& r);
|
||||
bool operator!=(const gb_json& r);
|
||||
|
||||
// [2024-01-13] double value maybe consider as integer if the number just an integer, this method is to set numbre to right type
|
||||
// dbval - true: make integer to double and simple_val_.dval = simple_val_.nval;
|
||||
// false: make double to integer and simple_val_.nval = simple_val_.dval
|
||||
bool revise_number_type(bool dbval);
|
||||
};
|
||||
|
||||
#ifdef DUMP_JSON_OBJECT_LIFE
|
||||
|
|
|
@ -1239,6 +1239,12 @@ bool device_option::arrange_raw_json(sane_opt_provider* sop)
|
|||
child->get_value("type", str);
|
||||
if (str != JSON_SANE_TYPE_GROUP) // omit group
|
||||
{
|
||||
if (str == JSON_SANE_TYPE_FIXED)
|
||||
{
|
||||
// revise cur and default
|
||||
device_option::revise_number_type(child, true);
|
||||
}
|
||||
|
||||
if(no_grp_)
|
||||
{
|
||||
insert_option(child, sop);
|
||||
|
@ -1329,7 +1335,7 @@ void device_option::init_depends(gb_json* opt)
|
|||
delete v;
|
||||
}
|
||||
}
|
||||
gb_json* device_option::copy_opt(gb_json* from)
|
||||
gb_json* device_option::copy_opt(gb_json* from, bool* changed_cur)
|
||||
{
|
||||
std::string text(from->to_string());
|
||||
gb_json* to = new gb_json();
|
||||
|
@ -1385,6 +1391,9 @@ gb_json* device_option::copy_opt(gb_json* from)
|
|||
if (!from->get_value("readonly", rdo))
|
||||
rdo = false;
|
||||
to->get_value("type", type);
|
||||
if (changed_cur)
|
||||
*changed_cur = apply_cur;
|
||||
|
||||
if (type == JSON_SANE_TYPE_BOOL)
|
||||
{
|
||||
to->set_value("default", *(bool*)val.c_str());
|
||||
|
@ -1421,6 +1430,8 @@ gb_json* device_option::copy_opt(gb_json* from)
|
|||
update_provider_value(to->key().c_str(), &val[0], rdo);
|
||||
}
|
||||
}
|
||||
else if (changed_cur)
|
||||
*changed_cur = false;
|
||||
}
|
||||
|
||||
// 4: range value ...
|
||||
|
@ -1560,6 +1571,7 @@ bool device_option::to_now(bool init, bool* changed)
|
|||
while (from)
|
||||
{
|
||||
std::string name(from->key());
|
||||
bool cur_chged = false;
|
||||
|
||||
if (init)
|
||||
init_depends(from);
|
||||
|
@ -1577,12 +1589,12 @@ bool device_option::to_now(bool init, bool* changed)
|
|||
}
|
||||
}
|
||||
|
||||
to = copy_opt(from);
|
||||
to = copy_opt(from, &cur_chged);
|
||||
from->release();
|
||||
if (to)
|
||||
{
|
||||
// copy cur value ...
|
||||
if (now_)
|
||||
if (now_ && !cur_chged)
|
||||
{
|
||||
gb_json* now = nullptr;
|
||||
now_->get_value(to->key().c_str(), now);
|
||||
|
@ -1718,6 +1730,54 @@ std::string device_option::option_value(gb_json* jsn, bool def_val)
|
|||
|
||||
return std::move(type);
|
||||
}
|
||||
void device_option::revise_number_type(gb_json* opt, bool to_double)
|
||||
{
|
||||
gb_json* child = nullptr;
|
||||
|
||||
opt->get_value("cur", child);
|
||||
if (child)
|
||||
{
|
||||
if (child->is_leaf_node())
|
||||
child->revise_number_type(to_double);
|
||||
//else
|
||||
// no object now, fixed me if be object
|
||||
|
||||
child->release();
|
||||
}
|
||||
|
||||
opt->get_value("default", child);
|
||||
if (child)
|
||||
{
|
||||
if (child->is_leaf_node())
|
||||
child->revise_number_type(to_double);
|
||||
else
|
||||
{
|
||||
gb_json* v = child->first_child();
|
||||
while (v)
|
||||
{
|
||||
if (v->is_leaf_node())
|
||||
v->revise_number_type(to_double);
|
||||
v->release();
|
||||
v = child->next_child();
|
||||
}
|
||||
}
|
||||
child->release();
|
||||
}
|
||||
|
||||
opt->get_value("range", child);
|
||||
if (child)
|
||||
{
|
||||
gb_json* v = child->first_child();
|
||||
while (v)
|
||||
{
|
||||
if (v->is_leaf_node())
|
||||
v->revise_number_type(to_double);
|
||||
v->release();
|
||||
v = child->next_child();
|
||||
}
|
||||
child->release();
|
||||
}
|
||||
}
|
||||
|
||||
std::string device_option::trans_group(const char* utf8, bool to_title)
|
||||
{
|
||||
|
|
|
@ -181,13 +181,14 @@ class device_option : public refer
|
|||
void insert_option(gb_json* opt, sane_opt_provider* from, const char* group = nullptr);
|
||||
bool arrange_raw_json(sane_opt_provider* sop); // create origin_ and re-arrange groups
|
||||
void init_depends(gb_json* opt);
|
||||
gb_json* copy_opt(gb_json* from);
|
||||
gb_json* copy_opt(gb_json* from, bool *changed_cur = nullptr);
|
||||
int visibility(gb_json* jsn);
|
||||
bool to_now(bool init, bool* changed);
|
||||
void update_provider_value(const char* name, void* value, bool skip_first = false/*readonly value should skip first*/);
|
||||
|
||||
protected:
|
||||
static std::string option_value(gb_json* jsn, bool def_val);
|
||||
static void revise_number_type(gb_json* opt, bool to_double);
|
||||
|
||||
template<class T>
|
||||
static condition_value* to_condition_value(gb_json* jsn, const char* key, const char* type, device_option* parent)
|
||||
|
|
Loading…
Reference in New Issue