From 8c6aa008c56e466f3cd8058e7094b924b427e585 Mon Sep 17 00:00:00 2001 From: Agnieszka Janowicz Date: Fri, 19 Feb 2016 13:14:02 +0100 Subject: [PATCH] Picture brightness view using genering slider view Apply generic slider view to picture contrast too Change-Id: Ie83a0fcc0c87b3addfd245ef1ad0e9afd71f55d3 Signed-off-by: Agnieszka Janowicz --- CMakeLists.txt | 2 + include/data/settings_picture.h | 3 + include/define.h | 2 + include/view/picture/view_picture_brightness.h | 24 +++ include/view/picture/view_picture_slider_generic.h | 41 ++++ src/data/settings_picture.c | 69 +++++++ src/layout/layout_picture.c | 39 ++-- src/main.c | 11 ++ src/view/picture/view_picture_brightness.c | 135 +++++++++++++ src/view/picture/view_picture_contrast.c | 136 +++---------- src/view/picture/view_picture_slider_generic.c | 211 +++++++++++++++++++++ 11 files changed, 541 insertions(+), 132 deletions(-) create mode 100644 include/view/picture/view_picture_brightness.h create mode 100644 include/view/picture/view_picture_slider_generic.h create mode 100644 src/view/picture/view_picture_brightness.c create mode 100644 src/view/picture/view_picture_slider_generic.c diff --git a/CMakeLists.txt b/CMakeLists.txt index a9f2265..c050029 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -63,8 +63,10 @@ ENDIF(NOT DEFINED DESKTOP_ICON) SET(SRCS src/main.c src/view/view_base.c + src/view/picture/view_picture_slider_generic.c src/view/picture/view_picture_mode.c src/view/picture/view_picture_contrast.c + src/view/picture/view_picture_brightness.c src/view/system/view_clock.c src/view/system/view_sleep_timer.c src/view/system/view_wakeup_timer.c diff --git a/include/data/settings_picture.h b/include/data/settings_picture.h index 99cd2f7..e907404 100644 --- a/include/data/settings_picture.h +++ b/include/data/settings_picture.h @@ -28,7 +28,10 @@ typedef enum _picture_mode { void settings_picture_set_picture_mode(settings_picture_mode mode_to_set); void settings_picture_set_contrast(int val); +void settings_picture_set_brightness(int val); settings_picture_mode settings_picture_get_picture_mode(void); int settings_picture_get_contrast(void); +int settings_picture_get_brightness(void); +int settings_picture_get_max_brightness(void); #endif /* __AIR_SETTINGS_PICTURE_H__ */ diff --git a/include/define.h b/include/define.h index ceb18d5..66ec370 100644 --- a/include/define.h +++ b/include/define.h @@ -30,6 +30,7 @@ /* View ID - Picture */ #define VIEW_PICTURE_MODE "VIEW_PICTURE_MODE" #define VIEW_PICTURE_CONTRAST "VIEW_PICTURE_CONTRAST" +#define VIEW_PICTURE_BRIGHTNESS "VIEW_PICTURE_BRIGHTNESS" /* View ID - System */ #define VIEW_CLOCK "VIEW_CLOCK" @@ -190,6 +191,7 @@ #define STR_PICTURE_MODE "Picture Mode" #define STR_CONTRAST "Contrast" +#define STR_BRIGHTNESS "Brightness" #define STR_LANGUAGE "Language" #define STR_LOCATION "Location" diff --git a/include/view/picture/view_picture_brightness.h b/include/view/picture/view_picture_brightness.h new file mode 100644 index 0000000..a77d873 --- /dev/null +++ b/include/view/picture/view_picture_brightness.h @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __AIR_SETTINGS_VIEW_PICTURE_BRIGHTNESS_H__ +#define __AIR_SETTINGS_VIEW_PICTURE_BRIGHTNESS_H__ + +#include "common/viewmgr.h" + +view_class *view_picture_brightness_get_vclass(void); + +#endif /* __AIR_SETTINGS_VIEW_PICTURE_BRIGHTNESS_H__ */ diff --git a/include/view/picture/view_picture_slider_generic.h b/include/view/picture/view_picture_slider_generic.h new file mode 100644 index 0000000..4b5e92f --- /dev/null +++ b/include/view/picture/view_picture_slider_generic.h @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef __AIR_SETTINGS_VIEW_PICTURE_SLIDER_GENERIC_H__ +#define __AIR_SETTINGS_VIEW_PICTURE_SLIDER_GENERIC_H__ + +#include "common/viewmgr.h" + +typedef void (*set_value)(int val); +typedef int (*get_value)(void); + +typedef struct { + const char *slider_title; + + int slider_min_val; + int slider_max_val; + int slider_cur_val; + int slider_step; + + set_value set_setting_value; + get_value get_setting_value; + + void *generic_slider_data; +} generic_slider_attr; + +view_class *view_picture_slider_generic_get_vclass(void); + +#endif /* __AIR_SETTINGS_VIEW_PICTURE_SLIDER_GENERIC_LAYOUT_H__ */ diff --git a/src/data/settings_picture.c b/src/data/settings_picture.c index 8d7379b..cd37b51 100644 --- a/src/data/settings_picture.c +++ b/src/data/settings_picture.c @@ -14,9 +14,29 @@ * limitations under the License. */ +#include #include "data/settings_picture.h" #include "app_debug.h" +#define DISPLAY_MAIN 0 +#define DEFAULT_MAX_BRIGHTNESS 100 + +/* Display error: + +device_display_get_numbers() function fails in device/display module on +ret = dbus_method_sync(DEVICED_BUS_NAME, + DEVICED_PATH_DISPLAY, DEVICED_INTERFACE_DISPLAY, + METHOD_GET_DISPLAY_COUNT, NULL, NULL); + +with the following error message +E/SYSTEM_DEVICE(28384): dbus.c: dbus_method_sync(131) > g_dbus_proxy_call_sync error : +org.tizen.system.deviced.display-GetDisplayCount (2-GDBus.Error:org.freedesktop.DBus.Error.ServiceUnknown: +The name org.tizen.system.deviced was not provided by any .service files) + +That's why all device_display_* functions invoked here don't work */ + + + /* Temporary - until real API is known */ static settings_picture_mode temp_mode = PICTURE_MODE_STANDARD; static int temp_contrast = 50; @@ -38,6 +58,21 @@ void settings_picture_set_contrast(int val) temp_contrast = val; } +void settings_picture_set_brightness(int val) +{ + int ret = DEVICE_ERROR_NONE; + int max = settings_picture_get_max_brightness(); + + if (max <= 0 || val < 0 || val > max) { + _ERR("Invalid parameters (max||val)"); + return; + } + + ret = device_display_set_brightness(DISPLAY_MAIN, val*max/100); + if (ret != DEVICE_ERROR_NONE) + _ERR("Failed to set brightness: %s", get_error_message(ret)); +} + settings_picture_mode settings_picture_get_picture_mode(void) { //@TODO: get picture mode @@ -49,3 +84,37 @@ int settings_picture_get_contrast(void) //@TODO: get contrast value return temp_contrast; } + +int settings_picture_get_brightness(void) +{ + int max, curr; + int ret = DEVICE_ERROR_NONE; + + max = settings_picture_get_max_brightness(); + if (max <= 0) { + _ERR("Invalid max brightness value"); + return 0; + } + + ret = device_display_get_brightness(0, &curr); + if (ret != DEVICE_ERROR_NONE) { + _ERR("Failed to get current brightness: %s", get_error_message(ret)); + return 0; + } + + return 100*curr/max; +} + +int settings_picture_get_max_brightness(void) +{ + int max; + int ret = DEVICE_ERROR_NONE; + + ret = device_display_get_max_brightness(0, &max); + if (ret != DEVICE_ERROR_NONE) { + _ERR("Failed to get max brightness: %s", get_error_message(ret)); + return DEFAULT_MAX_BRIGHTNESS; + } + + return max; +} diff --git a/src/layout/layout_picture.c b/src/layout/layout_picture.c index ad4b08d..524f580 100644 --- a/src/layout/layout_picture.c +++ b/src/layout/layout_picture.c @@ -15,7 +15,6 @@ */ #include -#include #include "common/layoutmgr.h" #include "common/inputmgr.h" @@ -30,7 +29,6 @@ #define PADDING_X 26 #define PADDING_Y 26 -#define BRIGHTNESS_DEFAULT "100%" #define SCREEN_DEFAULT "16:9" struct _priv { @@ -77,9 +75,9 @@ static struct menumgr_info menu_info[] = { }, { .id = MENU_BRIGHTNESS, - .title = "Brightness", + .title = STR_BRIGHTNESS, .style = STYLE_STATUS_BTN, - .disabled = EINA_TRUE, + .disabled = EINA_FALSE, .status = _get_brightness, .selected = _selected, }, @@ -144,32 +142,15 @@ static char *_get_contrast(void *data, int id) static char *_get_brightness(void *data, int id) { - SETTING_TRACE_BEGIN; - char str[1024]; - int max, v; - int r; - - r = device_display_get_numbers(&v); - if (r != DEVICE_ERROR_NONE) { - _ERR("failed to get number of display"); - return strdup(BRIGHTNESS_DEFAULT); - } + char b_str[5] = {0, }; + int b_val = settings_picture_get_brightness(); - r = device_display_get_max_brightness(0, &max); - if (r != DEVICE_ERROR_NONE) { - _ERR("failed to get max brightness"); - return strdup(BRIGHTNESS_DEFAULT); - } - - r = device_display_get_brightness(0, &v); - if (r != DEVICE_ERROR_NONE) { - _ERR("failed to get brightness"); - return strdup(BRIGHTNESS_DEFAULT); - } + if (b_val < 0) + return NULL; - snprintf(str, sizeof(str), "%d%%", 100 * v / max); + snprintf(b_str, sizeof(b_str), "%d%%", b_val); - return strdup(str); + return strdup(b_str); } static char *_get_screen_adj(void *data, int id) @@ -190,6 +171,10 @@ static void _selected(void *data, int id) if (!viewmgr_push_view(VIEW_PICTURE_CONTRAST)) _ERR("Push Picture contrast view failed."); break; + case MENU_BRIGHTNESS: + if (!viewmgr_push_view(VIEW_PICTURE_BRIGHTNESS)) + _ERR("Push Picture brightness view failed."); + break; } } diff --git a/src/main.c b/src/main.c index 3f8c691..fbada7f 100644 --- a/src/main.c +++ b/src/main.c @@ -23,6 +23,7 @@ #include "view/view_base.h" #include "view/picture/view_picture_mode.h" #include "view/picture/view_picture_contrast.h" +#include "view/picture/view_picture_brightness.h" #include "view/system/view_clock.h" #include "view/system/view_sleep_timer.h" #include "view/system/view_wakeup_timer.h" @@ -188,6 +189,13 @@ static bool _create_picture_ui(void) _ERR("Adding picture contrast view failed."); return false; } + + if (!viewmgr_add_view(view_picture_brightness_get_vclass(), NULL)) { + _ERR("Adding picture brightness view failed."); + return false; + } + + return true; } @@ -243,6 +251,9 @@ static void _destroy_picture_ui(void) if (!viewmgr_remove_view(VIEW_PICTURE_CONTRAST)) _ERR("Remove picture contrast view failed."); + + if (!viewmgr_remove_view(VIEW_PICTURE_BRIGHTNESS)) + _ERR("Remove picture brightness view failed."); } static void _destroy_system_ui(void) diff --git a/src/view/picture/view_picture_brightness.c b/src/view/picture/view_picture_brightness.c new file mode 100644 index 0000000..8627d99 --- /dev/null +++ b/src/view/picture/view_picture_brightness.c @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "view/picture/view_picture_brightness.h" + +#include + +#include "app_debug.h" +#include "define.h" +#include "common/inputmgr.h" +#include "common/utils.h" +#include "view/picture/view_picture_slider_generic.h" +#include "data/settings_picture.h" + +struct _priv { + Evas_Object *base; + void *base_view_data; + const view_class *base_view_class; +}; + +static Evas_Object *_create(Evas_Object *win, void *data) +{ + struct _priv *priv = NULL; + generic_slider_attr g_slider_attr = {0, }; + + if (!win) { + _ERR("Get window object failed."); + return NULL; + } + + priv = calloc(1, sizeof(struct _priv)); + if (!priv) { + _ERR("Calloc failed."); + return NULL; + } + + g_slider_attr.slider_title = STR_BRIGHTNESS; + g_slider_attr.slider_min_val = 0; + g_slider_attr.slider_max_val = settings_picture_get_max_brightness(); + g_slider_attr.slider_cur_val = 100; + g_slider_attr.set_setting_value = settings_picture_set_brightness; + g_slider_attr.get_setting_value = settings_picture_get_brightness; + + priv->base_view_class = view_picture_slider_generic_get_vclass(); + + if (!priv->base_view_class || !priv->base_view_class->create) { + _ERR("Failed to create generic slider view class."); + free(priv); + return NULL; + } + + priv->base = priv->base_view_class->create(win, &g_slider_attr); + if (!priv->base) { + _ERR("Failed to create brightness view"); + return NULL; + } + + priv->base_view_data = g_slider_attr.generic_slider_data; + + if (!viewmgr_set_view_data(VIEW_PICTURE_BRIGHTNESS, priv)) { + _ERR("Set view data failed."); + priv->base_view_class->destroy(priv->base_view_data); + free(priv); + return NULL; + } + + return priv->base; +} + +static void _show(void *data) +{ + struct _priv *priv = (struct _priv *)data; + + if (!priv || !priv->base_view_class || !priv->base_view_class->show + || !priv->base_view_data) { + _ERR("Invalid parameter."); + return; + } + + priv->base_view_class->show(priv->base_view_data); +} + +static void _hide(void *data) +{ + struct _priv *priv = (struct _priv *)data; + + if (!priv || !priv->base_view_class || !priv->base_view_class->hide + || !priv->base_view_data) { + _ERR("Invalid parameter."); + return; + } + + priv->base_view_class->hide(priv->base_view_data); +} + +static void _destroy(void *data) +{ + struct _priv *priv = (struct _priv *)data; + + if (!priv || !priv->base_view_class || !priv->base_view_class->destroy + || !priv->base_view_data) { + _ERR("Invalid parameter."); + return; + } + + priv->base_view_class->destroy(priv->base_view_data); + + free(priv); +} + +static view_class _vclass = { + .view_id = VIEW_PICTURE_BRIGHTNESS, + .create = _create, + .show = _show, + .hide = _hide, + .destroy = _destroy +}; + +view_class *view_picture_brightness_get_vclass(void) +{ + return &_vclass; +} diff --git a/src/view/picture/view_picture_contrast.c b/src/view/picture/view_picture_contrast.c index 7c78ce1..4e79aed 100644 --- a/src/view/picture/view_picture_contrast.c +++ b/src/view/picture/view_picture_contrast.c @@ -14,44 +14,27 @@ * limitations under the License. */ -#include "view/picture/view_picture_mode.h" +#include "view/picture/view_picture_contrast.h" #include -#include #include "app_debug.h" #include "define.h" #include "common/inputmgr.h" #include "common/utils.h" +#include "view/picture/view_picture_slider_generic.h" #include "data/settings_picture.h" -#define SLIDER_VAL_STR_L 4 - struct _priv { Evas_Object *base; - Evas_Object *slider; - - int slider_val; -}; - -enum picture_contrast_eo_type { - EO_PICTURE_CONTRAST_SLIDER -}; - -static void _key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, - Evas_Event_Key_Down *ev); -static void _changed_cb(int id, void *data, Evas_Object *obj); -static void _set_current_value_str_position(struct _priv *priv); -static void _update_slider_val(struct _priv *priv); - -static input_handler handler = { - .changed = _changed_cb, - .key_down = _key_down_cb + void *base_view_data; + const view_class *base_view_class; }; static Evas_Object *_create(Evas_Object *win, void *data) { struct _priv *priv = NULL; + generic_slider_attr g_slider_attr = {0, }; if (!win) { _ERR("Get window object failed."); @@ -64,30 +47,32 @@ static Evas_Object *_create(Evas_Object *win, void *data) return NULL; } - priv->base = utils_add_layout(win, GRP_VIEW_GENERIC_SLIDER, EINA_TRUE); - if (!priv->base) { - _ERR("Add layout failed."); - evas_object_del(priv->base); + g_slider_attr.slider_title = STR_CONTRAST; + g_slider_attr.slider_min_val = 0; + g_slider_attr.slider_max_val = 100; + g_slider_attr.slider_cur_val = 100; + g_slider_attr.set_setting_value = settings_picture_set_contrast; + g_slider_attr.get_setting_value = settings_picture_get_contrast; + + priv->base_view_class = view_picture_slider_generic_get_vclass(); + + if (!priv->base_view_class || !priv->base_view_class->create) { + _ERR("Failed to create generic slider view class."); free(priv); return NULL; } - elm_object_part_text_set(priv->base, PART_TEXT, STR_CONTRAST); - elm_object_part_text_set(priv->base, PART_VIEW_SLIDER_MIN, "0"); - elm_object_part_text_set(priv->base, PART_VIEW_SLIDER_MAX, "100"); - - priv->slider = utils_add_slider(priv->base, PART_CONTENT, 50, 0, 100, 1); - if (!priv->slider) { - _ERR("Add slider failed."); - evas_object_del(priv->slider); - free(priv); + priv->base = priv->base_view_class->create(win, &g_slider_attr); + if (!priv->base) { + _ERR("Failed to create contrast view"); return NULL; } - inputmgr_add_callback(priv->slider, EO_PICTURE_CONTRAST_SLIDER, &handler, priv); + + priv->base_view_data = g_slider_attr.generic_slider_data; if (!viewmgr_set_view_data(VIEW_PICTURE_CONTRAST, priv)) { _ERR("Set view data failed."); - evas_object_del(priv->base); + priv->base_view_class->destroy(priv->base_view_data); free(priv); return NULL; } @@ -99,40 +84,39 @@ static void _show(void *data) { struct _priv *priv = (struct _priv *)data; - if (!priv) { + if (!priv || !priv->base_view_class || !priv->base_view_class->show + || !priv->base_view_data) { _ERR("Invalid parameter."); return; } - evas_object_show(priv->base); - elm_object_focus_set(priv->slider, EINA_TRUE); - - priv->slider_val = settings_picture_get_contrast(); - _update_slider_val(priv); + priv->base_view_class->show(priv->base_view_data); } static void _hide(void *data) { struct _priv *priv = (struct _priv *)data; - if (!priv) { + if (!priv || !priv->base_view_class || !priv->base_view_class->hide + || !priv->base_view_data) { _ERR("Invalid parameter."); return; } - evas_object_hide(priv->base); + priv->base_view_class->hide(priv->base_view_data); } static void _destroy(void *data) { struct _priv *priv = (struct _priv *)data; - if (!priv) { + if (!priv || !priv->base_view_class || !priv->base_view_class->destroy + || !priv->base_view_data) { _ERR("Invalid parameter."); return; } - evas_object_del(priv->base); + priv->base_view_class->destroy(priv->base_view_data); free(priv); } @@ -149,61 +133,3 @@ view_class *view_picture_contrast_get_vclass(void) { return &_vclass; } - -static void _key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, - Evas_Event_Key_Down *ev) -{ - struct _priv *priv = (struct _priv *)data; - - if (!ev || !priv) { - _ERR("Invalid argument."); - return; - } - - if (!strcmp(ev->keyname, KEY_BACK) || (!strcmp(ev->keyname, KEY_ENTER))) - viewmgr_pop_view(); -} - -static void _changed_cb(int id, void *data, Evas_Object *obj) -{ - struct _priv *priv = (struct _priv *)data; - - if (!obj || !priv) { - _ERR("Invalid argument."); - return; - } - - priv->slider_val = (int)elm_slider_value_get(obj); - _set_current_value_str_position(priv); - settings_picture_set_contrast(priv->slider_val); -} - -static void _set_current_value_str_position(struct _priv *priv) -{ - char val_str[SLIDER_VAL_STR_L] = {0, }; - Edje_Message_Int msg = {0,}; - - if (!priv) { - _ERR("Invalid parameter."); - return; - } - - msg.val = priv->slider_val; - edje_object_message_send(elm_layout_edje_get(priv->base), EDJE_MESSAGE_INT, PIC_SLIDER_UPDATE_VAL, &msg); - - snprintf(val_str, SLIDER_VAL_STR_L, "%d", priv->slider_val); - elm_object_part_text_set(priv->base, PART_VIEW_SLIDER_CUR, val_str); -} - - -static void _update_slider_val(struct _priv *priv) -{ - if (!priv) { - _ERR("Invalid parameter."); - return; - } - - elm_slider_value_set(priv->slider, priv->slider_val); - - _set_current_value_str_position(priv); -} diff --git a/src/view/picture/view_picture_slider_generic.c b/src/view/picture/view_picture_slider_generic.c new file mode 100644 index 0000000..5867ed4 --- /dev/null +++ b/src/view/picture/view_picture_slider_generic.c @@ -0,0 +1,211 @@ +/* + * Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an AS IS BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "view/picture/view_picture_slider_generic.h" + +#include +#include + +#include "app_debug.h" +#include "define.h" +#include "common/inputmgr.h" +#include "common/utils.h" + +#define SLIDER_VAL_STR_L 4 + +struct _priv { + Evas_Object *base; + Evas_Object *slider; + + int slider_val; + + set_value settings_set_value; + get_value settings_get_value; +}; + +static void _key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, + Evas_Event_Key_Down *ev); +static void _changed_cb(int id, void *data, Evas_Object *obj); +static void _set_current_value_str_position(struct _priv *priv); +static void _update_slider_val(struct _priv *priv); + +static input_handler handler = { + .changed = _changed_cb, + .key_down = _key_down_cb +}; + +static Evas_Object *_create(Evas_Object *win, void *data) +{ + struct _priv *priv = NULL; + generic_slider_attr *attr = (generic_slider_attr *)data; + char slider_min_val_str[SLIDER_VAL_STR_L] = {0, }; + char slider_max_val_str[SLIDER_VAL_STR_L] = {0, }; + + if (!win || !attr) { + _ERR("Invalid parameter."); + return NULL; + } + + priv = calloc(1, sizeof(struct _priv)); + if (!priv) { + _ERR("Calloc failed."); + return NULL; + } + + priv->base = utils_add_layout(win, GRP_VIEW_GENERIC_SLIDER, EINA_TRUE); + if (!priv->base) { + _ERR("Add layout failed."); + free(priv); + return NULL; + } + + snprintf(slider_min_val_str, SLIDER_VAL_STR_L, "%d", attr->slider_min_val); + snprintf(slider_max_val_str, SLIDER_VAL_STR_L, "%d", attr->slider_max_val); + + elm_object_part_text_set(priv->base, PART_TEXT, attr->slider_title); + elm_object_part_text_set(priv->base, PART_VIEW_SLIDER_MIN, slider_min_val_str); + elm_object_part_text_set(priv->base, PART_VIEW_SLIDER_MAX, slider_max_val_str); + + priv->slider = utils_add_slider(priv->base, PART_CONTENT, 50, + attr->slider_min_val, attr->slider_max_val, attr->slider_step); + if (!priv->slider) { + _ERR("Add slider failed."); + evas_object_del(priv->slider); + free(priv); + return NULL; + } + inputmgr_add_callback(priv->slider, 0, &handler, priv); + + priv->settings_set_value = attr->set_setting_value; + priv->settings_get_value = attr->get_setting_value; + + attr->generic_slider_data = priv; + + return priv->base; +} + +static void _show(void *data) +{ + struct _priv *priv = (struct _priv *)data; + + if (!priv || !priv->settings_get_value) { + _ERR("Invalid parameter."); + return; + } + + evas_object_show(priv->base); + elm_object_focus_set(priv->slider, EINA_TRUE); + + priv->slider_val = priv->settings_get_value(); + _update_slider_val(priv); +} + +static void _hide(void *data) +{ + struct _priv *priv = (struct _priv *)data; + + if (!priv) { + _ERR("Invalid parameter."); + return; + } + + evas_object_hide(priv->base); +} + +static void _destroy(void *data) +{ + struct _priv *priv = (struct _priv *)data; + + if (!priv) { + _ERR("Invalid parameter."); + return; + } + + evas_object_del(priv->base); + + free(priv); +} + +static view_class _vclass = { + .view_id = NULL, + .create = _create, + .show = _show, + .hide = _hide, + .destroy = _destroy +}; + +view_class *view_picture_slider_generic_get_vclass(void) +{ + return &_vclass; +} + +static void _key_down_cb(int id, void *data, Evas *e, Evas_Object *obj, + Evas_Event_Key_Down *ev) +{ + struct _priv *priv = (struct _priv *)data; + + if (!ev || !priv) { + _ERR("Invalid argument."); + return; + } + + if (!strcmp(ev->keyname, KEY_BACK) || (!strcmp(ev->keyname, KEY_ENTER))) + viewmgr_pop_view(); +} + +static void _changed_cb(int id, void *data, Evas_Object *obj) +{ + struct _priv *priv = (struct _priv *)data; + + if (!obj || !priv || !priv->settings_set_value) { + _ERR("Invalid argument."); + return; + } + + priv->slider_val = (int)elm_slider_value_get(obj); + _set_current_value_str_position(priv); + priv->settings_set_value(priv->slider_val); +} + +static void _set_current_value_str_position(struct _priv *priv) +{ + char val_str[SLIDER_VAL_STR_L] = {0, }; + Edje_Message_Int msg = {0,}; + + if (!priv) { + _ERR("Invalid parameter."); + return; + } + + msg.val = priv->slider_val; + edje_object_message_send(elm_layout_edje_get(priv->base), EDJE_MESSAGE_INT, PIC_SLIDER_UPDATE_VAL, &msg); + + snprintf(val_str, SLIDER_VAL_STR_L, "%d", priv->slider_val); + elm_object_part_text_set(priv->base, PART_VIEW_SLIDER_CUR, val_str); +} + + +static void _update_slider_val(struct _priv *priv) +{ + if (!priv) { + _ERR("Invalid parameter."); + return; + } + + elm_slider_value_set(priv->slider, priv->slider_val); + + _set_current_value_str_position(priv); +} -- 2.7.4