aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src/libraries/winFang.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libraries/winFang.c')
-rw-r--r--src/libraries/winFang.c92
1 files changed, 72 insertions, 20 deletions
diff --git a/src/libraries/winFang.c b/src/libraries/winFang.c
index 4eb4a7b..d7feb39 100644
--- a/src/libraries/winFang.c
+++ b/src/libraries/winFang.c
@@ -1,6 +1,8 @@
1#include "winFang.h" 1#include "winFang.h"
2 2
3 3
4
5
4static void _checkWindowBounds(winFang *win, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h) 6static void _checkWindowBounds(winFang *win, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h)
5{ 7{
6 Evas_Object *test; 8 Evas_Object *test;
@@ -341,43 +343,93 @@ void winFangDel(winFang *win)
341 EINA_CLIST_FOR_EACH_ENTRY(wid, &win->widgets, Widget, node) 343 EINA_CLIST_FOR_EACH_ENTRY(wid, &win->widgets, Widget, node)
342 { 344 {
343 if (wid->on_del) wid->on_del(wid, wid->obj, NULL); 345 if (wid->on_del) wid->on_del(wid, wid->obj, NULL);
346 widgetDel(wid);
344 eo_unref(wid->obj); 347 eo_unref(wid->obj);
345 } 348 }
346 if (win->on_del) win->on_del(win, win->win, NULL); 349 if (win->on_del) win->on_del(win, win->win, NULL);
347 evas_object_del(win->win); 350 evas_object_del(win->win);
348} 351}
349 352
350Widget *widgetAdd(winFang *win, const Eo_Class *klass, char *title, int x, int y, int w, int h) 353
354static widgetSpec widgetClasses[15];
355
356Widget *widgetAdd(winFang *win, char *type , char *title, int x, int y, int w, int h)
351{ 357{
352 Widget *result; 358 Widget *result;
359 const Eo_Class *klass = NULL;
360 int i;
353 361
354 result = calloc(1, sizeof(Widget)); 362 // Poor mans introspection.
355 strcpy(result->magic, "Widget"); 363 if (NULL == widgetClasses[0].name)
356 eina_clist_add_head(&win->widgets, &result->node); 364 {
357 365 i = 0;
358 result->obj = eo_add(klass, win->win, 366 widgetClasses[i].name = WT_CHECK; widgetClasses[i++].klass = ELM_OBJ_CHECK_CLASS;
359 evas_obj_size_hint_weight_set(EVAS_HINT_EXPAND, EVAS_HINT_EXPAND), 367 widgetClasses[i].name = WT_BOX; widgetClasses[i++].klass = ELM_OBJ_BOX_CLASS;
360 evas_obj_size_hint_align_set(EVAS_HINT_FILL, EVAS_HINT_FILL), 368 widgetClasses[i].name = WT_BUTTON; widgetClasses[i++].klass = ELM_OBJ_BUTTON_CLASS;
361 evas_obj_visibility_set(EINA_TRUE), 369 widgetClasses[i].name = WT_ENTRY; widgetClasses[i++].klass = ELM_OBJ_ENTRY_CLASS;
362 eo_key_data_set("Widget", result, NULL) 370 widgetClasses[i].name = WT_FILES; widgetClasses[i++].klass = ELM_OBJ_FILESELECTOR_CLASS;
363 ); 371 widgetClasses[i].name = WT_GRID; widgetClasses[i++].klass = ELM_OBJ_GRID_CLASS;
372 widgetClasses[i].name = WT_HOVER; widgetClasses[i++].klass = ELM_OBJ_HOVERSEL_CLASS;
373 widgetClasses[i].name = WT_IMAGE; widgetClasses[i++].klass = ELM_OBJ_IMAGE_CLASS;
374 widgetClasses[i].name = WT_LABEL; widgetClasses[i++].klass = ELM_OBJ_LABEL_CLASS;
375 widgetClasses[i].name = WT_LAYOUT; widgetClasses[i++].klass = ELM_OBJ_LAYOUT_CLASS;
376 widgetClasses[i].name = WT_RADIO; widgetClasses[i++].klass = ELM_OBJ_RADIO_CLASS;
377 widgetClasses[i].name = WT_RECT; widgetClasses[i++].klass = EVAS_OBJ_RECTANGLE_CLASS;
378 widgetClasses[i].name = WT_TEXT; widgetClasses[i++].klass = EVAS_OBJ_TEXT_CLASS;
379 widgetClasses[i].name = WT_TEXTBOX; widgetClasses[i++].klass = ELM_OBJ_ENTRY_CLASS;
380 widgetClasses[i].name = WT_TOOLBAR; widgetClasses[i++].klass = ELM_OBJ_TOOLBAR_CLASS;
381 }
364 382
365 if (x < 0) 383 for (i = 0; i < ARRAY_LENGTH(widgetClasses); i++)
366 elm_layout_box_append(win->win, WF_BOX, result->obj); 384 {
367 else 385 if (strcmp(type, widgetClasses[i].name) == 0)
368 elm_grid_pack(win->grid, result->obj, x, y, w, h); 386 {
369 winFangCalcMinSize(win); 387 klass = widgetClasses[i].klass;
388 break;
389 }
390 }
370 391
371 if (title) 392 if (klass)
372 { 393 {
373 result->label = strdup(title); 394 result = calloc(1, sizeof(Widget));
374 elm_object_text_set(result->obj, result->label); 395 strcpy(result->magic, "Widget");
375 evas_object_name_set(result->obj, title); 396 strcpy(result->type, type);
397 eina_clist_add_head(&win->widgets, &result->node);
398
399 result->obj = eo_add(klass, win->win,
400 evas_obj_size_hint_weight_set(EVAS_HINT_EXPAND, EVAS_HINT_EXPAND),
401 evas_obj_size_hint_align_set(EVAS_HINT_FILL, EVAS_HINT_FILL),
402 evas_obj_visibility_set(EINA_TRUE),
403 eo_key_data_set("Widget", result, NULL)
404 );
405
406 if (x < 0)
407 elm_layout_box_append(win->win, WF_BOX, result->obj);
408 else
409 elm_grid_pack(win->grid, result->obj, x, y, w, h);
410 winFangCalcMinSize(win);
411
412 if (title)
413 {
414 result->label = strdup(title);
415 elm_object_text_set(result->obj, result->label);
416 evas_object_name_set(result->obj, title);
417 }
376 } 418 }
377 419
378 return result; 420 return result;
379} 421}
380 422
423void widgetDel(Widget *wid)
424{
425 if (wid)
426 {
427 // TODO - This is to work around a bug in Elm entry, remove it when the bug is fixed.
428 // The bug is that editable entry widgets cause the app to hang on exit.
429 if (strcmp(WT_ENTRY, wid->type) == 0)
430 elm_entry_editable_set(wid->obj, EINA_FALSE);
431 }
432}
381 433
382/* CALLBACK types 434/* CALLBACK types
383 435