rimmed pushed a commit to branch master.

http://git.enlightenment.org/tools/eflete.git/commit/?id=d6fb076ed139ce1326cd1506e2d80562f8af648c

commit d6fb076ed139ce1326cd1506e2d80562f8af648c
Author: Vitalii Vorobiov <[email protected]>
Date:   Tue Jan 19 16:43:19 2016 +0000

    property_group: add program filter
    
    Would sigsev on history revert to NULL, since edje_edit_..._filter_set would
    return false, when trying to reset back to NULL
---
 src/bin/ui/property_group.c | 108 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 108 insertions(+)

diff --git a/src/bin/ui/property_group.c b/src/bin/ui/property_group.c
index 26a8f54..969accd 100644
--- a/src/bin/ui/property_group.c
+++ b/src/bin/ui/property_group.c
@@ -210,6 +210,7 @@ struct _Group_Prop_Data
              Evas_Object *after_box;
              Evas_Object *afters_frame; /* it's a frame */
              Evas_Object *in_from, *in_range;
+             Evas_Object *filter_part, *filter_state;
         } program;
    } attributes;
 };
@@ -366,6 +367,12 @@ prop_program_targets_update(Group_Prop_Data *pd);
 static void
 prop_program_afters_update(Group_Prop_Data *pd);
 
+static void
+prop_program_filter_part_update(Group_Prop_Data *pd);
+
+static void
+prop_program_filter_state_update(Group_Prop_Data *pd);
+
 static Eina_Bool
 ui_property_state_obj_area_set(Evas_Object *property);
 
@@ -1036,7 +1043,11 @@ _on_editor_attribute_changed(void *data,
       case ATTRIBUTE_PROGRAM_TRANSITION_VALUE3:
       case ATTRIBUTE_PROGRAM_TRANSITION_VALUE4:
       case ATTRIBUTE_PROGRAM_FILTER_PART:
+         prop_program_filter_part_update(pd);
+         break;
       case ATTRIBUTE_PROGRAM_FILTER_STATE:
+         prop_program_filter_state_update(pd);
+         break;
       case ATTRIBUTE_PROGRAM_API_NAME:
       case ATTRIBUTE_PROGRAM_API_DESCRIPTION:
       case ATTRIBUTE_PROGRAM_NAME:
@@ -1954,9 +1965,102 @@ prop_program_action_add(Evas_Object *parent, 
Group_Prop_Data *pd)
    return item;
 }
 
+#define PROGRAM_ATTR_1COMBOBOX_CALLBACK(SUB, VALUE, MEMBER, DESCRIPTION, 
UPDATE) \
+static void \
+_on_##MEMBER##_##VALUE##_change(void *data, \
+                                Evas_Object *obj __UNUSED__, \
+                                void *ei) \
+{ \
+   Group_Prop_Data *pd = (Group_Prop_Data *)data; \
+   Ewe_Combobox_Item *item = ei; \
+   Eina_Bool isNone = false; \
+   Eina_Stringshare *old_val = 
edje_edit_##SUB##_##VALUE##_get(pd->group->edit_object \
+         PROGRAM_ARGS); \
+   if (((item->index != 0) && (item->title == old_val)) /*stringshares*/ || \
+       ((item->index == 0) && (old_val == NULL))) \
+     { \
+       eina_stringshare_del(old_val); \
+       return; \
+     } \
+   eina_stringshare_del(old_val); \
+   isNone = !strcmp(item->title, _("None")); \
+   Eina_Stringshare *msg = eina_stringshare_printf(DESCRIPTION, isNone ? NULL 
: item->title); \
+   Change *change = change_add(msg); \
+   eina_stringshare_del(msg); \
+   editor_##SUB##_##VALUE##_set(pd->group->edit_object, change, false 
PROGRAM_ARGS, \
+         isNone ? NULL : item->title); \
+   history_change_add(pd->group->history, change); \
+   evas_object_smart_callback_call(ap.win, SIGNAL_PROPERTY_ATTRIBUTE_CHANGED, 
NULL); \
+   UPDATE \
+}
+
 PROGRAM_MULTIPLE_COMBOBOX(target, "Previous_Target", _("target can be part or 
program"), true)
 PROGRAM_MULTIPLE_COMBOBOX(after, "Previous_After", _("after can be program"), 
false)
 
+static void
+prop_program_filter_part_update(Group_Prop_Data *pd)
+{
+   Part *part;
+   Eina_List *l;
+   Eina_Stringshare *value;
+   ewe_combobox_items_list_free(pd->attributes.program.filter_part, true);
+   value = edje_edit_program_filter_part_get(pd->group->edit_object 
PROGRAM_ARGS);
+   ewe_combobox_item_add(pd->attributes.program.filter_part, _("None"));
+   ewe_combobox_text_set(pd->attributes.program.filter_part, value ? value : 
_("None"));
+   EINA_LIST_FOREACH(pd->group->parts, l, part)
+     {
+        ewe_combobox_item_add(pd->attributes.program.filter_part, part->name);
+     }
+   edje_edit_string_free(value);
+}
+
+static void
+prop_program_filter_state_update(Group_Prop_Data *pd)
+{
+   Part *part;
+   State *state;
+   Eina_List *l;
+   Eina_Stringshare *value, *part_name;
+   ewe_combobox_items_list_free(pd->attributes.program.filter_state, true);
+   part_name = edje_edit_program_filter_part_get(pd->group->edit_object 
PROGRAM_ARGS);
+   if (!part_name)
+     {
+        elm_object_disabled_set(pd->attributes.program.filter_state, true);
+        return;
+     }
+   else
+     elm_object_disabled_set(pd->attributes.program.filter_state, false);
+
+   value = edje_edit_program_filter_state_get(pd->group->edit_object 
PROGRAM_ARGS);
+   ewe_combobox_text_set(pd->attributes.program.filter_state, value);
+   part = pm_resource_unsorted_get(pd->group->parts, part_name);
+   EINA_LIST_FOREACH(part->states, l, state)
+     {
+        ewe_combobox_item_add(pd->attributes.program.filter_state, 
state->parsed_name);
+     }
+   edje_edit_string_free(value);
+   edje_edit_string_free(part_name);
+}
+
+#define UPDATE_PROGRAM_FILTER_STATE \
+  prop_program_filter_state_update(pd);
+
+#define PROGRAM_ATTR_2COMBOBOX(TEXT, SUB, VALUE1, VALUE2, MEMBER, TOOLTIP1, 
TOOLTIP2, DESCRIPTION1, DESCRIPTION2, LABEL1, LABEL2) \
+   PROGRAM_ATTR_1COMBOBOX_CALLBACK(SUB, VALUE1, MEMBER, DESCRIPTION1, 
UPDATE_PROGRAM_FILTER_STATE) \
+   PROGRAM_ATTR_1COMBOBOX_CALLBACK(SUB, VALUE2, MEMBER, DESCRIPTION2, ) \
+   PROGRAM_2COMBOBOX_ADD(TEXT, SUB, VALUE1, VALUE2, MEMBER, TOOLTIP1, 
TOOLTIP2, LABEL1, LABEL2)
+
+PROGRAM_ATTR_2COMBOBOX(_("filter"), program, filter_part, filter_state, 
program,
+                       _("Filter signals to be only accepted if the part is "
+                         "in certain state (part value)"),
+                       _("Filter signals to be only accepted if the part is "
+                         "in certain state (state value)"),
+                       _("filter part changed to \"%s\""),
+                       _("filter state changed to \"%s\""),
+                       _("part:"), _("state:"))
+
+#undef UPDATE_PROGRAM_FILTER_STATE
+
 #define PROGRAM_ATTR_2SPINNER(TEXT, SUB, VALUE1, VALUE2, MEMBER, MIN, MAX, 
STEP, FMT, \
                               L1_START, L1_END, L2_START, L2_END, TOOLTIP1, 
TOOLTIP2, MULTIPLIER, \
                               TYPE, DESC1, DESC2) \
@@ -1997,6 +2101,8 @@ _ui_property_program_set(Evas_Object *property, const 
char *program)
         elm_box_pack_end(box, item);
         item = prop_program_action_add(box, pd);
         elm_box_pack_end(box, item);
+        item = prop_program_filter_part_filter_state_add(box, pd);
+        elm_box_pack_end(box, item);
         FRAME_PROPERTY_ADD(box, pd->attributes.program.action_params, true, 
_("Action params"), pd->scroller)
         elm_object_style_set(pd->attributes.program.action_params, 
"outdent_top");
         elm_box_pack_end(box,pd->attributes.program.action_params);
@@ -2034,6 +2140,8 @@ _ui_property_program_set(Evas_Object *property, const 
char *program)
         prop_program_signal_update(pd);
         prop_program_source_update(pd);
         prop_program_action_update(pd);
+        prop_program_filter_part_update(pd);
+        prop_program_filter_state_update(pd);
         prop_program_targets_update(pd);
         prop_program_afters_update(pd);
      }

-- 


Reply via email to