增加“bind”属性,当默认值改变时,可即时同步到当前值上

This commit is contained in:
gb 2024-01-13 10:57:37 +08:00
parent 1d76b40512
commit dcf2c0215a
5 changed files with 71 additions and 36 deletions

View File

@ -55,7 +55,7 @@ typedef struct BITMAPINFOHEADER
u_int32_t biYPelsPerMeter;
u_int32_t biClrUsed;
u_int32_t biClrImportant;
}BITMAPINFODEADER;
}BITMAPINFOHEADER;
#pragma pack(pop)
#define BI_RGB 0
#define MAKEWORD(a, b) (((a) & 0x0ff) | (((b) & 0x0ff) << 8))

View File

@ -1245,7 +1245,7 @@ namespace utils
std::string bitmap_info_header(int pixel_w, int pixel_h, int bpp, int dpix, int dpiy)
{
BITMAPINFODEADER bih = {0};
BITMAPINFOHEADER bih = {0};
std::string stream("");
if(dpiy == 0)

View File

@ -1377,16 +1377,50 @@ gb_json* device_option::copy_opt(gb_json* from)
{
std::string val(init_value_[to->key()]->value(&device_option::calc_simple_logic_expression, this));
std::string type("");
to->get_value("type", type);
bool apply_cur = false, rdo = false;
// should we change current value ??? - answer: add boolean field "bind" to specify
if (!from->get_value("bind", apply_cur))
apply_cur = false;
if (!from->get_value("readonly", rdo))
rdo = false;
to->get_value("type", type);
if (type == JSON_SANE_TYPE_BOOL)
{
to->set_value("default", *(bool*)val.c_str());
if (apply_cur)
{
to->set_value("cur", *(bool*)val.c_str());
update_provider_value(to->key().c_str(), &val[0], rdo);
}
}
else if (type == JSON_SANE_TYPE_INT)
{
to->set_value("default", *(int*)val.c_str());
if (apply_cur)
{
to->set_value("cur", *(int*)val.c_str());
update_provider_value(to->key().c_str(), &val[0], rdo);
}
}
else if (type == JSON_SANE_TYPE_FIXED)
{
to->set_value("default", *(double*)val.c_str());
if (apply_cur)
{
to->set_value("cur", *(double*)val.c_str());
update_provider_value(to->key().c_str(), &val[0], rdo);
}
}
else if (type == JSON_SANE_TYPE_STRING)
to->set_value("default", (const wchar_t*)val.c_str());
{
to->set_value("default", val.c_str());
if (apply_cur)
{
to->set_value("cur", val.c_str());
update_provider_value(to->key().c_str(), &val[0], rdo);
}
}
}
// 4: range value ...
@ -1626,6 +1660,32 @@ bool device_option::to_now(bool init, bool* changed)
return now_ != nullptr;
}
void device_option::update_provider_value(const char* name, void* value, bool skip_first)
{
if (src_.count(name))
{
sane_opt_provider* opt = nullptr;
if (skip_first)
{
opt = src_[name]->get_following(name);
}
else
{
opt = src_[name];
opt->add_ref();
}
while (opt)
{
opt->set_value(name, value);
sane_opt_provider* next = opt->get_following(name);
opt->release();
opt = next;
}
}
}
std::string device_option::option_value(gb_json* jsn, bool def_val)
{
@ -1787,18 +1847,7 @@ int device_option::update_data(const char* name, void* value, bool reorder_if_ne
err = SCANNER_ERR_ACCESS_DENIED;
// following ...
if (src_.count(name))
{
sane_opt_provider* opt = src_[name]->get_following(name);
while(opt)
{
opt->set_value(name, value);
sane_opt_provider* next = opt->get_following(name);
opt->release();
opt = next;
}
}
update_provider_value(name, value, true);
}
else
{
@ -1807,22 +1856,7 @@ int device_option::update_data(const char* name, void* value, bool reorder_if_ne
// pass to sane_opt_provider ...
err = SCANNER_ERR_OK;
if (src_.count(name))
{
sane_opt_provider* opt = src_[name];
opt->add_ref();
while (opt)
{
int r = opt->set_value(name, value);
if (r)
err = r;
sane_opt_provider* next = opt->get_following(name);
opt->release();
opt = next;
}
}
update_provider_value(name, value);
child->get_value("type", type);
utils::to_log(LOG_LEVEL_DEBUG, "set option '%s' value to '%s' = %d.\n", name, sane_opt_provider::sane_value_2_text(type.c_str(), value).c_str(), err);

View File

@ -184,6 +184,7 @@ class device_option : public refer
gb_json* copy_opt(gb_json* from);
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);