Add image_recolor properties

This commit is contained in:
fvanroie 2021-05-10 09:50:08 +02:00
parent 6ea6c8c297
commit 75b65aa523
2 changed files with 167 additions and 134 deletions

View File

@ -1240,7 +1240,21 @@ static void hasp_local_style_attr(lv_obj_t* obj, const char* attr_p, uint16_t at
// return;
/* Image attributes */
// Todo
case ATTR_IMAGE_RECOLOR_OPA:
return attribute_image_recolor_opa(obj, part, state, update, attr_p, (lv_opa_t)var);
case ATTR_IMAGE_OPA:
return attribute_image_opa(obj, part, state, update, attr_p, (lv_opa_t)var);
case ATTR_IMAGE_RECOLOR: {
if(update) {
lv_color32_t c;
if(Parser::haspPayloadToColor(payload, c))
lv_obj_set_style_local_image_recolor(obj, part, state,
lv_color_make(c.ch.red, c.ch.green, c.ch.blue));
} else {
attr_out_color(obj, attr, lv_obj_get_style_image_recolor(obj, part));
}
return;
}
/* Transition attributes */
// Todo
@ -1253,21 +1267,20 @@ static void hasp_local_style_attr(lv_obj_t* obj, const char* attr_p, uint16_t at
result = false;
}
static void hasp_process_arc_attribute(lv_obj_t* obj, const char* attr_p, uint16_t attr_hash, const char* payload,
static bool hasp_process_arc_attribute(lv_obj_t* obj, const char* attr, uint16_t attr_hash, const char* payload,
bool update)
{
// We already know it's a arc object
uint16_t val = atoi(payload);
char* attr = (char*)attr_p;
// if(*attr == '.') attr++; // strip leading '.'
// We already know it's a arc object
switch(attr_hash) {
case ATTR_TYPE:
return (update) ? lv_arc_set_type(obj, val % 3) : attr_out_int(obj, attr, lv_arc_get_type(obj));
(update) ? lv_arc_set_type(obj, val % 3) : attr_out_int(obj, attr, lv_arc_get_type(obj));
return true;
case ATTR_ROTATION:
return (update) ? lv_arc_set_rotation(obj, val) : attr_out_int(obj, attr, my_arc_get_rotation(obj));
(update) ? lv_arc_set_rotation(obj, val) : attr_out_int(obj, attr, my_arc_get_rotation(obj));
return true;
case ATTR_ADJUSTABLE:
if(update) {
@ -1277,26 +1290,29 @@ static void hasp_process_arc_attribute(lv_obj_t* obj, const char* attr_p, uint16
} else {
attr_out_int(obj, attr, lv_arc_get_adjustable(obj));
}
return;
return true;
case ATTR_START_ANGLE:
return (update) ? lv_arc_set_bg_start_angle(obj, val)
: attr_out_int(obj, attr, lv_arc_get_bg_angle_start(obj));
(update) ? lv_arc_set_bg_start_angle(obj, val) : attr_out_int(obj, attr, lv_arc_get_bg_angle_start(obj));
return true;
case ATTR_END_ANGLE:
return (update) ? lv_arc_set_bg_end_angle(obj, val) : attr_out_int(obj, attr, lv_arc_get_bg_angle_end(obj));
(update) ? lv_arc_set_bg_end_angle(obj, val) : attr_out_int(obj, attr, lv_arc_get_bg_angle_end(obj));
return true;
case ATTR_START_ANGLE1:
return (update) ? lv_arc_set_start_angle(obj, val) : attr_out_int(obj, attr, lv_arc_get_angle_start(obj));
(update) ? lv_arc_set_start_angle(obj, val) : attr_out_int(obj, attr, lv_arc_get_angle_start(obj));
return true;
case ATTR_END_ANGLE1:
return (update) ? lv_arc_set_end_angle(obj, val) : attr_out_int(obj, attr, lv_arc_get_angle_end(obj));
(update) ? lv_arc_set_end_angle(obj, val) : attr_out_int(obj, attr, lv_arc_get_angle_end(obj));
return true;
}
LOG_WARNING(TAG_ATTR, F(D_ATTRIBUTE_UNKNOWN), attr_p);
return false;
}
static void hasp_process_lmeter_attribute(lv_obj_t* obj, const char* attr, uint16_t attr_hash, const char* payload,
static bool hasp_process_lmeter_attribute(lv_obj_t* obj, const char* attr, uint16_t attr_hash, const char* payload,
bool update)
{
uint16_t val = atoi(payload);
@ -1307,24 +1323,27 @@ static void hasp_process_lmeter_attribute(lv_obj_t* obj, const char* attr, uint1
switch(attr_hash) {
case ATTR_TYPE:
return (update) ? lv_linemeter_set_mirror(obj, val != 0)
: attr_out_int(obj, attr, lv_linemeter_get_mirror(obj));
(update) ? lv_linemeter_set_mirror(obj, val != 0) : attr_out_int(obj, attr, lv_linemeter_get_mirror(obj));
return true;
case ATTR_ROTATION:
return (update) ? lv_linemeter_set_angle_offset(obj, val)
: attr_out_int(obj, attr, lv_linemeter_get_angle_offset(obj));
(update) ? lv_linemeter_set_angle_offset(obj, val)
: attr_out_int(obj, attr, lv_linemeter_get_angle_offset(obj));
return true;
case ATTR_LINE_COUNT:
return (update) ? lv_linemeter_set_scale(obj, angle, val) : attr_out_int(obj, attr, line_count);
(update) ? lv_linemeter_set_scale(obj, angle, val) : attr_out_int(obj, attr, line_count);
return true;
case ATTR_ANGLE:
return (update) ? lv_linemeter_set_scale(obj, val, line_count) : attr_out_int(obj, attr, angle);
(update) ? lv_linemeter_set_scale(obj, val, line_count) : attr_out_int(obj, attr, angle);
return true;
}
LOG_WARNING(TAG_ATTR, F(D_ATTRIBUTE_UNKNOWN), attr);
return false;
}
static void hasp_process_dropdown_attribute(lv_obj_t* obj, const char* attr, uint16_t attr_hash, const char* payload,
static bool hasp_process_dropdown_attribute(lv_obj_t* obj, const char* attr, uint16_t attr_hash, const char* payload,
bool update)
{
int16_t intval = atoi(payload);
@ -1333,28 +1352,33 @@ static void hasp_process_dropdown_attribute(lv_obj_t* obj, const char* attr, uin
// We already know it's a gauge object
switch(attr_hash) {
case ATTR_DIRECTION:
return (update) ? lv_dropdown_set_dir(obj, intval) : attr_out_int(obj, attr, lv_dropdown_get_dir(obj));
(update) ? lv_dropdown_set_dir(obj, intval) : attr_out_int(obj, attr, lv_dropdown_get_dir(obj));
return true;
case ATTR_SYMBOL:
return (update) ? lv_dropdown_set_symbol(obj, payload)
: attr_out_str(obj, attr, lv_dropdown_get_symbol(obj));
(update) ? lv_dropdown_set_symbol(obj, payload) : attr_out_str(obj, attr, lv_dropdown_get_symbol(obj));
return true;
case ATTR_OPEN:
return lv_dropdown_open(obj);
lv_dropdown_open(obj);
return true;
case ATTR_CLOSE:
return lv_dropdown_close(obj);
lv_dropdown_close(obj);
return true;
case ATTR_MAX_HEIGHT:
return (update) ? lv_dropdown_set_max_height(obj, intval)
: attr_out_int(obj, attr, lv_dropdown_get_max_height(obj));
(update) ? lv_dropdown_set_max_height(obj, intval)
: attr_out_int(obj, attr, lv_dropdown_get_max_height(obj));
return true;
case ATTR_SHOW_SELECTED:
return (update) ? lv_dropdown_set_show_selected(obj, val)
: attr_out_int(obj, attr, lv_dropdown_get_show_selected(obj));
(update) ? lv_dropdown_set_show_selected(obj, val)
: attr_out_int(obj, attr, lv_dropdown_get_show_selected(obj));
return true;
}
LOG_WARNING(TAG_ATTR, F(D_ATTRIBUTE_UNKNOWN), attr);
return false;
}
static bool hasp_process_gauge_attribute(lv_obj_t* obj, const char* attr, uint16_t attr_hash, const char* payload,
@ -1413,14 +1437,13 @@ static bool hasp_process_gauge_attribute(lv_obj_t* obj, const char* attr, uint16
return true; // found
}
LOG_WARNING(TAG_ATTR, F(D_ATTRIBUTE_UNKNOWN), attr);
return false;
}
// ##################### Common Attributes ########################################################
static inline void hasp_process_page_attributes(lv_obj_t* obj, const char* attr_p, uint16_t attr_hash, uint8_t val,
bool update)
static bool hasp_process_page_attributes(lv_obj_t* obj, const char* attr_p, uint16_t attr_hash, uint8_t val,
bool update)
{
uint8_t pageid;
@ -1428,18 +1451,19 @@ static inline void hasp_process_page_attributes(lv_obj_t* obj, const char* attr_
switch(attr_hash) {
case ATTR_NEXT:
update ? haspPages.set_next(pageid, val) : attr_out_int(obj, attr_p, haspPages.get_next(pageid));
break;
return true;
case ATTR_PREV:
update ? haspPages.set_prev(pageid, val) : attr_out_int(obj, attr_p, haspPages.get_prev(pageid));
break;
return true;
// case ATTR_BACK:
default:
update ? haspPages.set_back(pageid, val) : attr_out_int(obj, attr_p, haspPages.get_back(pageid));
break;
return true;
}
}
return false;
}
static bool hasp_process_obj_attribute_text(lv_obj_t* obj, const char* attr, const char* payload, bool update)
@ -1484,12 +1508,12 @@ static bool hasp_process_obj_attribute_text(lv_obj_t* obj, const char* attr, con
return true;
}
default:
LOG_WARNING(TAG_ATTR, F(D_ATTRIBUTE_UNKNOWN), attr);
break;
}
return false;
}
static inline bool attr_anim_time(lv_obj_t* obj, const char* attr, uint16_t val, bool update)
static bool attr_anim_time(lv_obj_t* obj, const char* attr, uint16_t val, bool update)
{
{ // Use anim_time for const lv_obj getters
hasp_attr_update16_const_t anim_time[] = {{LV_HASP_BAR, lv_bar_set_anim_time, lv_bar_get_anim_time},
@ -1572,7 +1596,7 @@ bool hasp_process_obj_attribute_val(lv_obj_t* obj, const char* attr, int16_t int
return true;
}
static void hasp_process_obj_attribute_range(lv_obj_t* obj, const char* attr, const char* payload, bool update,
static bool hasp_process_obj_attribute_range(lv_obj_t* obj, const char* attr, const char* payload, bool update,
bool set_min, bool set_max)
{
int16_t val = atoi(payload);
@ -1581,52 +1605,58 @@ static void hasp_process_obj_attribute_range(lv_obj_t* obj, const char* attr, co
if(obj_check_type(obj, LV_HASP_SLIDER)) {
int16_t min = lv_slider_get_min_value(obj);
int16_t max = lv_slider_get_max_value(obj);
if(update && (set_min ? val : min) == (set_max ? val : max)) return; // prevent setting min=max
return update ? lv_slider_set_range(obj, set_min ? val : min, set_max ? val : max)
: attr_out_int(obj, attr, set_min ? min : max);
if(update && (set_min ? val : min) == (set_max ? val : max)) return false; // prevent setting min=max
update ? lv_slider_set_range(obj, set_min ? val : min, set_max ? val : max)
: attr_out_int(obj, attr, set_min ? min : max);
return true;
}
if(obj_check_type(obj, LV_HASP_GAUGE)) {
int32_t min = lv_gauge_get_min_value(obj);
int32_t max = lv_gauge_get_max_value(obj);
if(update && (set_min ? val32 : min) == (set_max ? val32 : max)) return; // prevent setting min=max
return update ? lv_gauge_set_range(obj, set_min ? val32 : min, set_max ? val32 : max)
: attr_out_int(obj, attr, set_min ? min : max);
if(update && (set_min ? val32 : min) == (set_max ? val32 : max)) return false; // prevent setting min=max
update ? lv_gauge_set_range(obj, set_min ? val32 : min, set_max ? val32 : max)
: attr_out_int(obj, attr, set_min ? min : max);
return true;
}
if(obj_check_type(obj, LV_HASP_ARC)) {
int16_t min = lv_arc_get_min_value(obj);
int16_t max = lv_arc_get_max_value(obj);
if(update && (set_min ? val : min) == (set_max ? val : max)) return; // prevent setting min=max
return update ? lv_arc_set_range(obj, set_min ? val : min, set_max ? val : max)
: attr_out_int(obj, attr, set_min ? min : max);
if(update && (set_min ? val : min) == (set_max ? val : max)) return false; // prevent setting min=max
update ? lv_arc_set_range(obj, set_min ? val : min, set_max ? val : max)
: attr_out_int(obj, attr, set_min ? min : max);
return true;
}
if(obj_check_type(obj, LV_HASP_BAR)) {
int16_t min = lv_bar_get_min_value(obj);
int16_t max = lv_bar_get_max_value(obj);
if(update && (set_min ? val : min) == (set_max ? val : max)) return; // prevent setting min=max
return update ? lv_bar_set_range(obj, set_min ? val : min, set_max ? val : max)
: attr_out_int(obj, attr, set_min ? min : max);
if(update && (set_min ? val : min) == (set_max ? val : max)) return false; // prevent setting min=max
update ? lv_bar_set_range(obj, set_min ? val : min, set_max ? val : max)
: attr_out_int(obj, attr, set_min ? min : max);
return true;
}
if(obj_check_type(obj, LV_HASP_LMETER)) {
int32_t min = lv_linemeter_get_min_value(obj);
int32_t max = lv_linemeter_get_max_value(obj);
if(update && (set_min ? val32 : min) == (set_max ? val32 : max)) return; // prevent setting min=max
return update ? lv_linemeter_set_range(obj, set_min ? val32 : min, set_max ? val32 : max)
: attr_out_int(obj, attr, set_min ? min : max);
if(update && (set_min ? val32 : min) == (set_max ? val32 : max)) return false; // prevent setting min=max
update ? lv_linemeter_set_range(obj, set_min ? val32 : min, set_max ? val32 : max)
: attr_out_int(obj, attr, set_min ? min : max);
return true;
}
if(obj_check_type(obj, LV_HASP_CHART)) {
int16_t min = my_chart_get_min_value(obj);
int16_t max = my_chart_get_max_value(obj);
if(update && (set_min ? val : min) == (set_max ? val : max)) return; // prevent setting min=max
return update ? lv_chart_set_range(obj, set_min ? val : min, set_max ? val : max)
: attr_out_int(obj, attr, set_min ? min : max);
if(update && (set_min ? val : min) == (set_max ? val : max)) return false; // prevent setting min=max
update ? lv_chart_set_range(obj, set_min ? val : min, set_max ? val : max)
: attr_out_int(obj, attr, set_min ? min : max);
return true;
}
LOG_WARNING(TAG_ATTR, F(D_ATTRIBUTE_UNKNOWN), attr);
return false;
}
// ##################### Default Attributes ########################################################
@ -1679,7 +1709,7 @@ void hasp_process_obj_attribute(lv_obj_t* obj, const char* attr_p, const char* p
return; // attribute_found
case ATTR_OBJID:
if(update) LOG_WARNING(TAG_ATTR, F(D_ATTRIBUTE_READ_ONLY), attr_p);
if(update && val != obj->user_data.objid) LOG_WARNING(TAG_ATTR, F(D_ATTRIBUTE_READ_ONLY), attr_p);
attr_out_int(obj, attr, obj->user_data.objid);
return; // attribute_found
@ -1753,12 +1783,12 @@ void hasp_process_obj_attribute(lv_obj_t* obj, const char* attr_p, const char* p
break; // not found
case ATTR_MIN:
hasp_process_obj_attribute_range(obj, attr, payload, update, true, false);
return; // attribute_found
if(hasp_process_obj_attribute_range(obj, attr, payload, update, true, false)) return; // attribute_found
break;
case ATTR_MAX:
hasp_process_obj_attribute_range(obj, attr, payload, update, false, true);
return; // attribute_found
if(hasp_process_obj_attribute_range(obj, attr, payload, update, false, true)) return; // attribute_found
break;
case ATTR_OPACITY:
update ? lv_obj_set_style_local_opa_scale(obj, LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, val)
@ -1774,23 +1804,6 @@ void hasp_process_obj_attribute(lv_obj_t* obj, const char* attr_p, const char* p
: attr_out_int(obj, attr, obj->user_data.swipeid);
return; // attribute_found
case ATTR_SRC:
if(obj_check_type(obj, LV_HASP_IMAGE)) {
if(update) {
lv_img_cache_invalidate_src(lv_img_get_src(obj));
lv_img_set_src(obj, payload);
} else {
switch(lv_img_src_get_type(obj)) {
case LV_IMG_SRC_FILE:
return attr_out_str(obj, attr, lv_img_get_file_name(obj));
case LV_IMG_SRC_SYMBOL:
return attr_out_str(obj, attr, (char*)lv_img_get_src(obj));
}
}
return; // attribute_found
}
break; // not found
case ATTR_ANIM_SPEED:
if(obj_check_type(obj, LV_HASP_LABEL)) {
update ? lv_label_set_anim_speed(obj, (uint16_t)val)
@ -1801,7 +1814,7 @@ void hasp_process_obj_attribute(lv_obj_t* obj, const char* attr_p, const char* p
case ATTR_ANIM_TIME:
if(attr_anim_time(obj, attr, val, update)) return; // attribute_found
break; // not found
break;
case ATTR_ROWS:
switch(obj_get_type(obj)) {
@ -1983,45 +1996,6 @@ void hasp_process_obj_attribute(lv_obj_t* obj, const char* attr_p, const char* p
}
break; // not found
case ATTR_CRITICAL_VALUE:
case ATTR_ANGLE:
case ATTR_LABEL_COUNT:
case ATTR_LINE_COUNT:
case ATTR_FORMAT:
case ATTR_TYPE:
case ATTR_ROTATION:
case ATTR_ADJUSTABLE:
case ATTR_START_ANGLE:
case ATTR_END_ANGLE:
case ATTR_START_ANGLE1:
case ATTR_END_ANGLE1:
switch(obj_get_type(obj)) {
case LV_HASP_ARC:
hasp_process_arc_attribute(obj, attr_p, attr_hash, payload, update);
return; // attribute_found
case LV_HASP_GAUGE:
if(hasp_process_gauge_attribute(obj, attr_p, attr_hash, payload, update)) return; // attribute_found
break; // not found
case LV_HASP_LMETER:
hasp_process_lmeter_attribute(obj, attr_p, attr_hash, payload, update);
return; // attribute_found
default:
break; // not found
}
break; // not found
case ATTR_DIRECTION:
case ATTR_SYMBOL:
case ATTR_OPEN:
case ATTR_CLOSE:
case ATTR_MAX_HEIGHT:
case ATTR_SHOW_SELECTED:
if(obj_check_type(obj, LV_HASP_DROPDOWN)) {
hasp_process_dropdown_attribute(obj, attr_p, attr_hash, payload, update);
return; // attribute_found
}
break; // not found
case ATTR_RED: // TODO: remove temp RED
if(obj_check_type(obj, LV_HASP_BTNMATRIX)) {
my_btnmatrix_map_clear(obj); // TODO : remove this test property
@ -2053,21 +2027,75 @@ void hasp_process_obj_attribute(lv_obj_t* obj, const char* attr_p, const char* p
lv_obj_move_background(obj);
}
return; // attribute_found
}
case ATTR_NEXT:
case ATTR_PREV:
case ATTR_BACK:
if(obj_check_type(obj, LV_HASP_SCREEN)) {
hasp_process_page_attributes(obj, attr_p, attr_hash, val, update);
// Properties by object type
switch(obj_get_type(obj)) {
case LV_HASP_IMAGE:
switch(attr_hash) {
case ATTR_OFFSET_X:
update ? lv_img_set_offset_x(obj, val) : attr_out_int(obj, attr, lv_img_get_offset_x(obj));
return;
case ATTR_OFFSET_Y:
update ? lv_img_set_offset_y(obj, val) : attr_out_int(obj, attr, lv_img_get_offset_y(obj));
return;
case ATTR_AUTO_SIZE:
update ? lv_img_set_auto_size(obj, !!val) : attr_out_int(obj, attr, lv_img_get_auto_size(obj));
return;
case ATTR_SRC:
if(update) {
lv_img_cache_invalidate_src(lv_img_get_src(obj));
lv_img_set_src(obj, payload);
} else {
switch(lv_img_src_get_type(obj)) {
case LV_IMG_SRC_FILE:
return attr_out_str(obj, attr, lv_img_get_file_name(obj));
case LV_IMG_SRC_SYMBOL:
return attr_out_str(obj, attr, (char*)lv_img_get_src(obj));
}
}
return; // attribute_found
}
break; // not found
case LV_HASP_PAGE:
if(hasp_process_page_attributes(obj, attr_p, attr_hash, val, update)) {
return; // attribute_found
}
break; // not found
default: {
bool result;
hasp_local_style_attr(obj, attr, attr_hash, payload, update, result);
if(result) return; // attribute_found
}
case LV_HASP_DROPDOWN:
if(hasp_process_dropdown_attribute(obj, attr_p, attr_hash, payload, update)) {
return; // attribute_found
}
break; // not found
case LV_HASP_ARC:
if(hasp_process_arc_attribute(obj, attr_p, attr_hash, payload, update)) {
return; // attribute_found
}
break; // not found
case LV_HASP_GAUGE:
if(hasp_process_gauge_attribute(obj, attr_p, attr_hash, payload, update)) {
return; // attribute_found
}
break; // not found
case LV_HASP_LMETER:
if(hasp_process_lmeter_attribute(obj, attr_p, attr_hash, payload, update)) {
return; // attribute_found
}
break; // not found
default:
break;
}
{
bool result;
hasp_local_style_attr(obj, attr, attr_hash, payload, update, result);
if(result) return; // attribute_found
}
LOG_WARNING(TAG_ATTR, F(D_ATTRIBUTE_UNKNOWN " (%d)"), attr_p, attr_hash);

View File

@ -348,6 +348,11 @@ _HASP_ATTRIBUTE(SCALE_END_LINE_WIDTH, scale_end_line_width, lv_style_int_t)
#define ATTR_MODAL 7405
#define ATTR_AUTO_CLOSE 7880
// Image
#define ATTR_OFFSET_X 65388
#define ATTR_OFFSET_Y 65389
#define ATTR_AUTO_SIZE 63729
/* hasp user data */
#define ATTR_ACTION 42102
#define ATTR_TRANSITION 10933