skin_engine: Make pressing the setting bar touch region work

might need some tweaking, but works.

Change-Id: I0784cd4fe9996531da6cc275491ff3b4e83cdbcf
This commit is contained in:
Jonathan Gordon 2012-07-06 14:28:34 +10:00
parent 65f9df3083
commit 68ee7aac6e
5 changed files with 41 additions and 1 deletions

View file

@ -254,6 +254,7 @@ enum {
ACTION_TOUCH_SCROLLBAR, ACTION_TOUCH_SCROLLBAR,
ACTION_TOUCH_VOLUME, ACTION_TOUCH_VOLUME,
ACTION_TOUCH_SOFTLOCK, ACTION_TOUCH_SOFTLOCK,
ACTION_TOUCH_SETTING,
#endif #endif
/* USB HID codes */ /* USB HID codes */

View file

@ -600,3 +600,21 @@ int get_setting_info_for_bar(int setting_id, int *count, int *val)
val_to_selection(setting, oldvalue, count, val, &function); val_to_selection(setting, oldvalue, count, val, &function);
return true; return true;
} }
#ifdef HAVE_TOUCHSCREEN
void update_setting_value_from_touch(int setting_id, int selection)
{
const struct settings_list *setting = &settings[setting_id];
int new_val = selection_to_val(setting, selection);
int var_type = setting->flags&F_T_MASK;
if (var_type == F_T_INT || var_type == F_T_UINT)
{
*(int*)setting->setting = new_val;
}
else if (var_type == F_T_BOOL)
{
*(bool*)setting->setting = new_val ? true : false;
}
}
#endif

View file

@ -49,5 +49,8 @@ void option_talk_value(const struct settings_list *setting, int value, bool enqu
int option_value_as_int(const struct settings_list *setting); int option_value_as_int(const struct settings_list *setting);
int get_setting_info_for_bar(int setting_id, int *count, int *val); int get_setting_info_for_bar(int setting_id, int *count, int *val);
#ifdef HAVE_TOUCHSCREEN
void update_setting_value_from_touch(int setting_id, int selection);
#endif
#endif /* _GUI_OPTION_SELECT_H_ */ #endif /* _GUI_OPTION_SELECT_H_ */

View file

@ -1091,7 +1091,9 @@ static int parse_progressbar_tag(struct skin_element* element,
#ifdef HAVE_TOUCHSCREEN #ifdef HAVE_TOUCHSCREEN
if (!suppress_touchregion && if (!suppress_touchregion &&
(token->type == SKIN_TOKEN_VOLUMEBAR || token->type == SKIN_TOKEN_PROGRESSBAR)) (token->type == SKIN_TOKEN_VOLUMEBAR ||
token->type == SKIN_TOKEN_PROGRESSBAR ||
token->type == SKIN_TOKEN_SETTINGBAR))
{ {
struct touchregion *region = skin_buffer_alloc(sizeof(*region)); struct touchregion *region = skin_buffer_alloc(sizeof(*region));
struct skin_token_list *item; struct skin_token_list *item;
@ -1102,6 +1104,8 @@ static int parse_progressbar_tag(struct skin_element* element,
if (token->type == SKIN_TOKEN_VOLUMEBAR) if (token->type == SKIN_TOKEN_VOLUMEBAR)
region->action = ACTION_TOUCH_VOLUME; region->action = ACTION_TOUCH_VOLUME;
else if (token->type == SKIN_TOKEN_SETTINGBAR)
region->action = ACTION_TOUCH_SETTING;
else else
region->action = ACTION_TOUCH_SCROLLBAR; region->action = ACTION_TOUCH_SCROLLBAR;

View file

@ -104,6 +104,7 @@ int skin_get_touchaction(struct wps_data *data, int* edge_offset,
{ {
case ACTION_TOUCH_SCROLLBAR: case ACTION_TOUCH_SCROLLBAR:
case ACTION_TOUCH_VOLUME: case ACTION_TOUCH_VOLUME:
case ACTION_TOUCH_SETTING:
if (edge_offset) if (edge_offset)
{ {
struct progressbar *bar = struct progressbar *bar =
@ -284,6 +285,19 @@ int skin_get_touchaction(struct wps_data *data, int* edge_offset,
returncode = ACTION_REDRAW; returncode = ACTION_REDRAW;
} }
break; break;
case ACTION_TOUCH_SETTING:
{
struct progressbar *bar =
SKINOFFSETTOPTR(skin_buffer, temp->bar);
if (bar && edge_offset)
{
int val, count;
get_setting_info_for_bar(bar->setting_id, &count, &val);
val = *edge_offset * count / 100;
update_setting_value_from_touch(bar->setting_id, val);
}
}
break;
} }
return returncode; return returncode;
} }