2 * Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved.
4 * Licensed under the LGPL License, Version 2.1 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * https://www.gnu.org/licenses/
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 #include <Elementary.h>
18 #include "lottieview.h"
22 #include <sys/types.h>
29 typedef struct _AppInfo AppInfo;
36 Eina_Bool autoPlaying;
39 typedef struct _ItemData ItemData;
45 std::vector<std::string> jsonFiles;
46 bool renderMode = true;
49 _layout_del_cb(void *data, Evas *, Evas_Object *, void *)
51 AppInfo *info = (AppInfo *)data;
52 if (info->view) delete info->view;
55 ecore_evas_data_set(info->ee, "AppInfo", NULL);
61 _update_frame_info(AppInfo *info, double pos)
63 int frameNo = pos * info->view->getTotalFrame();
66 sprintf(buf, "%d / %ld", frameNo, info->view->getTotalFrame());
67 elm_object_part_text_set(info->layout, "text", buf);
71 _toggle_start_button(AppInfo *info)
73 if (!info->autoPlaying)
75 info->autoPlaying = EINA_TRUE;
77 elm_object_text_set(info->button, "Stop");
81 info->autoPlaying = EINA_FALSE;
83 elm_object_text_set(info->button, "Start");
88 _ee_pre_render_cb(Ecore_Evas *ee)
90 AppInfo *info = (AppInfo *)ecore_evas_data_get(ee, "AppInfo");
92 if (info && info->autoPlaying && info->view)
94 float pos = info->view->getPos();
95 _update_frame_info(info, pos);
96 elm_slider_value_set(info->slider, (double)pos);
100 _toggle_start_button(info);
105 _slider_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
107 double val = elm_slider_value_get(obj);
108 AppInfo *info = (AppInfo *)data;
110 _update_frame_info(info, val);
112 if (!info->autoPlaying)
114 info->view->seek(val);
115 info->view->render();
120 _button_clicked_cb(void *data, Evas_Object *obj, void *event_info)
122 AppInfo *info = (AppInfo *)data;
124 _toggle_start_button(info);
128 create_layout(Evas_Object *parent, const char *file)
130 Evas_Object *layout, *slider, *image, *button;
134 AppInfo *info = (AppInfo *)calloc(sizeof(AppInfo), 1);
137 layout = elm_layout_add(parent);
138 evas_object_show(layout);
139 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
141 std::string edjPath = DEMO_DIR;
142 edjPath +="layout.edj";
144 elm_layout_file_set(layout, edjPath.c_str(), "layout");
147 LottieView *view = new LottieView(evas_object_evas_get(layout), renderMode);
148 std::string filePath = DEMO_DIR;
151 view->setFilePath(filePath.c_str());
152 view->setSize(500, 500);
154 //IMAGE from LOTTIEVIEW
155 image = view->getImage();
156 evas_object_show(image);
157 evas_object_size_hint_min_set(image, 500, 500);
158 elm_object_part_content_set(layout, "lottie", image);
161 slider = elm_slider_add(layout);
162 elm_object_part_content_set(layout, "slider", slider);
163 evas_object_smart_callback_add(slider, "changed", _slider_cb, (void *)info);
165 button = elm_button_add(layout);
166 elm_object_text_set(button, "Start");
167 elm_object_part_content_set(layout, "button", button);
168 evas_object_smart_callback_add(button, "clicked", _button_clicked_cb, (void *)info);
170 e = evas_object_evas_get(layout);
171 ee = ecore_evas_ecore_evas_get(e);
172 ecore_evas_data_set(ee, "AppInfo", info);
173 ecore_evas_callback_pre_render_set(ee, _ee_pre_render_cb);
176 info->layout = layout;
177 info->slider = slider;
178 info->button = button;
180 evas_object_event_callback_add(layout, EVAS_CALLBACK_DEL, _layout_del_cb, (void *)info);
182 sprintf(buf, "%d / %ld", 0, view->getTotalFrame());
183 elm_object_part_text_set(layout, "text", buf);
192 _gl_selected_cb(void *data, Evas_Object *obj, void *event_info)
194 Evas_Object *nf = (Evas_Object *)data;
195 Elm_Object_Item *it = (Elm_Object_Item *)event_info;
196 elm_genlist_item_selected_set(it, EINA_FALSE);
198 Evas_Object *layout = create_layout(nf, jsonFiles[elm_genlist_item_index_get(it) - 1].c_str());
199 elm_naviframe_item_push(nf, NULL, NULL, NULL, layout, NULL);
203 _gl_text_get(void *data, Evas_Object *obj, const char *part)
205 ItemData *id = (ItemData *) data;
206 return strdup(jsonFiles[id->index].c_str());
210 _gl_del(void *data, Evas_Object *obj)
215 elm_main(int argc EINA_UNUSED, char **argv EINA_UNUSED)
217 Evas_Object *win, *nf, *genlist;
218 Elm_Genlist_Item_Class *itc = elm_genlist_item_class_new();
224 if (!strcmp(argv[1], "--disable-render"))
229 elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED);
230 win = elm_win_util_standard_add("lottie", "LottieViewer");
231 elm_win_autodel_set(win, EINA_TRUE);
232 evas_object_resize(win, 500, 700);
233 evas_object_show(win);
236 nf = elm_naviframe_add(win);
237 evas_object_size_hint_weight_set(nf, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
238 elm_win_resize_object_add(win, nf);
239 evas_object_show(nf);
242 genlist = elm_genlist_add(nf);
243 elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS);
244 evas_object_smart_callback_add(genlist, "selected", _gl_selected_cb, nf);
246 itc->item_style = "default";
247 itc->func.text_get = _gl_text_get;
248 itc->func.del = _gl_del;
250 std::string rscPath = DEMO_DIR;
252 dir = opendir(rscPath.c_str());
253 while ((ent = readdir(dir)) != NULL) {
254 if (!strncmp(ent->d_name + (strlen(ent->d_name) - 4), "json", 4)) {
255 jsonFiles.push_back(ent->d_name);
260 std::sort(jsonFiles.begin(), jsonFiles.end(), [](auto & a, auto &b){return a < b;});
262 for (uint i = 0; i < jsonFiles.size(); i++) {
263 itemData = (ItemData *)calloc(sizeof(ItemData), 1);
265 elm_genlist_item_append(genlist, itc, (void *)itemData, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
268 elm_naviframe_item_push(nf, "Lottie Viewer", NULL, NULL, genlist, NULL);