seoz pushed a commit to branch master.

commit 8bebdc139801cc8933f6af907e4b84cf539b1106
Author: Niraj Kumar <[email protected]>
Date:   Tue Sep 10 15:47:13 2013 +0900

    progressbar: Support second progress.
    
    This can be used by video/audio streaming such as youtube.
---
 AUTHORS                             |   1 +
 ChangeLog                           |   5 +
 NEWS                                |   1 +
 data/themes/widgets/progressbar.edc | 434 ++++++++++++++++++++++++++++++++++++
 src/bin/test.c                      |   2 +
 src/bin/test_progressbar.c          | 116 +++++++++-
 src/lib/elm_authors.h               |   1 +
 src/lib/elm_progressbar.c           | 123 +++++++++-
 src/lib/elm_progressbar_eo.h        |  34 +++
 src/lib/elm_progressbar_legacy.h    |  33 +++
 src/lib/elm_widget_progressbar.h    |   9 +
 11 files changed, 750 insertions(+), 9 deletions(-)

diff --git a/AUTHORS b/AUTHORS
index 926275f..a98a82e 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -81,3 +81,4 @@ Stefan Schmidt <[email protected]>
 Ryuan Choi (ryuan) <[email protected]> <[email protected]>
 Hosang Kim <[email protected]>
 Youngbok Shin <[email protected]>
+Niraj Kumar <[email protected]> <[email protected]>
diff --git a/ChangeLog b/ChangeLog
index 1718c8c..d957f29 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1593,3 +1593,8 @@
 2013-09-07  Shinwoo Kim
 
         * elm_access : delete access object in job when its hover object is 
deleted
+
+2013-09-10  Niraj Kumar
+
+        * ProgressBar: Added support for more than one progress status  in  a
+          single progress bar
diff --git a/NEWS b/NEWS
index 30d5df0..2a3ed46 100644
--- a/NEWS
+++ b/NEWS
@@ -86,6 +86,7 @@ Additions:
    * Add selectraise feature to gengrid.
    * Add bg reset feature.
    * Add elm_object_item_object_get().
+   * Added support for more than one progress status in a progressbar.
 
 Improvements:
 
diff --git a/data/themes/widgets/progressbar.edc 
b/data/themes/widgets/progressbar.edc
index 1f88ef2..ff3b535 100644
--- a/data/themes/widgets/progressbar.edc
+++ b/data/themes/widgets/progressbar.edc
@@ -848,3 +848,437 @@ group { name: "elm/progressbar/horizontal/wheel";
 
 
 ///////////////////////////////////////////////////////////////////////////////
+group { name: "elm/progressbar/horizontal/recording";
+   images {
+      image: "shelf_inset.png" COMP;
+      image: "bt_sm_base2.png" COMP;
+      image: "flip_shad.png" COMP;
+   }
+   parts {
+      part { name: "elm.background.progressbar";
+         type: RECT;
+         mouse_events: 0;
+         description { state: "default" 0.0;
+            rel1 {
+               relative: 0.0 0.0;
+               offset: 0 0;
+            }
+            rel2 {
+               relative: 1.0 1.0;
+            }
+         }
+      }
+      part { name: "elm.swallow.bar";
+         mouse_events: 0;
+         scale: 1;
+         type: SWALLOW;
+         description {
+            min: 48 28;
+            max: 99999 28; state: "default" 0.0;
+            rel1 {
+               to_x: "elm.text";
+               to_y: "elm.background.progressbar";
+               relative: 1.0 0.0;
+            }
+            rel2 {
+               to: "elm.background.progressbar";
+               relative: 1.0 1.0;
+            }
+         }
+      }
+      part { name: "elm.swallow.content";
+         type: SWALLOW;
+         description { state: "default" 0.0;
+            visible: 0;
+            align: 0.0 0.5;
+            rel1 {
+               offset: 4 0;
+               to_y: "elm.background.progressbar";
+            }
+            rel2 {
+               offset: 3 -1;
+               relative: 0.0 1.0;
+               to_y: "elm.background.progressbar";
+            }
+         }
+         description { state: "visible" 0.0;
+            inherit: "default" 0.0;
+            visible: 1;
+            aspect: 1.0 1.0;
+            aspect_preference: VERTICAL;
+            rel2.offset: 4 -1;
+         }
+      }
+      part { name: "elm.text";
+         type: TEXT;
+         mouse_events: 0;
+         scale: 1;
+         description { state: "default" 0.0;
+            visible: 0;
+            fixed: 1 1;
+            align: 0.0 0.5;
+            rel1.to_x: "elm.swallow.content";
+            rel1.relative: 1.0 0.0;
+            rel1.offset: -1 4;
+            rel2.to_x: "elm.swallow.content";
+            rel2.relative: 1.0 1.0;
+            rel2.offset: -1 -5;
+            color: 0 0 0 255;
+            text {
+               font: "Sans,Edje-Vera";
+               size: 10;
+               min: 0 0;
+               align: 0.0 0.5;
+            }
+         }
+         description { state: "visible" 0.0;
+            inherit: "default" 0.0;
+            visible: 1;
+            text.min: 1 1;
+            rel1.offset: 0 4;
+            rel2.offset: 0 -5;
+         }
+      }
+      part { name: "background";
+         mouse_events: 0;
+         clip_to: "elm.background.progressbar";
+         description {
+            state: "default" 0.0;
+            rel1 {
+               to: "elm.swallow.bar";
+               relative: 0.0 0.0;
+            }
+            rel2 {
+               to: "elm.swallow.bar";
+               relative: 1.0 1.0;
+               offset: -1 -1;
+            }
+            image {
+               normal: "shelf_inset.png";
+               border: 7 7 7 7;
+            }
+         }
+      }
+      part { name: "elm.text.status";
+         type: TEXT;
+         mouse_events: 0;
+         description { state: "default" 0.0;
+            fixed: 1 1;
+            visible: 0;
+            rel1 {
+               to: "background";
+               relative: 0.5 0.5;
+            }
+            rel2 {
+               to: "background";
+               relative: 0.5 0.5;
+            }
+            text {
+               font: "Sans:style=Bold,Edje-Vera-Bold";
+               size: 10;
+               min: 1 1;
+               align: 0.5 0.0;
+            }
+            color: 0 0 0 255;
+         }
+         description { state: "hidden" 0.0;
+            inherit: "default" 0.0;
+            visible: 0;
+            text.min: 0 0;
+         }
+      }
+      part { name: "elm.progress.progressbar";
+         mouse_events: 0;
+         clip_to: "elm.background.progressbar";
+         description {
+            state: "default" 0.0;
+            min: 14 28;
+            fixed: 1 1;
+            rel1 {
+               to: "elm.swallow.bar";
+               relative: 0.0 0.0;
+            }
+            rel2 {
+               to_y: "elm.swallow.bar";
+               to_x: "elm.cur.progressbar";
+               offset: -1 -1;
+            }
+            image {
+               normal: "flip_shad.png";
+               border: 6 6 6 6;
+            }
+         }
+         description {
+            state: "invert" 0.0;
+            inherit: "default" 0.0;
+            rel1 {
+               to_y: "elm.swallow.bar";
+               to_x: "elm.cur.progressbar";
+            }
+            rel2 {
+               to: "elm.swallow.bar";
+               relative: 1.0 1.0;
+            }
+         }
+         description {
+            state: "state_begin" 0.0;
+            inherit: "default" 0.0;
+            rel1 {
+               to: "elm.swallow.bar";
+               relative: 0.0 0.0;
+            }
+            rel2 {
+               to: "elm.swallow.bar";
+               relative: 0.1 1.0;
+            }
+         }
+         description {
+            state: "state_end" 0.0;
+            inherit: "default" 0.0;
+            rel1 {
+               to: "elm.swallow.bar";
+               relative: 0.9 0.0;
+            }
+            rel2 {
+               to: "elm.swallow.bar";
+               relative: 1.0 1.0;
+            }
+         }
+      }
+      part { name: "elm.progress.progressbar1";
+         mouse_events: 0;
+         clip_to: "elm.background.progressbar";
+         description {
+            state: "default" 0.0;
+            min: 14 28;
+            fixed: 1 1;
+            rel1 {
+               to: "elm.swallow.bar";
+               relative: 0.0 0.0;
+            }
+            rel2 {
+               to_y: "elm.swallow.bar";
+               to_x: "elm.cur.progressbar1";
+               offset: -1 -1;
+            }
+            image {
+               normal: "bt_sm_base2.png";
+               border: 6 6 6 6;
+            }
+         }
+         description {
+            state: "invert" 0.0;
+            inherit: "default" 0.0;
+            rel1 {
+               to_y: "elm.swallow.bar";
+               to_x: "elm.cur.progressbar1";
+            }
+            rel2 {
+               to: "elm.swallow.bar";
+               relative: 1.0 1.0;
+            }
+         }
+         description {
+            state: "state_begin" 0.0;
+            inherit: "default" 0.0;
+            rel1 {
+               to: "elm.swallow.bar";
+               relative: 0.0 0.0;
+            }
+            rel2 {
+               to: "elm.swallow.bar";
+               relative: 0.1 1.0;
+            }
+         }
+         description {
+            state: "state_end" 0.0;
+            inherit: "default" 0.0;
+            rel1 {
+               to: "elm.swallow.bar";
+               relative: 0.9 0.0;
+            }
+            rel2 {
+               to: "elm.swallow.bar";
+               relative: 1.0 1.0;
+            }
+         }
+      }
+      part { name: "text-bar";
+         type: TEXT;
+         mouse_events: 0;
+         clip_to: "progress-rect";
+         effect: SOFT_SHADOW;
+         scale: 1;
+         description { state: "default" 0.0;
+            align: 0.0 0.0;
+            fixed: 1 1;
+            visible: 0;
+            rel1.to: "elm.text.status";
+            rel1.offset: -1 -1;
+            rel2.to: "elm.text.status";
+            text {
+               text_source: "elm.text.status";
+               font: "Sans:style=Bold,Edje-Vera-Bold";
+               size: 10;
+               min: 1 1;
+               align: 0.0 0.0;
+            }
+            color: 224 224 224 255;
+            color3: 0 0 0 64;
+         }
+         description { state: "hidden" 0.0;
+            inherit: "default" 0.0;
+            visible: 0;
+            text.min: 0 0;
+         }
+      }
+      part { name: "elm.cur.progressbar";
+         mouse_events: 0;
+         dragable {
+            confine: "background";
+            x: 1 1 1;
+            y: 0 0 0;
+         }
+         description { state: "default" 0.0;
+            min: 14 28;
+            fixed: 1 1;
+            visible: 0;
+            rel1 {
+               to: "background";
+               relative: 0 0;
+            }
+            rel2.to: "background";
+         }
+      }
+      part { name: "elm.cur.progressbar1";
+         mouse_events: 0;
+         dragable {
+          confine: "background";
+            x: 1 1 1;
+            y: 0 0 0;
+         }
+         description { state: "default" 0.0;
+            min: 14 28;
+            fixed: 1 1;
+            visible: 0;
+            rel1 {
+               to: "background";
+               relative: 0 0;
+            }
+            rel2.to: "background";
+         }
+      }
+      part { name: "progress-rect";
+         type: RECT;
+         mouse_events: 0;
+         description { state: "default" 0.0;
+            rel1.to: "elm.progress.progressbar";
+            rel2.to: "elm.progress.progressbar";
+         }
+      }
+   }
+   programs {
+      program { name: "label_show";
+         signal: "elm,state,text,visible";
+         source: "elm";
+         action:  STATE_SET "visible" 0.0;
+         target: "elm.text";
+      }
+      program { name: "label_hide";
+         signal: "elm,state,text,hidden";
+         source: "elm";
+         action:  STATE_SET "default" 0.0;
+         target: "elm.text";
+      }
+      program { name: "icon_show";
+         signal: "elm,state,icon,visible";
+         source: "elm";
+         action:  STATE_SET "visible" 0.0;
+         target: "elm.swallow.content";
+      }
+      program { name: "icon_hide";
+         signal: "elm,state,icon,hidden";
+         source: "elm";
+         action:  STATE_SET "default" 0.0;
+         target: "elm.swallow.content";
+      }
+      program { name: "units_show";
+         signal: "elm,state,units,visible";
+         source: "elm";
+         action:  STATE_SET "default" 0.0;
+         target: "text-bar";
+         target: "elm.text.status";
+      }
+      program { name: "units_hide";
+         signal: "elm,state,units,hidden";
+         source: "elm";
+         action:  STATE_SET "hidden" 0.0;
+         target: "text-bar";
+         target: "elm.text.status";
+      }
+      program { name: "slide_to_end";
+         action:  STATE_SET "state_end" 0.0;
+         transition: LINEAR 0.5;
+         target: "elm.progress.progressbar";
+         target: "elm.progress.progressbar1";
+         after: "slide_to_begin";
+      }
+      program { name: "slide_to_begin";
+         signal: "elm,state,slide,begin";
+         action: STATE_SET "state_begin" 0.0;
+         target: "elm.progress.progressbar";
+         target: "elm.progress.progressbar1";
+         transition: LINEAR 0.5;
+         after: "slide_to_end";
+      }
+      program { name: "start_pulse";
+         signal: "elm,state,pulse,start";
+         source: "elm";
+         after: "slide_to_end";
+      }
+      program { name: "stop_pulse";
+         signal: "elm,state,pulse,stop";
+         source: "elm";
+         action: ACTION_STOP;
+         target: "slide_to_begin";
+         target: "slide_to_end";
+         target: "start_pulse";
+         after: "state_pulse";
+      }
+      program { name: "state_pulse";
+         signal: "elm,state,pulse";
+         source: "elm";
+         action: STATE_SET "state_begin" 0.0;
+         target: "elm.progress.progressbar";
+         target: "elm.progress.progressbar1";
+         after: "units_hide";
+      }
+      program { name: "state_fraction";
+         signal: "elm,state,fraction";
+         source: "elm";
+         action: ACTION_STOP;
+         target: "slide_to_begin";
+         target: "slide_to_end";
+         target: "start_pulse";
+         action: STATE_SET "default" 0.0;
+         target: "elm.progress.progressbar";
+         target: "elm.progress.progressbar1";
+      }
+      program { name: "set_invert_on";
+         signal: "elm,state,inverted,on";
+         source: "elm";
+         action:  STATE_SET "invert" 0.0;
+         target: "elm.progress.progressbar";
+         target: "elm.progress.progressbar1";
+      }
+      program { name: "set_invert_off";
+         signal: "elm,state,inverted,off";
+         source: "elm";
+         action:  STATE_SET "default" 0.0;
+         target: "elm.progress.progressbar";
+         target: "elm.progress.progressbar1";
+      }
+   }
+}
+
+///////////////////////////////////////////////////////////////////////////////
diff --git a/src/bin/test.c b/src/bin/test.c
index 9bbec15..2e69866 100644
--- a/src/bin/test.c
+++ b/src/bin/test.c
@@ -127,6 +127,7 @@ void test_gengrid4(void *data, Evas_Object *obj, void 
*event_info);
 void test_win_state(void *data, Evas_Object *obj, void *event_info);
 void test_win_state2(void *data, Evas_Object *obj, void *event_info);
 void test_progressbar(void *data, Evas_Object *obj, void *event_info);
+void test_progressbar2(void *data, Evas_Object *obj, void *event_info);
 void test_fileselector(void *data, Evas_Object *obj, void *event_info);
 void test_separator(void *data, Evas_Object *obj, void *event_info);
 void test_scroller(void *data, Evas_Object *obj, void *event_info);
@@ -715,6 +716,7 @@ add_tests:
    ADD_TEST(NULL, "Range Values", "Spinner", test_spinner);
    ADD_TEST(NULL, "Range Values", "Slider", test_slider);
    ADD_TEST(NULL, "Range Values", "Progressbar", test_progressbar);
+   ADD_TEST(NULL, "Range Values", "Progressbar 2", test_progressbar2);
 
    //------------------------------//
    ADD_TEST(NULL, "Booleans", "Check", test_check);
diff --git a/src/bin/test_progressbar.c b/src/bin/test_progressbar.c
index 6f63d32..13ac94f 100644
--- a/src/bin/test_progressbar.c
+++ b/src/bin/test_progressbar.c
@@ -38,6 +38,26 @@ _my_progressbar_value_set (void *data EINA_UNUSED)
    return ECORE_CALLBACK_CANCEL;
 }
 
+static Eina_Bool
+_my_progressbar_value_set2(void *data EINA_UNUSED)
+{
+   double progress;
+
+   progress = elm_progressbar_value_get (_test_progressbar.pb1);
+   if (progress < 1.0) progress += 0.0123;
+   else progress = 0.0;
+   elm_progressbar_part_value_set(_test_progressbar.pb1, 
"elm.cur.progressbar", progress);
+   elm_progressbar_value_set(_test_progressbar.pb2, progress);
+   elm_progressbar_part_value_set(_test_progressbar.pb2, 
"elm.cur.progressbar1", progress-0.15);
+   elm_progressbar_part_value_set(_test_progressbar.pb3, 
"elm.cur.progressbar", progress);
+   elm_progressbar_part_value_set(_test_progressbar.pb3, 
"elm.cur.progressbar1", progress-0.15);
+
+   if (progress < 1.0) return ECORE_CALLBACK_RENEW;
+
+   _test_progressbar.timer = NULL;
+   return ECORE_CALLBACK_CANCEL;
+}
+
 static void
 my_progressbar_test_start(void *data EINA_UNUSED, Evas_Object *obj 
EINA_UNUSED, void *event_info EINA_UNUSED)
 {
@@ -58,12 +78,37 @@ my_progressbar_test_start(void *data EINA_UNUSED, 
Evas_Object *obj EINA_UNUSED,
 }
 
 static void
+my_progressbar_test_start2(void *data EINA_UNUSED, Evas_Object *obj 
EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+   fprintf(stderr, "s1\n");
+
+   elm_object_disabled_set(_test_progressbar.btn_start, EINA_TRUE);
+   elm_object_disabled_set(_test_progressbar.btn_stop, EINA_FALSE);
+
+   if (!_test_progressbar.timer)
+     _test_progressbar.timer = ecore_timer_add(0.1,
+                                               _my_progressbar_value_set2, 
NULL);
+}
+
+static void
 my_progressbar_test_stop(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, 
void *event_info EINA_UNUSED)
 {
+   elm_progressbar_pulse(_test_progressbar.pb1, EINA_FALSE);
    elm_progressbar_pulse(_test_progressbar.pb2, EINA_FALSE);
-   elm_progressbar_pulse(_test_progressbar.pb5, EINA_FALSE);
-   elm_progressbar_pulse(_test_progressbar.pb7, EINA_FALSE);
+   elm_progressbar_pulse(_test_progressbar.pb3, EINA_FALSE);
+   elm_object_disabled_set(_test_progressbar.btn_start, EINA_FALSE);
+   elm_object_disabled_set(_test_progressbar.btn_stop, EINA_TRUE);
+
+   if (_test_progressbar.timer)
+     {
+        ecore_timer_del(_test_progressbar.timer);
+        _test_progressbar.timer = NULL;
+     }
+}
 
+static void
+my_progressbar_test_stop2(void *data EINA_UNUSED, Evas_Object *obj 
EINA_UNUSED, void *event_info EINA_UNUSED)
+{
    elm_object_disabled_set(_test_progressbar.btn_start, EINA_FALSE);
    elm_object_disabled_set(_test_progressbar.btn_stop, EINA_TRUE);
 
@@ -226,4 +271,71 @@ test_progressbar(void *data EINA_UNUSED, Evas_Object *obj 
EINA_UNUSED, void *eve
 
    evas_object_show(win);
 }
+
+void
+test_progressbar2(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void 
*event_info __UNUSED__)
+{
+   Evas_Object *win, *pb, *bx, *bt, *bt_bx;
+
+   win = elm_win_util_standard_add("progressbar", "Progressbar2");
+   evas_object_smart_callback_add(win, "delete,request",
+                                  my_progressbar_destroy, NULL);
+
+   bx = elm_box_add(win);
+   evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   elm_win_resize_object_add(win, bx);
+   evas_object_show(bx);
+
+   pb = elm_progressbar_add(win);
+   elm_object_text_set(pb, "Style: default");
+   evas_object_size_hint_align_set(pb, EVAS_HINT_FILL, 0.5);
+   evas_object_size_hint_weight_set(pb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   elm_progressbar_span_size_set(pb, 200);
+   elm_box_pack_end(bx, pb);
+   evas_object_show(pb);
+   _test_progressbar.pb1 = pb;
+
+   pb = elm_progressbar_add(win);
+   elm_object_style_set(pb, "recording");
+   elm_object_text_set(pb, "Style: Recording");
+   evas_object_size_hint_align_set(pb, EVAS_HINT_FILL, 0.5);
+   evas_object_size_hint_weight_set(pb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   elm_progressbar_span_size_set(pb, 200);
+   elm_box_pack_end(bx, pb);
+   evas_object_show(pb);
+   _test_progressbar.pb2 = pb;
+
+   pb = elm_progressbar_add(win);
+   elm_object_style_set(pb, "recording");
+   elm_object_text_set(pb, "Style: Recording 2");
+   evas_object_size_hint_align_set(pb, EVAS_HINT_FILL, 0.5);
+   evas_object_size_hint_weight_set(pb, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   elm_progressbar_span_size_set(pb, 200);
+   elm_box_pack_end(bx, pb);
+   evas_object_show(pb);
+   _test_progressbar.pb3 = pb;
+
+   bt_bx = elm_box_add(win);
+   elm_box_horizontal_set(bt_bx, EINA_TRUE);
+   evas_object_size_hint_weight_set(bt_bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   elm_box_pack_end(bx, bt_bx);
+   evas_object_show(bt_bx);
+
+   bt = elm_button_add(win);
+   elm_object_text_set(bt, "Start");
+   evas_object_smart_callback_add(bt, "clicked", my_progressbar_test_start2, 
NULL);
+   elm_box_pack_end(bt_bx, bt);
+   evas_object_show(bt);
+   _test_progressbar.btn_start = bt;
+
+   bt = elm_button_add(win);
+   elm_object_text_set(bt, "Stop");
+   elm_object_disabled_set(bt, EINA_TRUE);
+   evas_object_smart_callback_add(bt, "clicked", my_progressbar_test_stop2, 
NULL);
+   elm_box_pack_end(bt_bx, bt);
+   evas_object_show(bt);
+   _test_progressbar.btn_stop = bt;
+
+   evas_object_show(win);
+}
 #endif
diff --git a/src/lib/elm_authors.h b/src/lib/elm_authors.h
index cebc5e1..3045c29 100644
--- a/src/lib/elm_authors.h
+++ b/src/lib/elm_authors.h
@@ -83,6 +83,7 @@
  * @author Ryuan Choi (ryuan) <[email protected]> <[email protected]>
  * @author Hosang Kim <hosang12.kim@@samsung.com>
  * @author Youngbok Shin <youngb.shin@@samsung.com>
+ * @author Niraj Kumar <niraj.kr@@samsung.com> <niraj.kumar.ait@@gmail.com>
  *
  * Please contact <[email protected]> to get in
  * contact with the developers and maintainers.
diff --git a/src/lib/elm_progressbar.c b/src/lib/elm_progressbar.c
index d48c00e..ef702d8 100644
--- a/src/lib/elm_progressbar.c
+++ b/src/lib/elm_progressbar.c
@@ -40,6 +40,22 @@ static const Elm_Layout_Part_Alias_Description 
_text_aliases[] =
    {NULL, NULL}
 };
 
+static Elm_Progress_Status *
+_progress_status_new(const char *part_name, double val)
+{
+   Elm_Progress_Status *ps;
+   ps = calloc(1, sizeof(Elm_Progress_Status));
+   ps->part_name = eina_stringshare_add(part_name);
+   ps->val = val;
+   return ps;
+}
+
+static inline void
+_progress_status_free(Elm_Progress_Status *ps)
+{
+   eina_stringshare_del(ps->part_name);
+   free(ps);
+}
 static void
 _units_set(Evas_Object *obj)
 {
@@ -72,16 +88,21 @@ _val_set(Evas_Object *obj)
    ELM_PROGRESSBAR_DATA_GET(obj, sd);
    Elm_Widget_Smart_Data *wd = eo_data_scope_get(obj, ELM_OBJ_WIDGET_CLASS);
 
-   pos = sd->val;
    rtl = elm_widget_mirrored_get(obj);
-
-   if ((!rtl && sd->inverted) ||
-       (rtl && ((!sd->horizontal && sd->inverted) ||
+   Elm_Progress_Status *ps;
+   Eina_List *l;
+
+   EINA_LIST_FOREACH(sd->progress_status, l, ps)
+      {
+         pos = ps->val;
+         if ((!rtl && sd->inverted) ||
+              (rtl && ((!sd->horizontal && sd->inverted) ||
                 (sd->horizontal && !sd->inverted))))
-     pos = MAX_RATIO_LVL - pos;
+            pos = MAX_RATIO_LVL - pos;
 
-   edje_object_part_drag_value_set
-     (wd->resize_obj, "elm.cur.progressbar", pos, pos);
+         edje_object_part_drag_value_set
+           (wd->resize_obj, ps->part_name, pos, pos);
+      }
 }
 
 static void
@@ -284,8 +305,16 @@ static void
 _elm_progressbar_smart_del(Eo *obj, void *_pd, va_list *list EINA_UNUSED)
 {
    Elm_Progressbar_Smart_Data *sd = _pd;
+   Elm_Progress_Status *progress_obj;
 
    if (sd->units) eina_stringshare_del(sd->units);
+   if (sd->progress_status)
+      {
+         EINA_LIST_FREE(sd->progress_status, progress_obj)
+           {
+              _progress_status_free(progress_obj);
+           }
+      }
 
    eo_do_super(obj, MY_CLASS, evas_obj_smart_del());
 }
@@ -388,6 +417,79 @@ _pulse(Eo *obj, void *_pd, va_list *list)
 }
 
 EAPI void
+elm_progressbar_part_value_set(Evas_Object *obj, const char *part, double val)
+{
+   ELM_PROGRESSBAR_CHECK(obj);
+   eo_do(obj, elm_obj_progressbar_part_value_set(part, val));
+}
+
+static void
+_part_value_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
+{
+   const char *part_name = va_arg(*list, const char *);
+   double val = va_arg(*list, double);
+   Elm_Progressbar_Smart_Data *sd = _pd;
+   Elm_Progress_Status *ps;
+   Eina_Bool  existing_ps = EINA_FALSE;
+   Eina_List *l;
+
+   if (val < MIN_RATIO_LVL) val = MIN_RATIO_LVL;
+   if (val > MAX_RATIO_LVL) val = MAX_RATIO_LVL;
+
+   if (!strcmp(part_name, "elm.cur.progressbar"))
+     sd->val = val;
+
+   EINA_LIST_FOREACH(sd->progress_status, l, ps)
+     {
+        if (!strcmp(ps->part_name, part_name))
+          {
+             existing_ps = EINA_TRUE;
+             break;
+          }
+     }
+
+   if (!existing_ps)
+      {
+         ps = _progress_status_new(part_name, val);
+         sd->progress_status = eina_list_append(sd->progress_status, ps);
+      }
+   else
+      ps->val = val;
+
+   _val_set(obj);
+   _units_set(obj);
+   evas_object_smart_callback_call(obj, SIG_CHANGED, NULL);
+}
+
+EAPI double
+elm_progressbar_part_value_get(const Evas_Object *obj, const char * part)
+{
+   ELM_PROGRESSBAR_CHECK(obj) 0.0;
+   double ret;
+   eo_do((Eo *) obj, elm_obj_progressbar_part_value_get(part,&ret));
+   return ret;
+}
+
+static void
+_part_value_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
+{
+   const char* part = va_arg(*list, const char *);
+   double *ret = va_arg(*list, double *);
+   Elm_Progressbar_Smart_Data *sd = _pd;
+   Elm_Progress_Status *ps;
+   Eina_List *l;
+
+   EINA_LIST_FOREACH(sd->progress_status, l, ps)
+     {
+        if (!strcmp(ps->part_name, part))
+           {
+              *ret = ps->val;
+              return;
+           }
+     }
+}
+
+EAPI void
 elm_progressbar_value_set(Evas_Object *obj,
                           double val)
 {
@@ -400,6 +502,7 @@ _value_set(Eo *obj, void *_pd, va_list *list)
 {
    double val = va_arg(*list, double);
    Elm_Progressbar_Smart_Data *sd = _pd;
+   Elm_Progress_Status *ps;
 
    if (sd->val == val) return;
 
@@ -407,6 +510,8 @@ _value_set(Eo *obj, void *_pd, va_list *list)
    if (sd->val < MIN_RATIO_LVL) sd->val = MIN_RATIO_LVL;
    if (sd->val > MAX_RATIO_LVL) sd->val = MAX_RATIO_LVL;
 
+   ps = _progress_status_new("elm.cur.progressbar", sd->val);
+   sd->progress_status = eina_list_append(sd->progress_status, ps);
    _val_set(obj);
    _units_set(obj);
    evas_object_smart_callback_call(obj, SIG_CHANGED, NULL);
@@ -681,6 +786,8 @@ _class_constructor(Eo_Class *klass)
         
EO_OP_FUNC(ELM_OBJ_PROGRESSBAR_ID(ELM_OBJ_PROGRESSBAR_SUB_ID_HORIZONTAL_GET), 
_horizontal_get),
         
EO_OP_FUNC(ELM_OBJ_PROGRESSBAR_ID(ELM_OBJ_PROGRESSBAR_SUB_ID_INVERTED_SET), 
_inverted_set),
         
EO_OP_FUNC(ELM_OBJ_PROGRESSBAR_ID(ELM_OBJ_PROGRESSBAR_SUB_ID_INVERTED_GET), 
_inverted_get),
+        
EO_OP_FUNC(ELM_OBJ_PROGRESSBAR_ID(ELM_OBJ_PROGRESSBAR_SUB_ID_PART_VALUE_SET), 
_part_value_set),
+        
EO_OP_FUNC(ELM_OBJ_PROGRESSBAR_ID(ELM_OBJ_PROGRESSBAR_SUB_ID_PART_VALUE_GET), 
_part_value_get),
         EO_OP_FUNC_SENTINEL
    };
    eo_class_funcs_set(klass, func_desc);
@@ -702,6 +809,8 @@ static const Eo_Op_Description op_desc[] = {
      EO_OP_DESCRIPTION(ELM_OBJ_PROGRESSBAR_SUB_ID_HORIZONTAL_GET, "Retrieve 
the orientation of a given progress bar widget."),
      EO_OP_DESCRIPTION(ELM_OBJ_PROGRESSBAR_SUB_ID_INVERTED_SET, "Invert a 
given progress bar widget's displaying values order."),
      EO_OP_DESCRIPTION(ELM_OBJ_PROGRESSBAR_SUB_ID_INVERTED_GET, "Get whether a 
given progress bar widget's displaying values are inverted or not."),
+     EO_OP_DESCRIPTION(ELM_OBJ_PROGRESSBAR_SUB_ID_PART_VALUE_SET, "Set the 
progress value (in percentage) on a given progress bar widget for a part."),
+     EO_OP_DESCRIPTION(ELM_OBJ_PROGRESSBAR_SUB_ID_PART_VALUE_GET, "Get the 
progress value (in percentage) on a given progress bar widget for a part."),
      EO_OP_DESCRIPTION_SENTINEL
 };
 static const Eo_Class_Description class_desc = {
diff --git a/src/lib/elm_progressbar_eo.h b/src/lib/elm_progressbar_eo.h
index 26f30aa..7cfa6eb 100644
--- a/src/lib/elm_progressbar_eo.h
+++ b/src/lib/elm_progressbar_eo.h
@@ -23,6 +23,8 @@ enum
    ELM_OBJ_PROGRESSBAR_SUB_ID_HORIZONTAL_GET,
    ELM_OBJ_PROGRESSBAR_SUB_ID_INVERTED_SET,
    ELM_OBJ_PROGRESSBAR_SUB_ID_INVERTED_GET,
+   ELM_OBJ_PROGRESSBAR_SUB_ID_PART_VALUE_SET,
+   ELM_OBJ_PROGRESSBAR_SUB_ID_PART_VALUE_GET,
    ELM_OBJ_PROGRESSBAR_SUB_ID_LAST
 };
 
@@ -229,3 +231,35 @@ enum
  * @ingroup Progressbar
  */
 #define elm_obj_progressbar_inverted_get(ret) 
ELM_OBJ_PROGRESSBAR_ID(ELM_OBJ_PROGRESSBAR_SUB_ID_INVERTED_GET), 
EO_TYPECHECK(Eina_Bool *, ret)
+
+/**
+ * @def elm_progressbar_part_value_set
+ * @since 1.8
+ *
+ * Modified to support more than one progress status
+ * Set the value of the progress status a particular part
+ *
+ * @param[in] part
+ * @param[in] val
+ *
+ * @see elm_progressbar_part_value_set
+ *
+ * @ingroup Progressbar
+ */
+#define elm_obj_progressbar_part_value_set(part, val) 
ELM_OBJ_PROGRESSBAR_ID(ELM_OBJ_PROGRESSBAR_SUB_ID_PART_VALUE_SET), 
EO_TYPECHECK(const char*, part), EO_TYPECHECK(double, val)
+
+/**
+ * @def elm_progressbar_part_value_get
+ * @since 1.8
+ *
+ * Modified to support more than one progress status
+ * Get the value of the progress status of a particular part
+ *
+ * @param[in] part
+ * @param[out] ret
+ *
+ * @see elm_progressbar_part_value_get
+ *
+ * @ingroup Progressbar
+ */
+#define elm_obj_progressbar_part_value_get(part, ret) 
ELM_OBJ_PROGRESSBAR_ID(ELM_OBJ_PROGRESSBAR_SUB_ID_PART_VALUE_GET), 
EO_TYPECHECK(const char*, part), EO_TYPECHECK(double *, ret)
diff --git a/src/lib/elm_progressbar_legacy.h b/src/lib/elm_progressbar_legacy.h
index 492654d..89667e6 100644
--- a/src/lib/elm_progressbar_legacy.h
+++ b/src/lib/elm_progressbar_legacy.h
@@ -249,3 +249,36 @@ EAPI void                         
elm_progressbar_inverted_set(Evas_Object *obj,
  * @ingroup Progressbar
  */
 EAPI Eina_Bool                    elm_progressbar_inverted_get(const 
Evas_Object *obj);
+
+/**
+ * Set the progress value (in percentage) on a given progress bar
+ * widget for the given part name
+ *
+ * @since 1.8
+ *
+ * @param obj  The progress bar object
+ * @param part The partname to which val have to set
+ * @param val The progress value (@b must be between @c 0.0 and @c
+ * 1.0)
+ *
+ * Use this call to set progress bar status for more than one progress status .
+ *
+ * @ingroup Progressbar
+ */
+EAPI void                         elm_progressbar_part_value_set(Evas_Object 
*obj, const char *part, double val);
+
+/**
+ * Get the progress value (in percentage) on a given progress bar
+ * widget for a particular part
+ *
+ * @since 1.8
+ *
+ * @param obj The progress bar object
+ * @param part The part name of the progress bar
+ * @return The value of the progressbar
+ *
+ * @see elm_progressbar_value_set() for more details
+ *
+ * @ingroup Progressbar
+ */
+EAPI double                       elm_progressbar_part_value_get(const 
Evas_Object *obj, const char *part);
diff --git a/src/lib/elm_widget_progressbar.h b/src/lib/elm_widget_progressbar.h
index 3747a17..20d7812 100644
--- a/src/lib/elm_widget_progressbar.h
+++ b/src/lib/elm_widget_progressbar.h
@@ -18,6 +18,8 @@
  * Base layout smart data extended with progressbar instance data.
  */
 typedef struct _Elm_Progressbar_Smart_Data Elm_Progressbar_Smart_Data;
+typedef struct _Elm_Progress_Status Elm_Progress_Status;
+
 struct _Elm_Progressbar_Smart_Data
 {
    Evas_Object          *spacer;
@@ -30,11 +32,18 @@ struct _Elm_Progressbar_Smart_Data
    Eina_Bool             inverted : 1;
    Eina_Bool             pulse : 1;
    Eina_Bool             pulse_state : 1;
+   Eina_List             *progress_status;
 
    char                 *(*unit_format_func)(double val);
    void                  (*unit_format_free)(char *str);
 };
 
+struct _Elm_Progress_Status
+{
+   const char            *part_name;
+   double                val;
+};
+
 /**
  * @}
  */

-- 

------------------------------------------------------------------------------
How ServiceNow helps IT people transform IT departments:
1. Consolidate legacy IT systems to a single system of record for IT
2. Standardize and globalize service processes across IT
3. Implement zero-touch automation to replace manual, redundant tasks
http://pubads.g.doubleclick.net/gampad/clk?id=51271111&iu=/4140/ostg.clktrk

Reply via email to