hermet pushed a commit to branch master.

http://git.enlightenment.org/tools/enventor.git/commit/?id=528389b95c0201bab1229dbd27465d4faff28e15

commit 528389b95c0201bab1229dbd27465d4faff28e15
Author: Jaehyun Cho <[email protected]>
Date:   Fri Dec 19 14:36:49 2014 +0900

    ctxpopup: Support toggle candidate.
    
    Summary:
    Support toggle candidate.
             @feature
    
    Reviewers: Hermet
    
    Differential Revision: https://phab.enlightenment.org/D1789
---
 data/themes/default/layout_common.edc | 85 +++++++++++++++++++++++++++++++++
 src/lib/ctxpopup.c                    | 90 +++++++++++++++++++++++++++++++++++
 src/lib/edc_parser.c                  |  6 +--
 src/lib/enventor_private.h            | 15 +++---
 4 files changed, 186 insertions(+), 10 deletions(-)

diff --git a/data/themes/default/layout_common.edc 
b/data/themes/default/layout_common.edc
index 6cfeeb1..8564cc1 100644
--- a/data/themes/default/layout_common.edc
+++ b/data/themes/default/layout_common.edc
@@ -1559,6 +1559,91 @@ group { name: "preview_layout";
    }
 }
 
+group { name: "toggle_layout";
+   parts {
+      part { name: "base";
+         type: RECT;
+         scale: 1;
+         description { state: "default" 0.0;
+            min: 150 1;
+            color: 56 56 56 255;
+         }
+         description { state: "odd" 0.0;
+            inherit: "default" 0.0;
+            color: 64 64 64 255;
+         }
+      }
+      part { name: "text_base";
+         type: SPACER;
+         description { state: "default" 0.0;
+            rel1.to: "base";
+            rel2.to: "base";
+            rel2.relative: 0.0 1.0;
+            align: 0.0 0.5;
+            min: 35 0;
+            fixed: 1 0;
+         }
+      }
+      part { name: "elm.text.type";
+         type: TEXT;
+         description { state: "default" 0.0;
+            rel1.to: "text_base";
+            rel1.offset: 5 0;
+            rel2.to: "text_base";
+            align: 0.0 0.5;
+            fixed: 1 0;
+            text {
+               font: FN;
+               size: 10;
+               align: 0.0 0.5;
+               min: 1 0;
+               ellipsis: -1;
+            }
+            color: COL_NM;
+         }
+      }
+      part { name: "padding1";
+         type: SPACER;
+         description { state: "default" 0.0;
+            rel1.to: "text_base";
+            rel1.relative: 1.0 0.0;
+            rel2.to: "text_base";
+            align: 0.0 0.5;
+            min: 5 0;
+            fixed: 1 0;
+         }
+      }
+      part { name: "elm.swallow.toggle";
+         type: SWALLOW;
+         description { state: "default" 0.0;
+            rel1.to: "padding1";
+            rel1.relative: 1.0 0.0;
+            rel2.to: "padding2";
+            rel2.relative: 0.0 1.0;
+         }
+      }
+      part { name: "padding2";
+         type: SPACER;
+         description { state: "default" 0.0;
+            rel1.to: "base";
+            rel1.relative: 1.0 0.0;
+            rel2.to: "base";
+            align: 1.0 0.5;
+            min: 5 0;
+            fixed: 1 0;
+         }
+      }
+   }
+   programs {
+      program { name: "odd_item_set";
+         signal: "odd,item,set";
+         source: "";
+         action: STATE_SET "odd" 0.0;
+         target: "base";
+      }
+   }
+}
+
 group { name: "slider_layout";
    parts {
       part { name: "base";
diff --git a/src/lib/ctxpopup.c b/src/lib/ctxpopup.c
index 66463c7..f513d15 100644
--- a/src/lib/ctxpopup.c
+++ b/src/lib/ctxpopup.c
@@ -78,6 +78,37 @@ ctxpopup_it_cb(void *data, Evas_Object *obj, void 
*event_info)
 }
 
 static void
+toggle_dismiss_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+   attr_value *attr = data;
+   Evas_Object *box = elm_object_content_get(obj);
+   Evas_Object *layout;
+   Evas_Object *toggle;
+   Eina_List *box_children = elm_box_children_get(box);
+   Eina_List *l;
+   char candidate[512];
+   char buf[128];
+
+   if (eina_list_count(box_children) == 0) return;
+
+   snprintf(candidate, sizeof(candidate), "%s", attr->prepend_str);
+
+   EINA_LIST_FOREACH(box_children, l, layout)
+     {
+        toggle = elm_object_part_content_get(layout,
+                                             "elm.swallow.toggle");
+        snprintf(buf, sizeof(buf), "%d", (int) elm_check_state_get(toggle));
+        strcat(candidate, buf);
+        strcat(candidate, " ");
+     }
+   candidate[strlen(candidate) - 1] = '\0'; //Remove last appended " ".
+   strcat(candidate, attr->append_str);
+
+   ctxpopup_data *ctxdata = evas_object_data_get(obj, "ctxpopup_data");
+   ctxdata->selected_cb(ctxdata->data, obj, candidate);
+}
+
+static void
 slider_dismiss_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
 {
    attr_value *attr = data;
@@ -172,6 +203,60 @@ entry_changed_cb(void *data, Evas_Object *obj, void 
*event_info)
 }
 
 static Evas_Object *
+toggle_layout_create(Evas_Object *parent, attr_value *attr,
+                     const char *type, Eina_Bool toggle_val)
+{
+   //Layout
+   Evas_Object *layout = elm_layout_add(parent);
+   elm_layout_file_set(layout, EDJE_PATH, "toggle_layout");
+   evas_object_show(layout);
+
+   //Type
+   if (type)
+     elm_object_part_text_set(layout, "elm.text.type", type);
+
+   //Toggle
+   Evas_Object *toggle = elm_check_add(layout);
+   elm_object_style_set(toggle, "toggle");
+   elm_object_part_text_set(toggle, "on", "Enable");
+   elm_object_part_text_set(toggle, "off", "Disable");
+   elm_check_state_set(toggle, toggle_val);
+   evas_object_data_set(toggle, "attr", attr);
+   elm_object_part_content_set(layout, "elm.swallow.toggle", toggle);
+
+   return layout;
+}
+
+static void
+toggle_layout_set(Evas_Object *ctxpopup, attr_value *attr)
+{
+   Eina_Stringshare *type;
+   Eina_Array_Iterator itr;
+   unsigned int i;
+
+   //Box
+   Evas_Object *box = elm_box_add(ctxpopup);
+   evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND,
+                                    EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   evas_object_show(box);
+
+   //Layout
+   Evas_Object *layout;
+   EINA_ARRAY_ITER_NEXT(attr->strs, i, type, itr)
+     {
+        layout = toggle_layout_create(box, attr, type,
+                                      (Eina_Bool) roundf(attr->val[i]));
+        if (i % 2) elm_object_signal_emit(layout, "odd,item,set", "");
+        elm_box_pack_end(box, layout);
+     }
+
+   elm_object_content_set(ctxpopup, box);
+   evas_object_smart_callback_add(ctxpopup, "dismissed", toggle_dismiss_cb,
+                                  (void *) attr);
+}
+
+static Evas_Object *
 slider_layout_create(Evas_Object *parent, attr_value *attr,
                      const char *type, double slider_val, Eina_Bool integer)
 {
@@ -533,6 +618,11 @@ ctxpopup_candidate_list_create(edit_data *ed, attr_value 
*attr,
 
    switch (attr->type)
      {
+        case ATTR_VALUE_BOOLEAN:
+          {
+             toggle_layout_set(ctxpopup, attr);
+             break;
+          }
         case ATTR_VALUE_INTEGER:
           {
              slider_layout_set(ctxpopup, attr, EINA_TRUE);
diff --git a/src/lib/edc_parser.c b/src/lib/edc_parser.c
index a5df883..e4ec313 100644
--- a/src/lib/edc_parser.c
+++ b/src/lib/edc_parser.c
@@ -453,7 +453,7 @@ type_init_thread_blocking(void *data, Ecore_Thread *thread 
EINA_UNUSED)
    attr.value.cnt = 1;
    attr.value.min = 0;
    attr.value.max = 1;
-   attr.value.type = ATTR_VALUE_INTEGER;
+   attr.value.type = ATTR_VALUE_BOOLEAN;
    attr.value.prepend_str = ATTR_PREPEND_COLON;
    attr.value.append_str = ATTR_APPEND_SEMICOLON;
    eina_inarray_push(td->attrs, &attr);
@@ -468,7 +468,7 @@ type_init_thread_blocking(void *data, Ecore_Thread *thread 
EINA_UNUSED)
    attr.value.cnt = 2;
    attr.value.min = 0;
    attr.value.max = 1;
-   attr.value.type = ATTR_VALUE_INTEGER;
+   attr.value.type = ATTR_VALUE_BOOLEAN;
    attr.value.prepend_str = ATTR_PREPEND_COLON;
    attr.value.append_str = ATTR_APPEND_SEMICOLON;
    eina_inarray_push(td->attrs, &attr);
@@ -526,7 +526,7 @@ type_init_thread_blocking(void *data, Ecore_Thread *thread 
EINA_UNUSED)
    attr.value.cnt = 1;
    attr.value.min = 0;
    attr.value.max = 1;
-   attr.value.type = ATTR_VALUE_INTEGER;
+   attr.value.type = ATTR_VALUE_BOOLEAN;
    attr.value.prepend_str = ATTR_PREPEND_COLON;
    attr.value.append_str = ATTR_APPEND_SEMICOLON;
    eina_inarray_push(td->attrs, &attr);
diff --git a/src/lib/enventor_private.h b/src/lib/enventor_private.h
index 2c78646..a45f9e1 100644
--- a/src/lib/enventor_private.h
+++ b/src/lib/enventor_private.h
@@ -41,13 +41,14 @@ typedef struct editor_s edit_data;
 
 typedef enum attr_value_type
 {
-   ATTR_VALUE_INTEGER = 1,
-   ATTR_VALUE_FLOAT = 2,
-   ATTR_VALUE_CONSTANT = 4,
-   ATTR_VALUE_PART = 8,
-   ATTR_VALUE_STATE = 16,
-   ATTR_VALUE_IMAGE = 32,
-   ATTR_VALUE_PROGRAM = 64
+   ATTR_VALUE_BOOLEAN = 1,
+   ATTR_VALUE_INTEGER = 2,
+   ATTR_VALUE_FLOAT = 4,
+   ATTR_VALUE_CONSTANT = 8,
+   ATTR_VALUE_PART = 16,
+   ATTR_VALUE_STATE = 32,
+   ATTR_VALUE_IMAGE = 64,
+   ATTR_VALUE_PROGRAM = 128
 } attr_value_type;
 
 struct attr_value_s

-- 


Reply via email to