From f644b3c86e34dca52a4dba30edf8b36cf91e45f5 Mon Sep 17 00:00:00 2001 From: Gustavo Sverzut Barbieri Date: Fri, 1 Jan 2010 01:12:53 +0000 Subject: [PATCH] connman popup to give useful information, last commit this year! SVN revision: 44837 --- data/themes/default.edc | 395 +++++++++++++++++++++++++++++++ src/modules/connman/e_mod_main.c | 228 +++++++++++------- src/modules/connman/e_mod_main.h | 3 + 3 files changed, 545 insertions(+), 81 deletions(-) diff --git a/data/themes/default.edc b/data/themes/default.edc index e73c41f1c..041988833 100644 --- a/data/themes/default.edc +++ b/data/themes/default.edc @@ -6935,6 +6935,32 @@ collections { /* begin the collection of edje groups that are in this file */ } } +// GADGET and TIP all have the same parts and signals: +// +// SIGNALS: +// e,unavailable: connmand is not running (nothing else works) +// e,available: connmand is running +// +// e,changed,offline_mode,{yes,no} +// e,changed,technology,{wifi,ethernet,bluetooth,wimax,cellular} +// e,changed,state,{idle,association,configuration,ready,disconnect,failure} +// e,changed,mode,{managed,adhoc,gprs,edge,umts} +// e,changed,security,{none,wep,psk,ieee8021x,wpa,rsn} +// e,changed,favorite,{yes,no} +// e,changed,auto_connect,{yes,no} +// e,changed,pass_required,{yes,no} +// e,changed,error,{yes,no} +// e,changed,ipv4_address,{yes,no} +// +// PARTS: +// e.text.name +// e.text.error +// e.text.technology +// e.text.state +// e.text.ipv4_address +// +// MESSAGES: +// id=1, type=MSG_INT, description=strength (0-100) group { name: "e/modules/connman/main"; images { image: "connman-disconnect.png" COMP; @@ -7124,6 +7150,375 @@ collections { /* begin the collection of edje groups that are in this file */ } } + group { name: "e/modules/connman/tip"; + images { + image: "base_bg.png" COMP; + image: "connman-disconnect.png" COMP; + image: "connman-ethernet.png" COMP; + image: "connman-wifi.png" COMP; + } + min: 300 128; + script { + public message(Msg_Type:type, id, ...) { + if ((type == MSG_INT) && (id == 1)) { + new strength; + new buf[32]; + + strength = getarg(2); + + if (strength > 0) { + snprintf(buf, sizeof(buf), "%d%%", strength); + set_text(PART:"strength", buf); + emit("strength,show", ""); + } else + emit("strength,hide", ""); + } + } + } + + parts { + part { name: "base"; + mouse_events: 0; + description { state: "default" 0.0; + align: 0.5 0.0; + color_class: "menu_base"; + image { + normal: "base_bg.png"; + border: 2 2 2 2; + } + fill.smooth: 0; + } + } + + part { name: "state-clipper"; + type: RECT; + mouse_events: 0; + description { + state: "default" 0.0; + color: 255 255 255 255; + } + description { + state: "pulse" 0.0; + color: 255 255 255 128; + } + } + programs { + program { name: "e,changed,state,ready"; + signal: "e,changed,state,ready"; + source: "e"; + script { + stop_program(PROGRAM:"state,pulse,0"); + stop_program(PROGRAM:"state,pulse,1"); + } + after: "state,ready,apply"; + } + program { name: "state,ready,apply"; + action: STATE_SET "default" 0.0; + target: "state-clipper"; + transition: LINEAR 0.1; + } + + program { name: "e,changed,state,association"; + signal: "e,changed,state,association"; + source: "e"; + after: "state,pulse,0"; + } + program { name: "e,changed,state,configuration"; + signal: "e,changed,state,configuration"; + source: "e"; + after: "state,pulse,0"; + } + + program { name: "state,pulse,0"; + action: STATE_SET "default" 0.0; + target: "state-clipper"; + transition: LINEAR 0.8; + after: "state,pulse,1"; + } + program { name: "state,pulse,1"; + action: STATE_SET "pulse" 0.0; + target: "state-clipper"; + transition: LINEAR 0.8; + after: "state,pulse,0"; + } + } + + part { name: "technology"; + type: IMAGE; + mouse_events: 0; + clip_to: "state-clipper"; + description { + state: "default" 0.0; + image.normal: "connman-disconnect.png"; + min: 128 128; + max: 128 128; + align: 0.0 0.0; + fixed: 1 1; + rel1 { + relative: 0.0 0.0; + offset: 10 10; + } + rel2 { + relative: 0.0 0.0; + offset: 137 137; + } + } + description { + state: "ethernet" 0.0; + inherit: "default" 0.0; + image.normal: "connman-ethernet.png"; + } + description { + state: "wifi" 0.0; + inherit: "default" 0.0; + image.normal: "connman-wifi.png"; + } + // TODO: wimax, cellular, bluetooth + } + programs { + program { name: "e,changed,technology,none"; + signal: "e,changed,technology,none"; + source: "e"; + action: STATE_SET "default" 0.0; + target: "technology"; + } + program { name: "e,changed,technology,ethernet"; + signal: "e,changed,technology,ethernet"; + source: "e"; + action: STATE_SET "ethernet" 0.0; + target: "technology"; + } + program { name: "e,changed,technology,wifi"; + signal: "e,changed,technology,wifi"; + source: "e"; + action: STATE_SET "wifi" 0.0; + target: "technology"; + } + } + + part { name: "e.text.name"; + type: TEXT; + mouse_events: 0; + effect: SOFT_SHADOW; + description { + state: "default" 0.0; + color: 224 224 224 255; + color3: 0 0 0 64; + align: 0.0 0.0; + rel1 { + to_x: "technology"; + relative: 1.0 0.0; + offset: 10 10; + } + rel2 { + relative: 1.0 0.0; + offset: -10 30; + } + text { + font: "Sans:style=Bold"; + size: 14; + align: 0.0 0.0; + text: ""; + min: 1 1; + } + } + } + + part { name: "e.text.state"; + type: TEXT; + mouse_events: 0; + description { + state: "default" 0.0; + color: 96 96 96 255; + align: 0.0 0.0; + rel1 { + to_x: "technology"; + to_y: "e.text.name"; + relative: 1.0 1.0; + offset: 10 10; + } + rel2 { + to_y: "e.text.name"; + relative: 1.0 1.0; + offset: -10 25; + } + text { + font: "Sans"; + size: 10; + align: 0.0 0.0; + text: ""; + min: 1 1; + } + } + } + + part { name: "strength"; + type: TEXT; + mouse_events: 0; + description { + state: "default" 0.0; + color: 96 96 96 255; + align: 0.0 0.0; + fixed: 1 1; + rel1 { + to_x: "technology"; + to_y: "e.text.state"; + relative: 1.0 1.0; + offset: 10 10; + } + rel2 { + to_y: "e.text.state"; + relative: 1.0 1.0; + offset: -10 25; + } + text { + font: "Sans"; + size: 10; + align: 0.0 0.0; + text: ""; + min: 1 1; + } + } + description { + state: "hidden" 0.0; + inherit: "default" 0.0; + visible: 0; + rel2 { /* = rel1 */ + to_x: "technology"; + to_y: "e.text.name"; + relative: 0.0 1.0; + offset: 10 10; + } + } + } + + programs { + program { name: "strength,show"; + signal: "strength,show"; + action: STATE_SET "default" 0.0; + target: "strength"; + } + program { name: "strength,hide"; + signal: "strength,show"; + action: STATE_SET "hidden" 0.0; + target: "strength"; + } + } + + part { name: "e.text.error"; + type: TEXT; + mouse_events: 0; + description { + state: "default" 0.0; + color: 255 96 96 255; + align: 0.0 0.0; + fixed: 1 1; + rel1 { + to_x: "technology"; + to_y: "strength"; + relative: 1.0 1.0; + offset: 10 10; + } + rel2 { + to_y: "strength"; + relative: 1.0 1.0; + offset: -10 25; + } + text { + font: "Sans"; + size: 10; + align: 0.0 0.0; + text: ""; + min: 1 1; + } + } + description { + state: "hidden" 0.0; + inherit: "default" 0.0; + visible: 0; + max: 0 0; + rel2 { /* = rel1 */ + to_x: "technology"; + to_y: "strength"; + relative: 1.0 1.0; + offset: 10 10; + } + } + } + + programs { + program { name: "e,changed,error,yes"; + signal: "e,changed,error,yes"; + source: "e"; + action: STATE_SET "default" 0.0; + target: "e.text.error"; + } + program { name: "e,changed,error,no"; + signal: "e,changed,error,no"; + source: "e"; + action: STATE_SET "hidden" 0.0; + target: "e.text.error"; + } + } + + part { name: "e.text.ipv4_address"; + type: TEXT; + mouse_events: 0; + description { + state: "default" 0.0; + color: 96 96 96 255; + align: 0.0 0.0; + fixed: 1 1; + rel1 { + to_x: "technology"; + to_y: "e.text.error"; + relative: 1.0 1.0; + offset: 10 10; + } + rel2 { + to_y: "e.text.error"; + relative: 1.0 1.0; + offset: -10 25; + } + text { + font: "Sans"; + size: 10; + align: 0.0 0.0; + text: ""; + min: 1 1; + } + } + description { + state: "hidden" 0.0; + inherit: "default" 0.0; + max: 0 0; + visible: 0; + rel2 { /* = rel1 */ + to_x: "technology"; + to_y: "strength"; + relative: 1.0 1.0; + offset: 10 10; + } + } + } + + programs { + program { name: "e,changed,ipv4_address,yes"; + signal: "e,changed,ipv4_address,yes"; + source: "e"; + action: STATE_SET "default" 0.0; + target: "e.text.ipv4_address"; + } + program { name: "e,changed,ipv4_address,no"; + signal: "e,changed,ipv4_address,no"; + source: "e"; + action: STATE_SET "hidden" 0.0; + target: "e.text.ipv4_address"; + } + } + } + } + ///////////////////////////////////////////////////////////////////////////// /*** MOD: CONF_EDGEBINDINGS ***/ diff --git a/src/modules/connman/e_mod_main.c b/src/modules/connman/e_mod_main.c index 9646a9f76..5dd4b3d1d 100644 --- a/src/modules/connman/e_mod_main.c +++ b/src/modules/connman/e_mod_main.c @@ -16,8 +16,7 @@ * 1. improve gadget ui * * GOOD: - * 1. mouse over popup with information such as IP and AP name - * (remove name from gadget) + * 1. imporve mouse over popup ui * 2. nice popup using edje objects as rows, not simple lists (fancy) * 3. "Controls" for detailed information, similar to Mixer app * it would contain switches to toggle offline and choose @@ -44,6 +43,7 @@ static const char *e_str_failure = NULL; static void _connman_default_service_changed_delayed(E_Connman_Module_Context *ctxt); static void _connman_gadget_update(E_Connman_Instance *inst); +static void _connman_tip_update(E_Connman_Instance *inst); static const char * e_connman_theme_path(void) @@ -827,132 +827,194 @@ _connman_cb_mouse_down(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNU } static void -_connman_gadget_update(E_Connman_Instance *inst) +_connman_cb_mouse_in(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event __UNUSED__) +{ + E_Connman_Instance *inst = data; + Evas *e; + + if (inst->tip) + return; + + inst->tip = e_gadcon_popup_new(inst->gcc); + if (!inst->tip) return; + + e = inst->tip->win->evas; + + inst->o_tip = edje_object_add(e); + e_theme_edje_object_set(inst->o_tip, "base/theme/modules/connman/tip", + "e/modules/connman/tip"); + + _connman_tip_update(inst); + + e_gadcon_popup_content_set(inst->tip, inst->o_tip); + e_gadcon_popup_show(inst->tip); +} + +static void +_connman_cb_mouse_out(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event __UNUSED__) +{ + E_Connman_Instance *inst = data; + + if (!inst->tip) + return; + + evas_object_del(inst->o_tip); + e_object_del(E_OBJECT(inst->tip)); + inst->tip = NULL; + inst->o_tip = NULL; +} + +static void +_connman_edje_view_update(E_Connman_Instance *inst, Evas_Object *o) { E_Connman_Module_Context *ctxt = inst->ctxt; - Evas_Object *gadget = inst->ui.gadget; const E_Connman_Service *service; Edje_Message_Int msg; char buf[128]; - printf("\033[1;33mUPDATE GADGET\033[0m\n"); - if (!ctxt->has_manager) { - if (inst->popup) - _connman_popup_del(inst); - - edje_object_signal_emit(gadget, "e,unavailable", "e"); - edje_object_part_text_set(gadget, "e.text.name", _("No ConnMan")); - edje_object_part_text_set(gadget, "e.text.error", + edje_object_signal_emit(o, "e,unavailable", "e"); + edje_object_part_text_set(o, "e.text.name", _("No ConnMan")); + edje_object_part_text_set(o, "e.text.error", _("No ConnMan server found.")); - } - - if (inst->popup) - _connman_popup_update(inst); - - edje_object_signal_emit(gadget, "e,available", "e"); - - if (ctxt->offline_mode) - edje_object_signal_emit(gadget, "e,changed,offline_mode,yes", "e"); - else - edje_object_signal_emit(gadget, "e,changed,offline_mode,no", "e"); - - - printf("DBG CONNMAN: technology: %s\n", ctxt->technology); - - if (ctxt->technology) - { - edje_object_part_text_set(gadget, "e.text.technology", - ctxt->technology); - snprintf(buf, sizeof(buf), "e,changed,technology,%s", - ctxt->technology); - edje_object_signal_emit(gadget, buf, "e"); - } - else - { - edje_object_part_text_set(gadget, "e.text.technology", ""); - edje_object_signal_emit(gadget, "e,changed,technology,none", "e"); - } - - service = ctxt->default_service; - printf("DBG CONNMAN: default_service: %p (%s)\n", service, service ? service->name : ""); - if (!service) - { - edje_object_part_text_set(gadget, "e.text.name", _("No Connection")); - edje_object_signal_emit(gadget, "e,changed,service,none", "e"); return; } - printf("\033[0mDBG CONNMAN: service details:\n" - " state: %s\n" - " type: %s\n" - " error: %s\n" - " security: %s\n" - " strength: %hhu\n" - " flags: favorite=%hhu, auto_connect=%hhu, pass_required=%hhu\033[0m\n", - service->state, - service->type, - service->error, - service->security, - service->strength, - service->favorite, - service->auto_connect, - service->pass_required); + edje_object_signal_emit(o, "e,available", "e"); + + if (ctxt->offline_mode) + edje_object_signal_emit(o, "e,changed,offline_mode,yes", "e"); + else + edje_object_signal_emit(o, "e,changed,offline_mode,no", "e"); + + if (ctxt->technology) + { + edje_object_part_text_set(o, "e.text.technology", + ctxt->technology); + snprintf(buf, sizeof(buf), "e,changed,technology,%s", + ctxt->technology); + edje_object_signal_emit(o, buf, "e"); + } + else + { + edje_object_part_text_set(o, "e.text.technology", ""); + edje_object_signal_emit(o, "e,changed,technology,none", "e"); + } + + service = ctxt->default_service; + if (!service) + { + edje_object_part_text_set(o, "e.text.name", _("No Connection")); + edje_object_signal_emit(o, "e,changed,service,none", "e"); + + edje_object_part_text_set(o, "e.text.error", _("Not connected")); + edje_object_signal_emit(o, "e,changed,error,no", "e"); + + edje_object_signal_emit(o, "e,changed,mode,no", "e"); + + edje_object_signal_emit(o, "e,changed,mode,none", "e"); + edje_object_signal_emit(o, "e,changed,security,none", "e"); + + edje_object_part_text_set(o, "e.text.ipv4_address", ""); + edje_object_signal_emit(o, "e,changed,ipv4_address,no", "e"); + + edje_object_signal_emit(o, "e,changed,favorite,no", "e"); + edje_object_signal_emit(o, "e,changed,auto_connect,no", "e"); + edje_object_signal_emit(o, "e,changed,pass_required,no", "e"); + + return; + } if (service->name) - edje_object_part_text_set(gadget, "e.text.name", service->name); + edje_object_part_text_set(o, "e.text.name", service->name); else - edje_object_part_text_set(gadget, "e.text.name", _("Unknown Name")); + edje_object_part_text_set(o, "e.text.name", _("Unknown Name")); if (service->error) { - edje_object_part_text_set(gadget, "e.text.error", service->error); - edje_object_signal_emit(gadget, "e,changed,error,yes", "e"); + edje_object_part_text_set(o, "e.text.error", service->error); + edje_object_signal_emit(o, "e,changed,error,yes", "e"); } else { - edje_object_part_text_set(gadget, "e.text.error", _("No error")); - edje_object_signal_emit(gadget, "e,changed,error,no", "e"); + edje_object_part_text_set(o, "e.text.error", _("No error")); + edje_object_signal_emit(o, "e,changed,error,no", "e"); } snprintf(buf, sizeof(buf), "e,changed,service,%s", service->type); - edje_object_signal_emit(gadget, buf, "e"); + edje_object_signal_emit(o, buf, "e"); snprintf(buf, sizeof(buf), "e,changed,state,%s", service->state); - edje_object_signal_emit(gadget, buf, "e"); - printf("DBG CONNMAN signal: %s\n", buf); + edje_object_signal_emit(o, buf, "e"); + edje_object_part_text_set(o, "e.text.state", service->state); if (service->mode) { snprintf(buf, sizeof(buf), "e,changed,mode,%s", service->mode); - edje_object_signal_emit(gadget, buf, "e"); + edje_object_signal_emit(o, buf, "e"); } + else + edje_object_signal_emit(o, "e,changed,mode,none", "e"); if (service->security) { snprintf(buf, sizeof(buf), "e,changed,security,%s", service->security); - edje_object_signal_emit(gadget, buf, "e"); + edje_object_signal_emit(o, buf, "e"); + } + else + edje_object_signal_emit(o, "e,changed,security,none", "e"); + + if (service->ipv4_address) + { + edje_object_part_text_set(o, "e.text.ipv4_address", service->ipv4_address); + edje_object_signal_emit(o, "e,changed,ipv4_address,yes", "e"); + } + else + { + edje_object_part_text_set(o, "e.text.ipv4_address", ""); + edje_object_signal_emit(o, "e,changed,ipv4_address,no", "e"); } if (service->favorite) - edje_object_signal_emit(gadget, "e,changed,favorite,yes", "e"); + edje_object_signal_emit(o, "e,changed,favorite,yes", "e"); else - edje_object_signal_emit(gadget, "e,changed,favorite,no", "e"); + edje_object_signal_emit(o, "e,changed,favorite,no", "e"); if (service->auto_connect) - edje_object_signal_emit(gadget, "e,changed,auto_connect,yes", "e"); + edje_object_signal_emit(o, "e,changed,auto_connect,yes", "e"); else - edje_object_signal_emit(gadget, "e,changed,auto_connect,no", "e"); + edje_object_signal_emit(o, "e,changed,auto_connect,no", "e"); if (service->pass_required) - edje_object_signal_emit(gadget, "e,changed,pass_required,yes", "e"); + edje_object_signal_emit(o, "e,changed,pass_required,yes", "e"); else - edje_object_signal_emit(gadget, "e,changed,pass_required,no", "e"); - + edje_object_signal_emit(o, "e,changed,pass_required,no", "e"); msg.val = service->strength; - edje_object_message_send(gadget, EDJE_MESSAGE_INT, 1, &msg); + edje_object_message_send(o, EDJE_MESSAGE_INT, 1, &msg); +} + +static void +_connman_tip_update(E_Connman_Instance *inst) +{ + _connman_edje_view_update(inst, inst->o_tip); +} + +static void +_connman_gadget_update(E_Connman_Instance *inst) +{ + E_Connman_Module_Context *ctxt = inst->ctxt; + + if (!ctxt->has_manager && inst->popup) + _connman_popup_del(inst); + + if (inst->popup) + _connman_popup_update(inst); + if (inst->tip) + _connman_tip_update(inst); + + _connman_edje_view_update(inst, inst->ui.gadget); } /* Gadcon Api Functions */ @@ -979,6 +1041,10 @@ _gc_init(E_Gadcon *gc, const char *name, const char *id, const char *style) evas_object_event_callback_add (inst->ui.gadget, EVAS_CALLBACK_MOUSE_DOWN, _connman_cb_mouse_down, inst); + evas_object_event_callback_add + (inst->ui.gadget, EVAS_CALLBACK_MOUSE_IN, _connman_cb_mouse_in, inst); + evas_object_event_callback_add + (inst->ui.gadget, EVAS_CALLBACK_MOUSE_OUT, _connman_cb_mouse_out, inst); _connman_gadget_update(inst); diff --git a/src/modules/connman/e_mod_main.h b/src/modules/connman/e_mod_main.h index 306e71196..39708cb44 100644 --- a/src/modules/connman/e_mod_main.h +++ b/src/modules/connman/e_mod_main.h @@ -41,6 +41,9 @@ struct E_Connman_Instance Ecore_Event_Handler *key_down; } input; } ui; + + E_Gadcon_Popup *tip; + Evas_Object *o_tip; }; struct E_Connman_Service