aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorDavid Walter Seikel2014-05-12 08:29:43 +1000
committerDavid Walter Seikel2014-05-12 08:29:43 +1000
commit3314ac30f127e43d279b4e4384ee98389c4b137a (patch)
tree00b2ff8471dc33a745036857dc8da47716e6ec6c
parentwidgetAdd now does the box / grid decision, and some oter things moved into it. (diff)
downloadSledjHamr-3314ac30f127e43d279b4e4384ee98389c4b137a.zip
SledjHamr-3314ac30f127e43d279b4e4384ee98389c4b137a.tar.gz
SledjHamr-3314ac30f127e43d279b4e4384ee98389c4b137a.tar.bz2
SledjHamr-3314ac30f127e43d279b4e4384ee98389c4b137a.tar.xz
Move poor mans introspection into winFang.c, and use it in purkle.
-rw-r--r--src/GuiLua/GuiLua.c10
-rw-r--r--src/extantz/files.c2
-rw-r--r--src/libraries/SledjHamr.h3
-rw-r--r--src/libraries/winFang.c92
-rw-r--r--src/libraries/winFang.h29
-rw-r--r--src/purkle/purkle.c26
6 files changed, 112 insertions, 50 deletions
diff --git a/src/GuiLua/GuiLua.c b/src/GuiLua/GuiLua.c
index 06bc516..c845ff1 100644
--- a/src/GuiLua/GuiLua.c
+++ b/src/GuiLua/GuiLua.c
@@ -173,20 +173,16 @@ static void _on_click(void *data, Evas_Object *obj, void *event_info EINA_UNUSED
173static int widget(lua_State *L) 173static int widget(lua_State *L)
174{ 174{
175 winFang *win = NULL; 175 winFang *win = NULL;
176 Widget *wid;
176 char *type = "button"; 177 char *type = "button";
177 char *title = ":"; 178 char *title = ":";
178 int x = -1, y = -1, w = -1, h = -1; 179 int x = -1, y = -1, w = -1, h = -1;
179 180
180 pull_lua(L, 1, "*window $type $title %x %y %w %h", &win, &type, &title, &x, &y, &w, &h); 181 pull_lua(L, 1, "*window $type $title %x %y %w %h", &win, &type, &title, &x, &y, &w, &h);
181 182
182 // Poor mans introspection, until I write real introspection into EFL. 183 wid = widgetAdd(win, type, title, x, y, w, h);
183 // TODO - The alternative is to just lookup the ELM_*_CLASS in a hash table? 184 if (wid)
184 if (strcmp(type, "button") == 0)
185 { 185 {
186 Widget *wid;
187
188 // These two lines are likely the only ones that will be different for the different sorts of widgets.
189 wid = widgetAdd(win, ELM_OBJ_BUTTON_CLASS, title, x, y, w, h);
190 evas_object_smart_callback_add(wid->obj, "clicked", _on_click, wid); 186 evas_object_smart_callback_add(wid->obj, "clicked", _on_click, wid);
191 wid->data = L; 187 wid->data = L;
192 188
diff --git a/src/extantz/files.c b/src/extantz/files.c
index 9678e3e..1990091 100644
--- a/src/extantz/files.c
+++ b/src/extantz/files.c
@@ -148,7 +148,7 @@ winFang *filesAdd(globals *ourGlobals, char *path, Eina_Bool multi, Eina_Bool sa
148 148
149 me = winFangAdd(ourGlobals->mainWindow, ourGlobals->win_w - 380, ourGlobals->win_w - 530, 300, 500, "file selector", "files", ourGlobals->world); 149 me = winFangAdd(ourGlobals->mainWindow, ourGlobals->win_w - 380, ourGlobals->win_w - 530, 300, 500, "file selector", "files", ourGlobals->world);
150 150
151 wid = widgetAdd(me, ELM_OBJ_FILESELECTOR_CLASS, NULL, -1, -1, -1, -1); 151 wid = widgetAdd(me, WT_FILES, NULL, -1, -1, -1, -1);
152 fs = wid->obj; 152 fs = wid->obj;
153 wid->data = ourGlobals; 153 wid->data = ourGlobals;
154 wid->on_del = _on_fs_del; 154 wid->on_del = _on_fs_del;
diff --git a/src/libraries/SledjHamr.h b/src/libraries/SledjHamr.h
index 956b37e..aee845d 100644
--- a/src/libraries/SledjHamr.h
+++ b/src/libraries/SledjHamr.h
@@ -14,6 +14,9 @@
14#include <Elementary.h> 14#include <Elementary.h>
15 15
16 16
17#define ARRAY_LENGTH(array) (sizeof(array) / sizeof(*array))
18
19
17void HamrTime(void *elm_main, char *domain); 20void HamrTime(void *elm_main, char *domain);
18 21
19#endif 22#endif
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
diff --git a/src/libraries/winFang.h b/src/libraries/winFang.h
index 1bdef20..edec11b 100644
--- a/src/libraries/winFang.h
+++ b/src/libraries/winFang.h
@@ -8,6 +8,8 @@
8/* Enable access to unstable EFL EO API. */ 8/* Enable access to unstable EFL EO API. */
9#define EFL_EO_API_SUPPORT 1 9#define EFL_EO_API_SUPPORT 1
10 10
11#define ARRAY_LENGTH(array) (sizeof(array) / sizeof(*array))
12
11 13
12#include <Eo.h> 14#include <Eo.h>
13#include <Eina.h> 15#include <Eina.h>
@@ -24,6 +26,29 @@
24#define WF_SWALLOW "winFang/content" 26#define WF_SWALLOW "winFang/content"
25 27
26 28
29typedef struct _widgetSpec
30{
31 char *name;
32 const Eo_Class *klass;
33} widgetSpec;
34
35#define WT_CHECK "check"
36#define WT_BOX "box"
37#define WT_BUTTON "button"
38#define WT_FILES "files"
39#define WT_ENTRY "entry"
40#define WT_GRID "grid"
41#define WT_HOVER "hoversel"
42#define WT_IMAGE "image"
43#define WT_LABEL "label"
44#define WT_LAYOUT "layout"
45#define WT_RADIO "radio"
46#define WT_RECT "rectangle"
47#define WT_TEXT "text"
48#define WT_TEXTBOX "textbox"
49#define WT_TOOLBAR "toolbar"
50
51
27typedef struct _winFang 52typedef struct _winFang
28{ 53{
29 Evas *e; 54 Evas *e;
@@ -48,6 +73,7 @@ typedef struct _winFang
48typedef struct _Widget 73typedef struct _Widget
49{ 74{
50 char magic[8]; 75 char magic[8];
76 char type[16];
51 Evas_Object *obj; 77 Evas_Object *obj;
52 78
53 char *label, *look, *action, *help; 79 char *label, *look, *action, *help;
@@ -67,6 +93,7 @@ void winFangShow(winFang *win);
67void winFangCalcMinSize(winFang *win); 93void winFangCalcMinSize(winFang *win);
68void winFangDel(winFang *win); 94void winFangDel(winFang *win);
69 95
70Widget *widgetAdd(winFang *win, const Eo_Class *klass, char *title, int x, int y, int w, int h); 96Widget *widgetAdd(winFang *win, char *type, char *title, int x, int y, int w, int h);
97void widgetDel(Widget *wid);
71 98
72#endif 99#endif
diff --git a/src/purkle/purkle.c b/src/purkle/purkle.c
index 7bd47e7..2ee4964 100644
--- a/src/purkle/purkle.c
+++ b/src/purkle/purkle.c
@@ -4,36 +4,20 @@
4#include "winFang.h" 4#include "winFang.h"
5 5
6 6
7// TODO - This is to work around a bug in Elm entry, remove it when the bug is fixed.
8// The bug is that editable entry widgets cause the app to hang on exit.
9static void _on_entry_del(void *data, Evas_Object *obj, void *event_info)
10{
11// winFang *me = data;
12
13 elm_entry_editable_set(obj, EINA_FALSE);
14}
15
16static winFang *purkleAdd(winFang *parent, int w, int h, EPhysics_World *world) 7static winFang *purkleAdd(winFang *parent, int w, int h, EPhysics_World *world)
17{ 8{
18 winFang *me; 9 winFang *me;
19 Widget *wid; 10 Widget *wid;
20 Evas_Object *en;
21 11
22 me = winFangAdd(parent, 30, 590, w, h, "chatter box", "purkle", world); 12 me = winFangAdd(parent, 30, 590, w, h, "chatter box", "purkle", world);
23 13
24 en = eo_add(ELM_OBJ_ENTRY_CLASS, me->win, 14 wid = widgetAdd(me, WT_TEXTBOX, "History is shown here", -1, -1, -1, -1);
15 eo_do(wid->obj,
25 elm_obj_entry_scrollable_set(EINA_TRUE), 16 elm_obj_entry_scrollable_set(EINA_TRUE),
26 elm_obj_entry_editable_set(EINA_FALSE), 17 elm_obj_entry_editable_set(EINA_FALSE)
27 evas_obj_size_hint_weight_set(EVAS_HINT_EXPAND, EVAS_HINT_EXPAND),
28 evas_obj_size_hint_align_set(EVAS_HINT_FILL, EVAS_HINT_FILL),
29 evas_obj_visibility_set(EINA_TRUE)
30 ); 18 );
31 elm_object_text_set(en, "History is shown here");
32 elm_layout_box_append(me->win, WF_BOX, en);
33 eo_unref(en);
34 19
35 wid = widgetAdd(me, ELM_OBJ_ENTRY_CLASS, "", -1, -1, -1, -1); 20 wid = widgetAdd(me, WT_ENTRY, "", -1, -1, -1, -1);
36 wid->on_del = _on_entry_del;
37 eo_do(wid->obj, 21 eo_do(wid->obj,
38 elm_obj_entry_scrollable_set(EINA_TRUE), 22 elm_obj_entry_scrollable_set(EINA_TRUE),
39 elm_obj_entry_editable_set(EINA_TRUE) 23 elm_obj_entry_editable_set(EINA_TRUE)
@@ -45,7 +29,7 @@ static winFang *purkleAdd(winFang *parent, int w, int h, EPhysics_World *world)
45} 29}
46 30
47static const char *ourName = "purkle"; 31static const char *ourName = "purkle";
48int skang, _M; 32static int skang, _M;
49 33
50int luaopen_purkle(lua_State *L) 34int luaopen_purkle(lua_State *L)
51{ 35{